DSS: детект разрядности FAT в BPB теперь по всем канонам. Допиливание до FAT32.

SYS: Загрузка System.dos > #4000 байтов. Исправлен баг с ненужной проверкой расстояния от BPB до FAT для HDD.
SHELL: мелкие правки
This commit is contained in:
Anatoliy Belyanskiy 2024-04-14 01:54:39 +10:00
parent 9b975b7a88
commit bb63a4071d
21 changed files with 1124 additions and 919 deletions

File diff suppressed because it is too large Load Diff

View File

@ -24,6 +24,7 @@
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/defines.inc'
DEFINE EXEinfoMACRO 0 DEFINE EXEinfoMACRO 0
DEFINE App_EXE_Version 1 DEFINE App_EXE_Version 1
@ -348,9 +349,11 @@ write_to_: ld a,(disk) ;
ld b,a ld b,a
inc c inc c
scf scf
ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
dec c dec c
push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR CP #80 ;!HARDCODE ⨯ ¤à ©¢  - HDD
JR NC,.skip_FAT_check
push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â) ; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â)
LD HL,0 LD HL,0
LD IX,0 LD IX,0
@ -364,6 +367,7 @@ write_to_: ld a,(disk) ;
SBC HL,DE SBC HL,DE
RET C RET C
; ;
.skip_FAT_check:;
push bc push bc
ld a,b ld a,b
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 

View File

@ -79,7 +79,7 @@
; POP BC ; POP BC
; JP C,NDISK11 ; JP C,NDISK11
; LD A,B ; LD A,B
; LD (FatBuffer.DRIVE),A ; LD (CORE_BUFFERS.FatBuffer.DRIVE),A
; CALL RD_BPB ; CALL RD_BPB
; RET C ; RET C
; LD A,(LDRIVE) ; LD A,(LDRIVE)

View File

@ -62,9 +62,9 @@ DEL_FN: ;!TEST
PUSH DE PUSH DE
LD DE,#0000 ; ­®¬¥à ª« áâ¥à  LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT.Custom ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  CALL WRITE_TO_FAT.Custom ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP AF
POP DE POP DE
EXX EXX
POP AF
POP DE POP DE
EXX EXX
JP NC,.loop JP NC,.loop

View File

@ -132,14 +132,14 @@ MKDIR:
CP "." CP "."
JR Z,.copy_dir_record JR Z,.copy_dir_record
; fat32 ; fat32
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32 CP FAT_TYPE.x32
JR NZ,.fat16_root_dir JR NZ,.fat16_root_dir
; fat 32 ; fat 32
EX DE,HL EX DE,HL
LD HL,(FatBuffer.RootDirStartCluster_L) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L)
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL
LD HL,(FatBuffer.RootDirStartCluster_H) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL
EX DE,HL EX DE,HL
JR .set_rec JR .set_rec
@ -169,7 +169,7 @@ MKDIR:
EXX EXX
POP HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à  POP HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF .MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤ PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à  PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
@ -178,7 +178,7 @@ MKDIR:
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
; ;
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000 LD DE,CORE_BUFFERS.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Write LD BC,1*256 + Dss.DRV.Write
RST ToDSS.DRV RST ToDSS.DRV

View File

@ -67,7 +67,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+1),A
LD (IY+_sFM.F_POSITION+2),A LD (IY+_sFM.F_POSITION+2),A
LD (IY+_sFM.F_POSITION+3),A LD (IY+_sFM.F_POSITION+3),A
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A LD (IY+_sFM.DRIVE),A
; fat32 ; fat32
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H

View File

@ -51,7 +51,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL PUSH HL
EXX EXX
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
LD B,A LD B,A
LD C,Dss.DRV.Read LD C,Dss.DRV.Read
; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­® ; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­®
@ -67,7 +67,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
LD DE,CORE_BUFFERS.SECBUF+#C000 LD DE,CORE_BUFFERS.SECBUF+#C000
;LD BC,1*256 + Dss.DRV.Read ;LD BC,1*256 + Dss.DRV.Read
LD B,1 LD B,1
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
RST ToDSS.DRV RST ToDSS.DRV
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A

View File

@ -18,7 +18,7 @@ WRITE.RD_ONLY:
WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] ¨§ĄëâŽç­ëĽ ˘ë§Ž˘ë WRITE_FAT_TABLE WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] ¨§ĄëâŽç­ëĽ ˘ë§Ž˘ë WRITE_FAT_TABLE
CALL .Start CALL .Start
PUSH AF PUSH AF
LD A,(FatBuffer.CacheUpdated) LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated)
OR A OR A
CALL NZ,WRITE_FAT_TABLE ; ŻŽ¤ŞŤ. Ą ­Şă ŞĽč  FAT ¨ § Ż¨á âě ĽŁŽ ­  ¤¨áŞ CALL NZ,WRITE_FAT_TABLE ; ŻŽ¤ŞŤ. Ą ­Şă ŞĽč  FAT ¨ § Ż¨á âě ĽŁŽ ­  ¤¨áŞ
POP AF POP AF

View File

@ -16,7 +16,7 @@ CURDISK_FN:
CURDISK: CURDISK:
LD A,(LDRIVE) LD A,(LDRIVE)
LD C,A LD C,A
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
AND A AND A
RET RET
; ;

View File

@ -59,7 +59,7 @@ DISKINF: LD C,B
1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length 1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; 12, 16 or 32 ; 12, 16 or 32
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16 CP FAT_TYPE.x16
JR C,.next_prm JR C,.next_prm
; ;
@ -73,11 +73,11 @@ DISKINF: LD C,B
.put_char: LD (DE),A .put_char: LD (DE),A
POP DE POP DE
; ;
.next_prm: LD HL,FatBuffer.BPB_SERIAL_NUMBER .next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER
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,FatBuffer.BPB_LABEL LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; fat32 ; fat32
@ -121,7 +121,7 @@ DISKINF: LD C,B
;JR Z,CURRDS ;R06 ;JR Z,CURRDS ;R06
.CurrentDisk: LD A,(CurrentPath) .CurrentDisk: LD A,(CurrentPath)
SUB 'A' SUB 'A'
LD HL,FatBuffer.DRIVE LD HL,CORE_BUFFERS.FatBuffer.DRIVE
CP (HL) CP (HL)
JR Z,.CheckFreeSpace JR Z,.CheckFreeSpace
; ;
@ -138,15 +138,15 @@ DISKINF: LD C,B
;.FRESP2: ;.FRESP2:
LD D,B LD D,B
LD E,C LD E,C
LD HL,(FatBuffer.MaxClusterLow) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
DEC HL DEC HL
; fat 32 ; fat 32
EXX EXX
LD HL,(FatBuffer.MaxClusterHigh) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh)
DEC HL DEC HL
EXX EXX
LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
AND A AND A
RET RET
; ;

