This commit is contained in:
Anatoliy Belyanskiy 2024-04-07 05:28:29 +10:00
parent ada25b0fe1
commit 8448dbef48
3 changed files with 183 additions and 143 deletions

View File

@ -5,8 +5,9 @@
;
; ¢å®¤: A - ­®¬¥à ¤¨áª  (0=A,1=B .. 25=Z. #FF-⥪ã騩)
; <09>ਠA bit7 = 1:
; HL - ¡ãä¥à (256 ¡ ©â®¢) ¤«ï à áè¨à¥­­ëå ¤ ­­ëå:
; B != 0 - áç¨â âì ᢮¡®¤­®¥ ¬¥áâ®
; A and #7F - ­®¬¥à ¤¨áª 
; HL - ¡ãä¥à (256 ¡ ©â®¢) ¤«ï à áè¨à¥­­ëå ¤ ­­ëå:
; B != 0 - áç¨â âì ᢮¡®¤­®¥ ¬¥áâ®
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ” ©«®¢ ï á¨á⥬ 
@ -23,134 +24,167 @@
; à §¬¥à ¯®«ï - 1 ¡ ©â
; § à¥§¥à¢¨à®¢ ­®
; ;
; A and #7F - ­®¬¥à ¤¨áª 
;
; ¢ë室: A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å, ¥á«¨ CF=0
; HL - ®¡é¥¥ ª®«-¢® ª« áâ¥à®¢
; DE - ᢮¡®¤­ëå ª« áâ¥à®¢
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
; ¢ë室: CF=0:
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; HL':HL - ®¡é¥¥ ª®«-¢® ª« áâ¥à®¢
; DE':DE - ᢮¡®¤­ëå ª« áâ¥à®¢
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; CF=1:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;/////////////////////////////////////////////////////////////////////
DISKINF:; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
LD C,B
LD B,1
;
CP #80
JR C,.CustomDisk
CP #FF
JR Z,.CurrentDisk
; more info
LD B,C
AND %0111'1111
PUSH HL
PUSH AF
CALL .CustomDisk
POP IX
JR C,.error
;
EX (SP),HL
PUSH DE
PUSH AF
PUSH BC
;;;;
;
EX DE,HL
LD HL,CORE_BUFFERS.BootSector.ID_FAT
LD A,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP
;
LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER
LD A,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP
;
LD HL,CORE_BUFFERS.BootSector.BPB_LABEL
LD A,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
;
PUSH DE
LD A,XH
LD DE,Dss.DRV.GenIOCTL.Enter
LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV
POP DE
JR C,.error_drv
LD A,2 ;!HARDCODE ¤«¨­  ¯®«ï ü4 2 ¡ ©â : 䨧 ­®¬¥à ¤¨áª , ­®¬¥à à §¤¥«  ¤¨áª 
LD (DE),A
INC DE
EX AF,AF'
LD (DE),A ;䨧 ­®¬¥à ¤¨áª 
INC DE
LD A,C
LD (DE),A ;­®¬¥à à §¤¥«  ¤¨áª 
INC DE
;
.error_drv:
XOR A
LD (DE),A
;;;;
POP BC
POP AF
POP DE
.error: POP HL
RET
;
;CP #FF ; !FIXIT WorkDirectory
;!TEST Current Dir
;JR Z,CURRDS ;R06
.CurrentDisk:
LD A,(CurrentPath)
SUB 'A'
LD HL,FatBuffer.DRIVE
CP (HL)
JR Z,.CheckFreeSpace
;
.CustomDisk:
PUSH BC
CALL CHNDISK ;R06
POP BC
RET C
;
DISKINF: LD C,B
LD B,1
;
CP #80
JR C,.CustomDisk
CP #FF
JR Z,.CurrentDisk
; more info
LD B,C
AND %0111'1111
PUSH HL
PUSH AF
CALL .CustomDisk
POP IX
JR C,.error
;
EX (SP),HL
PUSH DE
PUSH AF
PUSH BC
;;;;
;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
;
EX DE,HL
LD HL,CORE_BUFFERS.BootSector.ID_FAT
JR NZ,1F
LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.ID_FAT
1: LD C,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP
;
LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER
JR NZ,1F
LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_SERIAL_NUMBER
1: LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP
;
LD HL,CORE_BUFFERS.BootSector.BPB_LABEL
JR NZ,1F
LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_LABEL
1: LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
; fat32
EXX
PUSH DE
PUSH HL
EXX
PUSH DE
LD A,XH
LD DE,Dss.DRV.GenIOCTL.Enter
LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV
POP DE
; fat32
EXX
POP HL
POP DE
EXX
JR C,.error_drv
LD A,2 ;!HARDCODE ¤«¨­  ¯®«ï ü4 2 ¡ ©â : 䨧 ­®¬¥à ¤¨áª , ­®¬¥à à §¤¥«  ¤¨áª 
LD (DE),A
INC DE
EX AF,AF'
LD (DE),A ;䨧 ­®¬¥à ¤¨áª 
INC DE
LD A,C
LD (DE),A ;­®¬¥à à §¤¥«  ¤¨áª 
INC DE
;
.error_drv: XOR A
LD (DE),A
;;;;
POP BC
POP AF
POP DE
.error: POP HL
RET
;
CP #FF ; !FIXIT WorkDirectory
;!TEST Current Dir
;JR Z,CURRDS ;R06
.CurrentDisk: LD A,(CurrentPath)
SUB 'A'
LD HL,FatBuffer.DRIVE
CP (HL)
JR Z,.CheckFreeSpace
;
.CustomDisk: PUSH BC
CALL CHNDISK ;R06
POP BC
RET C
;
.CheckFreeSpace:
XOR A
OR B
CALL NZ,.CURRDS
;
;.FRESP2:
LD D,B
LD E,C
LD HL,(FatBuffer.MaxClusterLow)
DEC HL
LD BC,(CORE_BUFFERS.BootSector.BytesPerSector)
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
AND A
RET
;
.CURRDS:
LD HL,2
LD BC,0
.FRESP: PUSH BC
; [ ] fat32
CALL READ_FROM_FAT
POP BC
CP DSS_Error.sys.DISK_FULL
RET Z
LD A,E
OR D
JR NZ,.skip
INC BC
.skip: INC HL
JP .FRESP
;
; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
.mCOPY_LOOP:
LD C,A
LD B,0
LD (DE),A
INC DE
LDIR
RET
;
XOR A
OR B
CALL NZ,.GetFreeSpace
;
;.FRESP2:
LD D,B
LD E,C
LD HL,(FatBuffer.MaxClusterLow)
DEC HL
; fat 32
EXX
LD HL,(FatBuffer.MaxClusterHigh)
DEC HL
EXX
LD BC,(CORE_BUFFERS.BootSector.BytesPerSector)
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
AND A
RET
;
.GetFreeSpace: XOR A
LD HL,2 ; [ ] fat32 ? ­®¬¥à ª« áâ¥à  ®â ª®â®à®£® áç¨â âì
; fat32
EXX
LD H,A
LD L,A
EXX
LD B,A
LD C,A
.loop_free_space:
PUSH BC
CALL READ_FROM_FAT
POP BC
CP DSS_Error.sys.DISK_FULL
RET Z
; fat 32
EXX
LD A,E
OR D
EXX
OR E
OR D
JR NZ,.skip
INC BC
LD A,B
OR C
JR NZ,.skip
EXX
INC BC
EXX
.skip: INC HL
JR .loop_free_space
;
; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
.mCOPY_LOOP: LD B,0
EX DE,HL
LD (HL),C
EX DE,HL
INC DE
LDIR
RET
;
;

View File

@ -690,7 +690,9 @@ RD_BPB: LD C,SLOT3
LD C,A
LD B,0 ; BC - File handels in sectors
;;;;
LD (FatBuffer.FilesPerSector),A
IF COMPILE_UNUSED_CODE
LD (FatBuffer.FilesPerSector),A
ENDIF
;
EX DE,HL
LD HL,(CORE_BUFFERS.BootSector.FilesInRootDIR) ; 0 for fat32
@ -723,15 +725,17 @@ RD_BPB: LD C,SLOT3
.loop3.end:
;
LD (FatBuffer.BytesPerCluster),HL
EX DE,HL
LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize
XOR A
IF COMPILE_UNUSED_CODE
EX DE,HL
LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize
XOR A
;NEXTAD4 ;!FIXIT ®¯â¨¬¨§¨à®¢ âì ª®£¤  ¯®­ ¤®¡¨âáï
.loop4: INC A
JP Z,DOS_X_Error.UnknownBPB
SBC HL,DE
JR NC,.loop4
LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
.loop4: INC A
JP Z,DOS_X_Error.UnknownBPB
SBC HL,DE
JR NC,.loop4
LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
ENDIF
;
;!TODO detect fat type by clusters!
;[ ] fat32 reset fat32 variables
@ -873,7 +877,6 @@ FatBuffer:
.CacheBlock: DW #00
.CacheUpdated: DB #00
;.SectorsPerBank: DB #00
.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï?
.RootDirStartCluster_L: DW #0000
.RootDirStartCluster_H: DW #0000 ; [ ] fat32
.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
@ -884,15 +887,18 @@ FatBuffer:
.SectorsPerFAT_H DB #00
.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ;!FIXIT ­¥ ¨á¯®«ì§ã¥âáï
.RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR
.FilesPerSector: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
.DirSizeInSectors: DB #00 ; DIR_SEC_SIZE
.FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ; [ ] fat32
.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 ¡ë«® ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£ 
.BytesPerCluster: DW #0000 ; CLUSTER_LEN
.ENDCLUS_LOW: DW #FFFF
.ENDCLUS_HIGH: DW #0FFF ; [ ] fat3
.MaxClusterLow: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
IF COMPILE_UNUSED_CODE
.FilesPerSector: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï?
ENDIF
;.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
;

View File

@ -1224,7 +1224,7 @@ SaveGotCluster: LD A,C
; ‚室: HL -  ¤à¥á ªã¤  ¯¨á âì
; ‚ë室: HL -  ¤à¥á á«¥¤ãî騩 ¯®á«¥ § ¯¨á ­®£®
WRITE_DATE_TIME_TO_DIRECTORY_RECORD:
; [ ] fat32 & VFAT date
; [ ] VFAT date
PUSH HL
CALL SYSTIME ; ã§­ âì ⥪. ¤ âã ¨ ¢à¥¬ï
CALL MK_TIME ; § ª®¤¨à®¢ âì ¢à¥¬ï/¤ âã