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/macros.z80'
include 'shared_includes/structures/FileSystem.inc'
include '../DSS/defines.inc'
DEFINE EXEinfoMACRO 0
DEFINE App_EXE_Version 1
@ -348,9 +349,11 @@ write_to_: ld a,(disk) ;
ld b,a
inc c
scf
ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
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 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â)
LD HL,0
LD IX,0
@ -364,6 +367,7 @@ write_to_: ld a,(disk) ;
SBC HL,DE
RET C
;
.skip_FAT_check:;
push bc
ld a,b
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 

View File

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

View File

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

View File

@ -132,14 +132,14 @@ MKDIR:
CP "."
JR Z,.copy_dir_record
; fat32
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.fat16_root_dir
; fat 32
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 HL,(FatBuffer.RootDirStartCluster_H)
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL
EX DE,HL
JR .set_rec
@ -169,7 +169,7 @@ MKDIR:
EXX
POP HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
@ -178,7 +178,7 @@ MKDIR:
IN A,(SLOT0)
OUT (SLOT3),A
;
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Write
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+2),A
LD (IY+_sFM.F_POSITION+3),A
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A
; fat32
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
EXX
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
LD B,A
LD C,Dss.DRV.Read
; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­®
@ -67,7 +67,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
LD DE,CORE_BUFFERS.SECBUF+#C000
;LD BC,1*256 + Dss.DRV.Read
LD B,1
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
RST ToDSS.DRV
POP AF
OUT (SLOT3),A

View File

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

View File

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

View File

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

View File

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

View File

@ -241,11 +241,16 @@ PORTAL.out_MAIN: ;
CLEAR_BUFFER_AND_INIT_PROC:
;------[CLEAR BUFFERS]------;
;R07 ;R11
XOR A
LD HL,CLEAR_ZONE.start
LD DE,CLEAR_ZONE.start+1
LD BC,CLEAR_ZONE.size-1
LD (HL),0
LD (HL),A
LDIR
; A = 0
DEC A
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
;
;R07 ;R11
;R11
LD HL,CORE_BUFFERS.FM_BUF
@ -405,7 +410,8 @@ BUFFERSplace _sBuffers=$
FM_BUF _sFM = BUFFERSplace.FileManipulator
.Size EQU _sFM
.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
XSTACK EQU BUFFERSplace.Stack.SPoint
BUFFER EQU BUFFERSplace.Buffer
@ -415,11 +421,11 @@ CLEAR_ZONE.size EQU _sBuffers
ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0"
DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector
DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector
DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector
DISPLAY "BUFFERSplace ", /H, CORE_BUFFERS.BUFFERSplace
DISPLAY "FatBuffer ", /H, CORE_BUFFERS.FatBuffer
DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer
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 "--- --- --- --- --- --- --- ---"
@ -597,7 +603,9 @@ DRV_CONTENT:
DRV_CONTENT.SIZE EQU $-DRV_CONTENT
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]
;

View File

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

View File

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

View File

@ -538,5 +538,12 @@ GET_RAMDRV_NUM:
LD A,(BC)
OR #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
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
; 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
.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1)
.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
.Stack _sStack ; 256 bytes
.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF
.MemoryTable BLOCK 256,0 ; 256 bytes
ENDS
;
;

View File

@ -1 +1 @@
952
950

View File

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

View File

@ -103,8 +103,14 @@ BATCH:
;CALL Restore_Screen
;R10
;pop af
ret c
ld (BAT_FM),a ; ¤¥áªà. bat-ä ©« 
JR NC,.good
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-ä ©« 
call NEWLINE
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat

View File

@ -1 +1 @@
314
315

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