View File

@ -181,7 +181,7 @@ TMPNAME: DZ ' ' ; 12
; IN: A - drive number ; IN: A - drive number
OPENDSK:;!TEST DRV.Open ®¡å®¤ R10 OPENDSK:;!TEST DRV.Open ®¡å®¤ R10
LD C,A LD C,A
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
CP C CP C
IF CHECK_DRIVE_CHANGE IF CHECK_DRIVE_CHANGE
JR NZ,.open JR NZ,.open
@ -200,12 +200,12 @@ OPENDSK:;!TEST DRV.Open
POP BC POP BC
JP C,.error JP C,.error
;[x] 29/02/2024 fix "open drive error" ;[x] 29/02/2024 fix "open drive error"
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD D,A LD D,A
PUSH DE PUSH DE
; ;
LD A,B LD A,B
LD (FatBuffer.DRIVE),A LD (CORE_BUFFERS.FatBuffer.DRIVE),A
; ;
CALL RD_BPB CALL RD_BPB
;[x] 29/02/2024 fix "open drive error" ;[x] 29/02/2024 fix "open drive error"
@ -217,6 +217,7 @@ OPENDSK:;!TEST DRV.Open
.exit: LD A,(LDRIVE) .exit: LD A,(LDRIVE)
AND A AND A
RET RET
;
.error: CP DSS_Error.sys.INVALID_DRIVE .error: CP DSS_Error.sys.INVALID_DRIVE
SCF SCF
RET Z RET Z
@ -356,7 +357,7 @@ MASK: LD HL,TMPNAME
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;!TEST Current Dir ;[x] 15/10/23 ;!TEST Current Dir ;[x] 15/10/23
DIR_PATH_CHANGE: DIR_PATH_CHANGE:
.FullCurrent: LD A,(FatBuffer.DRIVE) .FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A' ADD 'A'
LD (CurrentPath),A LD (CurrentPath),A
; ;
@ -365,7 +366,7 @@ DIR_PATH_CHANGE:
; ;
.FullWork: LD A,(CurrentPath) .FullWork: LD A,(CurrentPath)
SUB 'A' SUB 'A'
LD (FatBuffer.DRIVE),A LD (CORE_BUFFERS.FatBuffer.DRIVE),A
; ;
.Work: LD HL,WorkDirectory .Work: LD HL,WorkDirectory
JP CURRDIR_FN JP CURRDIR_FN
@ -391,7 +392,7 @@ DIR_PATH_CHECK: LD A,(HL)
JR Z,.checkDir JR Z,.checkDir
; ;
LD HL,CurrentPath LD HL,CurrentPath
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A' ADD 'A'
CP (HL) CP (HL)
JR NZ,.gotoPath JR NZ,.gotoPath
@ -413,7 +414,7 @@ DIR_PATH_CHECK: LD A,(HL)
JR .gotoPath JR .gotoPath
; ;
.checkDrive: LD HL,CurrentPath .checkDrive: LD HL,CurrentPath
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A' ADD 'A'
CP (HL) CP (HL)
RET RET

View File

@ -241,11 +241,16 @@ PORTAL.out_MAIN: ;
CLEAR_BUFFER_AND_INIT_PROC: CLEAR_BUFFER_AND_INIT_PROC:
;------[CLEAR BUFFERS]------; ;------[CLEAR BUFFERS]------;
;R07 ;R11 ;R07 ;R11
XOR A
LD HL,CLEAR_ZONE.start LD HL,CLEAR_ZONE.start
LD DE,CLEAR_ZONE.start+1 LD DE,CLEAR_ZONE.start+1
LD BC,CLEAR_ZONE.size-1 LD BC,CLEAR_ZONE.size-1
LD (HL),0 LD (HL),A
LDIR LDIR
; A = 0
DEC A
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
;
;R07 ;R11 ;R07 ;R11
;R11 ;R11
LD HL,CORE_BUFFERS.FM_BUF LD HL,CORE_BUFFERS.FM_BUF
@ -405,7 +410,8 @@ BUFFERSplace _sBuffers=$
FM_BUF _sFM = BUFFERSplace.FileManipulator FM_BUF _sFM = BUFFERSplace.FileManipulator
.Size EQU _sFM .Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size .FullSize EQU FMCOUNT*FM_BUF.Size
BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector à §­®© ¤«¨­ë ;BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector à §­®© ¤«¨­ë
FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer
EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header
XSTACK EQU BUFFERSplace.Stack.SPoint XSTACK EQU BUFFERSplace.Stack.SPoint
BUFFER EQU BUFFERSplace.Buffer BUFFER EQU BUFFERSplace.Buffer
@ -415,11 +421,11 @@ CLEAR_ZONE.size EQU _sBuffers
ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0"
DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector DISPLAY "BUFFERSplace ", /H, CORE_BUFFERS.BUFFERSplace
DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector DISPLAY "FatBuffer ", /H, CORE_BUFFERS.FatBuffer
DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer
DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF
DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF
DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "--- --- --- --- --- --- --- ---"
@ -597,7 +603,9 @@ DRV_CONTENT:
DRV_CONTENT.SIZE EQU $-DRV_CONTENT DRV_CONTENT.SIZE EQU $-DRV_CONTENT
DISPLAY "END ADDRESS: ",/H,$ DISPLAY "END ADDRESS: ",/H,$
ASSERT $<#4001,'-> Memory leack!!!'; DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512
ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!';
ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!';
;[END] ;[END]
; ;

