prepare for FAT "big dir" support

This commit is contained in:
Tolik 2025-10-30 23:25:12 +10:00
parent 02fb3ddb32
commit 4da5e6c350
14 changed files with 571 additions and 424 deletions

View File

@ -37,6 +37,7 @@ ATTRIB: ; Current Dir ;[x] 15/10/23
XOR A XOR A
LD (OPEN_FN.TMP),A LD (OPEN_FN.TMP),A
CALL .OPENATR ;R002 CALL .OPENATR ;R002
; DE = record index
CALL NC,OPEN_FN.FM CALL NC,OPEN_FN.FM
; ;
POP BC POP BC

View File

@ -6,86 +6,87 @@
;‚λ室­λ¥ §­ η¥­¨ο: ;‚λ室­λ¥ §­ η¥­¨ο:
; A - <20>®¤ ®θ¨΅<C2A8>¨, ¥α«¨ CF=1 ; A - <20>®¤ ®θ¨΅<C2A8>¨, ¥α«¨ CF=1
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
CLOSE_FN: ;CLOSE:
;R008 ; CLOSE_FN: LD (.TMP),A
;CLOSE: ; CALL SET_FM
LD (.TMP),A RET C
CALL SET_FM LD A,(TASK)
RET C CP (IY+_sFM.TASK_NUM)
LD A,(TASK) LD A,DSS_Error.sys.ACCESS_DENIED
CP (IY+_sFM.TASK_NUM) SCF
LD A,DSS_Error.sys.ACCESS_DENIED RET NZ
SCF BIT 7,(IY+_sFM.ACCESS_MODE)
RET NZ JR Z,.NOTMODF
BIT 7,(IY+_sFM.ACCESS_MODE) ;
JR Z,.NOTMODF ; ä ©« ¨§¬¥­ñ­
; LD E,(IY+_sFM.DIR_CLUSTER_L)
LD E,(IY+_sFM.DIR_CLUSTER_L) LD D,(IY+_sFM.DIR_CLUSTER_L+1)
LD D,(IY+_sFM.DIR_CLUSTER_L+1) PUSH DE
PUSH DE LD E,(IY+_sFM.DIR_CLUSTER_H)
; [x] fat32 LD D,(IY+_sFM.DIR_CLUSTER_H+1)
LD E,(IY+_sFM.DIR_CLUSTER_H) PUSH DE
LD D,(IY+_sFM.DIR_CLUSTER_H+1) ;
PUSH DE ; [x] 15/11/2023 -bug with bad clusters ;!TEST
; LD A,(IY+_sFM.DRIVE)
; [x] 15/11/2023 -bug with bad clusters ;!TEST CALL OPENDSK
LD A,(IY+_sFM.DRIVE) JR C,.error
CALL OPENDSK ;
JR C,.error XOR A
; CALL SET_FM
XOR A ; [x] fat32
CALL SET_FM POP DE
; [x] fat32 LD (IY+_sFM.DIR_CLUSTER_H),E
POP DE LD (IY+_sFM.DIR_CLUSTER_H+1),D
LD (IY+_sFM.DIR_CLUSTER_H),E LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E
LD (IY+_sFM.DIR_CLUSTER_H+1),D LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H),E ;
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1),D POP DE
; LD (IY+_sFM.DIR_CLUSTER_L),E
POP DE LD (IY+_sFM.DIR_CLUSTER_L+1),D
LD (IY+_sFM.DIR_CLUSTER_L),E ; [x] 15/11/2023 -bug with bad clusters ;!TEST
LD (IY+_sFM.DIR_CLUSTER_L+1),D LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E
; [x] 15/11/2023 -bug with bad clusters ;!TEST LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E ;
LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D CALL LOADDIR
; ; [ ] big dir
CALL LOADDIR ;!TODO ®â¬®â âì ªíè ¤® ­ã¦­®£® record index?
.TMP+1: LD A,0 ;
CALL SET_FM .TMP+1: LD A,0
; CALL SET_FM
SET_PAGE_X DIRPAGE ;
; SET_PAGE_X DIRPAGE
;!TEST 9/11/23 record index EX AF,AF'
; LD HL,DIR ; [ ] big dir
; LD DE,FAT_DIRECTORY_RECORD ;!TEST 9/11/23 record index
; LD C,(IY+_sFM.HANDLE) LD HL,DIRPAGE.buffer
; LD B,(IY+_sFM.HANDLE+1) LD DE,FAT_DIRECTORY_RECORD
; JR .CLOSE2 LD C,(IY+_sFM.HANDLE)
; .CLOSE1: LD B,(IY+_sFM.HANDLE+1)
; ADD HL,DE JR .CLOSE2
; DEC BC ;
; .CLOSE2: .CLOSE1: ADD HL,DE
; LD A,B DEC BC
; OR C .CLOSE2: LD A,B
; JR NZ,.CLOSE1 OR C
LD L,(IY+_sFM.HANDLE) JR NZ,.CLOSE1
LD H,(IY+_sFM.HANDLE+1) ;LD L,(IY+_sFM.HANDLE)
; ;LD H,(IY+_sFM.HANDLE+1)
LD D,YH ;;;;;;;;;
LD E,YL LD D,YH
EX DE,HL LD E,YL
;PUSH HL EX DE,HL
;SET_PAGE_X DIRPAGE ;PUSH HL
;POP HL ;SET_PAGE_X DIRPAGE
LD BC,FAT_DIRECTORY_RECORD ;POP HL
LDIR LD BC,FAT_DIRECTORY_RECORD
OUT (SLOT3),A LDIR
CALL SAVEDIR EX AF,AF'
.NOTMODF: OUT (SLOT3),A
LD A,(.TMP) CALL SAVEDIR
JP RES_FM .NOTMODF: LD A,(.TMP)
; JP RES_FM
.error: POP DE ;
POP DE .error: POP DE
RET POP DE
RET
; ;

View File

