boot.asm - bugfixes. dssboot.asm - support fat32. Core - bugfixes

This commit is contained in:
Anatoliy Belyanskiy 2024-06-05 03:06:29 +10:00
parent 83bfcf7cdd
commit 568806c67a
8 changed files with 873 additions and 416 deletions

View File

@ -11,10 +11,12 @@
; + System Bootstrap + ; + System Bootstrap +
; + Initial revision 09 Nov 1998 + ; + Initial revision 09 Nov 1998 +
; +------------------------------+ ; +------------------------------+
MODULE DSS_Boot_Loader
; BIOS 3.06 § £à㦠¥â ®¤¨­ ᥪâ®à § £àã§ç¨ª  ¨ ¯¥à¥¤ ñâ ¥¬ã ã¯à ¢«¥­¨¥. ; BIOS 3.06 § £à㦠¥â ®¤¨­ ᥪâ®à § £àã§ç¨ª  ¨ ¯¥à¥¤ ñâ ¥¬ã ã¯à ¢«¥­¨¥.
DEFINE ORIGINAL_DSS 0 DEFINE ORIGINAL_DSS 0
DEFINE UNIVERSAL_BOOT 1 DEFINE UNIVERSAL_BOOT 1
LOAD_SECTORS EQU SECTORS_OF_LOADER-1
DISP #8000 DISP #8000
@ -27,6 +29,9 @@
DRIVE: _mSYSID DRIVE: _mSYSID
DI DI
; ;!TEST 26/03/2024
; LD SP,#C000
; ;
LD (DRIVE),A LD (DRIVE),A
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
XOR A XOR A
@ -171,18 +176,15 @@ FATMSG: DB "FAT"
GOOD_DRIVE: LD DE,#8200 ;!HARDCODE GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD HL,0 LD HL,0
LD IX,2 LD IX,2
LD BC,2*256 + BIOS.DRV_READ ;!HARDCODE ¤®§ £à㧪  ¥éñ ¤¢ãå ᥪâ®à®¢ § £àã§ç¨ª  LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; ¤®§ £à㧪  ᥪâ®à®¢ § £àã§ç¨ª 
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
JP C,FAIL.NULL JP C,FAIL.NULL
; ;
; CONTINUE ; CONTINUE
;!TEST 26/03/2024
;LD SP,#C000
;
LD HL,0 LD HL,0
LD (DISKL),HL LD (PARTITION_START_L),HL
LD (DISKH),HL LD (PARTITION_START_H),HL
; ;
LD BC,1*256 + BIOS.GetMem LD BC,1*256 + BIOS.GetMem
RST ToBIOS_18 ;GET PAGE FOR DOS RST ToBIOS_18 ;GET PAGE FOR DOS
@ -210,7 +212,10 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
OR A OR A
PUSH AF PUSH AF
; § £à㧪  ; § £à㧪 
LD HL,(FCLUSTR) EXX
LD HL,(FCLUSTER_H)
EXX
LD HL,(FCLUSTR_L)
LD DE,#C000 LD DE,#C000
CALL LOAD_CORE CALL LOAD_CORE
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢ ; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
@ -229,8 +234,12 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢ CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
JP NC,INC_SECTOR_NUM JP NC,INC_SECTOR_NUM
CALL R_F_FAT ; next cluster in chain ;CALL R_F_FAT ; next cluster in chain
CALL READ_FROM_FAT ; next cluster in chain
EX DE,HL EX DE,HL
EXX
EX DE,HL
EXX
LD DE,#C000 LD DE,#C000
CALL NC,LOAD_CORE CALL NC,LOAD_CORE
.no_big_core: ; .no_big_core: ;
@ -326,7 +335,7 @@ RUN_CORE: DI
; ;
INC_SECTOR_NUM: PUSH DE INC_SECTOR_NUM: PUSH DE
CALL NSECTOR CALL CLUSTER_TO_SECTOR
LD DE,#20 ;!HARDCODE ª®«¨ç¥á⢮ ¯à®ç¨â ­­ëå ᥪâ®à®¢ LD DE,#20 ;!HARDCODE ª®«¨ç¥á⢮ ¯à®ç¨â ­­ëå ᥪâ®à®¢
ADD IX,DE ADD IX,DE
JR NC,.no_inc JR NC,.no_inc
@ -335,7 +344,10 @@ INC_SECTOR_NUM: PUSH DE
POP DE POP DE
LD BC,RUN_CORE LD BC,RUN_CORE
PUSH BC PUSH BC
PUSH HL PUSH HL ; ¤«ï ¡ « ­á 
;EXX
PUSH HL ; ¤«ï ¡ « ­á 
;EXX
JP LOAD_CORE.subload JP LOAD_CORE.subload
; CALL .set_stack ; CALL .set_stack
@ -408,20 +420,20 @@ PART_TB: PUSH BC
YEPDOS: ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® YEPDOS: ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,#80 LD A,#80
CP (IX+0) CP (IX + _sMBR_PARTITION_RECORD.isActive)
JR NZ,PART_TB.next JR NZ,PART_TB.next
LD A,4 ;!HARDCODE áç¥â稪 § ¯¨á¥© ¯ àâ¨æ¨© ¢ MBR LD A,4 ;!HARDCODE áç¥â稪 § ¯¨á¥© ¯ àâ¨æ¨© ¢ MBR
SUB B SUB B
PUSH AF ; ­®¬¥à § £à㧮筮£® à §¤¥«  PUSH AF ; ­®¬¥à § £à㧮筮£® à §¤¥« 
; ;
LD E,(IX+08) LD E,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0)
LD D,(IX+09) LD D,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD L,(IX+10) LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IX+11) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3)
PUSH DE PUSH DE
POP IX POP IX
LD (DISKL),IX LD (PARTITION_START_L),IX
LD (DISKH),HL LD (PARTITION_START_H),HL
LD A,(DRIVE) LD A,(DRIVE)
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
@ -438,7 +450,7 @@ YEPDOS: ;[ ] 17.12.2023
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;/* /*
GET_BPB: LD IX,#0000 GET_BPB: LD IX,#0000
LD HL,#0000 LD HL,#0000
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
@ -551,8 +563,8 @@ GET_BPB: LD IX,#0000
.BPB_FAT: LD (FatBuffer.FAT_TYPE),A .BPB_FAT: LD (FatBuffer.FAT_TYPE),A
;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL
; ;
LD IX,(DISKL) LD IX,(PARTITION_START_L)
LD HL,(DISKH) LD HL,(PARTITION_START_H)
LD DE,(FatBuffer.FAT1_SEC_L) LD DE,(FatBuffer.FAT1_SEC_L)
LD BC,#0000 LD BC,#0000
ADD IX,DE ADD IX,DE
@ -583,7 +595,7 @@ GET_BPB: LD IX,#0000
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* ;/*
GET_BPB: LD IX,#0000 GET_BPB: LD IX,#0000
LD HL,#0000 LD HL,#0000
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
@ -639,7 +651,7 @@ GET_BPB: LD IX,#0000
; ;
; ;R08 ; [x] fat32 ; ;R08 ; [x] fat32
; LD HL,BOOT_BUFFER ; LD HL,BOOT_BUFFER
; LD DE,CORE_BUFFERS.BootSector ; LD DE,BootSector
; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size
; LDIR ; LDIR
; ;
@ -647,20 +659,21 @@ GET_BPB: LD IX,#0000
CP #F0 CP #F0
RET C RET C
; ;
; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
; LD (FatBuffer.BytesPerSector),HL LD (FatBuffer.BytesPerSector),HL
; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
; LD (FatBuffer.SectorsPerCluster),A LD (FatBuffer.SectorsPerCluster),A
; calc. first sector FAT ; calc. first sector FAT
LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1
;LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2
; fat32 ; fat32
XOR A XOR A
LD B,A LD B,A
LD C,A LD C,A
LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; fat32 LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; fat32
; LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; fat32 LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; fat32
LD (FatBuffer.RootDirFirstSector_H),BC
LD (FatBuffer.SectorsPerFAT_H),A ; fat32 LD (FatBuffer.SectorsPerFAT_H),A ; fat32
; ;
; ;
@ -692,9 +705,8 @@ GET_BPB: LD IX,#0000
JR NZ,.loop1 JR NZ,.loop1
; ;
LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD (FatBuffer.FirstDataSector_H),BC
;LD BC,(FatBuffer.BytesPerSector) LD BC,(FatBuffer.BytesPerSector)
LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
LD A,B LD A,B
AND A AND A
; ;
@ -736,10 +748,10 @@ GET_BPB: LD IX,#0000
LD (FatBuffer.FirstDataSector_L),HL LD (FatBuffer.FirstDataSector_L),HL
; B = 0 ; B = 0
; ;
;LD HL,(FatBuffer.BytesPerSector) LD HL,(FatBuffer.BytesPerSector)
LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
;LD A,(FatBuffer.SectorsPerCluster) LD A,(FatBuffer.SectorsPerCluster)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
;!TODO FATcacheSize ;!TODO FATcacheSize
; calc. cluster size ; calc. cluster size
XOR 1 XOR 1
@ -774,17 +786,7 @@ GET_BPB: LD IX,#0000
SBC HL,DE SBC HL,DE
; ;
.HDDBIG: CALL SectorToCluster .HDDBIG: CALL SectorToCluster
; LD A,(FatBuffer.SectorsPerCluster) INC HL
; SCF
; .loop7: RRA
; JR C,.loop7_exit
; RR B
; RR C
; RR H
; RR L
; JP .loop7
;
.loop7_exit: INC HL
LD (FatBuffer.MaxClusterLow),HL LD (FatBuffer.MaxClusterLow),HL
LD A,L LD A,L
OR H OR H
@ -838,8 +840,8 @@ GET_BPB: LD IX,#0000
POP DE ; Total Sectors low POP DE ; Total Sectors low
; HL:DE = DataSec ; HL:DE = DataSec
; ;
;LD A,(FatBuffer.SectorsPerCluster) LD A,(FatBuffer.SectorsPerCluster)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
CALL DIV_for_SPC CALL DIV_for_SPC
; ¢ëïá­ï¥¬ à §à來®áâì FAT ; ¢ëïá­ï¥¬ à §à來®áâì FAT
@ -906,12 +908,12 @@ GET_BPB: LD IX,#0000
EXX EXX
LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster)
LD (FatBuffer.RootDirStartCluster_L),HL LD (FatBuffer.RootDirStartCluster_L),HL
LD BC,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
LD (FatBuffer.RootDirStartCluster_H),BC LD (FatBuffer.RootDirStartCluster_H),DE
; ;
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR.no_prepare
LD (FatBuffer.RootDirFirstSector_L),HL LD (FatBuffer.RootDirFirstSector_L),IX
LD (FatBuffer.RootDirFirstSector_H),BC LD (FatBuffer.RootDirFirstSector_H),HL
; ;
LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector)
LD (FatBuffer.FSINFO_Sector),HL LD (FatBuffer.FSINFO_Sector),HL
@ -931,89 +933,11 @@ GET_BPB: LD IX,#0000
LD DE,FatBuffer.BPB_LABEL LD DE,FatBuffer.BPB_LABEL
LD BC,11 ;!HARDCODE LD BC,11 ;!HARDCODE
LDIR LDIR
;
SET_PAGE_X FATPAGE
PUSH AF
LD DE,0 LD DE,0
CALL READ_FAT_TABLE CALL READ_FAT_TABLE
POP AF AND A
OUT (SLOT3),A
;
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR Z,.set_FSinfo
;
LD HL,#0001
LD (G_CLUST.low),HL
DEC L
LD (G_CLUST.high),HL
;
DEC HL
LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL
LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL
XOR A
RET RET
; ;
.set_FSinfo: CALL READ_FSinfo
; !FIXIT ¯à®¢¥àª  ­  ®è¨¡ªã
;
; ¯à®¢¥àª  ®¤­®© ¨§ á®â­¨ áà ­ëå ᨣ­ âãà
LD HL,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE)
LD DE,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE + 2)
LD BC,#7272
SBC HL,BC
JR NZ,.error
EX DE,HL
LD DE,#6141
SBC HL,DE
JR NZ,.error
; FREE_CLUSTERS_COUNT
LD BC,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT)
LD DE,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2)
; CF = 0
CALL .check_cluster
JR NC,.skip_FFFF
;
LD B,#FF
LD C,B
LD D,B
LD E,B
;
.skip_FFFF: LD (FatBuffer.FREE_CLUSTERS_COUNT_L),BC
LD (FatBuffer.FREE_CLUSTERS_COUNT_H),DE
;
; FIRST_FREE_CLUSTER
LD BC,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER)
LD DE,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2)
; CF = 0
CALL .check_cluster
JR C,.error
;
LD (G_CLUST.high),DE
LD (G_CLUST.low),BC
XOR A
.error: LD (FatBuffer.UPD_FSINFO),A
RET Z
;!TODO FREE_CLUSTERS_COUNT
;LD HL,#FFFF
;LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL
;LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL
;
XOR A
LD H,A
LD L,2
LD (G_CLUST.low),HL
LD L,H
LD (G_CLUST.high),HL
RET
;
;!TODO MaxCluster - ¬ ªá¨¬ «ì­® ¤®¯ãáâ¨¬ë© ¨«¨ ­  1 ¡®«ìè¥ ¬ ªá¨¬ «ì­® ¤®¯ãá⨬®£®?
.check_cluster: LD HL,(FatBuffer.MaxClusterLow)
SBC HL,BC
LD HL,(FatBuffer.MaxClusterHigh)
SBC HL,DE
RET
;;;;;;;; ;;;;;;;;
; --> BC:HL - Sector ; --> BC:HL - Sector
@ -1022,8 +946,8 @@ SectorToCluster:
LD A,B LD A,B
AND #0F AND #0F
LD B,A LD B,A
;LD A,(FatBuffer.SectorsPerCluster) LD A,(FatBuffer.SectorsPerCluster)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
SCF SCF
.loop: RRA .loop: RRA
RET C RET C
@ -1033,15 +957,85 @@ SectorToCluster:
RR L RR L
JP .loop JP .loop
; ;
*/ ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
DIV_for_SPC:
LD C,A
DEC A
JR Z,.exit
;
AND E
LD B,A ; ®áâ â®ª
LD A,C
RRCA
;
.loop: SRL H
RR L
RR D
RR E
RRCA
JP NC,.loop
LD A,B
.exit: LD B,D
LD C,E
EX DE,HL
LD H,0
LD L,A
RET
;
;NSECTOR:
; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR
CLUSTER_TO_SECTOR:
EXX
PUSH HL
EXX
POP DE
; DE:HL - cluster
;
.no_prepare: PUSH BC
LD BC,-2
ADD HL,BC
JR C,.no_dec_de
DEC DE
.no_dec_de: ; cluster = cluster - 2
;
LD A,(FatBuffer.SectorsPerCluster)
XOR 1
JR Z,.skip
;
RRA
.loop: ADD HL,HL
RL E
RL D
;
RRA
JP NC,.loop
;
.skip: EX DE,HL
LD XL,E
LD XH,D
LD DE,(FatBuffer.FirstDataSector_L)
ADD IX,DE
LD DE,(FatBuffer.FirstDataSector_H)
ADC HL,DE
;
POP BC
RET
;
;*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ¯®¨áª system.dos ; ¯®¨áª system.dos
GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
LD IX,(FatBuffer.RootDirFirstSector_L) LD IX,(FatBuffer.RootDirFirstSector_L)
LD BC,(DISKL) LD BC,(PARTITION_START_L)
LD DE,(DISKH) LD DE,(PARTITION_START_H)
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
LD A,(FatBuffer.DirSizeInSectors) LD A,(FatBuffer.DirSizeInSectors)
JR NZ,.NEXTSEC
;
LD A,(FatBuffer.SectorsPerCluster);!FIXIT ¯à®çâñâ ⮫쪮 ¯¥à¢ë© ª« áâ¥à ä ©«®¢ ­  FAT32
.NEXTSEC: PUSH AF .NEXTSEC: PUSH AF
ADD IX,BC ADD IX,BC
ADC HL,DE ADC HL,DE
@ -1049,7 +1043,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
PUSH IX PUSH IX
PUSH HL PUSH HL
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
LD DE,DIR LD DE,DIR_BUFFER
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
CALL SEARCH CALL SEARCH
@ -1069,7 +1063,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
; ;
SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
LD IX, DIR - FAT_DIRECTORY_RECORD LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD
.SKIPNAM: LD DE,FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD
ADD IX,DE ADD IX,DE
DEC C DEC C
@ -1108,12 +1102,27 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
AND A ; ­  ¢ë室¥ ZF = CF = 0 AND A ; ­  ¢ë室¥ ZF = CF = 0
RET RET
; ; HL - CLUSTER ; HL - CLUSTER
; ; DE - ADDRESS ; DE - ADDRESS
; ;!TODO ᤥ« âì âãâ ®¯à¥¤¥«¥­¨¥ à §¬¥à  SYSTEM.DOS ¨ ¢®§¬®¦­®áâì § £à㧨âì ¡®«ìè¥ 1 áâà ­¨æë ; !TODO ᤥ« âì âãâ ®¯à¥¤¥«¥­¨¥ à §¬¥à  SYSTEM.DOS
; [ ] ¨ ¢®§¬®¦­®áâì § £à㧨âì ¡®«ìè¥ 1 áâà ­¨æë
LOAD_CORE: LD (READMEM),DE LOAD_CORE: LD (READMEM),DE
.loop: PUSH HL .loop: PUSH HL
CALL NSECTOR EXX
PUSH HL
EXX
;
CALL CLUSTER_TO_SECTOR
;
;LD A,(FatBuffer.FAT_TYPE)
; CP FAT_TYPE.x32
; JR NZ,.skip_it
;
LD DE,(PARTITION_START_L)
ADD IX,DE
LD DE,(PARTITION_START_H)
ADC HL,DE
;.skip_it: ;
LD DE,(READMEM) LD DE,(READMEM)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
.max_sectors+1: CP #20 .max_sectors+1: CP #20
@ -1126,6 +1135,10 @@ LOAD_CORE: LD (READMEM),DE
EX AF,AF' EX AF,AF'
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
EXX
POP HL
EXX
POP HL POP HL
;AND A ;AND A
RET RET
@ -1141,6 +1154,9 @@ LOAD_CORE: LD (READMEM),DE
LD DE,(FatBuffer.BytesPerCluster) LD DE,(FatBuffer.BytesPerCluster)
ADD HL,DE ADD HL,DE
LD (READMEM),HL LD (READMEM),HL
EXX
POP HL
EXX
POP HL POP HL
CCF CCF
RET NC RET NC
@ -1150,8 +1166,12 @@ LOAD_CORE: LD (READMEM),DE
LD (BIG_CORE),A LD (BIG_CORE),A
RET Z RET Z
; ;
CALL R_F_FAT CALL READ_FROM_FAT
;CALL R_F_FAT
RET C RET C
EXX
EX DE,HL
EXX
EX DE,HL EX DE,HL
JP .loop JP .loop
@ -1240,7 +1260,7 @@ LOAD_CORE: LD (READMEM),DE
; ;
/*
; --> HL - CLUSTER ; --> HL - CLUSTER
; <-- HL:IX - SECTOR ; <-- HL:IX - SECTOR
NSECTOR: LD DE,0 NSECTOR: LD DE,0
@ -1267,13 +1287,260 @@ NSECTOR: LD DE,0
LD E,A LD E,A
ADC HL,DE ADC HL,DE
; ;
LD DE,(DISKL) LD DE,(PARTITION_START_L)
ADD IX,DE ADD IX,DE
LD DE,(DISKH) LD DE,(PARTITION_START_H)
ADC HL,DE ADC HL,DE
RET RET
*/
;------------------------------------------------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; ¢ë室: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®)
; de - ­®¬¥à á«¥¤. ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; de' - ­®¬¥à á«¥¤. ª« áâ¥à  (áâ à襥 á«®¢®)
; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥­
; CF - ª®­¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------
READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
RET C
PUSH HL
;
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à
.FAT16: CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
;
LD HL,SERVICE_SECTORS.FAT16
.exit: POP AF
OUT (SLOT3),A
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
SBC HL,DE
POP HL
;!FIXIT fat32 ¯¥à¥áâà å®¢ª 
EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
RET
;
;
.FAT12: CALL GET_FAT12_CELL
LD E,(HL)
INC HL
LD D,(HL)
LD HL,SERVICE_SECTORS.FAT12
JR NC,.Correct_2
.Correct_1: LD A,E
AND #F0
DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RR D
RRA
EDUP
LD E,A
JR .exit
;
.Correct_2: LD A,D
AND #0F
LD D,A
JR .exit
;
.FAT32: EXX
PUSH HL
EXX
;
CALL GET_FAT32_CELL
; ¯à®ç¨â âì ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD E,(HL)
INC HL
LD D,(HL)
INC HL
; ¯à®ç¨â âì áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD A,(HL)
INC HL
EX AF,AF'
LD A,(HL)
EXX
AND #0F
LD D,A
EX AF,AF'
LD E,A
EXX
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë ¬« ¤è¥£® á«®¢  ª« áâ¥à 
LD HL,SERVICE_SECTORS.FAT32.Low
SBC HL,DE
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë áâ à襣® á«®¢  ª« áâ¥à 
EXX
LD HL,SERVICE_SECTORS.FAT32.High
SBC HL,DE
POP HL
EXX
POP BC
LD A,B
OUT (SLOT3),A
POP HL
LD A,0
RET
;
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
GET_FAT12_CELL: LD D,H
LD E,L
SRL H
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
PUSH AF ; á®åà. ä« £
ADD HL,DE ; CLUSTER * 1.5
;
IF FAT_CACHE.Size_12 < #1800
;!FIXIT ®¯â¨¬¨§¨à®¢ âì
LD A,H
LD B,H
;
AND #1F
;AND FAT_CACHE.Size_Mask_16
;
LD H,A
LD A,B
;
RLCA
RLCA
RLCA
;DUP FAT_CACHE.Degree_16
; RRCA
;EDUP
AND #07
;AND FAT_CACHE.Part_Mask_16
;
; [ ] ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
ENDIF
;
LD DE,FATPAGE.cache
ADD HL,DE
POP AF
RET
;
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT16_CELL: LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Size_Mask_16
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
DUP FAT_CACHE.Degree_16
RRCA
EDUP
;AND #0F
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
; [x] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A,H
EXX
LD C,A
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
LD A,C
;
LD B,FAT_CACHE.Degree ; 4 ᤢ¨£ 
.loop_block: RLCA ; << H
RL L ; << L'
RL H ; << H'
DJNZ .loop_block
EXX
; ¨â®£¥ âãâ ¢ HL' ­®¬¥à ¡«®ª  FAT
;
; HL - FAT32 OFFSET (FROM CASH)
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
ADD HL,HL
ADD HL,HL
PUSH HL ; [ç] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX
EX DE,HL
LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;
; [x] fat32 ;!TEST
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster
; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
CHECK_CLUSTER_IS_SMALLER:
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
EXX
EX DE,HL
LD HL,(FatBuffer.MaxClusterHigh)
; CF = 0
SBC HL,DE
EX DE,HL
EXX
LD A,DSS_Error.sys.DISK_FULL
RET C
RET NZ
; ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL
LD HL,(FatBuffer.MaxClusterLow)
SBC HL,DE
EX DE,HL
LD A,DSS_Error.sys.DISK_FULL
RET
;
/*
;----------------- ;-----------------
;!TODO ᤥ« âì íâ® ¬ ªà®á ¬¨ ¨«¨ ¨­ª«î¤ ¬¨ ã­¨¢¥àá «ì­ë¬¨. ¯®¢â®àïîâáï ¢ ¤®á¥ ¨ ¥éñ £¤¥-â®
; HL - CLUSTER ; HL - CLUSTER
; DE - (CLUSTER) ; DE - (CLUSTER)
R_F_FAT: PUSH HL R_F_FAT: PUSH HL
@ -1358,8 +1625,11 @@ R_F_FAT: PUSH HL
; POP HL ; POP HL
; RET ; RET
; ;
*/
;
; ;
/*
RE_FAT: PUSH HL RE_FAT: PUSH HL
LD L,A LD L,A
LD H,0 LD H,0
@ -1374,10 +1644,10 @@ RE_FAT: PUSH HL
EX DE,HL EX DE,HL
JR NC,.NOINX JR NC,.NOINX
INC IX INC IX
.NOINX: LD HL,(DISKL) .NOINX: LD HL,(PARTITION_START_L)
ADD HL,DE ADD HL,DE
EX DE,HL EX DE,HL
LD BC,(DISKH) LD BC,(PARTITION_START_H)
JR NC,.NOINX2 JR NC,.NOINX2
INC IX INC IX
.NOINX2: ADD IX,BC .NOINX2: ADD IX,BC
@ -1391,18 +1661,123 @@ RE_FAT: PUSH HL
RST ToBIOS_18 RST ToBIOS_18
POP HL POP HL
RET RET
*/
; ;
;RE_FAT:
;RX01
; <20>à®ç¨â âì ¢ ª¥è •• ᥪâ®à®¢ FAT- 
; DE - NEW FAT BLOCK
READ_FAT_TABLE: PUSH HL
;
EX DE,HL
LD (FatBuffer.CacheBlock),HL
;
CALL GET_SECTOR_OF_FAT
;
; BC:HL - ­®¬¥à «®£.ᥪâ®à 
LD DE,(FatBuffer.FAT1_SEC_L)
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,(FatBuffer.FAT1_SEC_H)
; JR NC,.no_inc
; INC HL
.no_inc: ADC HL,BC
; HL:IX - SECTOR FAT FOR READING
;
LD DE,(PARTITION_START_L)
ADD IX,DE
LD DE,(PARTITION_START_H)
ADC HL,DE
LD DE,FAT_SECTORS_BUFFER
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
;
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
LD BC,FAT_CACHE.Sectors_16*256 + BIOS.DRV_READ
JR NZ,.next
LD B,FAT_CACHE.Sectors_32
.next: LD A,(DRIVE)
RST ToBIOS_18
;
POP AF
OUT (SLOT3),A
POP HL
RET
;
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
; in: HL - Cache block
; out: C:HL - logical number
; B = 0
GET_SECTOR_OF_FAT:
LD A,(FatBuffer.FAT_TYPE)
LD B,FAT_CACHE.Degree_32 ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥­­ãî
XOR FAT_TYPE.x32
JR Z,.next
LD B,FAT_CACHE.Degree ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥­­ãî
XOR A
.next: LD C,A
;
.loop: ADD HL,HL ;x2
ADC A,C
DJNZ .loop
;
LD C,A
RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; Area for boot sector [512Bytes] ; Area for boot sector [512Bytes]
;BOOT _sBOOT_SECTOR_PARAMS = $ ;BOOT _sBOOT_SECTOR_PARAMS = $
BOOT_BUFFER EQU $ BOOT_BUFFER EQU $
DIR EQU BOOT_BUFFER+512 DIR_BUFFER EQU BOOT_BUFFER+512
;
FAT_SECTORS_BUFFER EQU DIR+512
VALUE EQU 3*512+FAT_SECTORS_BUFFER
; ;
;FAT_SECTORS_BUFFER EQU DIR_BUFFER+512
;VALUE EQU 3*512+FAT_SECTORS_BUFFER
FAT_SECTORS_BUFFER EQU #C000
VALUE EQU DIR_BUFFER+512
FatBuffer _sysFatBuffer = VALUE
/*
.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
.CacheBlock: WORD #0000
.CacheUpdated: BYTE #00
.RootDirStartCluster_L: WORD #0000
.RootDirStartCluster_H: WORD #0000 ; fat32
.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
.FAT1_SEC_H: WORD #0000 ; fat32
.FAT2_SEC_L: WORD #0000
.FAT2_SEC_H: WORD #0000 ; fat32
.Number_Of_FATs BYTE #02
.SectorsPerFAT_L WORD #0000
.SectorsPerFAT_H BYTE #00
.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF
.END_CHAIN_CLUSTER_H: WORD #0FFF
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.BytesPerSector: WORD #0000
.SectorsPerCluster: BYTE #00
.FSINFO_Sector: WORD #01
.BPB_SERIAL_NUMBER: DWORD #00000000
.BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
.UPD_FSINFO: BYTE 0
.FREE_CLUSTERS_COUNT_L: WORD #FFFF
.FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
FatBuffer EQU VALUE FatBuffer EQU VALUE
.CacheBlock EQU FatBuffer+0 ; FatCache .CacheBlock EQU FatBuffer+0 ; FatCache
.FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT .FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT
@ -1412,7 +1787,13 @@ FatBuffer EQU VALUE
.FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC .FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC
.FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) .FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit)
.BytesPerCluster EQU FatBuffer+12; CLU_LEN .BytesPerCluster EQU FatBuffer+12; CLU_LEN
.FAT1_SEC_H EQU FatBuffer+14 ;
.SectorsPerFAT_L EQU FatBuffer+16
.SectorsPerFAT_H EQU FatBuffer+18
.FAT2_SEC_L EQU FatBuffer+20
.FAT2_SEC_H EQU FatBuffer+22
;.END_CHAIN_CLUSTER_L EQU FatBuffer+14; ENDCLUS ;.END_CHAIN_CLUSTER_L EQU FatBuffer+14; ENDCLUS
*/
; FatCache EQU VALUE+0 ; .CacheBlock ; FatCache EQU VALUE+0 ; .CacheBlock
@ -1427,20 +1808,19 @@ FatBuffer EQU VALUE
HANDBUF EQU VALUE+16 HANDBUF EQU VALUE + _sysFatBuffer
FCLUSTER32 EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H FCLUSTER_H EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H
; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME ; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME
; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE ; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE
FCLUSTR EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L FCLUSTR_L EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L
FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE
FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2
PARTITION_START_H EQU FSIZE1+2
DISKH EQU VALUE+48 PARTITION_START_L EQU PARTITION_START_H+2
DISKL EQU VALUE+50 READMEM EQU PARTITION_START_L+2
READMEM EQU VALUE+52 BIG_CORE EQU READMEM+2
BANKDOS EQU BIG_CORE+1
;SHEL_FM EQU VALUE+54 ;SHEL_FM EQU VALUE+54
BIG_CORE EQU VALUE+54
BANKDOS EQU VALUE+55
; EQU VALUE+56 ; EQU VALUE+56
;----------------- ;-----------------
@ -1454,6 +1834,11 @@ BANKDOS EQU VALUE+55
;STACK EQU (($/256)+2)*256 ;STACK EQU (($/256)+2)*256
DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER
DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER
DISPLAY "FatBuffer ",/H,FatBuffer
ENT ENT
ENDMODULE
OUTEND OUTEND
;[]-----------------------------------------------------------[] ;[]-----------------------------------------------------------[]

