DSS boot loader: trying to optimize for size

This commit is contained in:
Anatoliy Belyanskiy 2024-06-08 05:23:00 +10:00
parent cac616722c
commit fda917aed8
5 changed files with 182 additions and 381 deletions

View File

@ -47,49 +47,28 @@ DRIVE: _mSYSID
RET C ; goto FAIL RET C ; goto FAIL
LD A,(DRIVE) LD A,(DRIVE)
BIT 7,A BIT 7,A
JP Z,GOOD_DRIVE JR Z,GOOD_DRIVE
EX DE,HL EX DE,HL
LD DE,2*256 + 21 ;!HARDCODE ¥á«¨ ¢¥àá¨ï ­¨¦¥ 2.21, â® ®è¨¡ª  LD DE,2*256 + 21 ;!HARDCODE ¥á«¨ ¢¥àá¨ï ­¨¦¥ 2.21, â® ®è¨¡ª 
SBC HL,DE SBC HL,DE
LD HL,MESSAGES.INCORR LD HL,MESSAGES.INCORR
RET C ; goto FAIL RET C ; goto FAIL
JP GOOD_DRIVE ;
GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD HL,0
LD IX,2
LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; ¤®§ £à㧪  ᥪâ®à®¢ § £àã§ç¨ª 
LD A,(DRIVE)
RST ToBIOS_18
JP NC,CONTINUE
JR FAIL.NULL
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
FAIL: CALL MESSAGE FAIL: CALL MESSAGE
.NULL: LD HL,MESSAGES.FAILURE .NULL: LD HL,MESSAGES.FAILURE
CALL MESSAGE CALL MESSAGE
DI
HALT
JR $ JR $
; ;
MESSAGE: ;R01 Start
;
; DOSMESS: CALL FMESAGE
; LD C,Dss.PChars
; RST ToDSS
; RET
;
;
; FMESAGE: LD HL,MSG0
; LD BC,MSGE-MSG0
; INC A
; EX AF,AF'
; XOR A
; EX AF,AF'
; .NEXTMSG: EX AF,AF'
; CPIR
; RET PO
; RET NZ
; EX AF,AF'
; DEC A
; JR NZ,.NEXTMSG
; RET
;
;
MESSAGE: ;CALL FMESAGE
;R01 Start
XOR A XOR A
OUT (SYS_PORT.ON),A OUT (SYS_PORT.ON),A
.loop: LD A,(HL) ;R01 .loop: LD A,(HL) ;R01
@ -124,9 +103,11 @@ PRINTX: CP "\r" ;
LD DE,#0020 LD DE,#0020
LD BC,1*256 + BIOS.LP_SCROLL_UD LD BC,1*256 + BIOS.LP_SCROLL_UD
RST ToBIOS_18 RST ToBIOS_18
;
LD DE,#1F00 LD DE,#1F00
LD C,BIOS.LP_SET_PLACE LD C,BIOS.LP_SET_PLACE
RST ToBIOS_18 RST ToBIOS_18
;
LD A," " LD A," "
LD BC,#50 + BIOS.LP_PRINT_SYM LD BC,#50 + BIOS.LP_PRINT_SYM
RST ToBIOS_18 RST ToBIOS_18
@ -139,56 +120,30 @@ PRINTX: CP "\r" ;
RET ;R01 RET ;R01
;R01 End ;R01 End
; FAILURE EQU 0
; INCORR EQU 1
; ERRPART EQU 2
; ERRIBPB EQU 3
; NO_SYS EQU 4
; NOSHELL EQU 5
; STARTDO EQU 6
;a BIOS version that is incompatible with this version of DOS
MESSAGES:; 0 10 20 30 40 50 60 70 80 MESSAGES:; 0 10 20 30 40 50 60 70 80
.FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0 .FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0
.INCORR: DB "\r\nUnsupported BIOS version! Update BIOS to run this version of DSS.\r\n",0 .INCORR: DB "\r\nOld BIOS version.\r\n",0
.ERRPART: DB "\r\nUnknown partition table.",0 .ERRPART: DB "\r\nUnknown partition table.",0
.ERRIBPB: DB "\r\nInvalid BOOT sector.",0 .ERRIBPB: DB "\r\nInvalid BOOT sector.",0
.NO_SYS: DB "\r\nCan't open file SYSTEM.DOS...",0 .NO_SYS: DB "\r\nCan't open SYSTEM.DOS...",0
.NOSHELL: DB "\r\nCan't open file SYSTEM.EXE...",0 .NOSHELL: DB "\r\nCan't open SYSTEM.EXE...",0
.STARTDO: DB "\r\nStarting DSS... \r\n\n",0 .STARTDO: DB "\r\nStarting DSS... \r\n\n",0
; ;
SHELL_NAME: DB '\SYSTEM.EXE /P',0 SHELL_NAME: DB '\SYSTEM.EXE /P',0
ROOT: DB 'X:\',0 ROOT: DB 'X:\',0
CORE_NAME: DB "SYSTEM DOS" CORE_NAME: DB "SYSTEM DOS"
.Size EQU $-CORE_NAME .Size EQU $-CORE_NAME
FATMSG: DB "FAT"
////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
ASSERT $<#8200, "Error!!! BIOS LOADING ONLY FIRST #200 BYTES" ASSERT $<#8200, "Error!!! BIOS LOADING ONLY FIRST #200 BYTES"
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
CONTINUE: LD HL,0
////////////////////////////////////////////////////////////////////////
GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD HL,0
LD IX,2
LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; ¤®§ £à㧪  ᥪâ®à®¢ § £àã§ç¨ª 
LD A,(DRIVE)
RST ToBIOS_18
JP C,FAIL.NULL
;
; CONTINUE
LD HL,0
LD (PARTITION_START_L),HL LD (PARTITION_START_L),HL
LD (PARTITION_START_H),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
LD (BANKDOS),A LD (LOAD_CORE.BANKDOS),A
; ;
OUT (SLOT0),A OUT (SLOT0),A
; ;
@ -196,6 +151,7 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD HL,MESSAGES.ERRIBPB LD HL,MESSAGES.ERRIBPB
RET C ; goto FAIL RET C ; goto FAIL
CALL GETROOT CALL GETROOT
;
LD HL,MESSAGES.NO_SYS LD HL,MESSAGES.NO_SYS
RET C ; goto FAIL RET C ; goto FAIL
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢ ; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
@ -208,7 +164,7 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
SBC HL,DE SBC HL,DE
JR NC,.set_no_size JR NC,.set_no_size
.set_size: LD A,#FF .set_size: LD A,#FF
.set_no_size: LD (BIG_CORE),A .set_no_size: LD (LOAD_CORE.BIG_CORE),A
OR A OR A
PUSH AF PUSH AF
; § £à㧪  ; § £à㧪 
@ -226,10 +182,10 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
JR C,.no_big_core JR C,.no_big_core
; ;
IN A,(SLOT1) IN A,(SLOT1)
LD (BANKDOS),A LD (LOAD_CORE.BANKDOS),A
LD A,SUBLOAD_SIZE LD A,SUBLOAD_SIZE
LD (LOAD_CORE.max_sectors),A LD (LOAD_CORE.max_sectors),A
LD (BIG_CORE),A ; ⥯¥àì íâ® áçñâ稪 ®áâ ¢è¨åáï ᥪâ®à®¢ LD (LOAD_CORE.BIG_CORE),A ; ⥯¥àì íâ® áçñâ稪 ®áâ ¢è¨åáï ᥪâ®à®¢
; ;
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢ CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
@ -255,8 +211,6 @@ RUN_CORE: DI
LD B,#1F ;1FFD LD B,#1F ;1FFD
OUT (C),A OUT (C),A
; ;
; LD A,(BANKDOS)
; OUT (SLOT0),A
;DOS LOADED ;DOS LOADED
;IF UNIVERSAL_BOOT ;IF UNIVERSAL_BOOT
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
@ -319,20 +273,6 @@ RUN_CORE: DI
JP NZ,FAIL JP NZ,FAIL
JP FAIL.NULL JP FAIL.NULL
; .NoShell: LD HL,MESSAGES.NOSHELL
; JP C,FAIL
; LD HL,MESSAGES.FAILURE
; JP FAIL
; XFAIL: CALL DOSMESS
; .fail: LD HL,MESSAGES.FAILURE
; CALL DOSMESS
; DI
; HALT
; .halt: JR .halt
;
; ;
INC_SECTOR_NUM: PUSH DE INC_SECTOR_NUM: PUSH DE
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR
@ -345,22 +285,14 @@ INC_SECTOR_NUM: PUSH DE
LD BC,RUN_CORE LD BC,RUN_CORE
PUSH BC PUSH BC
PUSH HL ; ¤«ï ¡ « ­á  PUSH HL ; ¤«ï ¡ « ­á 
;EXX
PUSH HL ; ¤«ï ¡ « ­á  PUSH HL ; ¤«ï ¡ « ­á 
;EXX
JP LOAD_CORE.subload JP LOAD_CORE.subload
; CALL .set_stack
; JP RUN_CORE
; .set_stack: PUSH HL
; JP LOAD_CORE.subload
; ;
; ;
PART_TB: PUSH BC PART_TB: PUSH BC
LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55 LD DE,#AA55
;AND A
; CF = 0 ; CF = 0
SBC HL,DE SBC HL,DE
SCF SCF
@ -368,21 +300,23 @@ PART_TB: PUSH BC
LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE
LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD)
; ;
LD HL,YEPDOS
PUSH HL
.part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) .part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID)
; …‘‹ˆ ¤®¡ ¢¨âáï ¯®¤¤¥à¦ª  ¥éñ ®¤­®£® ⨯  ”‘, â® ¯®¬¥­ïâì 1 ­  2 ; …‘‹ˆ ¤®¡ ¢¨âáï ¯®¤¤¥à¦ª  ¥éñ ®¤­®£® ⨯  ”‘, â® ¯®¬¥­ïâì 1 ­  2
; 1 ; 1
CP PartitionSysTypes.FAT16_LBA CP PartitionSysTypes.FAT16_LBA
JR Z,YEPDOS RET Z ;JR Z,YEPDOS
CP PartitionSysTypes.FAT16 CP PartitionSysTypes.FAT16
JR Z,YEPDOS RET Z ;JR Z,YEPDOS
CP PartitionSysTypes.FAT16_32Mb CP PartitionSysTypes.FAT16_32Mb
JR Z,YEPDOS RET Z ;JR Z,YEPDOS
CP PartitionSysTypes.FAT12 CP PartitionSysTypes.FAT12
JR Z,YEPDOS RET Z ;JR Z,YEPDOS
CP PartitionSysTypes.FAT32 CP PartitionSysTypes.FAT32
JR Z,YEPDOS RET Z ;JR Z,YEPDOS
CP PartitionSysTypes.FAT32_LBA CP PartitionSysTypes.FAT32_LBA
JR Z,YEPDOS RET Z ;JR Z,YEPDOS
; ;
; 2 ; 2
;EXX ;EXX
@ -416,8 +350,7 @@ PART_TB: PUSH BC
; .Size EQU $-SUPPORTED_PARTITIONS ; .Size EQU $-SUPPORTED_PARTITIONS
; ;
;
YEPDOS: ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® YEPDOS: ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,#80 LD A,#80
CP (IX + _sMBR_PARTITION_RECORD.isActive) CP (IX + _sMBR_PARTITION_RECORD.isActive)
@ -426,13 +359,13 @@ YEPDOS: ;[ ] 17.12.2023
SUB B SUB B
PUSH AF ; ­®¬¥à § £à㧮筮£® à §¤¥«  PUSH AF ; ­®¬¥à § £à㧮筮£® à §¤¥« 
; ;
LD E,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0) LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0)
LD D,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1)
PUSH HL
LD (PARTITION_START_L),HL
LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2) LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3)
PUSH DE
POP IX POP IX
LD (PARTITION_START_L),IX
LD (PARTITION_START_H),HL LD (PARTITION_START_H),HL
LD A,(DRIVE) LD A,(DRIVE)
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
@ -443,7 +376,6 @@ YEPDOS: ;[ ] 17.12.2023
POP BC POP BC
LD L,A ; ­®¬¥à § £à㧮筮£® à §¤¥«  LD L,A ; ­®¬¥à § £à㧮筮£® à §¤¥« 
LD A,C LD A,C
;LD A,C
; ;
RET RET
; ;
@ -596,8 +528,18 @@ GET_BPB: LD IX,#0000
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;/* ;/*
GET_BPB: LD IX,#0000 GET_BPB: LD HL,#0000
LD HL,#0000 ;
LD (FatBuffer.FAT1_SEC_H),HL ; high word first sector FAT #1 ; fat32
LD (FatBuffer.RootDirFirstSector_H),HL
;LD (FatBuffer.CacheBlock),HL
XOR A
LD (FatBuffer.SectorsPerFAT_H),A ; fat32
;
PUSH HL
POP IX
; LD IX,#0000
; LD HL,#0000
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
LD A,(DRIVE) LD A,(DRIVE)
@ -625,58 +567,28 @@ GET_BPB: LD IX,#0000
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack)
LD L,A LD L,A
POP AF POP AF
;PUSH AF
LD C,BIOS.DRV_SET_PAR LD C,BIOS.DRV_SET_PAR
RST ToBIOS_18 RST ToBIOS_18
;POP BC ;
;LD A,C ; ­ å¥à ?
;RET
.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) .NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55 LD DE,#AA55
AND A ;AND A
SBC HL,DE SBC HL,DE
SCF SCF
RET NZ RET NZ
; ;
;RD_BPB: ; CALL READ_BPB
; JP C,DOS_X_Error.Not_ready
; ;
; LD DE,#AA55 ; ᨣ­ âãà  ;R05
; LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
; ;R05
; AND A
; SBC HL,DE
; JP NZ,DOS_X_Error.UnknownBPB
;
; ;R08 ; [x] fat32
; LD HL,BOOT_BUFFER
; LD DE,BootSector
; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size
; LDIR
;
LD A,(BOOT_BUFFER + BOOT_SECTOR.DRIVE_TYPE) LD A,(BOOT_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
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 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
; fat32
XOR A
LD B,A
LD C,A
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.RootDirFirstSector_H),BC
LD (FatBuffer.SectorsPerFAT_H),A ; fat32
;
; ;
LD BC,0
LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
LD A,E LD A,E
OR D OR D
@ -688,16 +600,14 @@ GET_BPB: LD IX,#0000
LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32)
.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE .skip_high: LD (FatBuffer.SectorsPerFAT_L),DE
LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs
LD (FatBuffer.Number_Of_FATs),A
CP 1 CP 1
JR Z,.one_FAT JR Z,.one_FAT
DEC A DEC A
ADD HL,DE ADD HL,DE
LD (FatBuffer.FAT2_SEC_L),HL
JR NC,.no_inc_BC JR NC,.no_inc_BC
INC BC INC BC
.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC .no_inc_BC: ;
.one_FAT: ;C_DATA1 .one_FAT: ;
.loop1: ADD HL,DE .loop1: ADD HL,DE
JR NC,.loop1_1 JR NC,.loop1_1
INC BC INC BC
@ -706,7 +616,7 @@ GET_BPB: LD IX,#0000
; ;
LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD (FatBuffer.FirstDataSector_H),BC LD (FatBuffer.FirstDataSector_H),BC
LD BC,(FatBuffer.BytesPerSector) LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
LD A,B LD A,B
AND A AND A
; ;
@ -719,10 +629,6 @@ GET_BPB: LD IX,#0000
; ;
LD C,A LD C,A
LD B,0 ; BC - File handels in sectors LD B,0 ; BC - File handels in sectors
;;;;
IF COMPILE_UNUSED_CODE
LD (FatBuffer.FilesPerSector),A
ENDIF
; ;
EX DE,HL EX DE,HL
LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32
@ -748,10 +654,8 @@ 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,(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)
;!TODO FATcacheSize ;!TODO FATcacheSize
; calc. cluster size ; calc. cluster size
XOR 1 XOR 1
@ -762,47 +666,24 @@ GET_BPB: LD IX,#0000
JP NC,.loop3 JP NC,.loop3
.loop3.end: ; .loop3.end: ;
LD (FatBuffer.BytesPerCluster),HL LD (FatBuffer.BytesPerCluster),HL
; fat32
LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive)
LD DE,(FatBuffer.FirstDataSector_L) LD BC,0
LD A,H LD A,H
OR L OR L
JP NZ,.HDDSMAL JP NZ,.HDDSMAL
; ;
LD HL,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) LD HL,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L)
LD BC,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) LD BC,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H)
.HDDSMAL: ;
PUSH BC ; Total Sectors high PUSH BC ; Total Sectors high
PUSH HL ; Total Sectors low PUSH HL ; Total Sectors low
AND A
SBC HL,DE
JP NC,.HDDBIG
DEC BC
JP .HDDBIG
;
.HDDSMAL: ; CF = 0
LD BC,0
PUSH BC ; Total Sectors high
PUSH HL ; Total Sectors low
SBC HL,DE
;
.HDDBIG: CALL SectorToCluster
INC HL
LD (FatBuffer.MaxClusterLow),HL
LD A,L
OR H
JR NZ,.no_inc_bc
INC BC
.no_inc_bc: LD (FatBuffer.MaxClusterHigh),BC
;
XOR A XOR A
LD H,A ;LD H,A
LD L,A ;LD L,A
LD (FatBuffer.CacheBlock),HL ;LD (FatBuffer.CacheBlock),HL
LD (FatBuffer.CacheUpdated),A
; A = 0 ; A = 0
LD HL,(FatBuffer.SectorsPerFAT_H) LD DE,(FatBuffer.SectorsPerFAT_H)
LD H,A LD D,A
EX DE,HL
LD HL,(FatBuffer.SectorsPerFAT_L) LD HL,(FatBuffer.SectorsPerFAT_L)
; DE:HL = SectorsPerFAT ; DE:HL = SectorsPerFAT
; ;
@ -840,10 +721,31 @@ 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)
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
CALL DIV_for_SPC ;CALL DIV_for_SPC
LD C,A
DEC A
JR Z,.DIV_exit
;
AND E
LD B,A ; ®áâ â®ª
LD A,C
RRCA
;
.DIV_loop: SRL H
RR L
RR D
RR E
RRCA
JP NC,.DIV_loop
LD A,B
.DIV_exit: LD B,D
LD C,E
EX DE,HL
LD H,0
LD L,A
;
; ¢ëïá­ï¥¬ à §à來®áâì FAT ; ¢ëïá­ï¥¬ à §à來®áâì FAT
LD A,D LD A,D
OR E OR E
@ -851,29 +753,13 @@ GET_BPB: LD IX,#0000
; ;
LD HL,4084 LD HL,4084
SBC HL,BC SBC HL,BC
JR NC,.its_FAT12 LD A,FAT_TYPE.x12
JR NC,.SET_VARS
; ;
LD HL,65525 LD HL,65525
SBC HL,BC SBC HL,BC
JR C,.its_FAT32
;
; It's FAT16
LD HL,#FFFF
LD A,FAT_TYPE.x16 LD A,FAT_TYPE.x16
.set_vars: EXX JR NC,.SET_VARS
LD HL,0
LD (FatBuffer.END_CHAIN_CLUSTER_H),HL
LD (FatBuffer.RootDirStartCluster_L),HL
LD (FatBuffer.RootDirStartCluster_H),HL
LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT.LABEL
EXX
LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER)
LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2)
JR .SET_VARS
;
.its_FAT12: LD HL,#0FFF
LD A,FAT_TYPE.x12
JR .set_vars
; ;
.its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber) .its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber)
CP #80 CP #80
@ -883,104 +769,62 @@ GET_BPB: LD IX,#0000
LD DE,(FatBuffer.SectorsPerFAT_H) LD DE,(FatBuffer.SectorsPerFAT_H)
LD D,0 LD D,0
EXX EXX
LD HL,(FatBuffer.FAT1_SEC_L) LD HL,(FatBuffer.FAT1_SEC_L)
LD DE,(FatBuffer.SectorsPerFAT_L) LD DE,(FatBuffer.SectorsPerFAT_L)
AND #0F AND #0F
JR Z,.first_FAT_active JR Z,.first_FAT_active
LD B,A LD B,A
; ;
.fat_calc_loop: ADD HL,DE .fat_calc_loop: ADD HL,DE
EXX EXX
ADC HL,DE ADC HL,DE
EXX EXX
DJNZ .fat_calc_loop DJNZ .fat_calc_loop
; ;
.first_FAT_active: .first_FAT_active:
LD (FatBuffer.FAT1_SEC_L),HL LD (FatBuffer.FAT1_SEC_L),HL
LD (FatBuffer.FAT2_SEC_L),HL
EXX EXX
LD (FatBuffer.FAT1_SEC_H),HL LD (FatBuffer.FAT1_SEC_H),HL
LD (FatBuffer.FAT2_SEC_H),HL
;
.mirrored_FATs: ; .mirrored_FATs: ;
LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT32.LABEL LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster)
LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
CALL CLUSTER_TO_SECTOR.no_prepare
LD (FatBuffer.RootDirFirstSector_L),IX
LD (FatBuffer.RootDirFirstSector_H),HL
LD A,FAT_TYPE.x32
; ;
EXX .SET_VARS: LD (FatBuffer.FAT_TYPE),A
LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster)
LD (FatBuffer.RootDirStartCluster_L),HL
LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
LD (FatBuffer.RootDirStartCluster_H),DE
;
CALL CLUSTER_TO_SECTOR.no_prepare
LD (FatBuffer.RootDirFirstSector_L),IX
LD (FatBuffer.RootDirFirstSector_H),HL
;
LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector)
LD (FatBuffer.FSINFO_Sector),HL
;
LD A,FAT_TYPE.x32
LD HL,#0FFF
LD (FatBuffer.END_CHAIN_CLUSTER_H),HL
LD H,L
LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER)
LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2)
;
.SET_VARS: LD (FatBuffer.FAT_TYPE),A
LD (FatBuffer.END_CHAIN_CLUSTER_L),HL
LD (FatBuffer.BPB_SERIAL_NUMBER),DE
LD (FatBuffer.BPB_SERIAL_NUMBER+2),BC
EXX
LD DE,FatBuffer.BPB_LABEL
LD BC,11 ;!HARDCODE
LDIR
LD DE,0 LD DE,0
CALL READ_FAT_TABLE CALL READ_FAT_TABLE
AND A AND A
RET RET
; ;
;;;;;;;; ;;;;;;;;
; --> BC:HL - Sector
; <-- BC:HL - Cluster
SectorToCluster:
LD A,B
AND #0F
LD B,A
LD A,(FatBuffer.SectorsPerCluster)
;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
SCF
.loop: RRA
RET C
RR B
RR C
RR H
RR L
JP .loop
; ;
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
DIV_for_SPC: ; DIV_for_SPC:
LD C,A ; LD C,A
DEC A ; DEC A
JR Z,.exit ; JR Z,.DIV_exit
; ; ;
AND E ; AND E
LD B,A ; ®áâ â®ª ; LD B,A ; ®áâ â®ª
LD A,C ; LD A,C
RRCA ; RRCA
; ; ;
.loop: SRL H ; .DIV_loop: SRL H
RR L ; RR L
RR D ; RR D
RR E ; RR E
RRCA ; RRCA
JP NC,.loop ; JP NC,.DIV_loop
LD A,B ; LD A,B
.exit: LD B,D ; .DIV_exit: LD B,D
LD C,E ; LD C,E
EX DE,HL ; EX DE,HL
LD H,0 ; LD H,0
LD L,A ; LD L,A
RET ; RET
; ;
;NSECTOR: ;NSECTOR:
; in: HL':HL - CLUSTER ; in: HL':HL - CLUSTER
@ -1009,11 +853,11 @@ CLUSTER_TO_SECTOR:
RL D RL D
; ;
RRA RRA
JP NC,.loop JR NC,.loop
; ;
.skip: EX DE,HL .skip: EX DE,HL
LD XL,E PUSH DE
LD XH,D POP IX
LD DE,(FatBuffer.FirstDataSector_L) LD DE,(FatBuffer.FirstDataSector_L)
ADD IX,DE ADD IX,DE
LD DE,(FatBuffer.FirstDataSector_H) LD DE,(FatBuffer.FirstDataSector_H)
@ -1038,8 +882,10 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
LD A,(FatBuffer.SectorsPerCluster);!FIXIT ¯à®çâñâ ⮫쪮 ¯¥à¢ë© ª« áâ¥à ä ©«®¢ ­  FAT32 LD A,(FatBuffer.SectorsPerCluster);!FIXIT ¯à®çâñâ ⮫쪮 ¯¥à¢ë© ª« áâ¥à ä ©«®¢ ­  FAT32
.NEXTSEC: PUSH AF .NEXTSEC: PUSH AF
ADD IX,BC ADD IX,BC
ADC HL,DE JR NC,.skip_inc
;HL:IX INC HL
;ADC HL,DE
.skip_inc: ;HL:IX
PUSH IX PUSH IX
PUSH HL PUSH HL
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
@ -1053,19 +899,17 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
RET C RET C
RET NZ RET NZ
LD A,B LD A,B
LD DE,0 ;LD DE,0
LD BC,1 LD BC,1
DEC A DEC A
JR NZ,.NEXTSEC JR NZ,.NEXTSEC
SCF SCF
RET RET
; ;
;
SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
LD IX, DIR_BUFFER - 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 .SKIPNAM_DE: ADD IX,DE
DEC C DEC C
RET Z RET Z
; ;
@ -1075,11 +919,11 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
RET Z RET Z
; ;
CP #E5 CP #E5
JR Z,.SKIPNAM JR Z,.SKIPNAM_DE
; ;
LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT)
AND FAT_ATTR.DIRECTORY AND FAT_ATTR.DIRECTORY
JR NZ,.SKIPNAM JR NZ,.SKIPNAM_DE
; ;
LD DE,CORE_NAME LD DE,CORE_NAME
PUSH IX PUSH IX
@ -1131,7 +975,7 @@ LOAD_CORE: LD (READMEM),DE
.subload: LD A,(.max_sectors) .subload: LD A,(.max_sectors)
LD B,A LD B,A
LD C,BIOS.DRV_READ_LONG LD C,BIOS.DRV_READ_LONG
LD A,(BANKDOS) LD A,(LOAD_CORE.BANKDOS)
EX AF,AF' EX AF,AF'
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
@ -1140,12 +984,11 @@ LOAD_CORE: LD (READMEM),DE
POP HL POP HL
EXX EXX
POP HL POP HL
;AND A
RET RET
; ;
.SMALL_CLUSTER: LD B,A .SMALL_CLUSTER: LD B,A
LD C,BIOS.DRV_READ_LONG LD C,BIOS.DRV_READ_LONG
LD A,(BANKDOS) .BANKDOS+1: LD A,0
EX AF,AF' EX AF,AF'
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
@ -1161,9 +1004,10 @@ LOAD_CORE: LD (READMEM),DE
CCF CCF
RET NC RET NC
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢ ; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
LD A,(BIG_CORE)
.BIG_CORE+1: LD A,0
DEC A DEC A
LD (BIG_CORE),A LD (.BIG_CORE),A
RET Z RET Z
; ;
CALL READ_FROM_FAT CALL READ_FROM_FAT
@ -1306,9 +1150,7 @@ NSECTOR: LD DE,0
; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥­ ; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥­
; CF - ª®­¥æ 楯®çª¨ ; CF - ª®­¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------
READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER READ_FROM_FAT: PUSH HL
RET C
PUSH HL
; ;
IN A,(SLOT3) IN A,(SLOT3)
PUSH AF PUSH AF
@ -1433,8 +1275,6 @@ GET_FAT12_CELL: LD D,H
;AND FAT_CACHE.Part_Mask_16 ;AND FAT_CACHE.Part_Mask_16
; ;
; [ ] ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï ; [ ] ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã 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 LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E CP E
LD E,A LD E,A
@ -1451,7 +1291,6 @@ GET_FAT12_CELL: LD D,H
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE ;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT16_CELL: LD A,H GET_FAT16_CELL: LD A,H
LD B,H LD B,H
;AND #0F
AND FAT_CACHE.Size_Mask_16 AND FAT_CACHE.Size_Mask_16
LD H,A LD H,A
LD A,B LD A,B
@ -1464,8 +1303,6 @@ GET_FAT16_CELL: LD A,H
; ;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
; [x] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï ; [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 LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E CP E
LD E,A LD E,A
@ -1513,32 +1350,6 @@ GET_FAT32_CELL: ;
ADD HL,DE ; ­  ï祩ªã FAT ADD HL,DE ; ­  ï祩ªã FAT
RET 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
;
/* /*
;----------------- ;-----------------
; HL - CLUSTER ; HL - CLUSTER
@ -1677,12 +1488,14 @@ READ_FAT_TABLE: PUSH HL
; BC:HL - ­®¬¥à «®£.ᥪâ®à  ; BC:HL - ­®¬¥à «®£.ᥪâ®à 
LD DE,(FatBuffer.FAT1_SEC_L) LD DE,(FatBuffer.FAT1_SEC_L)
ADD HL,DE ADD HL,DE
EX DE,HL ;
LD XH,D ; EX DE,HL
LD XL,E ; LD XH,D
; LD XL,E
PUSH HL
POP IX
;
LD HL,(FatBuffer.FAT1_SEC_H) LD HL,(FatBuffer.FAT1_SEC_H)
; JR NC,.no_inc
; INC HL
.no_inc: ADC HL,BC .no_inc: ADC HL,BC
; HL:IX - SECTOR FAT FOR READING ; HL:IX - SECTOR FAT FOR READING
; ;
@ -1691,10 +1504,11 @@ READ_FAT_TABLE: PUSH HL
LD DE,(PARTITION_START_H) LD DE,(PARTITION_START_H)
ADC HL,DE ADC HL,DE
LD DE,FAT_SECTORS_BUFFER LD DE,FAT_SECTORS_BUFFER
IN A,(SLOT3) ;
PUSH AF IN A,(SLOT3)
LD A,SHARED_PAGE PUSH AF
OUT (SLOT3),A LD A,SHARED_PAGE
OUT (SLOT3),A
; ;
LD A,(FatBuffer.FAT_TYPE) LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32 XOR FAT_TYPE.x32
@ -1704,8 +1518,8 @@ READ_FAT_TABLE: PUSH HL
.next: LD A,(DRIVE) .next: LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
; ;
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
POP HL POP HL
RET RET
; ;
@ -1810,29 +1624,15 @@ FatBuffer EQU VALUE
HANDBUF EQU VALUE + _sysFatBuffer HANDBUF EQU VALUE + _sysFatBuffer
FCLUSTER_H 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
; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE
FCLUSTR_L 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 PARTITION_START_H EQU FSIZE1+2
PARTITION_START_L EQU PARTITION_START_H+2 PARTITION_START_L EQU PARTITION_START_H+2
READMEM EQU PARTITION_START_L+2 READMEM EQU PARTITION_START_L+2
BIG_CORE EQU READMEM+2 ;BIG_CORE EQU READMEM+2
BANKDOS EQU BIG_CORE+1
;SHEL_FM EQU VALUE+54
; EQU VALUE+56
;-----------------
; BLOCK #8600-$-3,0
; DB 'SPT'
; BIGA EQU (($/256)+1)*256
; BIGA2 EQU BIGA-$-2
; DS BIGA2
; DB "dp"
; E______
;STACK EQU (($/256)+2)*256
DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER
DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER

View File

@ -19,18 +19,18 @@
; ;
; ;
STRUCT _sysFatBuffer STRUCT _sysFatBuffer
.DRIVE: BYTE #FF ;.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32 .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
.CacheBlock: WORD #0000 .CacheBlock: WORD #0000
.CacheUpdated: BYTE #00 ;.CacheUpdated: BYTE #00
;.SectorsPerBank: BYTE #00 ;.SectorsPerBank: BYTE #00
.RootDirStartCluster_L: WORD #0000 ;.RootDirStartCluster_L: WORD #0000
.RootDirStartCluster_H: WORD #0000 ; fat32 ;.RootDirStartCluster_H: WORD #0000 ; fat32
.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) .FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
.FAT1_SEC_H: WORD #0000 ; fat32 .FAT1_SEC_H: WORD #0000 ; fat32
.FAT2_SEC_L: WORD #0000 ;.FAT2_SEC_L: WORD #0000
.FAT2_SEC_H: WORD #0000 ; fat32 ;.FAT2_SEC_H: WORD #0000 ; fat32
.Number_Of_FATs BYTE #02 ;.Number_Of_FATs BYTE #02
.SectorsPerFAT_L WORD #0000 .SectorsPerFAT_L WORD #0000
.SectorsPerFAT_H BYTE #00 .SectorsPerFAT_H BYTE #00
.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR .RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
@ -39,15 +39,15 @@
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low .FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high .FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN .BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF ;.END_CHAIN_CLUSTER_L: WORD #FFFF
.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
@ -77,7 +77,7 @@
BYTE ' Anatoliy ' BYTE ' Anatoliy '
BYTE ' Belyanskiy. ' BYTE ' Belyanskiy. '
BYTE ' Sprinter Team, ' BYTE ' Sprinter Team, '
BYTE ' 2023 ' BYTE ' 2024 '
ENDM ENDM

View File

@ -19,6 +19,7 @@ CLOSE_FN:
RET NZ RET NZ
BIT 7,(IY+_sFM.ACCESS_MODE) BIT 7,(IY+_sFM.ACCESS_MODE)
JR Z,.NOTMODF JR Z,.NOTMODF
;
LD E,(IY+_sFM.DIR_CLUSTER_L) LD E,(IY+_sFM.DIR_CLUSTER_L)
LD D,(IY+_sFM.DIR_CLUSTER_L+1) LD D,(IY+_sFM.DIR_CLUSTER_L+1)
PUSH DE PUSH DE
@ -81,7 +82,5 @@ CLOSE_FN:
CALL SAVEDIR CALL SAVEDIR
.NOTMODF: .NOTMODF:
LD A,(.TMP) LD A,(.TMP)
;CALL RES_FM
JP RES_FM JP RES_FM
;RET
; ;

View File

@ -158,10 +158,10 @@ SEARCH:
OR A OR A
JR Z,.error_file_not_found JR Z,.error_file_not_found
CP #E5 ;!HARDCODE #E5 - § ¯¨áì ¢ ¤¨à¥ªâ®à¨¨ ᢮¡®¤­ , â ª ª ª ä ©«/¤¨à¥ªâ®à¨ï ¡ë«¨ 㤠«¥­ë CP #E5 ;!HARDCODE #E5 - § ¯¨áì ¢ ¤¨à¥ªâ®à¨¨ ᢮¡®¤­ , â ª ª ª ä ©«/¤¨à¥ªâ®à¨ï ¡ë«¨ 㤠«¥­ë
JR Z,.next_record JR Z,.next_record_DE
LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT)
AND C AND C
JR NZ,.next_record JR NZ,.next_record_DE
LD HL,MASKARE LD HL,MASKARE
LD D,XH LD D,XH
LD E,XL LD E,XL
@ -199,12 +199,13 @@ SEARCH:
AND A AND A
RET RET
.next_record: .next_record:
LD DE,FAT_DIRECTORY_RECORD
.next_record_DE:
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
; EXX ; EXX
; INC DE ; INC DE
; EXX ; EXX
; ;
LD DE,FAT_DIRECTORY_RECORD
ADD IX,DE ADD IX,DE
JR NC,.loop JR NC,.loop
.error_too_many_files: .error_too_many_files:

View File

@ -98,6 +98,7 @@ PUTCHAR:
RET Z RET Z
DEC E DEC E
JP LOCATE JP LOCATE
;
.LF_: CALL CURSOR .LF_: CALL CURSOR
LD A,D LD A,D
CP #1F CP #1F