@ -86,7 +86,10 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23 ;CREATE_FN:
.PATH0+1: LD HL,0 .PATH0+1: LD HL,0
XOR A XOR A
LD (OPEN_FN.TMP),A LD (OPEN_FN.TMP),A
JP OPEN_FN.FILE ;R008 ; DE - record index ¨§ WRT_HND
; !FIXIT ¬®¦­® ®¯â¨¬¨§­ãâì ¯¥à¥å®¤®¬ áà §ã ­ 
; ¢ë¤¥«¥­¨¥ FM (GET_FM)
JP OPEN_FN.FILE
; ;
.Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE .Prepare: ;AND #E7 ;R004 %76A00SHR = !FAT_ATTR ;!HARDCODE
AND FAT_ATTR.NoDIRnoVolID AND FAT_ATTR.NoDIRnoVolID

View File

@ -274,7 +274,7 @@ ENVVALUE EQU CORE_BUFFERS.BUFFER //#3800 ; BUFFER ;DS 128
ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160 ENVSIZE DW DEF_ENV_SIZE ;E_END-ENVIRONMENT ;160
ENVIRONMENT EQU ENVADDR ENVIRONMENT EQU ENVPAGE.ADDR
DEFAULT_ENV: DB 'BOOTDSK=' ;R02 DEFAULT_ENV: DB 'BOOTDSK=' ;R02
.boot_disk: DB 'X:',0 ;R02 .boot_disk: DB 'X:',0 ;R02

View File

@ -31,6 +31,7 @@ F_FIRST: CALL .INIT_VARS
LD A,(.SEARCH_ATTRIBUT) LD A,(.SEARCH_ATTRIBUT)
CALL SEARCH.Custom CALL SEARCH.Custom
RET C RET C
PUSH DE ; record index ¬®¦¥â ¨ ­¥ ­ã¦­®
LD HL,CORE_BUFFERS.MASKARE LD HL,CORE_BUFFERS.MASKARE
.DTABUF+1: LD DE,0 .DTABUF+1: LD DE,0
LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; ª®¯¨à㥬 .NAME ¨ .EXT LD BC,FAT_DIRECTORY_RECORD.ATTRIBUT ; ª®¯¨à㥬 .NAME ¨ .EXT
@ -38,11 +39,19 @@ F_FIRST: CALL .INIT_VARS
.SEARCH_ATTRIBUT+1: .SEARCH_ATTRIBUT+1:
LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT LD A,0 ; DSS_FCB_MAIN.SEARCH_ATTRIBUT
LD (DE),A LD (DE),A
; ¯à¨ ¯à릪¥ á ­  á⥪¥ ¤®«¦¥­ «¥¦ âì record index
.FIND_S: INC DE .FIND_S: INC DE
;!TODO «ãçè¥ âã⠨ᯮ«ì§®¢ âì ª ª ¢ record index ¤«ï ¯¥à¥¡®à  ª â «®£  > #4000 bytes ;!TODO «ãçè¥ âã⠨ᯮ«ì§®¢ âì ª ª ¢ record index ¤«ï ¯¥à¥¡®à  ª â «®£  > #4000 bytes
LD BC,FAT_DIRECTORY_RECORD LD BC,FAT_DIRECTORY_RECORD
ADD IX,BC ADD IX,BC
LD (F_NEXT.CURHND),IX LD (F_NEXT.CURHND),IX
; record index ¬®¦¥â ¨ ­¥ ­ã¦­®
POP HL
;!FIXIT ­¥â ¯à®¢¥àª¨ ­  ¯¥à¥¯®«­¥­¨¥
; ­ ¤¥¥¬áï, çâ® FAT ¡¥§ ª®á类¢
INC HL
LD (F_NEXT.RecordIndex),HL
;
LD HL,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT LD HL,CORE_BUFFERS.HANDBUF + FAT_DIRECTORY_RECORD.RESERVED_NT
LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT LD BC,CORE_BUFFERS.HANDBUF.SIZE - FAT_DIRECTORY_RECORD.RESERVED_NT
LDIR LDIR
@ -79,43 +88,44 @@ F_FIRST: CALL .INIT_VARS
F_NEXT: F_NEXT:
.NO_NEXT.YES EQU 0 .NO_NEXT.YES EQU 0
.NO_NEXT.NO EQU #FF .NO_NEXT.NO EQU #FF
.NO_NEXT+1: .NO_NEXT+1: LD A,0
LD A,0 OR A
OR A LD A,DSS_Error.sys.INVALID_ACCESS
LD A,DSS_Error.sys.INVALID_ACCESS SCF
SCF RET Z
RET Z ;
LD (F_FIRST.DTABUF),DE LD (F_FIRST.DTABUF),DE
EX DE,HL EX DE,HL
LD DE,CORE_BUFFERS.MASKARE LD DE,CORE_BUFFERS.MASKARE
LD BC,11 ;!HARDCODE LD BC,11 ;!HARDCODE
LDIR LDIR
;
XOR A ; F_NEXT.NO_NEXT.YES XOR A ; F_NEXT.NO_NEXT.YES
LD (F_NEXT.NO_NEXT),A LD (F_NEXT.NO_NEXT),A
LD A,(HL)
LD A,(HL) PUSH HL
PUSH HL CALL .NSEARCH
CALL .NSEARCH POP HL
POP DE RET C
RET C ;
JP F_FIRST.FIND_S PUSH DE
.NSEARCH: EX DE,HL
EX AF,AF' JP F_FIRST.FIND_S
SET_PAGE_X DIRPAGE ;
;PUSH AF .NSEARCH: EX AF,AF'
EX AF,AF' SET_PAGE_X DIRPAGE
CPL ;PUSH AF
LD C,A EX AF,AF'
;!TEST 9/11/23 record index CPL
; EXX LD C,A
; LD DE,0 ;!TEST 9/11/23 record index
; EXX EXX
; .RecordIndex+1: LD DE,0 ; record index ¬®¦¥â ¨ ­¥ ­ã¦­®
.CURHND+2: EXX
LD IX,0 ;
LD A,XH .CURHND+2: LD IX,0 ;  ¤à¥á á«¥¤ãî饩 § ¯¨á¨ ¢ ªíè¥ ¤¨à¥ªâ®à¨¨
OR XL LD A,XH
JP Z,SEARCH.error_too_many_files OR XL
JP SEARCH.loop JP Z,SEARCH.error_too_many_files ; [ ] big dir
JP SEARCH.loop
; ;