View File

@ -18,12 +18,52 @@
; ¤¨áª¥â  ¤«ï á®§¤ ­¨ï ¨§ ­¥¥ § £à㧮筮©. ; ¤¨áª¥â  ¤«ï á®§¤ ­¨ï ¨§ ­¥¥ § £à㧮筮©.
; ;
; ;
STRUCT _sysFatBuffer
.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
.CacheBlock: WORD #0000
.CacheUpdated: BYTE #00
;.SectorsPerBank: BYTE #00
.RootDirStartCluster_L: WORD #0000
.RootDirStartCluster_H: WORD #0000 ; fat32
.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
.FAT1_SEC_H: WORD #0000 ; fat32
.FAT2_SEC_L: WORD #0000
.FAT2_SEC_H: WORD #0000 ; fat32
.Number_Of_FATs BYTE #02
.SectorsPerFAT_L WORD #0000
.SectorsPerFAT_H BYTE #00
.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF
.END_CHAIN_CLUSTER_H: WORD #0FFF
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.BytesPerSector: WORD #0000
.SectorsPerCluster: BYTE #00
.FSINFO_Sector: WORD #01
.BPB_SERIAL_NUMBER: DWORD #00000000
.BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
;.UPD_FSINFO: BYTE 0
;.FREE_CLUSTERS_COUNT_L: WORD #FFFF
;.FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
ENDS
include 'shared_includes/constants/sp2000.inc' include 'shared_includes/constants/sp2000.inc'
include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/bios_equ.inc'
include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/constants/dss_equ.inc'
include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/accelerator.z80'
include 'shared_includes/macroses/macros.z80' include 'shared_includes/macroses/macros.z80'
include 'shared_includes/structures/FileSystem.inc' include 'shared_includes/structures/FileSystem.inc'
;include 'DSS/structures.inc'
include '../DSS/defines.inc' include '../DSS/defines.inc'
DEFINE EXEinfoMACRO 0 DEFINE EXEinfoMACRO 0
@ -42,9 +82,10 @@
; ¢¥àá¨ï ¯à®£à ¬¬ë ; ¢¥àá¨ï ¯à®£à ¬¬ë
major_version equ 1 ; áâ. ­®¬¥à ¢¥àᨨ major_version equ 2 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 5 ; ¬«. ­®¬¥à minor_version equ 0 ; ¬«. ­®¬¥à
;; ;;
SECTORS_OF_LOADER EQU 4
org_addr EQU #8000 + CLP_Buffer org_addr EQU #8000 + CLP_Buffer
code_addr EQU BEGIN code_addr EQU BEGIN
@ -108,40 +149,40 @@ version_ok: xor a ;
ld hl,root_path ; "X:\" ª®à¥­ì ¤¨áª  ld hl,root_path ; "X:\" ª®à¥­ì ¤¨áª 
add a,'A' add a,'A'
ld (hl),a ld (hl),a
ld c,1Dh ; ᬥ­  ª â «®£  ld c,Dss.ChDir ; ᬥ­  ª â «®£ 
RST ToDSS RST ToDSS
;-------------------------------------------- ;--------------------------------------------
; —⥭¨¥ ä ©«  system.exe ; —⥭¨¥ ä ©«  system.exe
;-------------------------------------------- ;--------------------------------------------
ld hl,name2 ; ¨¬ï ä ©«  ld hl,name2 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
jr nc,read_file1_ok ;jr nc,read_file1_ok
; ®á¢®¡. ¡«®ª ¯ ¬ï⨠; ®á¢®¡. ¡«®ª ¯ ¬ïâ¨
read_file_err: ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠;read_file_err: ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
ld a,-1 ; ª®¤ ®è¨¡ª¨ ;ld a,DSS_Error.sys.DISK_FULL ; ª®¤ ®è¨¡ª¨
jp exit jp c,exit
; á®åà. à ¡. ï祩ª¨ ä ©«  system.exe ; á®åà. à ¡. ï祩ª¨ ä ©«  system.exe
read_file1_ok: ld hl,file_handle ; ®âªã¤  read_file1_ok: ld hl,FILE1_PARAMS ; ®âªã¤ 
ld de,hFile1 ; ªã¤  ld de,FILE2_PARAMS ; ªã¤ 
ld bc,6 ld bc,FILE2_PARAMS.dataSize
ldir ldir
;-------------------------------------------- ;--------------------------------------------
; —⥭¨¥ ä ©«  system.dos ; —⥭¨¥ ä ©«  system.dos
;-------------------------------------------- ;--------------------------------------------
ld hl,name1 ; ¨¬ï ä ©«  ld hl,name1 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
jr nc,read_file2_ok ;jr c,read_file_err
;ld a,DSS_Error.sys.DISK_FULL; ª®¤ ®è¨¡ª¨
jp c,exit
;jr nc,read_file2_ok
; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.exe ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.exe
file_err1: ld a,(id_mem) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠; file_err1: ld a,(FILE2_PARAMS.id_blck); ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
jr read_file_err ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.dos ;jr read_file_err ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.dos
confirm_flag+1: ld a,0
read_file2_ok:
confirm_flag+*: ld a,0
or a or a
jr z,no_confirm jr z,no_confirm
ld a,(boot_disk) ; á¨áâ. ¤¨áª ld a,(boot_disk) ; á¨áâ. ¤¨áª
@ -153,7 +194,7 @@ confirm_flag+*: ld a,0
ld (messages.lett2),a ld (messages.lett2),a
ld a,5 ; ¨­¤¥ªá áâப¨ "Insert destination disk..." ld a,5 ; ¨­¤¥ªá áâப¨ "Insert destination disk..."
call print_string call print_string
ld bc,3035h ; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨ ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
RST ToDSS RST ToDSS
no_confirm: ld a,2 ; ¨­¤¥ªá áâப¨ "Installing boot loader..." no_confirm: ld a,2 ; ¨­¤¥ªá áâப¨ "Installing boot loader..."
call print_string call print_string
@ -162,7 +203,7 @@ no_confirm: ld a,2 ;
ld hl,root_path ; "X:\" áâப  ¯ã⨠ld hl,root_path ; "X:\" áâப  ¯ãâ¨
add a,'A' add a,'A'
ld (hl),a ld (hl),a
ld c,1Dh ; ᬥ­  ⥪. ª â «®£  ld c,Dss.ChDir ; ᬥ­  ⥪. ª â «®£ 
RST ToDSS RST ToDSS
;-------------------------------------------- ;--------------------------------------------
; ‡ ¯¨á âì boot-§ £àã§ç¨ª ; ‡ ¯¨á âì boot-§ £àã§ç¨ª
@ -174,29 +215,29 @@ no_confirm: ld a,2 ;
; ‡ ¯¨áì ä ©«  system.dos ; ‡ ¯¨áì ä ©«  system.dos
ld hl,name1 ; ¨¬ï ä ©«  ld hl,name1 ; ¨¬ï ä ©« 
call write_file call write_file
jr nc,ok_write1 jr c,write_error
jr file_err1
;
ok_write1: ; ®á¢®¡®¤¨âì ¯ ¬ïâì ok_write1: ; ®á¢®¡®¤¨âì ¯ ¬ïâì
ld a,(id_blck) ; ¡«®ª system.dos ; ld a,(FILE1_PARAMS.id_blck) ; ¡«®ª system.dos
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
; ;
; § £à. à ¡. ï祩ª¨ ; § £à. à ¡. ï祩ª¨
ld hl,hFile1 ; ®âªã¤  ld hl,FILE2_PARAMS ; ®âªã¤ 
ld de,file_handle ; ªã¤  ld de,FILE1_PARAMS ; ªã¤ 
ld bc,6 ld bc,FILE1_PARAMS.dataSize
ldir ldir
; ‡ ¯¨áì ä ©«  system.exe ; ‡ ¯¨áì ä ©«  system.exe
ld hl,name2 ; ¨¬ï ä ©«  ld hl,name2 ; ¨¬ï ä ©« 
call write_file call write_file
; ®á¢®¡®¤¨âì ¯ ¬ïâì ; ®á¢®¡®¤¨âì ¯ ¬ïâì
push af ; push af
ld a,(id_blck) ; ¡«®ª system.exe ; ld a,(FILE1_PARAMS.id_blck) ; ¡«®ª system.exe
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
pop af ; pop af
jr c,exit ; ®è¨¡ª  ;
jr c,write_error
;jr c,exit ; ®è¨¡ª 
; ;
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
add a,'A' add a,'A'
@ -209,25 +250,24 @@ ok_write1: ;
; § ¯à®á¨âì á¨á⥬­ë© ¤¨áª ; § ¯à®á¨âì á¨á⥬­ë© ¤¨áª
ld a,(boot_disk) ; á¨áâ. ¤¨áª ld a,(boot_disk) ; á¨áâ. ¤¨áª
cp 2 cp 2
jr nc,exit-1 ; ­¥ ¤¨áª®¢®¤ë jr nc,.not_fdd ; ­¥ ¤¨áª®¢®¤ë
add a,'A' add a,'A'
ld (messages.lett3),a ld (messages.lett3),a
ld a,6 ; ¨­¤¥ªá áâப¨ "Insert system disk..." ld a,6 ; ¨­¤¥ªá áâப¨ "Insert system disk..."
call print_string call print_string
ld bc,3035h ; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨ ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
RST ToDSS RST ToDSS
xor a ; ª®¤ "Ok" .not_fdd: xor a ; ª®¤ "Ok"
exit: push af exit: push af
call restore_path ; ¢®ááâ. ⥪. ¤¨áª ¨ ¯ãâì call restore_path ; ¢®ááâ. ⥪. ¤¨áª ¨ ¯ãâì
port: ld a,-1 ; á®åà. ¯®àâ port: ld a,-1 ; á®åà. ¯®àâ
out (SLOT3),a out (SLOT3),a
pop af pop af
ld c,41h ; ¢ë室 ¢ „Ž‘ ld c,Dss.Exit ; ¢ë室 ¢ „Ž‘
ld b,a ld b,a
RST ToDSS RST ToDSS
jr $ jr $
;
help: ld a,8 ; ¨­¤¥ªá áâப¨ "Invalid drive specification" help: ld a,8 ; ¨­¤¥ªá áâப¨ "Invalid drive specification"
call print_string call print_string
ld a,4 ; ¨­¤¥ªá áâப¨ åí«¯  ld a,4 ; ¨­¤¥ªá áâப¨ åí«¯ 
@ -255,8 +295,8 @@ name2: db "SYSTEM.EXE",0
;------------------------------------------------- ;-------------------------------------------------
write_boot_loader: write_boot_loader:
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld c,1 ; open device ld c,Dss.DRV.Open ; open device
rst 18h rst ToDSS.DRV
ret c ret c
ld hl,close_device ; â®çª  ¢ë室  ld hl,close_device ; â®çª  ¢ë室 
push hl push hl
@ -264,10 +304,10 @@ write_boot_loader:
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤ ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ªã¤  ld de,buffer ; ªã¤ 
ld bc,0105h ; ¯à®ç¨â âì 1 ᥪâ®à (boot) ld bc,1*256 + Dss.DRV.Read ; ¯à®ç¨â âì 1 ᥪâ®à (boot)
rst 18h rst ToDSS.DRV
ret c ; ®è¨¡ª  ç⥭¨ï ret c ; ®è¨¡ª  ç⥭¨ï
ld a,(buffer+21) ; ¡ ©â ä®à¬ â  ld a,(buffer + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
cp #F0 ; 1.44Mb cp #F0 ; 1.44Mb
ret c ; ­¥§­ ª®¬ë© ä®à¬ â ret c ; ­¥§­ ª®¬ë© ä®à¬ â
jr z,write_to_floppy jr z,write_to_floppy
@ -285,8 +325,8 @@ write_boot_loader:
; § ªàëâì ¤¥¢ ©á ; § ªàëâì ¤¥¢ ©á
close_device: push af ; á®åà. ä« £ close_device: push af ; á®åà. ä« £
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld c,2 ; close device ld c,Dss.DRV.Close ; close device
rst 18h rst ToDSS.DRV
pop af pop af
ret ret
@ -298,38 +338,45 @@ close_device: push af ;
; ¢ë室: CF - ¯à¨ ®è¨¡ª¥ § ¯¨á¨ ; ¢ë室: CF - ¯à¨ ®è¨¡ª¥ § ¯¨á¨
;------------------------------------------------- ;-------------------------------------------------
write_to_floppy: write_to_floppy:
ld a,(buffer+16) ; ç¨á«® ª®¯¨© FAT-®¢ ld a,(buffer + BOOT_SECTOR.Number_of_FATs) ; ç¨á«® ª®¯¨© FAT-®¢
or a or a
scf scf
ret z ; ®è¨¡ª  ret z ; ®è¨¡ª 
dec a ; --ç¨á«® ª®¯¨© dec a ; --ç¨á«® ª®¯¨©
jr z,overwrite_floppy ; § £àã§ç¨ª 㦥 § ¯¨á ­, ¯¥à¥§ ¯¨á âì ¥£® jr z,overwrite_floppy ; § £àã§ç¨ª 㦥 § ¯¨á ­, ¯¥à¥§ ¯¨á âì ¥£®
; ­ áâநâì ï祩ª¨ boot-ᥪâ®à  ; ­ áâநâì ï祩ª¨ boot-ᥪâ®à 
ld (buffer+16),a ; ç¨á«® ª®¯¨© FAT-®¢ ld (buffer + BOOT_SECTOR.Number_of_FATs),a ; ç¨á«® ª®¯¨© FAT-®¢
ld hl,(buffer+14) ; § à¥§¥à¢. ᥪâ®à®¢ ld hl,(buffer + BOOT_SECTOR.RESERVED_SECTORS) ; § à¥§¥à¢. ᥪâ®à®¢
ld bc,(buffer+22) ; ᥪâ®à®¢ ­  FAT ld bc,(buffer + BOOT_SECTOR.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT
ld a,b ; ld a,b
or c ; or c
scf ; scf
ret z ; 0 ᥪâ®à®¢ ­  FAT ; ret z ; 0 ᥪâ®à®¢ ­  FAT
; ;
add hl,bc add hl,bc
ld (buffer+14),hl ; § à¥§¥à¢. ᥪâ®à®¢ ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; § à¥§¥à¢. ᥪâ®à®¢
ex hl,de
ld hl,SECTORS_OF_LOADER-1
and a
sbc hl,de
ccf
ret c
overwrite_floppy: overwrite_floppy:
; § ¯¨á âì boot-ᥪâ®à ­ § ¤ ; § ¯¨á âì boot-ᥪâ®à ­ § ¤
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤ ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤  ld de,buffer ; ®âªã¤ 
ld bc,0106h ; § ¯¨á âì 1 ᥪâ®à ld bc,1*256 + Dss.DRV.Write ; § ¯¨á âì 1 ᥪâ®à
rst 18h rst ToDSS.DRV
ret c ; ®è¨¡ª  § ¯¨á¨ ret c ; ®è¨¡ª  § ¯¨á¨
; § ¯¨á âì § £àã§ç¨ª ; § ¯¨á âì § £àã§ç¨ª
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤ ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª ) ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,0306h ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.) ld bc,SECTORS_OF_LOADER*256 + Dss.DRV.Write ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst 18h rst ToDSS.DRV
ret ret
@ -342,8 +389,8 @@ overwrite_floppy:
write_to_ram_disk: write_to_ram_disk:
write_to_: ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª  write_to_: ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
ld de,#55AA ld de,#55AA
ld bc,0 * 256 + 8 ld bc,Dss.DRV.GenIOCTL.GetParams
rst #18 rst ToDSS.DRV
ex af,af' ex af,af'
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
ld b,a ld b,a
@ -362,7 +409,7 @@ write_to_: ld a,(disk) ;
RST ToBIOS RST ToBIOS
POP BC POP BC
LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
LD DE,04 ;!HARDCODE ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1) LD DE,SECTORS_OF_LOADER + 1 ; ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1)
AND A AND A
SBC HL,DE SBC HL,DE
RET C RET C
@ -373,7 +420,7 @@ write_to_: ld a,(disk) ;
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤ ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª ) ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,3*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.) ld bc,SECTORS_OF_LOADER*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst ToBIOS rst ToBIOS
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
pop bc pop bc
@ -396,7 +443,7 @@ write_to_hard_disk:
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS RST ToBIOS
; check signature ; check signature
LD HL,(buffer+510) ;!HARDCODE Signature word LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55 LD DE,#AA55
AND A AND A
SBC HL,DE SBC HL,DE
@ -406,9 +453,9 @@ write_to_hard_disk:
PUSH BC PUSH BC
; set active in buffer ; set active in buffer
INC C INC C
LD HL,buffer + #01BE + #30 ;!HARDCODE MBR: Offset of last record of partition table in the MBR LD HL,buffer + _sBOOT_SECTOR.PARTITION_TABLE.Record_4
LD DE,#10 ; à §¬¥à ®¤­®© § ¯¨á¨ MBR LD DE,_sMBR_PARTITION_RECORD ; à §¬¥à ®¤­®© § ¯¨á¨ MBR
LD B,4 ;!HARDCODE MBR: Number of entries in the partition table LD B,_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD; MBR: Number of entries in the partition table
.loop: XOR A .loop: XOR A
LD (HL),A LD (HL),A
; ;
@ -434,6 +481,10 @@ write_to_hard_disk:
JR Z,.next JR Z,.next
CP PartitionSysTypes.FAT16_LBA CP PartitionSysTypes.FAT16_LBA
JR Z,.next JR Z,.next
CP PartitionSysTypes.FAT32
JR Z,.next
CP PartitionSysTypes.FAT32_LBA
JR Z,.next
; NOT SUPPORTED FS ; NOT SUPPORTED FS
POP BC POP BC
SCF SCF
@ -448,8 +499,9 @@ write_to_hard_disk:
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤ ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤  (ª®¤ § £àã§ç¨ª ) ld de,buffer ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,1*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.) ld bc,1*256 + BIOS.DRV_WRITE ; § ¯¨á âì 1 ᥪâ®à
JP ToBIOS RST ToBIOS
RET
; ;
;------------------------------------------------- ;-------------------------------------------------
; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨ ; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨
@ -461,7 +513,7 @@ write_to_hard_disk:
get_drive_letter: get_drive_letter:
inc hl ; ¡ãä¥à áâப¨ inc hl ; ¡ãä¥à áâப¨
ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà  ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
ld c,43h ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨ ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨
RST ToDSS RST ToDSS
ld de,buffer ld de,buffer
ld a,(de) ld a,(de)
@ -480,7 +532,7 @@ get_drive_letter:
jr c,get_drive_err jr c,get_drive_err
cp 'z'+1 cp 'z'+1
jr nc,get_drive_err jr nc,get_drive_err
res 5,a and %1101'1111
sub 'A' sub 'A'
or a or a
ret ret
@ -495,11 +547,11 @@ get_drive_err: scf ;
;---------------------------------------------------- ;----------------------------------------------------
; á®åà. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì ; á®åà. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;---------------------------------------------------- ;----------------------------------------------------
save_path: ld c,2 ; ã§­ âì ¤¨áª save_path: ld c,Dss.CurDisk ; ã§­ âì ¤¨áª
RST ToDSS RST ToDSS
ld (sys_disk),a ld (sys_disk),a
ld hl,sys_path ld hl,sys_path
ld c,1Eh ; ã§­ âì ¯ãâì ld c,Dss.CurDir ; ã§­ âì ¯ãâì
RST ToDSS RST ToDSS
ret ret
@ -508,38 +560,40 @@ save_path: ld c,2 ; 㧭
; ¢®ááâ. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì ; ¢®ááâ. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;---------------------------------------------------- ;----------------------------------------------------
restore_path: ld a,(sys_disk) restore_path: ld a,(sys_disk)
ld c,1 ; ᬥ­  ¤¨áª  ld c,Dss.ChDisk ; ᬥ­  ¤¨áª 
RST ToDSS RST ToDSS
ld hl,sys_path ld hl,sys_path
ld c,1Dh ; ᬥ­  ¯ã⨠ld c,Dss.ChDir ; ᬥ­  ¯ãâ¨
RST ToDSS RST ToDSS
ret ret
;
;
disk: db 0 ; ­®¬¥à § ¤ ­­®£® ¤¨áª  disk: db 0 ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
boot_disk: db 0 ; ­®¬¥à boot-¤¨áª  á¨á⥬ë boot_disk: db 0 ; ­®¬¥à boot-¤¨áª  á¨á⥬ë
; à ¡. ï祩ª¨ ⥪. ä ©«  ; à ¡. ï祩ª¨ ⥪. ä ©« 
; ;
; ç⥭¨¥: system.exe, ¤ «¥¥ system.dos ; ç⥭¨¥: system.exe, ¤ «¥¥ system.dos
; § ¯¨áì: system.dos, ¤ «¥¥ system.exe ; § ¯¨áì: system.dos, ¤ «¥¥ system.exe
file_handle: db -1 ; ¤¥áªà¨¯â®à ä ©«  FILE1_PARAMS:
id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ï⨠.handle: db -1 ; ¤¥áªà¨¯â®à ä ©« 
.id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
; ;
lsize: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©«  .sizeLow: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©« 
hsize: dw 0 ; áâ.à §àï¤ .sizeHigh: dw 0 ; áâ.à §àï¤
.dataSize EQU $-FILE1_PARAMS
; á®åà. ¤ ­­ë¥ system.exe ; á®åà. ¤ ­­ë¥ system.exe
hFile1: db -1 ; ¤¥áªà. ä ©«  FILE2_PARAMS:
id_mem: db -1 ; ¨¤¥­â¨ä. ¡«®ª  .handle: db -1 ; ¤¥áªà¨¯â®à ä ©« 
.id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
; ;
dw 0 ; ¬«.à §àï¤ .sizeLow: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©« 
dw 0 ; áâ.à §àï¤ .sizeHigh: dw 0 ; áâ.à §àï¤
.dataSize EQU $-FILE2_PARAMS
ASSERT FILE1_PARAMS.dataSize = FILE2_PARAMS.dataSize, "Erorr! FILE1_PARAMS != FILE2_PARAMS"
; ;
; ;
; ;
@ -550,8 +604,8 @@ messages: db 0
db "\r\nBoot and System files Installer v" ;0 db "\r\nBoot and System files Installer v" ;0
db major_version + '0','.' db major_version + '0','.'
db (minor_version / 10) + '0',(minor_version % 10) + '0','.' db (minor_version / 10) + '0',(minor_version % 10) + '0','.'
db "\r\n\nCopyright (c) 2006-2022 Vasil Ivanov." db "\r\n\nCopyright (c) 2006 Vasil Ivanov."
db "\r\n\nCopyright (c) 2023 Sprinter Team." db "\r\n\nCopyright (c) 2023-2024 Sprinter Team."
db "\r\n\n",0 db "\r\n\n",0
; ;
db "System successfully installed on disk " ;1 db "System successfully installed on disk " ;1
@ -586,7 +640,7 @@ messages: db 0
; ‚뢥á⨠áâப㠯® ¨­¤¥ªáã ; ‚뢥á⨠áâப㠯® ¨­¤¥ªáã
; ¢å®¤: a=¨­¤¥ªá áâப¨ ; ¢å®¤: a=¨­¤¥ªá áâப¨
print_string: call get_string ; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a' print_string: call get_string ; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a'
ld c,5Ch ; ¢ë¢®¤ áâப¨ ld c,Dss.PChars ; ¢ë¢®¤ áâப¨
RST ToDSS RST ToDSS
ret ret
@ -616,33 +670,43 @@ get_loop: ex af,af'
; ¢å®¤: hl=¨¬ï ä ©«  ; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: CF-¯à¨ ®è¨¡ª¥ ; ¢ë室: CF-¯à¨ ®è¨¡ª¥
;==================================================== ;====================================================
read_file: ld a,1 ; ­  ç⥭¨¥ read_file: ld a,Dss.Open.R ; ­  ç⥭¨¥
ld c,11h ; ®âªàëâì ä ©« ld c,Dss.Open ; ®âªàëâì ä ©«
RST ToDSS RST ToDSS
jr nc,ok ; ¡¥§ ®è¨¡®ª jr nc,.ok ; ¡¥§ ®è¨¡®ª
;
push af
ld a,9 ; ¨­¤¥ªá "Can't open file" ld a,9 ; ¨­¤¥ªá "Can't open file"
call print_string call print_string
scf pop af
ret
ok: ld (file_handle),a ; ¤¥áªà. ä ©« 
ld hl,0
ld ix,0
ld bc,0215h ; 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
RST ToDSS
ld (hsize),hl ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld (lsize),ix ; ¬«.à §àï¤
call get_memory ; à áç. ¨ ¢ë¤¥«. áâà ­¨æë ¯®¤ ä ©«
jr c,not_enough ; ­¥ 墠⠥⠯ ¬ïâ¨
call file_to_bank ; § £à. ä ©« ¢ áâà ­¨æë
close_file: ld a,(file_handle) ; ¤¥áªà. ä ©« 
ld c,12h ; § ªàëâì ä ©«
RST ToDSS
ret ret
; ;
not_enough: call close_file .ok: ld (FILE1_PARAMS.handle),a ; ¤¥áªà. ä ©« 
ld hl,0
ld ix,0
ld bc,Dss.Move_FP.FrEnd ; 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
RST ToDSS
ld (FILE1_PARAMS.sizeHigh),hl ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld (FILE1_PARAMS.sizeLow),ix ; ¬«.à §àï¤
call get_memory ; à áç. ¨ ¢ë¤¥«. áâà ­¨æë ¯®¤ ä ©«
jr c,.not_enough ; ­¥ 墠⠥⠯ ¬ïâ¨
call file_to_bank ; § £à. ä ©« ¢ áâà ­¨æë
.close_file: push af
ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,Dss.Close ; § ªàëâì ä ©«
RST ToDSS
pop af
ret
;
.not_enough: push af
call .close_file
ld a,10 ; ¨­¤¥ªá "Can't allocate memory" ld a,10 ; ¨­¤¥ªá "Can't allocate memory"
call print_string call print_string
pop af
or a
scf scf
ret nz
ld a,DSS_Error.sys.NOT_ENOUGH_MEMORY
ret ret
@ -652,9 +716,9 @@ not_enough: call close_file
; ç¨á«® áâà ­¨æ ¨ ¢ë¤¥«¨âì ¨å. ; ç¨á«® áâà ­¨æ ¨ ¢ë¤¥«¨âì ¨å.
; ‚ë室: CF - ¯à¨ ­¥å¢ âª¥ ¯ ¬ï⨠; ‚ë室: CF - ¯à¨ ­¥å¢ âª¥ ¯ ¬ïâ¨
;---------------------------------------------------- ;----------------------------------------------------
get_memory: ld hl,(hsize) ; áâ.à §àï¤ à §¬¥à  ä ©«  get_memory: ld hl,(FILE1_PARAMS.sizeHigh) ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld bc,(lsize) ; ¬«.à §àï¤ ld bc,(FILE1_PARAMS.sizeLow) ; ¬«.à §àï¤
ld de,4000h ; ¤¥«¨â¥«ì (à §¬¥à áâà ­¨æë) ld de,#4000 ; ¤¥«¨â¥«ì (à §¬¥à áâà ­¨æë)
xor a xor a
scf scf
malloc1: rr d malloc1: rr d
@ -669,7 +733,7 @@ malloc1: rr d
jr malloc1 jr malloc1
; ;
malloc2: or a malloc2: or a
jr z,$+3 jr z,$+3 ;!FIXIT $
inc bc inc bc
xor a xor a
cp b cp b
@ -677,9 +741,9 @@ malloc2: or a
ret nz ret nz
; ¢ë¤¥«¨âì ¡«®ª ¯ ¬ï⨠; ¢ë¤¥«¨âì ¡«®ª ¯ ¬ïâ¨
ld b,c ; b=ç¨á«® áâà ­¨æ ld b,c ; b=ç¨á«® áâà ­¨æ
ld c,3Dh ld c,Dss.GetMem
RST ToDSS RST ToDSS
ld (id_blck),a ; ¨¤¥­â¨ä. ¡«®ª  ld (FILE1_PARAMS.id_blck),a ; ¨¤¥­â¨ä. ¡«®ª 
ret ret
@ -688,39 +752,38 @@ malloc2: or a
;---------------------------------------------------- ;----------------------------------------------------
file_to_bank: ld hl,0 file_to_bank: ld hl,0
ld ix,0 ld ix,0
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld bc,0015h ; 㪠§ â¥«ì ­  ­ ç «® ä ©«  ld bc,Dss.Move_FP.FrStart ; 㪠§ â¥«ì ­  ­ ç «® ä ©« 
RST ToDSS RST ToDSS
ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ;ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld c,0C4h ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ld bc,0*256 + BIOS.GetMemPage; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst 08h rst ToBIOS
ret c ret c
loop_to_bank: push af .loop: push af
out (SLOT3),a out (SLOT3),a
ld hl,page_buffer ; #C000 ªã¤  ld hl,page_buffer ; #C000 ªã¤ 
ld de,4000h ; ᪮«ìª® ld de,#4000 ; ᪮«ìª®
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,13h ; ç¨â âì ä ©« ld c,Dss.Read ; ç¨â âì ä ©«
RST ToDSS RST ToDSS
pop bc pop bc
jr nc,ok_to_bank jr c,.error
ld a,12 ; ¨­¤¥ªá "Reading error" ; ok
cp -1 ; ¯à®ç¨â ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ret z ; ¤ 
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,BIOS.GetMemPageNext ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst ToBIOS
ret c
cp #FF
jr nz,.loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
; error
.error: ld a,12 ; ¨­¤¥ªá "Reading error"
call print_string call print_string
scf scf
ret ret
;
ok_to_bank: cp -1 ; ¯à®ç¨â ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ret z ; ¤ 
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,0C7h ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst 08h
ret c
cp 255
jr nz,loop_to_bank ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
;==================================================== ;====================================================
@ -728,72 +791,76 @@ ok_to_bank: cp -1 ;
; ¢å®¤: hl=¨¬ï ä ©«  ; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: CF-¯à¨ ®è¨¡ª¥ ; ¢ë室: CF-¯à¨ ®è¨¡ª¥
;==================================================== ;====================================================
write_file: ld a,20h ;  âਡãâ " à娢­ë©" write_file: ld a,FAT_ATTR.ARCHIVE ;  âਡãâ " à娢­ë©"
ld c,0Ah ; á®§¤ âì ä ©« ld c,Dss.Create ; á®§¤ âì ä ©«
RST ToDSS RST ToDSS
jr nc,create_ok ; ¡¥§ ®è¨¡®ª jr nc,.create_ok ; ¡¥§ ®è¨¡®ª
push af
ld a,13 ; ¨­¤¥ªá "Can't create file" ld a,13 ; ¨­¤¥ªá "Can't create file"
call print_string call print_string
scf pop af
ret ret
; ;
create_ok: ld (file_handle),a ; ¤¥áªà. ä ©«  .create_ok: ld (FILE1_PARAMS.handle),a ; ¤¥áªà. ä ©« 
ld hl,close_file ; § ªà. ä ©« ld hl,read_file.close_file ; § ªà. ä ©«
push hl ; â®çª  ¢ë室  push hl ; â®çª  ¢ë室 
; ;
; ç⥭¨¥ ä ©«  ¨§ ¡ ­®ª ¨ § ¯¨áì ­  ¤¨áª ; ç⥭¨¥ ä ©«  ¨§ ¡ ­®ª ¨ § ¯¨áì ­  ¤¨áª
ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ;ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld c,0C4h ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ld bc,BIOS.GetMemPage ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst 08h rst ToBIOS
ret c ret c
write_loop: push af .loop: push af
out (SLOT3),a out (SLOT3),a
ld hl,(lsize) ; ¬«.à §àï¤ à §¬¥à  ä ©«  ld hl,(FILE1_PARAMS.sizeLow) ; ¬«.à §àï¤ à §¬¥à  ä ©« 
ld de,(hsize) ; áâ.à §àï¤ ld de,(FILE1_PARAMS.sizeHigh) ; áâ.à §àï¤
ld bc,4000h ld bc,#4000
xor a xor a
sbc hl,bc sbc hl,bc
ld b,a ld b,a
ex de,hl ex de,hl
sbc hl,bc sbc hl,bc
ex de,hl ex de,hl
jr c,write_end ; § ¯¨á âì ®áâ â®ª jr c,.write_end ; § ¯¨á âì ®áâ â®ª
ld (lsize),hl ld (FILE1_PARAMS.sizeLow),hl
ld (hsize),de ld (FILE1_PARAMS.sizeHigh),de
; ;
ld hl,page_buffer ; #C000 ®âªã¤  ld hl,page_buffer ; #C000 ®âªã¤ 
ld de,4000h ; ᪮«ìª® ld de,#4000 ; ᪮«ìª®
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,14h ; § ¯¨áì ä ©«  ld c,Dss.Write ; § ¯¨áì ä ©« 
RST ToDSS RST ToDSS
pop bc pop bc
jr nc,write_ok jr c,.error
ld a,14 ; ¨­¤¥ªá "Writing error"
call print_string
scf
ret
; ;
write_ok: cp -1 ; § ¯¨á ­® ¬¥­ì襥 ç¨á«® ¡ ©â ? .write_ok: cp -1 ; § ¯¨á ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ld a,DSS_Error.sys.DISK_FULL
scf scf
ret z ; ¤ , ­  ¤¨áª¥ ­¥â ¬¥áâ  jr nz,.error ; ¤ , ­  ¤¨áª¥ ­¥â ¬¥áâ 
ld a,b ; a=䨧¨ç. áâà ­¨æ  ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,0C7h ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª  ld c,BIOS.GetMemPageNext ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst 08h rst ToBIOS
ret c ret c
cp 255 cp #FF
jr nz,write_loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ  jr nz,.loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret ret
; ;
write_end: pop af ; ¡ « ­á á⥪  .write_end: pop af ; ¡ « ­á á⥪ 
ld de,(lsize) ; ᪮«ìª® ld de,(FILE1_PARAMS.sizeLow) ; ᪮«ìª®
ld a,e ld a,e
or d or d
ret z ; 0 ¡ ©â®¢ ret z ; 0 ¡ ©â®¢
ld hl,page_buffer ; #C000 ®âªã¤  ld hl,page_buffer ; #C000 ®âªã¤ 
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,14h ; § ¯¨áì ä ©«  ld c,Dss.Write ; § ¯¨áì ä ©« 
RST ToDSS RST ToDSS
ret nc
;
.error: push af
ld a,14 ; ¨­¤¥ªá "Writing error"
call print_string
pop af
ret ret
@ -807,6 +874,6 @@ code_loader.size EQU $-code_loader
; 512 ¡ ©â, ¡ãä¥à boot-ᥪâ®à  ; 512 ¡ ©â, ¡ãä¥à boot-ᥪâ®à 
buffer equ $ buffer equ $
sys_disk equ buffer+513 ; ¤¨áª á¨á⥬ë sys_disk equ buffer+512 ; ¤¨áª á¨á⥬ë
sys_path equ sys_disk+1 ; ¯ãâì á¨á⥬ë sys_path equ sys_disk+1 ; ¯ãâì á¨á⥬ë

