ещё несколько процедур

This commit is contained in:
Anatoliy Belyanskiy 2024-03-24 04:53:25 +10:00
parent 1f66e8af24
commit bd5919fdc4
14 changed files with 620 additions and 799 deletions

View File

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

View File

@ -48,7 +48,6 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23
RET C
PUSH HL
; [ ] fat32
LD DE,(FatBuffer.ENDCLUS_LOW) ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
LD HL,MASKARE
@ -142,7 +141,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23
LDIR
;
POP HL
CALL NSECTOR
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤

View File

@ -41,7 +41,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L)
PUSH IX
.RMD17: PUSH HL
CALL NSECTOR
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­®
.read_dir_loop:

View File

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

View File

@ -120,7 +120,7 @@ DISKINF:; [ ] 22/11/23
;.FRESP2:
LD D,B
LD E,C
LD HL,(FAT_Max_Cluster_L)
LD HL,(FatBuffer.MaxClusterLow)
DEC HL
LD BC,(CORE_BUFFERS.BootSector.BytesPerSector)
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)

View File

@ -357,6 +357,7 @@ ADRST10: ;DS 512 ;,0
INCLUDE "API.ASM"
INCLUDE "DOS_Proc.asm"
INCLUDE "FS/FAT/FAT.ASM"
INCLUDE "FS/FAT/FAT_X.ASM"
INCLUDE "DOS_FM.ASM"
INCLUDE "EXECUTE.ASM"
@ -461,8 +462,11 @@ SECBUF EQU BUFFER
;
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||;
; !!!!! νβ  ―ΰ<E28095>ζ₯€γΰ  § βΰρβαο ―<>α«₯ ¨α<CEB1>«­­¨ο
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; § âàñâáï ¯®á«¥ ¨­¨æ¨ «¨§ æ¨¨
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; <20>¥à¢ë© áâ àâ á¨á⥬ë, ¯®á«¥ ¨­¨æ¨ «¨§ æ¨¨  ¤à¥á ¢ â ¡«¨æ¥ ¬¥­ï¥âáï ­  VERSION
F_START: DI
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®

View File

@ -134,17 +134,11 @@ XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00
;
MACRO SET_PAGE_X new_page
; IF OLD_SET_BANK
; LD A,new_page
; CALL BANK
; ELSE
LD A,(BANKTBL+new_page)
LD B,A
LD C,SLOT3
IN A,(SLOT3)
OUT (C),B
; ENDIF
ENDM
;

View File