View File

@ -13,7 +13,7 @@
; CF=1, A - ª®¤ ®è¨¡ª¨. ; CF=1, A - ª®¤ ®è¨¡ª¨.
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
;AND #7F ; ACCESS_MODE bit7 - ¤«ï ¢­ãâ७­¥£® ¨á¯®«ì§®¢ ­¨ï))) ;!TODO ;AND #7F ; ACCESS_MODE bit7 - ¤«ï ¢­ãâ७­¥£® ¨á¯®«ì§®¢ ­¨ï))) ;!TODO
LD (.TMP),A LD (.TMP),A
PUSH HL PUSH HL
CALL DIR_PATH_CHECK.forceCheck CALL DIR_PATH_CHECK.forceCheck
@ -28,15 +28,20 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
RET C RET C
.FILE: CALL SEARCH.File ; enter point from EXEC, CREATE .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE
RET C RET C
;R002 ;!TEST 9/11/23 record index
.FM: PUSH DE ; á®å࠭塞 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS (¯®«ã祭 ¨§ SEARCH)
; ;
CALL GET_FM ; enter point from ATTRIB .FM: ; enter point from ATTRIB
RET C ;R002 ;!TEST 9/11/23 record index
LD A,C PUSH DE ; á®å࠭塞 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS (¯®«ã祭 ¨§ SEARCH)
EX AF,AF' ;
CALL GET_FM
;!TEST 9/11/23 record index 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS ;!TEST 9/11/23 record index 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS
POP DE POP DE
;
RET C
LD A,C ; ¤¥áªà¨¯â®à ä ©« 
EX AF,AF'
;!TEST 9/11/23 record index 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS
;POP DE
; EXX ; EXX
LD (IY+_sFM.HANDLE),E LD (IY+_sFM.HANDLE),E
LD (IY+_sFM.HANDLE+1),D LD (IY+_sFM.HANDLE+1),D
@ -49,43 +54,95 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
LDIR LDIR
.TMP+1: LD A,0 .TMP+1: LD A,0
LD (IY+_sFM.ACCESS_MODE),A LD (IY+_sFM.ACCESS_MODE),A
LD A,(TASK) ; ®¯â¨¬¨§­ã« âãâ
LD (IY+_sFM.TASK_NUM),A ;LD A,(TASK)
;!FIXIT ®¯â¨¬¨§­ãâì âãâ § ­ã«¥­¨¥ ;LD (IY+_sFM.TASK_NUM),A
;XOR A
;LD (IY+_sFM.OptimizedClusters),A
;LD (IY+_sFM.KnownCluster_L),A
;LD (IY+_sFM.KnownCluster_L+1),A
;LD (IY+_sFM.KnownOffset_L),A
;LD (IY+_sFM.KnownOffset_L+1),A
;; fat32
; LD (IY+_sFM.KnownCluster_H),A
; LD (IY+_sFM.KnownCluster_H+1),A
; LD (IY+_sFM.KnownOffset_H),A
; LD (IY+_sFM.KnownOffset_H+1),A
;;
;LD (IY+_sFM.F_POSITION),A
;LD (IY+_sFM.F_POSITION+1),A
;LD (IY+_sFM.F_POSITION+2),A
;LD (IY+_sFM.F_POSITION+3),A
;LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
;LD (IY+_sFM.DRIVE),A
;; fat32
;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H
;LD E,(HL)
;INC HL
;LD D,(HL)
;LD (IY+_sFM.DIR_CLUSTER_H),E
;LD (IY+_sFM.DIR_CLUSTER_H+1),D
;;
;LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM
;LD E,(HL)
;INC HL
;LD D,(HL)
;LD (IY+_sFM.DIR_CLUSTER_L),E
;LD (IY+_sFM.DIR_CLUSTER_L+1),D
;
PUSH IY
POP HL
LD DE,_sFM.F_POSITION
ADD HL,DE
XOR A XOR A
LD (IY+_sFM.OptimizedClusters),A LD (HL),A ; _sFM.F_POSITION
LD (IY+_sFM.KnownCluster_L),A INC HL
LD (IY+_sFM.KnownCluster_L+1),A LD (HL),A ; _sFM.F_POSITION + 1
LD (IY+_sFM.KnownOffset_L),A INC HL
LD (IY+_sFM.KnownOffset_L+1),A LD (HL),A ; _sFM.F_POSITION + 2
; fat32 INC HL
LD (IY+_sFM.KnownCluster_H),A LD (HL),A ; _sFM.F_POSITION + 3
LD (IY+_sFM.KnownCluster_H+1),A INC HL
LD (IY+_sFM.KnownOffset_H),A
LD (IY+_sFM.KnownOffset_H+1),A
; ;
LD (IY+_sFM.F_POSITION),A EX DE,HL
LD (IY+_sFM.F_POSITION+1),A LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L
LD (IY+_sFM.F_POSITION+2),A LDI ; _sFM.DIR_CLUSTER_L
LD (IY+_sFM.F_POSITION+3),A LDI ; _sFM.DIR_CLUSTER_L + 1
LD HL,CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H
LDI ; _sFM.DIR_CLUSTER_H
LDI ; _sFM.DIR_CLUSTER_H + 1
EX DE,HL
;
INC HL
INC HL
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (IY+_sFM.DRIVE),A LD (HL),A ; _sFM.DRIVE
; fat32
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H
LD E,(HL)
INC HL INC HL
LD D,(HL)
LD (IY+_sFM.DIR_CLUSTER_H),E
LD (IY+_sFM.DIR_CLUSTER_H+1),D
;
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L ; work directory FM
LD E,(HL)
INC HL INC HL
LD D,(HL) LD A,(TASK)
LD (IY+_sFM.DIR_CLUSTER_L),E LD (HL),A ; _sFM.TASK_NUM
LD (IY+_sFM.DIR_CLUSTER_L+1),D INC HL
; ;
XOR A
LD (HL),A ; _sFM.OptimizedClusters
INC HL
LD (HL),A ; _sFM.KnownCluster_L
INC HL
LD (HL),A ; _sFM.KnownCluster_L + 1
INC HL
LD (HL),A ; _sFM.KnownCluster_H
INC HL
LD (HL),A ; _sFM.KnownCluster_H + 1
INC HL
LD (HL),A ; _sFM.KnownOffset_L
INC HL
LD (HL),A ; _sFM.KnownOffset_L + 1
INC HL
LD (HL),A ; _sFM.KnownOffset_H
INC HL
LD (HL),A ; _sFM.KnownOffset_H + 1
; ;
EX AF,AF' EX AF,AF'
AND A AND A
RET RET
; ;