View File

@ -345,9 +345,9 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
JR NZ,.SUBDIR JR NZ,.SUBDIR
.REROOT: ; fat32 .REROOT: ; fat32
EX DE,HL EX DE,HL
LD HL,(FatBuffer.RootDirStartCluster_L) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(FatBuffer.RootDirStartCluster_H) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL
EX DE,HL EX DE,HL
CALL LOADDIR CALL LOADDIR
@ -423,11 +423,11 @@ LOADDIR: ;!TODO optimize
; ; LD (HL),L ; ; LD (HL),L
; ; LDIR ; ; LDIR
; ; ; ;
; LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
; LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à ; LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à
; ; ­®¬¥à ¯¥à¢®£® ª« áâ¥à  ; ; ­®¬¥à ¯¥à¢®£® ª« áâ¥à 
; ; [x] fat32 ; ; [x] fat32
; LD A,(FatBuffer.FAT_TYPE) ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
; XOR 32 ; XOR 32
; JR Z,.read_dir ; JR Z,.read_dir
; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY ; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
@ -446,14 +446,14 @@ LOADDIR: ;!TODO optimize
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ;
.LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤ .LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤
LD IX,(FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à  LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(FatBuffer.DirSizeInSectors) LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£  LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£ 
CP B CP B
JR NC,.RTD1 JR NC,.RTD1
LD B,A ; ç¨á«® ᥪâ®à®¢ LD B,A ; ç¨á«® ᥪâ®à®¢
.RTD1: LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  .RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢ LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV RST ToDSS.DRV
@ -475,10 +475,10 @@ LOAD_SAVE_DIR_PREPARE:
AND A AND A
EX AF,AF' EX AF,AF'
; ;
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A LD (IY+_sFM.DRIVE),A
; [x] fat32 ; [x] fat32
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32 - 1 CP FAT_TYPE.x32 - 1
JR NC,.exit JR NC,.exit
;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
@ -504,10 +504,10 @@ SAVEDIR: ;!TODO optimize
; AND A ; AND A
; PUSH AF ; PUSH AF
; ; ; ;
; LD A,(FatBuffer.DRIVE) ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
; LD (IY+_sFM.DRIVE),A ; LD (IY+_sFM.DRIVE),A
; ; [x] fat32 ; ; [x] fat32
; LD A,(FatBuffer.FAT_TYPE) ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
; XOR 32 ; XOR 32
; JR Z,.save_dir ; JR Z,.save_dir
; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY ; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
@ -528,15 +528,15 @@ SAVEDIR: ;!TODO optimize
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ;
.SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) .SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H)
LD IX,(FatBuffer.RootDirFirstSector_L) LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L)
LD A,(FatBuffer.DirSizeInSectors) LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors
SUB B SUB B
JR NC,.RTD1S JR NC,.RTD1S
ADD A,B ADD A,B
LD B,A LD B,A
.RTD1S: LD A,(FatBuffer.DRIVE) .RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,DIRPAGE.buffer LD DE,DIRPAGE.buffer
LD C,Dss.DRV.Write LD C,Dss.DRV.Write
RST ToDSS.DRV RST ToDSS.DRV
@ -593,7 +593,7 @@ WRT_HND: SET_PAGE_X DIRPAGE
SBC HL,DE SBC HL,DE
JR NC,SAVEDIR JR NC,SAVEDIR
LD HL,(SAVEDIR.DIRSIZE) LD HL,(SAVEDIR.DIRSIZE)
LD BC,(FatBuffer.BytesPerCluster) LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster)
ADD HL,BC ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL LD (SAVEDIR.DIRSIZE),HL
AND A AND A
@ -604,7 +604,7 @@ WRT_HND: SET_PAGE_X DIRPAGE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ­¥ ¨á¯®«ì§ã¥âáï ; ­¥ ¨á¯®«ì§ã¥âáï
; TESTDSK: ;????? ¢®§¬®¦­®, çâ® âãâ «®£¨ç­¥¥, 祬 ¢ ­ ç «¥ OPENDSK, ¥á«¨ ¡ã¤¥â à ¡®â âì Dss.DRV.Open ; TESTDSK: ;????? ¢®§¬®¦­®, çâ® âãâ «®£¨ç­¥¥, 祬 ¢ ­ ç «¥ OPENDSK, ¥á«¨ ¡ã¤¥â à ¡®â âì Dss.DRV.Open
; LD A,(FatBuffer.DRIVE) ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
; LD C,Dss.DRV.MediaCheck ; LD C,Dss.DRV.MediaCheck
; RST ToDSS.DRV ; RST ToDSS.DRV
; OR A ; OR A
@ -618,7 +618,7 @@ RD_BPB: LD C,SLOT3
PUSH BC PUSH BC
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08
LD C,Dss.DRV.GetBPB LD C,Dss.DRV.GetBPB
RST ToDSS.DRV RST ToDSS.DRV
@ -642,6 +642,17 @@ RD_BPB: LD C,SLOT3
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0 CP #F0
JP C,DOS_X_Error.UnknownBPB JP C,DOS_X_Error.UnknownBPB
;
;!TODO ¯à®¢¥à¨âì ¯® ¬¥âª¥ à §¤¥« , çâ® íâ® FAT, ¯®â®¬ ®¯à¥¤¥«ïâì ª ª®© FAT
;
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector)
LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster)
LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER)
LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),HL
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER+2)
LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),HL
; calc. first sector FAT ; calc. first sector FAT
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
; ;
@ -649,20 +660,20 @@ RD_BPB: LD C,SLOT3
; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1)
; ADD HL,DE ; ADD HL,DE
; ;
;!FIXIT ¤«ï fat32 ¢â몠âì á ᥪâ®à   ªâ¨¢­®© â ¡«¨æë ;!FIXIT ¤«ï fat32 ¢â몠âì á ᥪâ®à   ªâ¨¢­®© â ¡«¨æë
LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1
LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 LD (CORE_BUFFERS.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 (CORE_BUFFERS.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 (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (FatBuffer.RootDirStartCluster_L),BC ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),BC ; [ ] fat32
LD (FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32
LD (FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
LD (FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables
LD (FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32
; ;
; ;
LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16) LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16)
@ -670,20 +681,21 @@ RD_BPB: LD C,SLOT3
OR D OR D
JR NZ,.skip_high JR NZ,.skip_high
; ;
LD BC,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32+4) LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32+4)
LD (FatBuffer.SectorsPerFAT_H),BC LD A,C
LD DE,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32) LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A
.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32)
.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE
; ;
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs
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 LD (CORE_BUFFERS.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: LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC
.one_FAT: ;C_DATA1 .one_FAT: ;C_DATA1
.loop1: ADD HL,DE .loop1: ADD HL,DE
JR NC,.loop1_1 JR NC,.loop1_1
@ -691,9 +703,9 @@ RD_BPB: LD C,SLOT3
.loop1_1: DEC A .loop1_1: DEC A
JR NZ,.loop1 JR NZ,.loop1
; ;
LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,B LD A,B
AND A AND A
; ;
@ -708,7 +720,7 @@ RD_BPB: LD C,SLOT3
LD B,0 ; BC - File handels in sectors LD B,0 ; BC - File handels in sectors
;;;; ;;;;
IF COMPILE_UNUSED_CODE IF COMPILE_UNUSED_CODE
LD (FatBuffer.FilesPerSector),A LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A
ENDIF ENDIF
; ;
EX DE,HL EX DE,HL
@ -724,14 +736,14 @@ RD_BPB: LD C,SLOT3
EX DE,HL EX DE,HL
LD C,A ; A - sectors in DIR LD C,A ; A - sectors in DIR
LD B,0 LD B,0
LD (FatBuffer.DirSizeInSectors),A LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A
ADD HL,BC ; Start DATA area ADD HL,BC ; Start DATA area
LD (FatBuffer.FirstDataSector_L),HL LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL
; B = 0 ; B = 0
; ;
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
;!TODO FATcacheSize ;!TODO FATcacheSize
; calc. cluster size ; calc. cluster size
XOR 1 XOR 1
@ -741,7 +753,7 @@ RD_BPB: LD C,SLOT3
RRA RRA
JP NC,.loop3 JP NC,.loop3
.loop3.end: ; .loop3.end: ;
LD (FatBuffer.BytesPerCluster),HL LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL
; ;
IF COMPILE_UNUSED_CODE IF COMPILE_UNUSED_CODE
EX DE,HL EX DE,HL
@ -752,69 +764,71 @@ RD_BPB: LD C,SLOT3
JP Z,DOS_X_Error.UnknownBPB JP Z,DOS_X_Error.UnknownBPB
SBC HL,DE SBC HL,DE
JR NC,.loop4 JR NC,.loop4
LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
ENDIF ENDIF
;
;!TODO detect fat type by clusters! ////////////////////////////////////////////////////////////////
; [ ] fat32 ////////////////////////////////////////////////////////////////
LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FAT16.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £  ////////////////////////////////////////////////////////////////
LD DE,FAT_STRING ; LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
LD B,3 ; LD DE,FAT_STRING
;R_BPBL1 ; LD B,3
.loop5: LD A,(DE) ; ;R_BPBL1
CP (HL) ; .loop5: LD A,(DE)
JP NZ,.IBM_DOS ; CP (HL)
INC HL ; JP NZ,.IBM_DOS
INC DE ; INC HL
DJNZ .loop5 ; INC DE
; DJNZ .loop5
;FID ;FID
.loop6: LD A,(HL) ; .loop6: LD A,(HL)
INC HL ; INC HL
CP ' ' ; CP ' '
JR Z,.loop6 ; JR Z,.loop6
; ; ;
CP '1' ; CP '1'
;[ ] fat32 ; JP Z,.fat1x
JP Z,.fat1x ; CP '3'
CP '3' ; JP NZ,DOS_X_Error.UnknownBPB
JP NZ,DOS_X_Error.UnknownBPB ; LD A,#52 ; #52-#20 = #32 fat type
LD A,#52 ; #52-#20 = #32 fat type ; LD HL,#0FFF
LD HL,#0FFF ; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL
LD (FatBuffer.END_CHAIN_CLUSTER_H),HL ; LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT
LD (FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT ; LD H,L
LD H,L ; JR .BPB_FAT
JR .BPB_FAT ; ;
; ; .fat1x: LD A,(HL)
.fat1x: LD A,(HL) ; CP '2' ; FAT16
CP '2' ; FAT16 ; LD HL,#0FFF
LD HL,#0FFF ; JR Z,.BPB_FAT
JR Z,.BPB_FAT ; CP '6' ; FAT12
CP '6' ; FAT12 ; JP NZ,DOS_X_Error.UnknownBPB
JP NZ,DOS_X_Error.UnknownBPB ; LD H,L
LD H,L ; .BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32)
.BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) ; LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A
LD (FatBuffer.FAT_TYPE),A ; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL
LD (FatBuffer.END_CHAIN_CLUSTER_L),HL
;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨¥ ¢ëç¨á«ï¥¬®¥ ¨ á®å࠭塞®¥ ¢ FatBuffer ;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨¥ ¢ëç¨á«ï¥¬®¥ ¨ á®å࠭塞®¥ ¢ FatBuffer
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; LD HL,0 ; LD HL,0
; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track ; LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track
; LD A,(CORE_BUFFERS.BootSector.HEADS) ; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.HEADS)
; .BPB_L1: ; calc. sector per cylinder ; .BPB_L1: ; calc. sector per cylinder
; ADD HL,BC ; ADD HL,BC
; DEC A ; DEC A
; JR NZ,.BPB_L1 ; JR NZ,.BPB_L1
; LD (FatBuffer.S_X_H),HL ; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; [ ] fat32 ; [ ] fat32
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive) LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive)
LD DE,(FatBuffer.FirstDataSector_L) LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L)
LD A,H LD A,H
OR L OR L
JP NZ,.HDDSMAL JP NZ,.HDDSMAL
; ;
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L) LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L)
LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H) LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H)
PUSH BC ; Total Sectors high
PUSH HL ; Total Sectors low
AND A AND A
SBC HL,DE SBC HL,DE
JP NC,.HDDBIG JP NC,.HDDBIG
@ -822,25 +836,104 @@ RD_BPB: LD C,SLOT3
JP .HDDBIG JP .HDDBIG
; ;
.HDDSMAL: ; CF = 0 .HDDSMAL: ; CF = 0
SBC HL,DE
LD BC,0 LD BC,0
.HDDBIG: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) PUSH BC ; Total Sectors high
PUSH HL ; Total Sectors low
SBC HL,DE
;
.HDDBIG: LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
SCF SCF
.S4C01: RRA .loop7: RRA
JR C,.S4C02 JR C,.loop7_exit
RR B RR B
RR C RR C
RR H RR H
RR L RR L
JP .S4C01 JP .loop7
.S4C02: INC HL ;
LD (FatBuffer.MaxClusterLow),HL .loop7_exit: INC HL
LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL
; ;
XOR A XOR A
LD H,A LD H,A
LD L,A LD L,A
LD (FatBuffer.CacheBlock),HL LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL
LD (FatBuffer.CacheUpdated),A LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
; A = 0
LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H)
LD H,A
EX DE,HL
LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L)
; DE:HL = SectorsPerFAT
;
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs)
LD B,A
DEC A
JR Z,.loop_mul_end
; .Number_of_FATs * .SectorsPerFAT
.loop_mul: ADD HL,HL
EX DE,HL
ADC HL,HL
EX DE,HL
DJNZ .loop_mul
.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD B,0
LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD C,A
ADD HL,BC
JR NC,.no_inc_DE
INC DE
.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
ADD HL,BC
JR NC,.no_inc_de
INC DE
.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT)
AND A
LD B,D
LD C,E
POP DE ; Total Sectors low
EX DE,HL
SBC HL,DE
EX (SP),HL ; Total Sectors high
SBC HL,BC
POP DE ; Total Sectors low
; HL:DE = DataSec
;
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
CALL DIV_for_SPC
; ¢ëïá­ï¥¬ à §à來®áâì FAT
LD A,D
OR E
JR NZ,.its_FAT32
;
LD HL,4084
SBC HL,BC
JR NC,.its_FAT12
;
LD HL,65525
SBC HL,BC
JR C,.its_FAT32
;
; It's FAT16
LD A,FAT_TYPE.x16
LD HL,#FFFF
JR .BPB_FAT
;
.its_FAT12: LD HL,#0FFF
LD A,FAT_TYPE.x12
JR .BPB_FAT
;
.its_FAT32: LD A,FAT_TYPE.x32
LD HL,#0FFF
LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL
LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT
LD H,L
;
.BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A
LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL
;
SET_PAGE_X FATPAGE SET_PAGE_X FATPAGE
@ -848,8 +941,9 @@ RD_BPB: LD C,SLOT3
; [ ] fat32 ; [ ] fat32
; XOR A ; XOR A
; HL = 0 ; HL = 0
EX DE,HL ; EX DE,HL
; ;
LD DE,0
CALL READ_FAT_TABLE CALL READ_FAT_TABLE
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
@ -881,6 +975,7 @@ DOS_X_Error:
; ;
; ;
;!TODO ª ¡ãä¥à ¬! ;!TODO ª ¡ãä¥à ¬!
/*
FatBuffer: FatBuffer:
;.MSG: DB 'FAT' ;.MSG: DB 'FAT'
.DRIVE: DB #FF .DRIVE: DB #FF
@ -918,4 +1013,5 @@ FatBuffer:
;.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï))) ;.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï? ;.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
; ;
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -113,23 +113,23 @@ INC_FAT:
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster ; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster
; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32) ; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
CHECK_CLUSTER_IS_SMALLER: CHECK_CLUSTER_IS_SMALLER:
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32 XOR FAT_TYPE.x32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
EXX EXX
EX DE,HL EX DE,HL
LD HL,(FatBuffer.MaxClusterHigh) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh)
; CF = 0 ; CF = 0
SBC HL,DE SBC HL,DE
EX DE,HL EX DE,HL
EXX EXX
LD A,DSS_Error.sys.DISK_FULL LD A,DSS_Error.sys.DISK_FULL
;RET C ;RET C
RET NZ ; ¥á«¨ FatBuffer.MaxClusterHigh - hl' != 0, â® ª« áâ¥à ª®à४â­ë© RET NZ ; ¥á«¨ CORE_BUFFERS.FatBuffer.MaxClusterHigh - hl' != 0, â® ª« áâ¥à ª®à४â­ë©
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à  ; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL .low: EX DE,HL
LD HL,(FatBuffer.MaxClusterLow) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
; CF = 0 ; CF = 0
SBC HL,DE SBC HL,DE
EX DE,HL EX DE,HL
@ -157,7 +157,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
; ;
PUSH HL PUSH HL
PUSH AF PUSH AF
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16 CP FAT_TYPE.x16
JR C,.FAT12 JR C,.FAT12
JR NZ,.FAT32 JR NZ,.FAT32
@ -255,9 +255,9 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
; .Custom: ; .Custom:
; HL':HL ¨ DE':DE â ª¨¥ ¦¥ ª ª ¨ ­  ¢å®¤¥ ; HL':HL ¨ DE':DE â ª¨¥ ¦¥ ª ª ¨ ­  ¢å®¤¥
;------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------
WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; ­®¬¥à ª« áâ¥à  WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; ­®¬¥à ª« áâ¥à 
EXX EXX
LD DE,(FatBuffer.END_CHAIN_CLUSTER_H) ; ­®¬¥à ª« áâ¥à  LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H) ; ­®¬¥à ª« áâ¥à 
EXX EXX
.Custom: PUSH DE .Custom: PUSH DE
EXX EXX
@ -278,9 +278,9 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ;
PUSH DE ; ¬« ¤è¨© ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì PUSH DE ; ¬« ¤è¨© ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD ; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
;LD A,1 ;LD A,1
;LD (FatBuffer.CacheUpdated),A ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
; ;
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16 CP FAT_TYPE.x16
JR C,.FAT12 JR C,.FAT12
JR NZ,.FAT32 JR NZ,.FAT32
@ -296,7 +296,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ;
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD ; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A XOR A
INC A INC A
LD (FatBuffer.CacheUpdated),A LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
; CF = 0 ; CF = 0
RET RET
; ;
@ -360,7 +360,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ;
; out: C:HL - logical number ; out: C:HL - logical number
; B = 0 ; B = 0
GET_SECTOR_OF_FAT: GET_SECTOR_OF_FAT:
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
LD B,FAT_CACHE.Degree_32 ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥­­ãî LD B,FAT_CACHE.Degree_32 ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥­­ãî
XOR FAT_TYPE.x32 XOR FAT_TYPE.x32
JR Z,.next JR Z,.next
@ -383,7 +383,7 @@ GET_SECTOR_OF_FAT:
; ADC A,C ; ADC A,C
; EDUP ; EDUP
; LD C,A ; LD C,A
; LD A,(FatBuffer.FAT_TYPE) ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
; CP FAT_TYPE.x32 ; CP FAT_TYPE.x32
; RET NZ ; RET NZ
; ADD HL,HL ;x2 ; ADD HL,HL ;x2
@ -400,34 +400,34 @@ GET_SECTOR_OF_FAT:
; DE - NEW FAT BLOCK ; DE - NEW FAT BLOCK
READ_FAT_TABLE: PUSH HL READ_FAT_TABLE: PUSH HL
PUSH DE PUSH DE
LD A,(FatBuffer.CacheUpdated) LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated)
OR A OR A
CALL NZ,WRITE_FAT_TABLE.Start CALL NZ,WRITE_FAT_TABLE.Start
POP DE POP DE
; ;
EX DE,HL EX DE,HL
LD (FatBuffer.CacheBlock),HL LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL
; ;
CALL GET_SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT
; ;
; BC:HL - ­®¬¥à «®£.ᥪâ®à  ; BC:HL - ­®¬¥à «®£.ᥪâ®à 
LD DE,(FatBuffer.FAT1_SEC_L) LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L)
ADD HL,DE ADD HL,DE
EX DE,HL EX DE,HL
LD XH,D LD XH,D
LD XL,E LD XL,E
LD HL,(FatBuffer.FAT1_SEC_H) LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H)
; JR NC,.no_inc ; JR NC,.no_inc
; INC HL ; INC HL
.no_inc: ADC HL,BC .no_inc: ADC HL,BC
; HL:IX - SECTOR FAT FOR READING ; HL:IX - SECTOR FAT FOR READING
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32 XOR FAT_TYPE.x32
LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
JR NZ,.next JR NZ,.next
LD B,FAT_CACHE.Sectors_32 ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE LD B,FAT_CACHE.Sectors_32 ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
.next: LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS .next: LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
RST ToDSS.DRV RST ToDSS.DRV
POP HL POP HL
RET RET
@ -443,7 +443,7 @@ WRITE_FAT_TABLE:
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª ; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD HL,(FatBuffer.CacheBlock) .Start: LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock)
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
CALL GET_SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT
; B=0, C:HL - ᬥ饭¨¥ ¢ ᥪâ®à å ¢­ãâਠ⠡«¨æë FAT ­  ­ ç «® ¡«®ª  ; B=0, C:HL - ᬥ饭¨¥ ¢ ᥪâ®à å ¢­ãâਠ⠡«¨æë FAT ­  ­ ç «® ¡«®ª 
@ -453,7 +453,7 @@ WRITE_FAT_TABLE:
;LD C,L ;LD C,L
; ;
LD DE,FAT_CACHE.Sectors_32 LD DE,FAT_CACHE.Sectors_32
LD A,(FatBuffer.FAT_TYPE) LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32 CP FAT_TYPE.x32
JR Z,.next JR Z,.next
LD DE,FAT_CACHE.Sectors_16 ; !FIXIT ¡à âì íâ® §­ ç¥­¨¥ ¨§ ¯¥à¥¬¥­­®© ¢¥§¤¥ LD DE,FAT_CACHE.Sectors_16 ; !FIXIT ¡à âì íâ® §­ ç¥­¨¥ ¨§ ¯¥à¥¬¥­­®© ¢¥§¤¥
@ -466,10 +466,10 @@ WRITE_FAT_TABLE:
; ;
.no_inc: ; ª®­¥æ ¡«®ª  ¢ë室¨â §  ¯à¥¤¥«ë â ¡«¨æë? .no_inc: ; ª®­¥æ ¡«®ª  ¢ë室¨â §  ¯à¥¤¥«ë â ¡«¨æë?
LD B,E ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè LD B,E ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè
LD A,(FatBuffer.SectorsPerFAT_H) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H)
LD (.sub_A),A LD (.sub_A),A
;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT ;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT
LD DE,(FatBuffer.SectorsPerFAT_L) LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L)
AND A AND A
LD A,C LD A,C
SBC HL,DE SBC HL,DE
@ -493,8 +493,8 @@ WRITE_FAT_TABLE:
;PUSH HL ;PUSH HL
; ;
; B = ç¨á«® ᥪâ®à®¢ ; B = ç¨á«® ᥪâ®à®¢
LD IX,(FatBuffer.FAT1_SEC_H) LD IX,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H)
LD DE,(FatBuffer.FAT1_SEC_L) LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L)
;LD B,A ;LD B,A
;LD C,Dss.DRV.Write ; § ¯¨áì ᥪâ®à®¢ ;LD C,Dss.DRV.Write ; § ¯¨áì ᥪâ®à®¢
PUSH BC PUSH BC
@ -505,26 +505,26 @@ WRITE_FAT_TABLE:
CALL .SAVE_FAT_XX CALL .SAVE_FAT_XX
; [x] ¥á«¨ ¢á¥£® ®¤­  â ¡«¨æ  FAT, â® ¯®¢â®à­®© § ¯¨á¨ ­¥ ¯à®¨á室¨â 13/03/2024 ; [x] ¥á«¨ ¢á¥£® ®¤­  â ¡«¨æ  FAT, â® ¯®¢â®à­®© § ¯¨á¨ ­¥ ¯à®¨á室¨â 13/03/2024
POP BC ; B = ç¨á«® ᥪâ®à®¢, C = áâ à訩 ¡ ©â ᬥ饭¨ï ¢ ᥪâ®à å POP BC ; B = ç¨á«® ᥪâ®à®¢, C = áâ à訩 ¡ ©â ᬥ饭¨ï ¢ ᥪâ®à å
LD HL,(FatBuffer.FAT1_SEC_H) LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H)
LD DE,(FatBuffer.FAT2_SEC_H) LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H)
AND A AND A
SBC HL,DE SBC HL,DE
JR NZ,.not_one_FAT JR NZ,.not_one_FAT
LD HL,(FatBuffer.FAT2_SEC_L) LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L)
LD DE,(FatBuffer.FAT1_SEC_L) LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L)
; CF = 0 ; CF = 0
SBC HL,DE SBC HL,DE
JR Z,.only_one_FAT JR Z,.only_one_FAT
; ;
; á®å࠭塞 ¢â®àãî ª®¯¨î FAT ; á®å࠭塞 ¢â®àãî ª®¯¨î FAT
.not_one_FAT: LD IX,(FatBuffer.FAT2_SEC_H) .not_one_FAT: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H)
LD DE,(FatBuffer.FAT2_SEC_L) LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L)
LD HL,(.save_hl) LD HL,(.save_hl)
CALL .SAVE_FAT_XX CALL .SAVE_FAT_XX
AND A ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª AND A ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
.only_one_FAT: ; .only_one_FAT: ;
.ERR: LD A,0 .ERR: LD A,0
LD (FatBuffer.CacheUpdated),A LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
RET RET
; ‚室: IX:DE - ­ ç «® â ¡«¨æë FAT ¢ ᥪâ®à å ; ‚室: IX:DE - ­ ç «® â ¡«¨æë FAT ¢ ᥪâ®à å
; C:HL - ᬥ饭¨¥ ¢ â ¡«¨æ¥ ¢ ᥪâ®à å ; C:HL - ᬥ饭¨¥ ¢ â ¡«¨æ¥ ¢ ᥪâ®à å
@ -546,7 +546,7 @@ WRITE_FAT_TABLE:
LD XL,E LD XL,E
; HL:IX - ᬥ饭¨¥ ¢­ãâਠࠧ¤¥«  ­  ­ ç «® ­ã¦­®£® ¡«®ª  FAT ; HL:IX - ᬥ饭¨¥ ¢­ãâਠࠧ¤¥«  ­  ­ ç «® ­ã¦­®£® ¡«®ª  FAT
LD DE,FATPAGE.cache ; ®âªã¤  LD DE,FATPAGE.cache ; ®âªã¤ 
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD C,Dss.DRV.Write LD C,Dss.DRV.Write
JP ToDSS.DRV JP ToDSS.DRV
@ -585,7 +585,7 @@ GET_FAT32_CELL:
; ;
EXX EXX
EX DE,HL EX DE,HL
LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
SBC HL,DE SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL POP HL
@ -611,9 +611,9 @@ GET_FAT16_CELL:
; ;
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 ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C ; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E CP E
LD E,A LD E,A
; ;
@ -654,9 +654,9 @@ GET_FAT12_CELL:
;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 ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C ; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E CP E
LD E,A LD E,A
; ;
@ -683,7 +683,7 @@ CLUSTER_TO_SECTOR:
; DE:HL - cluster ; DE:HL - cluster
DEC HL DEC HL
DEC HL DEC HL
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
XOR 1 XOR 1
JR Z,.skip JR Z,.skip
; ;
@ -698,13 +698,13 @@ CLUSTER_TO_SECTOR:
.skip: EX DE,HL .skip: EX DE,HL
LD XL,E LD XL,E
LD XH,D LD XH,D
LD DE,(FatBuffer.FirstDataSector_L) LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L)
; [x] fat32 ; [x] fat32
;XOR A ;XOR A
; ;
ADD IX,DE ADD IX,DE
; [x] fat32 ; [x] fat32
LD DE,(FatBuffer.FirstDataSector_H) LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H)
;LD D,A ;LD D,A
;LD E,A ;LD E,A
; ;
@ -720,7 +720,7 @@ CLUSTER_TO_SECTOR:
; IX - buffer in RAM ; IX - buffer in RAM
; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï
BLOCK_READ: LD (READ.PointerOnBuffer),IX BLOCK_READ: LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER
LD C,A LD C,A
PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï, C - SectorsPerCluster PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï, C - SectorsPerCluster
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
@ -809,7 +809,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
JR NC,.skip2 JR NC,.skip2
INC HL INC HL
.skip2: LD DE,(READ.PointerOnBuffer) .skip2: LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C LD B,C
LD C,Dss.DRV.Read LD C,Dss.DRV.Read
RST ToDSS.DRV RST ToDSS.DRV
@ -817,7 +817,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
JR C,.Error JR C,.Error
POP BC ; B = ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã, C = (SectorsPerCluster - ®áâ â®ª) «¨¡® ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï POP BC ; B = ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã, C = (SectorsPerCluster - ®áâ â®ª) «¨¡® ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï
LD HL,(READ.PointerOnBuffer) LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
;!TEST ;!TEST
LD A,B LD A,B
LD B,C LD B,C
@ -833,7 +833,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã = 0? RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã = 0?
LD B,A LD B,A
; ;
.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster .loop4: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster
LD A,B LD A,B
SUB (HL) SUB (HL)
LD B,A LD B,A
@ -861,7 +861,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
PUSH BC PUSH BC
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR
LD DE,(READ.PointerOnBuffer) LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C LD B,C
LD C,Dss.DRV.Read LD C,Dss.DRV.Read
RST ToDSS.DRV RST ToDSS.DRV
@ -869,7 +869,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
; ;
POP BC POP BC
LD HL,(READ.PointerOnBuffer) LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
.loop3: ADD HL,DE .loop3: ADD HL,DE
DEC C DEC C
JR NZ,.loop3 JR NZ,.loop3
@ -915,7 +915,7 @@ CHECK_FIRST_CLUSTER:
; IY - FM ; IY - FM
; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï § ¯¨á¨ ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï § ¯¨á¨
BLOK_WRITE: LD (READ.PointerOnBuffer),IX BLOK_WRITE: LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER
LD C,A LD C,A
PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï, C - SectorsPerCluster PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï, C - SectorsPerCluster
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
@ -1031,7 +1031,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
INC HL INC HL
; DOUBLE 1 ; DOUBLE 1
.skip2: LD DE,(READ.PointerOnBuffer) .skip2: LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C LD B,C
LD C,Dss.DRV.Write LD C,Dss.DRV.Write
RST ToDSS.DRV RST ToDSS.DRV
@ -1040,7 +1040,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
JR C,.Error_3 JR C,.Error_3
POP BC POP BC
LD HL,(READ.PointerOnBuffer) LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
; ;
LD A,B LD A,B
LD B,C LD B,C
@ -1057,7 +1057,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã = 0? RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã = 0?
LD B,A LD B,A
; ;
.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster .big_loop: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster
LD A,B LD A,B
SUB (HL) SUB (HL)
LD B,A LD B,A
@ -1090,7 +1090,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR
; DOUBLE 1 ; DOUBLE 1
LD DE,(READ.PointerOnBuffer) LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE) LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C LD B,C
LD C,Dss.DRV.Write LD C,Dss.DRV.Write
RST ToDSS.DRV RST ToDSS.DRV
@ -1098,7 +1098,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
JR C,.Error_3 JR C,.Error_3
POP BC POP BC
LD HL,(READ.PointerOnBuffer) LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
.loop3: ADD HL,DE .loop3: ADD HL,DE
DEC C DEC C
JR NZ,.loop3 JR NZ,.loop3
@ -1268,12 +1268,12 @@ GET_OFFSET_IN_SECTORS:
;!TODO fat32 ;!TODO fat32
;======================================================================= ;=======================================================================
;BPB ;BPB
;LD (FatBuffer.FAT2_SEC_L),HL ;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL
;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR ;LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
;BPB32 ;BPB32
;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 <20>¥à¢ë© ª« áâ¥à ª®à­¥¢®£® ª â «®£  (®¡ëç­® 2) 4 ¡ ©â  ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 <20>¥à¢ë© ª« áâ¥à ª®à­¥¢®£® ª â «®£  (®¡ëç­® 2) 4 ¡ ©â 
;FAT Max Cluster ;FAT Max Cluster
;LD (FatBuffer.MaxClusterLow),HL ;LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL
;======================================================================= ;=======================================================================
;//MODULE: FAT_X ;//MODULE: FAT_X

View File

@ -538,5 +538,12 @@ GET_RAMDRV_NUM:
LD A,(BC) LD A,(BC)
OR #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨ OR #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
RET RET
ENDDRVR EQU $ ;
;
;TEST_DB_DEL_ME: DB 'Make here more than one page to load test'
;
;
;ENDDRVR EQU $
; ;

View File

@ -73,14 +73,55 @@
; LEN2 EQU 29 ; AMODE EQU 41 ; LEN2 EQU 29 ; AMODE EQU 41
; LEN3 EQU 30 ; FTASK EQU 42 ; LEN3 EQU 30 ; FTASK EQU 42
;
STRUCT _sFatBuffer
;.MSG: BYTE 'FAT'
.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] 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
.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 ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ;!FIXIT ­¥ ¨á¯®«ì§ã¥âáï
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high ; [ ] fat32 ¡ë«® ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£ 
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF
.END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;
.BytesPerSector WORD #0000
.SectorsPerCluster BYTE #00
.BPB_SERIAL_NUMBER DWORD #00000000
.BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
; IF COMPILE_UNUSED_CODE
; .FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
; .ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
; ENDIF
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
ENDS
;
; ;
STRUCT _sBuffers STRUCT _sBuffers
.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1)
.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ;
.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .FatBuffer _sFatBuffer
;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32
.EXE_Header _sEXE_HEADER ; 512 bytes .EXE_Header _sEXE_HEADER ; 512 bytes
.Stack _sStack ; 256 bytes .Stack _sStack ; 256 bytes
.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF .Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF
.MemoryTable BLOCK 256,0 ; 256 bytes .MemoryTable BLOCK 256,0 ; 256 bytes
ENDS ENDS
; ;

View File

@ -1 +1 @@
952 950

View File

@ -149,4 +149,9 @@ MOUSE_BAUD:
.multiplier_2 EQU 45 ; ¢â®à®© ¬­®¦¨â¥«ì = 45. 875000/Œ­1*Œ­2=1215 .multiplier_2 EQU 45 ; ¢â®à®© ¬­®¦¨â¥«ì = 45. 875000/Œ­1*Œ­2=1215
ENDIF ENDIF
;----------------------------------------------------; ;----------------------------------------------------;
; ;
;
;----------------------------------------------------;
SUBLOAD_SIZE EQU 10 ; ª®«-¢® ᥪâ®à®¢ ª®â®à®¥ ­ ¤® ¯®¤£à㧨âì ¯®á«¥ § £à㧪¨ system.dos ¢ áâà ­¨æã
;----------------------------------------------------;

View File

@ -103,8 +103,14 @@ BATCH:
;CALL Restore_Screen ;CALL Restore_Screen
;R10 ;R10
;pop af ;pop af
ret c JR NC,.good
ld (BAT_FM),a ; ¤¥áªà. bat-ä ©«  CP DSS_Error.sys.TOO_MANY_FILES_IN_DIR
SCF
RET NZ
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET
;
.good: ld (BAT_FM),a ; ¤¥áªà. bat-ä ©« 
; ¢ë¯®«­. ª®¬ ­¤ bat-ä ©«  ; ¢ë¯®«­. ª®¬ ­¤ bat-ä ©« 
call NEWLINE call NEWLINE
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat ;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat

View File

@ -1 +1 @@
314 315

@ -1 +1 @@
Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292 Subproject commit 0e2bbfb73ceb70a16b2ab2b5ee6cbc6bd5005bf7