@ -359,7 +359,7 @@ LOADDIR:
.LoadRootDir:
LD HL,(FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤
LD IX,(FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(FatBuffer.DirSizeInSectros)
LD A,(FatBuffer.DirSizeInSectors)
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£ 
CP B
JR NC,.RTD1
@ -464,7 +464,7 @@ SAVEDIR:
.SaveRootDir:
LD HL,(FatBuffer.RootDirFirstSector_H)
LD IX,(FatBuffer.RootDirFirstSector_L)
LD A,(FatBuffer.DirSizeInSectros)
LD A,(FatBuffer.DirSizeInSectors)
LD B,32 ;!HARDCODE sector size 512
SUB B
JR NC,.RTD1S
@ -576,7 +576,7 @@ RD_BPB: LD C,SLOT3
EX DE,HL
LD C,A ; A - sectors in DIR
LD B,0
LD (FatBuffer.DirSizeInSectros),A
LD (FatBuffer.DirSizeInSectors),A
ADD HL,BC ; Start DATA area
LD (FatBuffer.FirstDataSector_L),HL
; B = 0
@ -602,13 +602,13 @@ RD_BPB: LD C,SLOT3
JP Z,DOS_X_Error.UnknownBPB
SBC HL,DE
JR NC,.loop4
LD (FatBuffer.ClusterPerBank),A ; A - Clusters per bank (16k)
LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
;
;!TODO detect fat type by clusters!
;[ ] fat32 reset fat32 variables
LD HL,0
LD (FatBuffer.ENDCLUS_HIGH),HL
LD (FAT_Max_Cluster_H),HL
LD (FatBuffer.MaxClusterHigh),HL
;
LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
LD DE,FatBuffer.MSG
@ -627,34 +627,28 @@ RD_BPB: LD C,SLOT3
JR Z,.loop6
;
CP '1'
IF _FAT32_ENABLE
JP Z,.fat1x
;[ ] fat32
CP '2'
JP Z,.fat1x
CP '3'
JP NZ,DOS_X_Error.UnknownBPB
LD A,#46 ; #46-#26 = 32 fat type
LD HL,#0FFF
LD (FatBuffer.ENDCLUS_HIGH),HL
LD (FAT_Max_Cluster_H),HL
LD H,#FF
LD (FatBuffer.MaxClusterHigh),HL
LD H,L
JR .BPB_FAT
;
ELSE
JP NZ,DOS_X_Error.UnknownBPB
ENDIF
;
.fat1x: LD A,(HL)
CP '6' ; FAT16
LD HL,#FFFF
JR Z,.BPB_FAT
CP '2' ; FAT12
JP NZ,DOS_X_Error.UnknownBPB
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 #26 ; A-#26 = fat type (12, 16, 32)
LD (FatBuffer.FAT_TYPE),A
LD (FatBuffer.ENDCLUS_LOW),HL
;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨¥ ¢ëç¨á«ï¥¬®¥ ¨ á®å࠭塞®¥ ¢ FatBuffer
////////////////////////////////////////////////////////////////////////
; LD HL,0
@ -694,13 +688,13 @@ RD_BPB: LD C,SLOT3
RR L
JP .S4C01
.S4C02: INC HL
LD (FAT_Max_Cluster_L),HL
LD (FatBuffer.MaxClusterLow),HL
;
XOR A
LD H,A
LD L,A
LD (FatCache.Block),HL
LD (FatCache.Update),A
LD (FatBuffer.CacheBlock),HL
LD (FatBuffer.CacheUpdated),A
SET_PAGE_X FATPAGE
@ -722,13 +716,13 @@ RD_BPB: LD C,SLOT3
CP #F0
JR C,DOS_X_Error.UnknownBPB
; ID ram-¤¨áª  - #FA
CP #F8 ; !FIXIT ­¥ ®¡ï§ â¥«ì­® ¥á«¨ ¢¨­â, â® ­¥ FAT12
LD A,'6'
LD HL,#FFFF
JP Z,.BPB_FAT
;
CP #F8 ; !FIXIT fat. ­¥ ®¡ï§ â¥«ì­® ¥á«¨ ¢¨­â, â® ­¥ FAT12
LD A,'2'
LD HL,#0FFF
JP NZ,.BPB_FAT
;
LD A,'6'
LD H,L
JP .BPB_FAT
;
DOS_X_Error:
@ -745,11 +739,14 @@ DOS_X_Error:
;!TODO ª ¡ãä¥à ¬!
FatBuffer:
.MSG: DB 'FAT'
.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
.BLOCK: DB #00
.DRIVE: DB #FF
.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32
.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
.DRIVE: DB #FF
.FAT1_SEC_L: DW #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
.FAT1_SEC_H: DW #0000 ; [ ] fat32
.FAT2_SEC_L: DW #0000
@ -757,20 +754,15 @@ FatBuffer:
.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 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
.DirSizeInSectros: DB #00 ; DIR_SEC_SIZE
.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
.BytesPerCluster: DW #0000 ; CLUSTER_LEN
.ClusterPerBank: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï?
.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32
.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
.ENDCLUS_LOW: DW #FFFF
.ENDCLUS_HIGH: DW #FFFF ; [ ] fat32
.ENDCLUS_HIGH: DW #0FFF ; [ ] fat3
.MaxClusterLow: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;
INCLUDE "FAT12_16.ASM"
IF _FAT32_ENABLE
INCLUDE "FAT32.ASM"
ENDIF
;

View File

@ -1,194 +0,0 @@
;!TODO fat32
;=======================================================================
;BPB
;LD (FatBuffer.FAT2_SEC_L),HL
;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
;BPB32
;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 <20>¥à¢ë© ª« áâ¥à ª®à­¥¢®£® ª â «®£  (®¡ëç­® 2) 4 ¡ ©â 
;FAT Max Cluster
;LD (FAT_Max_Cluster_L),HL
;=======================================================================
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; ª®áâ뫨
MODULE SET_FAT32
; ‚•Ž„: HL - ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¯®á«¥ ¨­ªà¥¬¥­â 
; ‚›•Ž„: HL - ª ª ¨ ¢å®¤
; DE - áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¯®á«¥ ¨­ªà¥¬¥­â 
CHECK_INC_HIGH_CLUSTER:
LD DE,(R_CLUST.FAT32)
;
LD A,H
OR L
RET NZ
;
INC DE
; !FIXIT ¯à®¢¥àïâì ¯¥à¥¯®«­¥­¨¥?
RET
ENDMODULE
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;-----------------------------------------------------------------------
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
;
;[x] fat32 ;!TEST
GET_FAT32_CELL:
; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A,H
EXX
LD C,A
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
LD A,C
;
LD B,FAT_CACHE.Degree_32 ; 4 ᤢ¨£ 
.loop_block:
RLCA ; << H
RL L ; << L'
RL H ; << H'
DJNZ .loop_block
EXX
; ¨â®£¥ âãâ ¢ HL' ­®¬¥à ¡«®ª  FAT
;
; HL - FAT32 OFFSET (FROM CASH)
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
ADD HL,HL
ADD HL,HL
PUSH HL ; á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX
EX DE,HL
LD HL,(FatCache.Block) ; BC - BLOCK FAT IN CASH
SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
; FOR 8192 bytes cache
; 1ÿ073ÿ741ÿ824 bytes max fat32 size
; 1073741824/8192=131072
; 0x40000000 / 0x2000 = 0x20000
; FOR 16384 bytes cache
; 1ÿ073ÿ741ÿ824 bytes max fat32 size
; 1073741824/16384=65536
; 0x40000000 / 0x4000 = 0x10000
/*
D E H L
0xEAB1022 - block 0x1D562
D E H
0xEAB10 >>> 0x1D562
[ ] fat32 ¤®¤¥« âì âãâ
LD A,H
LD B,H
AND #0F
;AND FAT_CACHE.Size_Mask_16 ; #0F
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
;DUP FAT_CACHE.Degree_16
RRCA
RRCA
RRCA
RRCA
;EDUP
AND #0F
;AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
CP C
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
*/
;-----------------------------------------------------------------------
/*
; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
; A - NEW FAT BLOCK
READ_FAT32:
PUSH HL
PUSH AF
LD A,(FatCache.Update)
OR A
CALL NZ,WRITE_FAT_TABLE.Start
POP AF
LD L,A
XOR A
LD H,A ;!FIXIT fat32
LD (FatCache.Block),HL
LD (FatCache.Update),A
;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT
DUP FAT_CACHE.Degree_16
ADD HL,HL ;x2
EDUP
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
;
LD XH,D
LD XL,E
;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
;
LD HL,0 ; áâ. à §àï¤ ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32
LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
RST ToDSS.DRV
POP HL
RET
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL:
LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Size_Mask_16
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
DUP FAT_CACHE.Degree_16
RRCA
EDUP
;AND #0F
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
R_F_F16:
CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
POP AF
OUT (SLOT3),A
;!TODO #FFF7 - ª« áâ¥à á ª®áïªç­ë¬¨ ᥪâ®à ¬¨
LD HL,#FFEF ;!HARDCODE
XOR A ; DssErr.sys.NO_ERROR
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL
RET
*/
;

View File

@ -14,33 +14,43 @@
;---------------------------------------------------------------
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
; [ ] fat32
R_CLUST:
LD HL,#0001
LD (G_CLUST.num),HL
; [x] fat32 ;!TEST
R_CLUST: LD HL,#0001
LD (G_CLUST.low),HL
DEC L
LD (G_CLUST.high),HL
RET
.FAT32: WORD 0
; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à
; [ ] fat32
G_CLUST:
.num+1: LD HL,#0001
; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢
; [x] fat32 ;!TEST
G_CLUST: ;
.low+1: LD HL,#0001
.loop: INC HL ; ­®¬¥à ª« áâ¥à 
LD A,L
OR H
; [x] fat32
IF _FAT32_ENABLE
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER
ENDIF
EXX
.high+1: LD HL,0
JR NZ,.no_inc
INC HL
.no_inc: EXX
;
CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
CP DSS_Error.sys.DISK_FULL
SCF
RET Z ; ®è¨¡ª  ?
EXX
LD A,D
OR E
EXX
OR D
OR E
JR NZ,.loop
LD (G_CLUST.num),HL
LD (G_CLUST.low),HL
EXX
LD (G_CLUST.high),HL
EXX
; XOR A
RET
@ -60,11 +70,10 @@ INC_FAT:
; JR NC,.loop ; ­¥ ª®­¥æ 楯®çª¨
EX DE,HL
; POP DE ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT.Custom ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
;!FIXIT <­¥â ª®­âà®«ï ®è¨¡ª¨>
;
POP HL
LD DE,(FatBuffer.ENDCLUS_LOW) ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
@ -73,6 +82,35 @@ INC_FAT:
RET
;RX01
; ¢å®¤: de = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster
; de' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
; [x] fat32 ;!TEST
CHECK_CLUSTER_IS_SMALLER:
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
EXX
EX DE,HL
LD HL,(FatBuffer.MaxClusterHigh)
; CF = 0
SBC HL,DE
EX DE,HL
EXX
LD A,DSS_Error.sys.DISK_FULL
;RET C
RET NZ ; ¥á«¨ FatBuffer.MaxClusterHigh - hl' != 0, â® ª« áâ¥à ª®à४â­ë©
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL
LD HL,(FatBuffer.MaxClusterLow)
; CF = 0
SBC HL,DE
EX DE,HL
LD A,DSS_Error.sys.DISK_FULL
RET
;
;------------------------------------------------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
@ -85,34 +123,9 @@ INC_FAT:
; CF - ª®­¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------
;[x] fat32 ;!TEST
READ_FROM_FAT:
;[x] fat32
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
; !FIXIT fat32 ¯à®¢¥àïâì ®¡  á«®¢  FAT_Max_Cluster
EXX
EX DE,HL
LD HL,(FAT_Max_Cluster_H)
; CF = 0
SBC HL,DE
EX DE,HL
EXX
LD A,DSS_Error.sys.DISK_FULL
RET C
JP NZ,.correct_cluster ; ¥á«¨ FAT_Max_Cluster_H - hl' != 0, â® ª« áâ¥à ª®à४â­ë©
;
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL
LD HL,(FAT_Max_Cluster_L)
; CF = 0
SBC HL,DE
EX DE,HL
LD A,DSS_Error.sys.DISK_FULL
READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
RET C
;
.correct_cluster:
SET_PAGE_X FATPAGE
;
PUSH HL
@ -135,7 +148,6 @@ READ_FROM_FAT:
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
SBC HL,DE
POP HL
; [x] fat32
EXX
LD H,A
LD L,A
@ -150,8 +162,7 @@ READ_FROM_FAT:
LD D,(HL)
LD HL,SERVICE_SECTORS.FAT12
JR NC,.Correct_2
.Correct_1:
LD A,E
.Correct_1: LD A,E
AND #F0
DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RR D
@ -160,14 +171,12 @@ READ_FROM_FAT:
LD E,A
JR .exit
;
.Correct_2
LD A,D
.Correct_2: LD A,D
AND #0F
LD D,A
JR .exit
;
.FAT32: ; [x] fat32 ;!TEST
EXX
.FAT32: EXX
PUSH HL
EXX
;
@ -199,7 +208,6 @@ READ_FROM_FAT:
SBC HL,DE
POP HL
EXX
;
POP BC
LD A,B
OUT (SLOT3),A
@ -208,30 +216,36 @@ READ_FROM_FAT:
; ‡ ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì (⮫쪮 ¤«ï fat32)
; .Custom:
; de = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ª®â®à®¥ ¢¯¨á âì
; de' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ª®â®à®¥ ¢¯¨á âì (⮫쪮 ¤«ï fat32)
; ¢ë室: â ª®© ¦¥ ª ª ¨ ¢å®¤
;------------------------------------------------------------------------------------------------
; [ ] fat32
WRITE_TO_FAT:
; [x] fat32 ;!TEST
WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; ­®¬¥à ª« áâ¥à 
EXX
LD DE,(FatBuffer.ENDCLUS_HIGH) ; ­®¬¥à ª« áâ¥à 
EXX
.Custom: PUSH DE
EXX
PUSH DE
EX DE,HL
LD HL,(FAT_Max_Cluster_L)
AND A
SBC HL,DE
EX DE,HL
EXX
CALL CHECK_CLUSTER_IS_SMALLER
EXX
POP DE
EXX
POP DE
LD A,DSS_Error.sys.DISK_FULL
RET C
;
EXX
SET_PAGE_X FATPAGE
EXX
PUSH HL
PUSH AF
PUSH DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
PUSH DE ; ¬« ¤è¨© ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
;LD A,1
;LD (FatCache.Update),A
;LD (FatBuffer.CacheUpdated),A
;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
@ -239,7 +253,7 @@ WRITE_TO_FAT:
JR NZ,.FAT32
;
.FAT16: CALL GET_FAT16_CELL
POP DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
POP DE ; ¬« ¤è¨© ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
LD (HL),E ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D
@ -249,13 +263,13 @@ WRITE_TO_FAT:
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A
INC A
LD (FatCache.Update),A
LD (FatBuffer.CacheUpdated),A
; CF = 0
RET
;
.FAT12: ;!FIXIT ¯¥à¥¤¥« âì ­  ¯¥à¥¬¥­­ë¥ FAT_CACHE
CALL GET_FAT12_CELL
POP DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
POP DE ; ¬« ¤è¨© ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
JR C,.Correct_1 ; ­®¬¥à ­¥çñâ­ë©
LD (HL),E
INC HL
@ -265,8 +279,7 @@ WRITE_TO_FAT:
LD (HL),A
JR .exit
;
.Correct_1:
; ¢«¥¢® ­  4 ¡¨âa
.Correct_1: ; ¢«¥¢® ­  4 ¡¨âa
EX DE,HL
ADD HL,HL
ADD HL,HL
@ -280,84 +293,94 @@ WRITE_TO_FAT:
LD (HL),A ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
LD (HL),D
POP AF
POP HL
OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A
INC A
LD (FatCache.Update),A
; LD A,1
; LD (FatCache.Update),A
; AND A
; CF = 0
RET
.FAT32: ; [ ] fat32
JR .exit
;
.FAT32: ; [x] fat32 ;!TEST
EXX
PUSH DE ; áâ à訩 ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
PUSH HL ; áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
EXX
CALL GET_FAT32_CELL
POP DE ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
LD (HL),E ; á®åà. ¢ ª¥è¥ FAT- 
INC HL ; ­®¬¥à ª« áâ¥à 
EXX
POP HL ; áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
EXX
POP DE ; áâ à訩 ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
POP BC ; ¬« ¤è¨© ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
; á®åà. ¢ ª¥è¥ FAT-  ­®¬¥à ª« áâ¥à 
LD (HL),C
INC HL
LD (HL),B
INC HL
LD (HL),E
INC HL
LD (HL),D
JR .exit
;;;;;;;;;
DI
HALT
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
; in: HL - Cache block
; out: C:HL - logical number
GET_SECTOR_OF_FAT:
XOR A
LD B,A
LD C,A
DUP FAT_CACHE.Degree ; 4
ADD HL,HL ;x2
ADC A,C
EDUP
LD C,A
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
RET NZ
ADD HL,HL ;x2
RET NC
INC C
RET
;;;;;;;;;
;RE_FAT:
;RX01
; <20>à®ç¨â âì ¢ ª¥è •• ᥪâ®à®¢ FAT- 
; [ ] fat32 ;!TEST
; [x] fat32 ;!TEST
; DE - NEW FAT BLOCK
READ_FAT_TABLE:
PUSH HL
; [x] fat32
; PUSH AF
READ_FAT_TABLE: PUSH HL
PUSH DE
;
LD A,(FatCache.Update)
LD A,(FatBuffer.CacheUpdated)
OR A
CALL NZ,WRITE_FAT_TABLE.Start
; [x] fat32
; POP AF
POP DE
;
;[ ] fat32
; LD L,A
; XOR A
; LD H,A
EX DE,HL
LD (FatBuffer.CacheBlock),HL
;
CALL GET_SECTOR_OF_FAT
;
LD (FatCache.Block),HL
;LD (FatCache.Update),A
;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT
DUP FAT_CACHE.Degree ; 4
ADD HL,HL ;x2
EDUP
LD DE,(FatBuffer.FAT1_SEC_L)
; ­®¬¥à «®£. ᥪâ®à 
; BC:HL - ­®¬¥à «®£. ᥪâ®à 
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,(FatBuffer.FAT1_SEC_H)
LD DE,0
ADC HL,DE
JR NC,.no_inc
INC HL
.no_inc: ADD HL,BC
; HL:IX - SECTOR FAT FOR READING
LD B,FAT_CACHE.Sectors_16
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
JR NZ,.nxt
LD B,FAT_CACHE.Sectors_32
LD B,FAT_CACHE.Sectors_32 ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
.nxt: LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD C,Dss.DRV.Read ;ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
RST ToDSS.DRV
POP HL
RET
; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
; [ ] fat32
WRITE_FAT_TABLE:
@ -368,16 +391,14 @@ WRITE_FAT_TABLE:
OUT (SLOT3),A
RET
; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD HL,(FatCache.Block)
;
;LD H,0
;FAT BLOCK * 16 = SECTOR OF FAT
DUP FAT_CACHE.Degree
ADD HL,HL ;x2
EDUP
; HL - ­®¬¥à «®£. ᥪâ®à 
.Start: LD HL,(FatBuffer.CacheBlock)
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
CALL GET_SECTOR_OF_FAT
; BC:HL - ­®¬¥à «®£. ᥪâ®à 
; [ ] fat32 ;!FIXIT
LD B,H
LD C,L ;BC - BLOCK OF FAT
LD C,L
; [ ] fat32
LD DE,FAT_CACHE.Sectors_16
ADD HL,DE ;+ SIZE CASH (16 SECTORS)
LD A,E ;!HARDCODE ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè
@ -385,17 +406,17 @@ WRITE_FAT_TABLE:
AND A
SBC HL,DE
JR C,.WALLFAT
;
EX DE,HL
LD HL,FAT_CACHE.Sectors_16
; CF = 0
SBC HL,DE
JR C,.ERR
JR C,.ERR ;!TODO ¯à®¢¥à¨âì
LD A,L
.WALLFAT:; !TODO çñ¡ áà §ã ¢ IX ­¥ £à㧨âì FAT_FRM?
.WALLFAT:
LD H,B
LD L,C
PUSH HL ; HL - ­®¬¥à «®£. ᥪâ®à 
;
PUSH HL
LD DE,(FatBuffer.FAT1_SEC_L)
LD B,A ; ç¨á«® ᥪâ®à®¢
LD C,Dss.DRV.Write ; § ¯¨áì ᥪâ®à®¢
@ -416,7 +437,7 @@ WRITE_FAT_TABLE:
AND A ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
.only_one_FAT:
.ERR: LD A,0
LD (FatCache.Update),A
LD (FatBuffer.CacheUpdated),A
RET
;
.SAVE_FAT_XX:
@ -438,66 +459,50 @@ WRITE_FAT_TABLE:
LD DE,FATPAGE.cache ; ®âªã¤ 
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
JP ToDSS.DRV
/*
.WALLFAT:; !TODO çñ¡ áà §ã ¢ IX ­¥ £à㧨âì FAT_FRM?
LD H,B
LD L,C
PUSH HL ; HL - ­®¬¥à «®£. ᥪâ®à 
;-----------------------------------------------------------------------
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
;
LD DE,(FatBuffer.FAT1_SEC_L)
ADD HL,DE
EX DE,HL
; ­®¬¥à «®£. ᥪâ®à 
;LD IX,0
;ADD IX,DE
LD XH,D
LD XL,E
;[x] fat32 ;!TEST
GET_FAT32_CELL:
; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A,H
EXX
LD C,A
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
LD A,C
;
LD HL,0 ; áâ. à §àï¤
;HL:IX - SECTOR OF FAT FOR SAVE
LD DE,FATPAGE.cache ; ®âªã¤ 
LD B,A ; ç¨á«® ᥪâ®à®¢
LD C,Dss.DRV.Write ; § ¯¨áì ᥪâ®à®¢
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
PUSH BC
RST ToDSS.DRV
; [ ] ¥á«¨ ¢á¥£® ®¤­  â ¡«¨æ  FAT, â® ¯®¢â®à­®© § ¯¨á¨ ­¥ ¯à®¨á室¨â 13/03/2024
LD DE,(FatBuffer.FAT2_SEC_L)
LD HL,(FatBuffer.FAT1_SEC_L)
LD B,FAT_CACHE.Degree_32 ; 4 ᤢ¨£ 
.loop_block:
RLCA ; << H
RL L ; << L'
RL H ; << H'
DJNZ .loop_block
EXX
; ¨â®£¥ âãâ ¢ HL' ­®¬¥à ¡«®ª  FAT
;
; HL - FAT32 OFFSET (FROM CASH)
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
ADD HL,HL
ADD HL,HL
PUSH HL ; [ ] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
SBC HL,DE
POP BC ; b=ç¨á«® ᥪâ®à®¢
POP HL
JR Z,.only_one_FAT
; POP BC ; b=ç¨á«® ᥪâ®à®¢
; POP HL
; LD DE,(FatBuffer.FAT2_SEC_L)
;
ADD HL,DE
EXX
EX DE,HL
LD XH,D
LD XL,E
;
LD HL,0
; CF = ADD HL,DE
; [ ] fat32 - ¢â®à ï â ¡«¨æ  ä â ¬®¦¥â ¦¥ ã¥å âì ¤ «ìè¥ 16-¡¨â «®£¨ç¥áª®£® ᥪâ®à ?
IF _FAT32_ENABLE
RL L
ENDIF
;
LD DE,FATPAGE.cache
LD A,(FatBuffer.DRIVE)
LD C,Dss.DRV.Write
RST ToDSS.DRV
AND A ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
.only_one_FAT:
;
.ERR: LD A,0
LD (FatCache.Update),A
LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
*/
;-----------------------------------------------------------------------
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT16_CELL:
@ -516,9 +521,9 @@ GET_FAT16_CELL:
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
; [ ] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
@ -526,7 +531,7 @@ GET_FAT16_CELL:
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;-----------------------------------------------------------------------
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
@ -538,7 +543,7 @@ GET_FAT12_CELL:
PUSH AF ; á®åà. ä« £
ADD HL,DE ; CLUSTER * 1.5
;
IF FAT_CACHE.Size_12 < #2000
IF FAT_CACHE.Size_12 < #1800
;!FIXIT ®¯â¨¬¨§¨à®¢ âì
LD A,H
LD B,H
@ -559,9 +564,9 @@ GET_FAT12_CELL:
;AND FAT_CACHE.Part_Mask_16
;
; [ ] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatCache.Block) ; BC - BLOCK FAT IN CASH
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
@ -572,12 +577,20 @@ GET_FAT12_CELL:
ADD HL,DE
POP AF
RET
;-----------------------------------------------------------------------
; in: DE:HL - CLUSTER
;NSECTOR:
; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR
NSECTOR:;[ ] fat32
LD DE,(FAT_Max_Cluster_H) ; [ ] fat32 - § ¬¥­¨âì ¤à㣮© ¯¥à¥¬¥­­®©
;[ ] fat32
CLUSTER_TO_SECTOR:
EXX
PUSH HL
EXX
POP DE
; DE:HL - cluster
DEC HL
DEC HL
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
@ -645,7 +658,7 @@ BLOCK_READ: PUSH BC
;DE : BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (D=D+1, B=B+1)
;
PUSH DE ; [x] ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
JP .enter_loop1
JR .enter_loop1
;
.fast_exit_5: POP DE
.fast_exit_4: ; [x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
@ -678,26 +691,26 @@ BLOCK_READ: PUSH BC
;
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP DE
POP BC
POP BC ; B - Amount sectors
CALL SaveGotCluster
;
POP DE ; ®áâ â®ª DIV_for_SPC
POP BC ; HL:DE - FP (in sectors)
POP DE ; D = 0, E = ®áâ â®ª DIV_for_SPC
POP BC ; B = Amount sectors
; (SP) = (RET)
;
; à ¡®â  á ®áâ âª®¬ ®â ¤¥«¥­¨ï
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
SUB E
LD C,A ;\
CP B ; \
JR C,.skip1 ;SIZE > RESIDUE CLUSTER ; \
LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO à §®¡à âìáï
.skip1: LD A,B ; /
SUB C ; /
LD B,A ;/
PUSH HL
LD C,A
CP B
JR C,.skip1 ;SIZE > RESIDUE CLUSTER
LD C,B ;SIZE < CLUSTER
.skip1: LD A,B
SUB C
LD B,A
PUSH HL ; ­®¬¥à ª« áâ¥à  ¬« ¤è ï ç áâì
PUSH BC
PUSH DE
CALL NSECTOR
CALL CLUSTER_TO_SECTOR
POP DE
ADD IX,DE
JR NC,.skip2
@ -745,7 +758,7 @@ BLOCK_READ: PUSH BC
EX DE,HL
PUSH HL
PUSH BC
CALL NSECTOR
CALL CLUSTER_TO_SECTOR
LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD B,C
@ -826,7 +839,6 @@ BLOK_WR: PUSH BC
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),H
EXX
;
LD DE,(FatBuffer.ENDCLUS_LOW)
CALL WRITE_TO_FAT
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;PUSH HL
@ -903,7 +915,7 @@ BLOK_WR: PUSH BC
PUSH HL
PUSH BC
PUSH DE
CALL NSECTOR
CALL CLUSTER_TO_SECTOR
POP DE
ADD IX,DE
JR NC,.WR4
@ -954,7 +966,7 @@ BLOK_WR: PUSH BC
EX DE,HL
PUSH HL
PUSH BC
CALL NSECTOR
CALL CLUSTER_TO_SECTOR
; DOUBLE 1
LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
@ -988,53 +1000,53 @@ BLOK_WR: PUSH BC
;SCF
RET
/*
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ‚室: HL - ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; BC - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; ‚ë室: HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ  (¬« ¤è¥¥ á«®¢®)
; BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
GetSavedCluster:
INC B
;PUSH DE ; ¯¥à¢ë© ª« áâ¥à ä ©«  (áâ à襥 á«®¢®)
LD E,(IY+_sFM.KnownCluster_L)
LD D,(IY+_sFM.KnownCluster_L+1)
LD A,E
OR D
RET Z
;
DEC B
PUSH DE ; KnownCluster_H
PUSH HL ; ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
PUSH BC ; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
LD E,(IY+_sFM.KnownOffset_L)
LD D,(IY+_sFM.KnownOffset_L+1)
LD A,D
OR E
JR Z,.noOptimization_3
;
POP HL ; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
SBC HL,DE
JR C,.noOptimization_2
LD C,L
LD B,H
POP DE ; ¡ « ­á á⥪ 
POP HL
; ®¯â¨¬¨§ æ¨ï: HL - ­¥ ¯¥à¢ë© ª« áâ¥à ä ©« ,   KnownCluster
; BC - à ááâ®ï­¨¥ ¤® âॡ㥬®£® ᬥ饭¨ï ®â KnownCluster
;
INC B
RET
;
.noOptimization_3:
POP BC
.noOptimization_2:
POP HL
.noOptimization_1:
POP DE
INC B
RET
*/
; ;GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ; ‚室: HL - ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; ; BC - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; ; ‚ë室: HL - ¨§¢¥áâ­ë© ª« áâ¥à ä ©«  ¤«ï ®âáçñâ  (¬« ¤è¥¥ á«®¢®)
; ; BC - ®á⠢襥áï ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (¬« ¤è¥¥ á«®¢®)
; GetSavedCluster:
; INC B
; ;PUSH DE ; ¯¥à¢ë© ª« áâ¥à ä ©«  (áâ à襥 á«®¢®)
; LD E,(IY+_sFM.KnownCluster_L)
; LD D,(IY+_sFM.KnownCluster_L+1)
; LD A,E
; OR D
; RET Z
; ;
; DEC B
; PUSH DE ; KnownCluster_H
; PUSH HL ; ¯¥à¢ë© ª« áâ¥à ä ©«  (¬« ¤è¥¥ á«®¢®)
; PUSH BC ; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
; LD E,(IY+_sFM.KnownOffset_L)
; LD D,(IY+_sFM.KnownOffset_L+1)
; LD A,D
; OR E
; JR Z,.noOptimization_3
; ;
; POP HL ; ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å
; SBC HL,DE
; JR C,.noOptimization_2
; LD C,L
; LD B,H
; POP DE ; ¡ « ­á á⥪ 
; POP HL
; ; ®¯â¨¬¨§ æ¨ï: HL - ­¥ ¯¥à¢ë© ª« áâ¥à ä ©« ,   KnownCluster
; ; BC - à ááâ®ï­¨¥ ¤® âॡ㥬®£® ᬥ饭¨ï ®â KnownCluster
; ;
; INC B
; RET
; ;
; .noOptimization_3:
; POP BC
; .noOptimization_2:
; POP HL
; .noOptimization_1:
; POP DE
; INC B
; RET
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
; ‚室: DE - ᬥ饭¨¥ ¢ ä ©«¥ ¢ ª« áâ¥à å (áâ à襥 á«®¢®)
@ -1131,11 +1143,23 @@ SaveGotCluster: LD A,C
////////////////////////////////////////////////////////////////////////
FatCache: ;WORD #0000
.Block WORD #0000
.Update BYTE 0
FAT_Max_Cluster_L: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
FAT_Max_Cluster_H: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;!TODO fat32
;=======================================================================
;BPB
;LD (FatBuffer.FAT2_SEC_L),HL
;LD (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
;=======================================================================
;FatCache:
;.Block WORD #0000
;.Update BYTE 0
;FAT_Max_Cluster_L: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;FAT_Max_Cluster_H: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;//MODULE: FAT_X
;[END]
@ -1258,7 +1282,7 @@ FAT_Max_Cluster_H: WORD #0000 ;
////////////// OLD ////////////////
; HL - CLUSTER
; HL:IX - SECTOR
; NSECTOR: DEC HL
; CLUSTER_TO_SECTOR: DEC HL
; DEC HL
; EX DE,HL
; LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)

View File

@ -1,3 +1,4 @@
;!TODO ¯à¨¢¥á⨠ª ®¡é¥¬ã ¢¨¤ã ¢ ®¤­ã ¨­áâàãªæ¨î, ¯à®¢¥à¨âì ª®à४⭮áâì
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
@ -11,10 +12,10 @@
;
;Function: Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Input: C = #00
; IX = Environment
;
;Output: A = Amount drive support
; HL = Size driver
;[]===========================================================[0]
;[]===========================================================[1]
@ -22,10 +23,10 @@
;
;Function: Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;Input: C = #01
; A = Drive
;
;Output: None
;[]===========================================================[1]
;[]===========================================================[2]
@ -33,10 +34,10 @@
;
;Function: Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;Input: C = #02
; A = Drive
;
;Output: None
;[]===========================================================[2]
;[]===========================================================[3]
@ -44,11 +45,11 @@
;
;Function: Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;Input: C = #03
; A = Drive
;
;Output: A = #00 disk no changed
; #FF disk changed
;[]===========================================================[3]
;[]===========================================================[4]
@ -56,36 +57,38 @@
;
;Function: Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;Input: C = #04
; A = Drive
; DE = Address
;
;Output: None
;[]===========================================================[4]
;[]===========================================================[5]
;Procedure : Input
;Procedure: Read
;
;Function : Input from disk
;Function: Read from disk
;
;Input: C = #05
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A = Drive
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output: None
;
;[]===========================================================[5]
;[]===========================================================[6]
;Procedure : Output
;Procedure: Write
;
;Function : Output to disk
;Function: Write to disk
;
;Input: C = #06
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output: None
;
;[]===========================================================[6]
;[]===========================================================[7]
@ -93,11 +96,11 @@
;
;Function: Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;Input: C = #07
; A = Drive
;
;Output: A = #00 Removable
; A = #FF Non-removable
;[]===========================================================[7]
;[]===========================================================[8]
@ -105,19 +108,17 @@
;
;Function: Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;Input: C = #08
; B = Subcommand
; DE = #55AA Magic Number
;
;Subcommands: #00 - Get Device Parameters
; #01 - Read track
; #02 - Test track
; #80 - Set Device Parameters
; #81 - Write track
; #82 - Format track
;Output:
;[]===========================================================[8]
;[]===========================================================[9]
@ -125,15 +126,15 @@
;
;Function: Reading sectors from disk
;
;Input : C = 0Ah
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;Input: C = #0A
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A' = Page
;
;Output: A' = Next Page
; HL:IX = Next Logical Block (sector)
; DE = Next Address
;[]===========================================================[9]
;[]===========================================================[10]
@ -141,33 +142,33 @@
;
;Function: Writing sectors to disk
;
;Input : C = 0Bh
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;Input: C = #0B
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A' = Page
;
;Output: A' = Next Page
; HL:IX = Next Logical Block (sector)
; DE = Next Address
;[]===========================================================[10]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
; 0 (#00) - NO ERRORS
; 1 (#01) - BAD COMMAND
; 2 (#02) - BAD DRIVE NUMBER
; 3 (#03) - UNKNOW FORMAT
; 4 (#04) - NOT READY
; 5 (#05) - SEEK ERROR
; 6 (#06) - SECTOR NOT FOUND
; 7 (#07) - CRC ERROR
; 8 (#08) - WRITE PROTECT
; 9 (#09) - READ ERROR
; 10 (#0A) - WRITE ERROR
; 11 (#0B) - FAILURE
; 12 (#0C) - BUSY (DEVICE OPENED)
; 13 (#0D) - RESERVED
; IDE0 EQU #0C1C0
; IDE1 EQU #0C1C8
@ -286,7 +287,7 @@ SELHDD: PUSH DE
;
LD L,A
LOGDRV_ENTRY_FIND LOGDRV
;
; !HARDCODE
LD C,(IY+1)
LD B,(IY+2)
LD E,(IY+3)
@ -431,14 +432,14 @@ CHEK_H: ;LD A,#FF
RET
;HL:IX - SECTOR
; DE - ADDRESS
; A - DRIVE
GBPB_H: PUSH IY
PUSH DE
LD L,A
;
LOGDRV_ENTRY_FIND LOGDRV
;
; !HARDCODE
LD E,(IY+1)
LD D,(IY+2)
LD L,(IY+3)
@ -469,7 +470,7 @@ LREADH: PUSH IY
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD NUMBER +#80
; A - HDD LOG NUMBER
;WRITE SECTOR
LWRITEH:
PUSH IY
@ -482,7 +483,7 @@ LWRITEH:
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD NUMBER +#80
; A - HDD LOG NUMBER
;WRITE SECTOR
WRITEH: PUSH IY
CALL SELHDD
@ -494,7 +495,7 @@ WRITEH: PUSH IY
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD NUMBER +#80
; A - HDD LOG NUMBER
;READ SECTOR
READH: PUSH IY
CALL SELHDD
@ -506,7 +507,7 @@ READH: PUSH IY
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD NUMBER +#80
; A - HDD LOG NUMBER
;CHECK SECTOR
CHECKH: PUSH IY
CALL SELHDD

View File

@ -9,6 +9,7 @@
; DISK DRIVER SPECIFICATION
; !FIXIT ⑤<>玻オ皚<E382AA><E79A9A>!
;---------------------------------------------
; COMMAND 00h (INITIALIZATION)
;

View File

@ -1 +1 @@
945
955

View File

@ -66,7 +66,7 @@ FAT_CACHE:
; for FAT32
.Size_32 EQU #4000
.Sectors_32 EQU .Size_32 / .Sector_Size ; #20
.Degree_32 EQU .Degree
.Degree_32 EQU 5
.Size_Mask_32 EQU #0F
.Part_Mask_32 EQU #0F
.bytes_record_32 EQU 2