View File

@ -544,12 +544,12 @@ EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ;
LEAVE: LD A,B LEAVE: LD A,B
LD (ErrorLevel),A LD (ErrorLevel),A
CALL FREE_PROCESS_MEMORY CALL FREE_PROCESS_MEMORY
LD SP,(EXSTACK)
;[x] 10/12/23 close EXE FMs ;[x] 10/12/23 close EXE FMs
CALL FREE_PROCESS_FMs CALL FREE_PROCESS_FMs
; ;
_mDECTASK _mDECTASK
; LD SP,(EXSTACK)
; âãâ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥!
POP AF POP AF
POP HL POP HL
OUT (SLOT1),A OUT (SLOT1),A
@ -561,6 +561,7 @@ LEAVE: LD A,B
POP HL POP HL
LD (EXSTACK),SP LD (EXSTACK),SP
LD SP,HL LD SP,HL
;
EX DE,HL EX DE,HL
LD A,(ErrorLevel) LD A,(ErrorLevel)
;R12 ;R12
@ -572,6 +573,9 @@ LEAVE: LD A,B
JP (HL) JP (HL)
; ;
.norm_exit: AND A .norm_exit: AND A
;!TEST
EI
;
JP (HL) JP (HL)
;///////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////

View File

@ -81,15 +81,15 @@ DISKINF: LD C,B
LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; ;
;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL
CALL GET_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
; fat32 ; fat32
EXX EXX
PUSH DE PUSH DE
PUSH HL PUSH HL
EXX EXX
;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL
CALL GET_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
PUSH DE PUSH DE
LD A,XH LD A,XH
LD DE,Dss.DRV.GenIOCTL.Enter LD DE,Dss.DRV.GenIOCTL.Enter