View File

@ -193,7 +193,7 @@ SAVETXT: PUSH AF
LD L,#28 LD L,#28
.SVTEXT1: LD (BACKTXT.WinMax),HL .SVTEXT1: LD (BACKTXT.WinMax),HL
LD DE,#0000 LD DE,#0000
LD A,(BANKTBL + TXTPAGE) LD A,((#FF00 & BANKTBL) + TXTPAGE)
LD B,A LD B,A
LD C,BIOS.WIN_COPY LD C,BIOS.WIN_COPY
@ -229,7 +229,7 @@ BACKTXT: PUSH AF
LD IX,#C000 LD IX,#C000
.WinMax+1: LD HL,#2050 .WinMax+1: LD HL,#2050
LD DE,#0000 LD DE,#0000
LD A,(BANKTBL + TXTPAGE) LD A,((#FF00 & BANKTBL) + TXTPAGE)
LD B,A LD B,A
LD C,BIOS.WIN_RESTORE LD C,BIOS.WIN_RESTORE
;[x] 29/9/23 ;[x] 29/9/23

View File

@ -266,6 +266,10 @@ INTx38_Handler: PUSH AF
POP AF POP AF
RET RET
; ;
;BLOCK #FD-$,#FF
BANKTBL: BLOCK (USING_MEMPAGES + 2),#FF
.Size EQU $-BANKTBL
ASSERT (high(BANKTBL + USING_MEMPAGES + 2) == high(BANKTBL)), "Error! Memory leak"
_mInfoALIGN 256,0 _mInfoALIGN 256,0
@ -362,10 +366,10 @@ MASKARE: BLOCK 8,0 ;
BANKTBL EQU ($ & #FF00) + (1<?($ & #FF)) * #100 ; BANKTBL EQU ($ & #FF00) + (1<?($ & #FF)) * #100
.Size EQU USING_MEMPAGES + 2 ; .Size EQU USING_MEMPAGES + 2
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
CLEAR_ZONE.start EQU BANKTBL + BANKTBL.Size CLEAR_ZONE.start EQU $ ;BANKTBL + BANKTBL.Size
MODULE CORE_BUFFERS MODULE CORE_BUFFERS
BUFFERSplace _sBuffers = CLEAR_ZONE.start BUFFERSplace _sBuffers = CLEAR_ZONE.start
TMPNAME EQU BUFFERSplace.TMPNAME ; +- TMPNAME EQU BUFFERSplace.TMPNAME ; +-

View File

@ -146,16 +146,16 @@ SEARCH:
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
; ®¯â¨¬¨§ æ¨ï ¤«ï ¨­¤¥ªá  § ¯¨á¨ ¢ ᯨ᪥ ª â «®£ . ; ®¯â¨¬¨§ æ¨ï ¤«ï ¨­¤¥ªá  § ¯¨á¨ ¢ ᯨ᪥ ª â «®£ .
; <09>®­ ¤®¡¨âáï ¢¥à­ãâì ¤«ï ¯¥à¥¡®à  ª â «®£  > #4000 ¡ ©â ; <09>®­ ¤®¡¨âáï ¢¥à­ãâì ¤«ï ¯¥à¥¡®à  ª â «®£  > #4000 ¡ ©â
; EXX EXX
; LD DE,0 LD DE,0
; EXX EXX
; ;
.loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME) .loop: LD A,(IX + FAT_DIRECTORY_RECORD.NAME)
OR A OR A
JR Z,.error_file_not_found JR Z,.error_file_not_found
CP #E5 ;!HARDCODE #E5 - § ¯¨áì ¢ ¤¨à¥ªâ®à¨¨ ᢮¡®¤­ , â ª ª ª ä ©«/¤¨à¥ªâ®à¨ï ¡ë«¨ 㤠«¥­ë CP #E5 ;!HARDCODE #E5 - § ¯¨áì ¢ ¤¨à¥ªâ®à¨¨ ᢮¡®¤­ , â ª ª ª ä ©«/¤¨à¥ªâ®à¨ï ¡ë«¨ 㤠«¥­ë
JR Z,.next_record JR Z,.next_record
LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) LD A,(IX + FAT_DIRECTORY_RECORD.ATTRIBUT)
LD D,A LD D,A
AND C AND C
JR NZ,.next_record JR NZ,.next_record
@ -184,33 +184,34 @@ SEARCH:
; ;
LD D,XH LD D,XH
LD E,XL LD E,XL
;!FIXIT ¬®¦¥â ­  ¢ë室¥ ¯à®áâ® EXX?
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
; EXX EXX
; PUSH DE PUSH DE ; record index
; EXX EXX
PUSH IX ;PUSH IX
; ;
LD HL,CORE_BUFFERS.HANDBUF LD HL,CORE_BUFFERS.HANDBUF
EX DE,HL EX DE,HL
LD BC,CORE_BUFFERS.HANDBUF.SIZE LD BC,CORE_BUFFERS.HANDBUF.SIZE
LDIR LDIR
;!TEST 9/11/23 record index ; record index
POP DE POP DE
;
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
EX AF,AF' EX AF,AF'
AND A AND A
RET RET
; ;
.next_record: LD DE,FAT_DIRECTORY_RECORD .next_record: ;!TEST 9/11/23 record index
;!TEST 9/11/23 record index EXX
; EXX INC DE
; INC DE EXX
; EXX
; ;
ADD IX,DE LD DE,FAT_DIRECTORY_RECORD
ADD IX,DE ; [ ] big dir
JR NC,.loop JR NC,.loop
;
.error_too_many_files: .error_too_many_files:
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
@ -501,8 +502,8 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
EX DE,HL EX DE,HL
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32 LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32
LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32 LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32
LD HL,#4000 ;!HARDCODE ;LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL ;LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;-------------; EX DE,HL ;-------------; EX DE,HL
; JP LOADDIR ; JP LOADDIR
@ -512,7 +513,8 @@ LOADDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE CALL LOAD_SAVE_DIR_PREPARE
PUSH AF PUSH AF
EX AF,AF' EX AF,AF'
JR NZ,.read_dir JR NZ,.read_dir ; root dir or not
; root dir
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE) LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
CP FAT_TYPE.x32 CP FAT_TYPE.x32
JR NZ,.LoadRootDir JR NZ,.LoadRootDir
@ -541,16 +543,16 @@ LOADDIR: ;!TODO optimize
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: PUSH AF ; 21/04/2025 fix ¬ãá®à ¢ áâà ­¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥­ìè¥ áâà ­¨æë .RTD1: LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD A,(CORE_BUFFERS.FS_Buffer.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
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã ; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
; 21/04/2025 fix ¬ãá®à ¢ áâà ­¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥­ìè¥ áâà ­¨æë ; 21/04/2025 fix ¬ãá®à ¢ áâà ­¨æ¥ ª â «®£ , ¥á«¨ ª â «®£ ¬¥­ìè¥ áâà ­¨æë
POP AF BIT 7,D
JR NC,.exit JR Z,.exit
XOR A XOR A
LD (DE),A LD (DE),A
; ;
@ -564,42 +566,124 @@ LOADDIR: ;!TODO optimize
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
LOAD_SAVE_DIR_PREPARE: LOAD_SAVE_DIR_PREPARE:
;!TODO optimize ;!TODO optimize
XOR A ; FILE MANIPULATOR = 0 XOR A ; FILE MANIPULATOR = 0
LD H,A LD H,A
LD L,A LD L,A
LD IX,0 LD IX,0
LD B,A ; ®â ­ ç «  ä ©«  LD B,A ; ®â ­ ç «  ä ©« 
CALL MOVE_FP CALL MOVE_FP
;
SET_PAGE_X DIRPAGE SET_PAGE_X DIRPAGE
AND A AND A
EX AF,AF' PUSH AF
; ;
LD A,(CORE_BUFFERS.FS_Buffer.DRIVE) LD A,(CORE_BUFFERS.FS_Buffer.DRIVE)
LD (IY+_sFM.DRIVE),A LD (CORE_BUFFERS.FM_BUF.DRIVE),A
;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY ;;;;;;;;
LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H) ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H)
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1) ;OR (IY+_sFM.FS_REC.FIRST_CLUSTER_H+1)
; ;
XOR A
LD D,#40
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
EXX
LD D,A
LD E,A
LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
OR H
OR L
EXX
OR H
OR L
;;;;;;;;
PUSH AF
CALL NZ,.CalcDirSize
;
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),DE
EXX
LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE + 2),DE
POP AF
EX AF,AF' EX AF,AF'
POP AF
RET
;
.CalcDirSize: ; calc dir size in clusters
LD DE,0
;LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L)
;EXX
; LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
.loop: ; ;
;EXX
INC DE ; <20> ¤¥¥¬áï âãâ ­  â®, ç⮠ᯥæ¨ä¨ª æ¨ï ¢ë¯®«­ï¥âáï ¨ ¯¥à¥¯®«­¥­¨ï ­¥ ¡ã¤¥â
PUSH DE
CALL READ_FROM_FAT
EX DE,HL
POP DE
EXX
EX DE,HL
EXX
JR NC,.loop
; DE - à §¬¥à ¤¨à¥ªâ®à¨¨ ¢ ª« áâ¥à å
;
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
;
; DE':DE - ª®«-¢® ª« áâ¥à®¢
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; --> DE*BC*A = DE':DE ¤«ï ®â¢¥â  墠â¨â, ¯®å®¤ã, 4å ॣ¨áâ஢
EXX
LD DE,0
EXX
SRL B
RR C
RRCA
JR C,.loop2
;
.loop1: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
RRCA
JR NC,.loop1
;
.loop2: ;
SLA E
RL D
EXX
RL E
RL D
;RL C
EXX
;
SRL B
RR C
JR NC,.loop2
; <-- DE*BC*A = DE':DE
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy ; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£  ; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£ 
; ¢ë室: DE - record index
WRT_HND: WRT_HND:
SET_PAGE_X DIRPAGE SET_PAGE_X DIRPAGE
EX AF,AF' EX AF,AF'
LD HL,DIRPAGE.buffer LD HL,DIRPAGE.buffer
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
; EXX EXX
; LD DE,0 LD DE,0
; EXX EXX
; ;
LD BC,FAT_DIRECTORY_RECORD LD BC,FAT_DIRECTORY_RECORD
.loop: ;LD A,(IX+00) .loop: ;LD A,(IX+00)
@ -626,23 +710,30 @@ WRT_HND:
LDIR LDIR
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
; ¯à®¢¥à塞, 㢥«¨ç¨«áï «¨ à §¬¥à ¤ ­­ëå ¤¨à¥ªâ®à¨¨
LD HL,DIRPAGE.buffer LD HL,DIRPAGE.buffer
LD BC,(SAVEDIR.DIRSIZE) LD BC,(SAVEDIR.DIRSIZE)
DEC BC DEC BC
ADD HL,BC ADD HL,BC
AND A AND A
SBC HL,DE SBC HL,DE
JR NC,SAVEDIR JR NC,.SAVEDIR
;
; à §¬¥à ¤ ­­ëå ¤¨à¥ªâ®à¨¨ 㢥«¨ç¨«áï
LD HL,(SAVEDIR.DIRSIZE) LD HL,(SAVEDIR.DIRSIZE)
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster) LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerCluster)
ADD HL,BC ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL LD (SAVEDIR.DIRSIZE),HL
AND A AND A
;JP SAVEDIR .SAVEDIR: EXX
PUSH DE
EXX
CALL SAVEDIR
POP DE
RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª. ; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª.
; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à  ; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
; [x] fat32 ;!TEST
SAVEDIR: ;!TODO optimize SAVEDIR: ;!TODO optimize
CALL LOAD_SAVE_DIR_PREPARE CALL LOAD_SAVE_DIR_PREPARE
PUSH AF PUSH AF
@ -920,7 +1011,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD H,A LD H,A
LD D,H LD D,H
LD E,L LD E,L
;EX DE,HL
EXX EXX
LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) LD HL,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
LD D,H LD D,H
@ -930,14 +1020,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs)
DEC A DEC A
LD B,A LD B,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
;
CALL NZ,ALL_SECTORS_PER_FATs CALL NZ,ALL_SECTORS_PER_FATs
EXX EXX
PUSH HL PUSH HL
@ -983,7 +1065,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD HL,65524 LD HL,65524
SBC HL,BC SBC HL,BC
JR C,.its_FAT32 JR C,.its_FAT32
;
; It's FAT16 ; It's FAT16
LD A,(.UsesVarsFAT32) LD A,(.UsesVarsFAT32)
AND A AND A
@ -1021,16 +1102,6 @@ FAT_BPB: LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L) LD HL,(CORE_BUFFERS.FS_Buffer.FAT1_SEC_L)
LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L) LD DE,(CORE_BUFFERS.FS_Buffer.SectorsPerFAT_L)
AND #0F AND #0F
;
; JR Z,.first_FAT_active
; LD B,A
; ;
; .fat_calc_loop: ADD HL,DE
; EXX
; ADC HL,DE
; EXX
; DJNZ .fat_calc_loop
;
LD B,A LD B,A
CALL NZ,ALL_SECTORS_PER_FATs CALL NZ,ALL_SECTORS_PER_FATs
; ;
@ -2071,118 +2142,114 @@ WRITE_FAT_TABLE:
;[x] fat32 ;!TEST ;[x] fat32 ;!TEST
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à  ;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE ;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL: GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
; ¤¢¨£ ¥¬ ¢«¥¢® 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 ; 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 ; [x] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX
EX DE,HL
LD HL,(CORE_BUFFERS.FS_Buffer.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:
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)
; [x] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;-----------------------------------------------------------------------
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
GET_FAT12_CELL:
LD D,H
LD E,L
SRL H
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
PUSH AF ; á®åà. ä« £
ADD HL,DE ; CLUSTER * 1.5
;
IF FAT_CACHE.Size_12 < #1800
;!FIXIT ®¯â¨¬¨§¨à®¢ âì
LD A,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 ; 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 ; [x] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX
EX DE,HL
LD HL,(CORE_BUFFERS.FS_Buffer.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: LD A,H
LD B,H LD B,H
; ;AND #0F
AND #1F AND FAT_CACHE.Size_Mask_16
;AND FAT_CACHE.Size_Mask_16
;
LD H,A LD H,A
LD A,B 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
; ;
RLCA ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
RLCA ; [x] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
RLCA
;DUP FAT_CACHE.Degree_16
; RRCA
;EDUP
AND #07
;AND FAT_CACHE.Part_Mask_16
;
; [ ] ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C ; CP C
LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E CP E
LD E,A LD E,A
; ;
CALL NZ,READ_FAT_TABLE ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT-  CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
ENDIF LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
; ADD HL,DE ; ­  ï祩ªã FAT
LD DE,FATPAGE.cache RET
ADD HL,DE ;-----------------------------------------------------------------------
POP AF ;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
RET ;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
GET_FAT12_CELL: LD D,H
LD E,L
SRL H
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
PUSH AF ; á®åà. ä« £
ADD HL,DE ; CLUSTER * 1.5
;
IF FAT_CACHE.Size_12 < #1800
;!FIXIT ®¯â¨¬¨§¨à®¢ âì
LD A,H
LD B,H
;
AND #1F
;AND FAT_CACHE.Size_Mask_16
;
LD H,A
LD A,B
;
RLCA
RLCA
RLCA
;DUP FAT_CACHE.Degree_16
; RRCA
;EDUP
AND #07
;AND FAT_CACHE.Part_Mask_16
;
; [ ] ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(CORE_BUFFERS.FS_Buffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
ENDIF
;
LD DE,FATPAGE.cache
ADD HL,DE
POP AF
RET
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------

View File

@ -302,7 +302,7 @@ SETUP_CURSORS:
; ;
in a,(SLOT3) in a,(SLOT3)
push af ; 甌縲. <20> push af ; 甌縲. <20>
ld a,(BANKTBL + TXTPAGE) ; 2-© «®£. ­®¬¥à áâà ­¨æë à áè. „Ž‘ ld a,((#FF00 & BANKTBL) + TXTPAGE) ; 2-© «®£. ­®¬¥à áâà ­¨æë à áè. „Ž‘
out (SLOT3),a out (SLOT3),a
; ; <20><>腮碎 瓱痰. Л<><D09B><EFBFBD><EFBFBD>. ; ; <20><>腮碎 瓱痰. Л<><D09B><EFBFBD><EFBFBD>.

View File

@ -24,8 +24,10 @@
;File Manipulator (FM) ;File Manipulator (FM)
;[ ] fat32 ;[ ] fat32
; !!!!! ¨§-§  ¢áïª¨å ®¯â¨¬¨§ æ¨© áà ­ëå ­¥ ¬¥­ïâì ¬¥áâ ¬¨ ­¨ç¥£®, ⮫쪮 ¤®¡ ¢«ïâì ¢ ª®­¥æ
STRUCT _sFM ; 54 bytes STRUCT _sFM ; 54 bytes
; from FAT ; from FAT
.FS_REC FAT_DIRECTORY_RECORD
; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME ; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME
; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT ; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT
; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT ; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT
@ -39,7 +41,6 @@
; .DATE: WORD #0000 ;+ #18 +24 DATE ; .DATE: WORD #0000 ;+ #18 +24 DATE
; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32 ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ; [ ] fat32
; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE
.FS_REC FAT_DIRECTORY_RECORD
; from Core ; from Core
.F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .F_POSITION DWORD #00000000 ;+ #20 +32 FILE POSITION (FP)
.DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW .DIR_CLUSTER_L WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER LOW

View File

@ -1,33 +1,101 @@
; ; …᫨ define § ª®¬¬¥­â¨à®¢ ­, â® ¢ ª®¤¥ ®­ ⮦¥ â ª¦¥
DEFINE TEST_FEATURE 0
;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; Ž<EFBFBD>™……
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE TEST_FEATURE 0
DEFINE MINIMUM_EXE_VERSION 1
DEFINE COMPILE_UNUSED_CODE 0
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; MOUSE
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default)
DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B
DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨. …᫨ = 0, â® «¨è­¨© ª®¤ ­¥ ª®¬¯¨«¨âáï
;----------------------------------------------------;
IF MOUSE_COM_BAUD = 1
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 22 ; ¢â®à®© ¬­®¦¨â¥«ì = 22. 875000/Œ­1*Œ­2=2485
ELSEIF MOUSE_COM_BAUD = 2
MOUSE_BAUD:
.multiplier_1 EQU %0000'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 1.
.multiplier_2 EQU 182 ; ¢â®à®© ¬­®¦¨â¥«ì = 182. 875000/Œ­1*Œ­2=4807
ELSE
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 45 ; ¢â®à®© ¬­®¦¨â¥«ì = 45. 875000/Œ­1*Œ­2=1215
ENDIF
;----------------------------------------------------;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; KEYBOARD
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A
DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift.
DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C
DEFINE USE_E1_SCANCODE 0
;DEFINE CLASSIC_CURSOR 0
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
; DSS
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
DEFINE NeedSafePort_Y 1
DEFINE NON_REMOVABLE_FDD 0
;-----------------------------------------------[VERSION]
DSS_MAX_SECTOR_SIZE EQU 512
DSS_MAX_DRIVES_AMOUNT EQU 26
MAX_RAMDRIVES EQU 16
MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 3.06
DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10
;DEFINE TABisSPACES 0
;DEFINE EnoughtOnly_LF 0
;-----------------------------------------------[^^^^^^^]
;
;-----------------------------------------------[MEMORY]
DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82
;DEFINE OLD_SET_BANK 0
;-----------------------------------------------[^^^^^^]
;-----------------------------------------------[«®£.­®¬¥à  áâà ­¨æ]
DEFINE USING_MEMPAGES 4 ; à §¬¥à ¡«®ª  ¤®¯®«­¨â¥«ì­ëå áâà ­¨æ
; ªíè ᯨ᪠ ª â «®£ 
DIRPAGE EQU 0 + (low BANKTBL)
.buffer EQU #C000
FATPAGE EQU 1 + (low BANKTBL)
.cache EQU #C000
TXTPAGE EQU 2 + (low BANKTBL)
.ADDR EQU #C000
ENVPAGE EQU TXTPAGE
.PATH_PNT_ARRAY EQU #FC80
.ENVTEMP EQU #FE00
.ADDR EQU #E400
DRVPAGE EQU 3 + (low BANKTBL)
; ;
DEFINE MINIMUM_EXE_VERSION 1 COREPAGE EQU 4 + (low BANKTBL) ; ®­  ®â¤¥«ì­® ¨ ­¥ á ¡«®ª®¬ ¢ëè¥.
;-----------------------------------------------[^^^^^^^^^^^^^^^^^^]
DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0
ENVIRONMENT_STRING_LENGTH EQU 255
FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
; ;
SUBLOAD_SIZE EQU 2 ; ª®«-¢® ᥪâ®à®¢ ª®â®à®¥ ­ ¤® ¯®¤£à㧨âì ¯®á«¥ § £à㧪¨ system.dos ¢ áâà ­¨æã
;°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°;
;
DEFINE COMPILE_UNUSED_CODE 0
;
; MOUSE
DEFINE MOUSE_COM_BAUD 0 ; 1 - 2485, 2 - 4807, else - 1215 (default)
DEFINE MOUSE_INT_ENABLED 0 ; INT from SIO ch. B
DEFINE MOUSE_READ_PORT_TIMEOUT 5*512 ; Š®áâë«ì­ë© â ©¬- ãâ ­  ®¦¨¤ ­¨¥ ¡ ©â  ®â ¬ë誨. …᫨ = 0, â® «¨è­¨© ª®¤ ­¥ ª®¬¯¨«¨âáï
; KEYBOARD
DEFINE KEYBOARD_INT_ENABLED 0 ; INT from SIO ch. A
DEFINE CHANGE_LANG_CTRL_SHIFT 1 ; [x] 0: Ctrl + Space, 1: Ctrl + Shift.
DEFINE BREAK_PROCESS_CODE #AC00 ; CTRL+C
DEFINE USE_E1_SCANCODE 0
; DEFINE CLASSIC_CURSOR 0
;
;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE CHANGE_FREE_CLU_AFTER_DEL 1
////////////////////////////////////////////////////////////////////////
SERVICE_SECTORS: SERVICE_SECTORS:
.FAT12 EQU #0FEF .FAT12 EQU #0FEF
.FAT16 EQU #FFEF .FAT16 EQU #FFEF
@ -90,70 +158,4 @@ FAT_CACHE:
;.Degree_12 EQU _shift ;.Degree_12 EQU _shift
;.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1) ;.Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1)
;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1 ;.Part_Mask_12 EQU ((1<<(.bytes_record_12*8)) / (.Size/2))-1
///////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
DEFINE NeedSafePort_Y 1
; DEFINE TABisSPACES 0
; DEFINE EnoughtOnly_LF 0
DEFINE NON_REMOVABLE_FDD 0
;
DSS_MAX_SECTOR_SIZE EQU 512
DSS_MAX_DRIVES_AMOUNT EQU 26
MAX_RAMDRIVES EQU 16
MINIMUM_BIOS_VERSION EQU 3*256 + 06 ; version 2.55
DEFINE STR_MINIMUM_BIOS_VERSION '0' + high MINIMUM_BIOS_VERSION, '.', '0'+(low MINIMUM_BIOS_VERSION)/10, '0'+(low MINIMUM_BIOS_VERSION)-((low MINIMUM_BIOS_VERSION)/10)*10
;
;-------------------[MEMORY]-------------------------;
DEFINE PORTAL.RSTx18_SWITCH_ADDRESS #82
; DEFINE OLD_SET_BANK 0
;---------------------[ «®£.­®¬¥à  áâà ­¨æ ¯ ¬ï⨠]---------------------
DEFINE USING_MEMPAGES 4 ; à §¬¥à ¡«®ª  ¤®¯®«­¨â¥«ì­ëå áâà ­¨æ
; ªíè ᯨ᪠ ª â «®£ 
DIRPAGE EQU 0
.buffer EQU #C000
FATPAGE EQU 1
.cache EQU #C000
TXTPAGE EQU 2
ENVPAGE EQU TXTPAGE
.PATH_PNT_ARRAY EQU #FC80
.ENVTEMP EQU #FE00
DRVPAGE EQU 3
;
COREPAGE EQU 4 ; ®­  ®â¤¥«ì­® ¨ ­¥ á ¡«®ª®¬ ¢ëè¥.
;-----------------------------------------------------------------------
DIRECTORY_PATH_LENGTH EQU 256 ; '\' + 255, 0
ENVIRONMENT_STRING_LENGTH EQU 255
TXTADDR EQU #C000
ENVADDR EQU #E400
;DIR EQU #C000
;FAT_CACHE EQU #C000
FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
;HANDBUF.SIZE EQU FAT_DIRECTORY_RECORD
;----------------------------------------------------;
;
;
;----------------------------------------------------;
IF MOUSE_COM_BAUD = 1
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 22 ; ¢â®à®© ¬­®¦¨â¥«ì = 22. 875000/Œ­1*Œ­2=2485
ELSEIF MOUSE_COM_BAUD = 2
MOUSE_BAUD:
.multiplier_1 EQU %0000'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 1.
.multiplier_2 EQU 182 ; ¢â®à®© ¬­®¦¨â¥«ì = 182. 875000/Œ­1*Œ­2=4807
ELSE
MOUSE_BAUD:
.multiplier_1 EQU %0100'0000 ; ¯¥à¢ë© ¬­®¦¨â¥«ì = 16.
.multiplier_2 EQU 45 ; ¢â®à®© ¬­®¦¨â¥«ì = 45. 875000/Œ­1*Œ­2=1215
ENDIF
;----------------------------------------------------;
;
;
;----------------------------------------------------;
SUBLOAD_SIZE EQU 2 ; ª®«-¢® ᥪâ®à®¢ ª®â®à®¥ ­ ¤® ¯®¤£à㧨âì ¯®á«¥ § £à㧪¨ system.dos ¢ áâà ­¨æã
;----------------------------------------------------;

View File

@ -78,12 +78,12 @@ DEPLOY: ;Allocate memory
RST ToBIOS RST ToBIOS
; ¤®«¦­  ¨¤â¨ ¯®á«¥ GetMemBlkPages, ç⮡ ¢¬¥áâ® ; ¤®«¦­  ¨¤â¨ ¯®á«¥ GetMemBlkPages, ç⮡ ¢¬¥áâ®
; § ªà뢠誨 #FF ¯®áâ ¢¨âì áâà ­¨æã COREPAGE ; § ªà뢠誨 #FF ¯®áâ ¢¨âì áâà ­¨æã COREPAGE
LD HL,BANKTBL + COREPAGE LD HL,COREPAGE + (#FF00 & BANKTBL)
IN A,(SLOT0) IN A,(SLOT0)
LD (HL),A LD (HL),A
; ¤«ï API ¤à ©¢¥à  ¬ë誨 ; ¤«ï API ¤à ©¢¥à  ¬ë誨
LD (DRIVES_DRIVER.MOUSE_HANDLER.CorePage),A LD (DRIVES_DRIVER.MOUSE_HANDLER.CorePage),A
LD A,(BANKTBL + DRVPAGE) LD A,((#FF00 & BANKTBL) + DRVPAGE)
LD (RST_0x30.drv_page),A LD (RST_0x30.drv_page),A
; ;
POP AF POP AF
@ -113,4 +113,5 @@ DEPLOY: ;Allocate memory
OUT (SLOT3),A OUT (SLOT3),A
AND A AND A
RET RET
.Size: EQU DEPLOY
;-----------------------------------------------------------------------; ;-----------------------------------------------------------------------;

@ -1 +1 @@
Subproject commit 4da18d54c12e0f2ff4183be7a1cbf5882da1bd4f Subproject commit 97d5ea8a4b1359d49fb706f24aae6af6bb4eef66