View File

@ -722,8 +722,9 @@ RD_BPB: ; LD C,SLOT3
LD C,A LD C,A
LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC
LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32
;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
; ;
; ;
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
@ -754,7 +755,8 @@ RD_BPB: ; LD C,SLOT3
JR NZ,.loop1 JR NZ,.loop1
; ;
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC
;
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,B LD A,B
AND A AND A
@ -979,18 +981,17 @@ RD_BPB: ; LD C,SLOT3
LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL
LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL
; ;
.mirrored_FATs: ; .mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL
LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL
; ;
EXX EXX
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster)
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL
LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE
; ;
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR.no_prepare
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL
; ;
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector)
LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL

View File

@ -968,17 +968,17 @@ GET_FAT12_CELL:
;[x] fat32 ;!TEST ;[x] fat32 ;!TEST
;NSECTOR: ;CLUSTER_TO_SECTOR:
; in: HL':HL - CLUSTER ; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR ; out: HL:IX - SECTOR
CLUSTER_TO_SECTOR: CLUSTER_TO_SECTOR:
PUSH BC
EXX EXX
PUSH HL PUSH HL
EXX EXX
POP DE POP DE
; DE:HL - cluster ; DE:HL - cluster
; ;
.no_prepare: PUSH BC
LD BC,-2 LD BC,-2
ADD HL,BC ADD HL,BC
JR C,.no_dec_de JR C,.no_dec_de

View File

@ -100,14 +100,14 @@
.END_CHAIN_CLUSTER_H: WORD #0FFF .END_CHAIN_CLUSTER_H: WORD #0FFF
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.BytesPerSector WORD #0000 .BytesPerSector: WORD #0000
.SectorsPerCluster BYTE #00 .SectorsPerCluster: BYTE #00
.FSINFO_Sector WORD #01 .FSINFO_Sector: WORD #01
.BPB_SERIAL_NUMBER DWORD #00000000 .BPB_SERIAL_NUMBER: DWORD #00000000
.BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS .BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
.UPD_FSINFO BYTE 0 .UPD_FSINFO: BYTE 0
.FREE_CLUSTERS_COUNT_L WORD #FFFF .FREE_CLUSTERS_COUNT_L: WORD #FFFF
.FREE_CLUSTERS_COUNT_H WORD #FFFF .FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥ ;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï))) ;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))

View File

@ -1 +1 @@
987 988