SAVEDIR, LOADDIR, OPENDIR

This commit is contained in:
Anatoliy Belyanskiy 2024-04-04 02:12:55 +10:00
parent b515b2429f
commit 53dbf83712
5 changed files with 551 additions and 523 deletions

View File

@ -1,189 +1,185 @@
; HL - ADDRESS ; HL - BUFFER ADDRESS
; DE - SIZE ; DE - BLOCK SIZE
; A - FM ; A - FM
READ: LD (.R_POINT),HL READ: LD (.R_POINT),HL
LD (.S_POINT),HL LD (.S_POINT),HL
CALL SET_FM CALL SET_FM
RET C RET C
CALL TSTSIZE CALL .TEST_SIZE
; ;
LD A,D LD A,D
OR E OR E
JP Z,.NOREAD JP Z,.NOREAD
; ;
PUSH DE PUSH DE
LD A,(IY+_sFM.DRIVE) LD A,(IY+_sFM.DRIVE)
CALL OPENDSK CALL OPENDSK
JP C,.ERR_1 JP C,.ERR_1
;<3B> áçñâ ᬥ饭¨ï ¢ ᥪâ®à å ;<3B> áçñâ ᬥ饭¨ï ¢ ᥪâ®à å ;!HARDCODE sectro size
LD H,0 ;!HARDCODE max file size = 8 gb LD H,0 ;!HARDCODE max file size = 8 gb
LD L,(IY+_sFM.F_POSITION+3) LD E,(IY+_sFM.F_POSITION+1)
LD D,(IY+_sFM.F_POSITION+2) LD D,(IY+_sFM.F_POSITION+2)
LD E,(IY+_sFM.F_POSITION+1) LD L,(IY+_sFM.F_POSITION+3)
LD A,E LD A,E
AND #01 AND #01
LD B,A LD B,A
LD C,(IY+_sFM.F_POSITION) LD C,(IY+_sFM.F_POSITION)
;OR A RR L
RR L RR D
RR D RR E
RR E ;HL:DE FP (in sectors)
;HL:DE FP (in sectors) ;BC FP residue (in bytes)
;BC FP residue (in bytes) ;
; OR C
OR C JP NZ,.ROV1
JP NZ,.ROV1 .ROV4: POP BC
.ROV4: POP BC PUSH BC
PUSH BC SRL B
SRL B JR Z,.ROV2
JR Z,.ROV2 LD (.SECTORH),HL
LD (.SECTORH),HL LD (.SECTORL),DE
LD (.SECTORL),DE .R_POINT+2: LD IX,0
.R_POINT+2: LD IX,0 CALL BLOCK_READ
CALL BLOCK_READ JP C,.ERR_1
JP C,.ERR_1 LD DE,(.R_POINT)
LD DE,(.R_POINT)
.PointerOnBuffer+1: .PointerOnBuffer+1:
LD HL,0 // LD HL,(READMEM) LD HL,0 // LD HL,(READMEM)
AND A AND A
SBC HL,DE SBC HL,DE
LD C,H LD C,H
LD B,0 LD B,0
ADD HL,DE ADD HL,DE
LD (.R_POINT),HL LD (.R_POINT),HL
SRL C SRL C
.SECTORL+1: LD HL,0 // LD HL,(SECTORL) .SECTORL+1: LD HL,0 // LD HL,(SECTORL)
ADD HL,BC ADD HL,BC
EX DE,HL EX DE,HL
.SECTORH+1: LD HL,0 // LD HL,(SECTORH) .SECTORH+1: LD HL,0 // LD HL,(SECTORH)
LD C,B LD C,B
ADC HL,BC ADC HL,BC
.ROV2: POP BC .ROV2: POP BC
LD A,B LD A,B
AND #01 AND #01
LD B,A LD B,A
OR C OR C
JP Z,.ROV6 JP Z,.ROV6
PUSH BC PUSH BC
LD IX,CORE_BUFFERS.BUFFER+#C000 LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1 LD B,1
IN A,(SLOT3) IN A,(SLOT3)
PUSH AF PUSH AF
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
CALL BLOCK_READ CALL BLOCK_READ
POP BC POP BC
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
JP C,.ERR_1 JP C,.ERR_1
LD HL,CORE_BUFFERS.BUFFER LD HL,CORE_BUFFERS.BUFFER
LD DE,(.R_POINT) LD DE,(.R_POINT)
POP BC POP BC
LDIR LDIR
LD (.R_POINT),DE LD (.R_POINT),DE
.ROV6: LD HL,(.R_POINT) .ROV6: LD HL,(.R_POINT)
.S_POINT+1: LD DE,0 .S_POINT+1: LD DE,0
;EX DE,HL ;EX DE,HL
AND A AND A
SBC HL,DE SBC HL,DE
PUSH HL PUSH HL
EX DE,HL EX DE,HL
LD XH,D LD XH,D
LD XL,E LD XL,E
LD HL,0 LD HL,0
CALL MOVE_FP.F_current CALL MOVE_FP.F_current
POP DE POP DE
.NOREAD: .NOREAD: ;
.COD+1: LD A,0 .COD+1: LD A,0
OR A OR A
RET RET
; ;
.ROV1: PUSH BC .ROV1: PUSH BC
PUSH HL PUSH HL
PUSH DE PUSH DE
LD IX,CORE_BUFFERS.BUFFER+#C000 LD IX,CORE_BUFFERS.BUFFER+#C000
LD B,1 LD B,1
IN A,(SLOT3) IN A,(SLOT3)
PUSH AF PUSH AF
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
CALL BLOCK_READ CALL BLOCK_READ
POP BC POP BC
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
POP HL POP HL
JP C,.ERR_3 JP C,.ERR_3
; inc HL:DE ; inc HL:DE
LD BC,1 LD BC,1
ADD HL,BC ADD HL,BC
EX DE,HL EX DE,HL
POP HL POP HL
LD C,B LD C,B
ADC HL,BC ADC HL,BC
; ;
EXX EXX
POP DE POP DE
LD HL,512 ;!HARDCODE sector size! LD HL,512 ;!HARDCODE sector size!
AND A AND A
SBC HL,DE SBC HL,DE
LD B,H LD B,H
LD C,L LD C,L
POP HL POP HL
AND A AND A
SBC HL,BC SBC HL,BC
JR NC,.ROV3 JR NC,.ROV3
ADD HL,BC ADD HL,BC
LD B,H LD B,H
LD C,L LD C,L
LD HL,0 ;!TODO ¬®¦­® âãâ ã¯à®áâ¨âì ¤ «ì­¥©èãî ¢¥âªã? LD HL,0 ;!TODO ¬®¦­® âãâ ã¯à®áâ¨âì ¤ «ì­¥©èãî ¢¥âªã?
.ROV3: PUSH HL .ROV3: PUSH HL
LD HL,CORE_BUFFERS.BUFFER LD HL,CORE_BUFFERS.BUFFER
ADD HL,DE ADD HL,DE
LD DE,(.R_POINT) LD DE,(.R_POINT)
LDIR LDIR
LD (.R_POINT),DE LD (.R_POINT),DE
EXX EXX
JP .ROV4 JP .ROV4
.ERR_3: POP HL ;
.ERR_2: POP HL .ERR_3: POP HL
.ERR_1: POP BC .ERR_2: POP HL
SCF .ERR_1: POP BC
RET SCF
RET
;
.TEST_SIZE: XOR A
TSTSIZE: LD (READ.COD),A
XOR A LD L,(IY+_sFM.F_POSITION) ;FP LOW
LD (READ.COD),A LD H,(IY+_sFM.F_POSITION+1)
LD L,(IY+_sFM.F_POSITION) ;FP LOW ADD HL,DE
LD H,(IY+_sFM.F_POSITION+1) ;
ADD HL,DE EXX
; ;LD DE,0 ;!TEST
EXX LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH
;LD DE,0 ;!TEST LD H,(IY+_sFM.F_POSITION+3)
LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH ;!TEST
LD H,(IY+_sFM.F_POSITION+3) JR NC,.no_inc_hl
;!TEST INC HL
JR NC,.no_inc_hl ;ADC HL,DE
INC HL ;
;ADC HL,DE .no_inc_hl: EXX ;HL':HL - NEW FP
; ;
.no_inc_hl: LD C,(IY+_sFM.FS_REC.F_SIZE)
EXX ;HL':HL - NEW FP LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW
; AND A
LD C,(IY+_sFM.FS_REC.F_SIZE) SBC HL,BC
LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW EXX
AND A LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH
SBC HL,BC LD B,(IY+_sFM.FS_REC.F_SIZE+3)
EXX SBC HL,BC
LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH EXX
LD B,(IY+_sFM.FS_REC.F_SIZE+3) RET C ;OK READ ALL
SBC HL,BC EX DE,HL
EXX SBC HL,DE ;VERY BIG
RET C ;OK READ ALL EX DE,HL
EX DE,HL LD A,#FF
SBC HL,DE ;VERY BIG LD (READ.COD),A
EX DE,HL RET
LD A,#FF
LD (READ.COD),A
RET

View File

@ -79,6 +79,7 @@ FM_FIND: CP FMCOUNT+1
; A=0 ; A=0
OR (IY) ;+00 NAME OR (IY) ;+00 NAME
RET RET
;
.error: XOR A .error: XOR A
LD A,DSS_Error.sys.INVALID_HANDLE LD A,DSS_Error.sys.INVALID_HANDLE
RET RET
@ -145,48 +146,48 @@ GET_FM: LD IY,0
; HL:IX - OFFSET POINTER ; HL:IX - OFFSET POINTER
; A - FILE MANIPULATOR ; A - FILE MANIPULATOR
MOVE_FP: MOVE_FP: CALL SET_FM
CALL SET_FM RET C
RET C INC B
INC B DJNZ .B_1
DEC B ;from Start File
JR Z,.F_start ; B=0
DEC B .F_start: LD C,B
JR Z,.F_current LD D,B
DEC B LD E,B
JR Z,.B_end JP .DO
LD A,DSS_Error.sys.INVALID_FUNCTION ;
SCF .B_1: DJNZ .B_2
RET ;from Current Position
;from Start File .F_current: LD C,(IY+_sFM.F_POSITION)
.F_start: LD B,(IY+_sFM.F_POSITION+1)
; B=0 LD E,(IY+_sFM.F_POSITION+2)
LD C,B LD D,(IY+_sFM.F_POSITION+3)
LD D,B .DO: ADD IX,BC
LD E,B ADC HL,DE
JP .DO LD D,XH
;from End File LD E,XL
.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) LD (IY+_sFM.F_POSITION),E
LD B,(IY + _sFM.FS_REC.F_SIZE+1) LD (IY+_sFM.F_POSITION+1),D
LD E,(IY + _sFM.FS_REC.F_SIZE+2) LD (IY+_sFM.F_POSITION+2),L
LD D,(IY + _sFM.FS_REC.F_SIZE+3) LD (IY+_sFM.F_POSITION+3),H
JP .DO XOR A
;from Current Position RET
.F_current: ;
LD C,(IY+_sFM.F_POSITION) .B_2: DJNZ .error
LD B,(IY+_sFM.F_POSITION+1) ;from End File
LD E,(IY+_sFM.F_POSITION+2) .B_end: LD C,(IY + _sFM.FS_REC.F_SIZE)
LD D,(IY+_sFM.F_POSITION+3) LD B,(IY + _sFM.FS_REC.F_SIZE+1)
.DO: ADD IX,BC LD E,(IY + _sFM.FS_REC.F_SIZE+2)
ADC HL,DE LD D,(IY + _sFM.FS_REC.F_SIZE+3)
LD D,XH JP .DO
LD E,XL ; B > 2
LD (IY+_sFM.F_POSITION),E .error: LD A,DSS_Error.sys.INVALID_FUNCTION
LD (IY+_sFM.F_POSITION+1),D SCF
LD (IY+_sFM.F_POSITION+2),L RET
LD (IY+_sFM.F_POSITION+3),H ;;;;;;;;;
XOR A
RET
;FP COMPARE ;FP COMPARE
; CY - FILE POINTER > SIZE ; CY - FILE POINTER > SIZE

View File

@ -63,116 +63,106 @@
; DJNZ .GETN6 ; DJNZ .GETN6
; RET ; RET
;---------------;---------------;--------------- ;---------------;---------------;---------------
GetName: GetName: LD BC,#08FF ;!HARDCODE ¤«¨­  ¨¬¥­¨ + áçñâ稪
LD BC,#08FF ;!HARDCODE ¤«¨­  ¨¬¥­¨ + áçñâ稪 LD A,' '
LD A,' ' .loop: CP (HL)
.loop: CP (HL) JR Z,.skip
JR Z,.skip LDI
LDI DJNZ .loop
DJNZ .loop JP .extension
;;;; ;
JP .extension .skip: LD C,B
;;;; LD B,0
.skip: LD C,B ; CF=0
LD B,0 ADC HL,BC
; CF=0 .extension: CP (HL)
ADC HL,BC LD A,"."
;;;; JR NZ,.copy_ext
.extension: XOR A
CP (HL) .copy_ext: LD (DE),A
LD A,"." INC DE
JR NZ,.copy_extension RET Z ;no copy extension
XOR A ; copy extension
.copy_extension: LD BC,#03FF ;!HARDCODE ¤«¨­  à áè¨à¥­¨ï + áçñâ稪
LD (DE),A LD A,' '
INC DE .loop2: CP (HL)
RET Z ;no copy extension JR Z,.exit
; copy extension LDI
LD BC,#03FF ;!HARDCODE ¤«¨­  à áè¨à¥­¨ï + áçñâ稪 DJNZ .loop2
LD A,' ' .exit: XOR A
.loop2: CP (HL) LD (DE),A
JR Z,.exit RET
LDI
DJNZ .loop2
.exit: XOR A
LD (DE),A
RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ’¥áâ ­  ¤®¯ãá⨬®¥ ¨¬ï ¨ ­ áâநâìáï ­  ¤¨áª. ; ’¥áâ ­  ¤®¯ãá⨬®¥ ¨¬ï ¨ ­ áâநâìáï ­  ¤¨áª.
; ¢å®¤: hl=áâப  ¨¬¥­¨ ; ¢å®¤: hl=áâப  ¨¬¥­¨
; ¢ë室: (TMPNAME) ; ¢ë室: (TMPNAME)
GETWORD: GETWORD: ; !TEST
; !TEST INC HL
INC HL LD A,(HL)
LD A,(HL) DEC HL
DEC HL CP ':'
CP ':' JR NZ,.dir_loop
JR NZ,.dir_loop
LD A,(HL) LD A,(HL)
CP 'a' CP 'a'
JR C,.next JR C,.next
CP 'z'+1 CP 'z'+1
JR NC,.next JR NC,.next
SUB #20 SUB #20
.next: SUB 'A' .next: SUB 'A'
INC HL INC HL
INC HL INC HL
PUSH HL PUSH HL
CALL CHNDISK CALL CHNDISK
;CALL OPENDSK ;CALL OPENDSK
POP HL POP HL
RET C RET C
LD A,(HL) LD A,(HL)
OR A OR A
JR Z,.done JR Z,.done
CP ' ' ; CP ' ' ;
JR Z,.done JR Z,.done
CP '\' ; CP '\' ;
SCF SCF
LD A,DSS_Error.sys.PATH_NOT_FOUND LD A,DSS_Error.sys.PATH_NOT_FOUND
RET NZ RET NZ
INC HL INC HL
; ;
.dir_loop: .dir_loop: LD DE,TMPNAME
LD DE,TMPNAME LD BC,#0DFF
LD BC,#0DFF .loop: LD A,(HL)
; INC HL
.loop: LD A,(HL) CP '\' ;
INC HL JR Z,.DIR_NAME
CP '\' ; ; AND A
JR Z,.DIR_NAME ; JR Z,.DIR_NAME
; AND A ;CP ':'
; JR Z,.DIR_NAME ;JR Z,.DRV_NAME
;CP ':' LD (DE),A
;JR Z,.DRV_NAME INC DE
LD (DE),A CP ' '+1
INC DE CCF
CP ' '+1 RET NC
CCF DJNZ .loop
RET NC LD A,DSS_Error.sys.INVALID_NAME
DJNZ .loop SCF
LD A,DSS_Error.sys.INVALID_NAME RET
SCF ;
RET .done: XOR A
; LD (TMPNAME),A
.done: XOR A RET
LD (TMPNAME),A ;
RET .DIR_NAME: XOR A
; LD (DE),A
.DIR_NAME: PUSH HL
XOR A LD HL,TMPNAME
LD (DE),A CALL OPENDIR
PUSH HL POP HL
LD HL,TMPNAME RET C
CALL OPENDIR JR .dir_loop
POP HL
RET C
JR .dir_loop
; .DRV_NAME: ; .DRV_NAME:
; LD A,(TMPNAME) ; LD A,(TMPNAME)
; CP 'a' ; CP 'a'
@ -191,6 +181,7 @@ GETWORD:
; JR .loop ; JR .loop
; ;
; <20>ãä¥à ¨¬¥­¨ 8.3 ä®à¬ â  ; <20>ãä¥à ¨¬¥­¨ 8.3 ä®à¬ â 
TMPNAME: DZ ' ' ; 12 ¯à®¡¥«®¢ ¨ 0 ;!FIXIT ª ¡ãä¥à ¬ TMPNAME: DZ ' ' ; 12 ¯à®¡¥«®¢ ¨ 0 ;!FIXIT ª ¡ãä¥à ¬
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
@ -262,89 +253,6 @@ OPENDSK:;!TEST DRV.Open
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; ¢å®¤: HL - ¨¬ï ¤¨à¥ªâ®à¨¨
OPENDIR:;[x] some optimizations
;XOR A
;CALL SET_FM
LD IY,CORE_BUFFERS.FM_BUF
;
LD A,(HL)
OR A
JR NZ,.SUBDIR
.REROOT1:
LD DE,0
;[x] some optimizations
; LD (IY+_sFM.FIRST_CLUSTER_L),E
; LD (IY+_sFM.FIRST_CLUSTER_L+1),D
; [ ] fat32
EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL
EX DE,HL
;
CALL LOADDIR
LD HL,WorkDirectory
LD (HL),'\'
INC HL
LD (HL),#00
; CF=0
;AND A
RET
.SUBDIR:
CP "."
JR NZ,.SUBDIR2
;!TEST ;[x] some optimizations
;LD A,(IY+_sFM.FIRST_CLUSTER_L) ;R005
; [ ] fat32
LD A,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005
;
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) ;R005
JR NZ,.SUDI1 ;R005
INC HL ;R005
LD A,(HL) ;R005
OR A ;R005
DEC HL ;R005
JR Z,.REROOT1 ;R005
.SUDI1: EXX
LD HL,MASKARE
LD DE,MASKARE+1
LD BC,10 ;!HARDCODE
LD (HL),' '
LDIR
EXX
LD DE,MASKARE
.loop: LDI
LD A,(HL)
OR A
JR NZ,.loop
JR .SUBDIR3
.SUBDIR2:
CALL MASK.name
RET C
.SUBDIR3:
CALL FINDDIR
RET C
;!TEST ;[x] some optimizations
;LD (IY+_sFM.FIRST_CLUSTER_L),E
;LD (IY+_sFM.FIRST_CLUSTER_L+1),D
;LD DE,#4000 ;!HARDCODE
;LD (IY+_sFM.F_SIZE),E
;LD (IY+_sFM.F_SIZE+1),D
EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32
LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL
EX DE,HL
;
JP LOADDIR
; CF=0
;AND A
;RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; <20>८¡à §®¢ âì ¨¬ï 8.3 -> 11 ä®à¬ â ; <20>८¡à §®¢ âì ¨¬ï 8.3 -> 11 ä®à¬ â
; ¢å®¤: hl = 8.3 ¨¬ï ; ¢å®¤: hl = 8.3 ¨¬ï
@ -528,7 +436,6 @@ DIR_PATH_CHECK: LD A,(HL)
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CHECK_NAME: CHECK_NAME:
LD HL,MASKARE LD HL,MASKARE

View File

@ -170,6 +170,8 @@ SEARCH:
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; FIND "MASKAREA" IN DIRECTORY ; FIND "MASKAREA" IN DIRECTORY
; [ ] fat32
; ¢ë室: IY:DE - cluster number
FINDDIR: FINDDIR:
SET_PAGE_X DIRPAGE SET_PAGE_X DIRPAGE
; ;
@ -238,6 +240,7 @@ FINDDIR:
LD A,DSS_Error.sys.PATH_NOT_FOUND LD A,DSS_Error.sys.PATH_NOT_FOUND
SCF SCF
RET RET
;
.ADDSPEC: .ADDSPEC:
LD HL,WorkDirectory+1 LD HL,WorkDirectory+1
LD BC,WorkDirectory.DEPTH-1 LD BC,WorkDirectory.DEPTH-1
@ -290,6 +293,10 @@ FINDDIR:
; ; JP IT_DIR ; ; JP IT_DIR
; ;
.IT_DIR: ; [ ] fat32 .IT_DIR: ; [ ] fat32
LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H)
LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H+1)
LD YH,D
LD YL,E
LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L)
LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1)
POP AF POP AF
@ -316,67 +323,233 @@ FINDDIR:
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CHECK_ZERO_CLUSTER:
EX DE,HL
LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005
LD A,L
OR H
LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H)
OR L
OR H
EX DE,HL
RET
;----------------------------------------------------------------------;
; ¢å®¤: HL - ¨¬ï ¤¨à¥ªâ®à¨¨
; [x] fat32
OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
LD A,(HL)
OR A
JR NZ,.SUBDIR
.REROOT: ; fat32
EX DE,HL
LD HL,(FatBuffer.RootDirStartCluster_L)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(FatBuffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL
EX DE,HL
CALL LOADDIR
; CF=0
LD HL,WorkDirectory
LD (HL),'\'
INC HL
LD (HL),#00
;AND A
RET
;
.SUBDIR: CP "."
JR NZ,.SUBDIR2
; fat32
CALL CHECK_ZERO_CLUSTER
JR NZ,.no_root ;R005
; "cd ." or "cd .."
;R005
INC HL
LD A,(HL)
OR A
DEC HL
JR Z,.REROOT
;
.no_root: EXX
LD HL,MASKARE
LD DE,MASKARE+1
LD BC,10 ;!HARDCODE
LD (HL),' '
LDIR
EXX
LD DE,MASKARE
.loop: LDI
LD A,(HL)
OR A
JR NZ,.loop
JR .SUBDIR3
;
.SUBDIR2: CALL MASK.name
RET C
; fat32
.SUBDIR3: CALL FINDDIR
RET C
EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; [ ] fat32
LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL
;EX DE,HL
JP LOADDIR
;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; <20>à®ç¨â âì ᯨ᮪ ª â «®£  ; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
LOADDIR: ; [x] fat32 ;!TEST
XOR A LOADDIR: ;!TODO optimize
LD H,A ; XOR A ; FILE MANIPULATOR = 0
LD L,A ; LD H,A
LD IX,0 ; LD L,A
LD B,A ; ®â ­ ç «  ä ©«  ; LD IX,0
CALL MOVE_FP ; LD B,A ; ®â ­ ç «  ä ©« 
; CALL MOVE_FP
; ;
; SET_PAGE_X DIRPAGE
; AND A
; PUSH AF
; ;!TEST no ldir
; ; ®ç¨áâ¨âì ª¥è ª â «®£ 
; ; LD HL,#C000
; ; LD DE,#C001
; ; LD BC,#3FFF
; ; LD (HL),L
; ; LDIR
; ;
; LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
; LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à
; ; ­®¬¥à ¯¥à¢®£® ª« áâ¥à 
; ; [x] fat32
; LD A,(FatBuffer.FAT_TYPE)
; XOR 32
; JR Z,.read_dir
; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
; LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
; OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
CALL LOAD_SAVE_DIR_PREPARE
PUSH AF
EX AF,AF'
JR Z,.LoadRootDir
.read_dir: LD HL,DIRPAGE.buffer ; ªã¤ 
LD DE,#4000 ; ᪮«ìª®
XOR A ; ¤¥áªà¨¯â®à
CALL READ ; ç⥭¨¥ ¨§ ä ©« 
LD (SAVEDIR.DIRSIZE),DE ; ç¨á«® ¯à®ç¨â. ¡ ©â®¢
POP AF
OUT (SLOT3),A
RET
;
.LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤
LD IX,(FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(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) ; ­®¬¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
RET
;----------------------------------------------------------------------;
SET_PAGE_X DIRPAGE LOAD_SAVE_DIR_PREPARE:
AND A ;!TODO optimize
PUSH AF XOR A ; FILE MANIPULATOR = 0
;!TEST no ldir LD H,A
; ®ç¨áâ¨âì ª¥è ª â «®£  LD L,A
; LD HL,#C000 LD IX,0
; LD DE,#C001 LD B,A ; ®â ­ ç «  ä ©« 
; LD BC,#3FFF CALL MOVE_FP
; LD (HL),L ;
; LDIR SET_PAGE_X DIRPAGE
; AND A
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  EX AF,AF'
LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à ;
; ­®¬¥à ¯¥à¢®£® ª« áâ¥à  LD A,(FatBuffer.DRIVE)
; [ ] fat32 LD (IY+_sFM.DRIVE),A
LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ; [x] fat32
OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) LD A,(FatBuffer.FAT_TYPE)
JP Z,.LoadRootDir CP FAT_TYPE.x32 - 1
; JR NC,.exit
LD HL,DIRPAGE.buffer ; ªã¤  ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
LD DE,#4000 ; ᪮«ìª® LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
XOR A ; ¤¥áªà¨¯â®à OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
CALL READ ; ç⥭¨¥ ¨§ ä ©«  .exit: EX AF,AF'
LD (SAVEDIR.DIRSIZE),DE ; ç¨á«® ¯à®ç¨â. ¡ ©â®¢ RET
POP AF
OUT (SLOT3),A ;!TODO FAT procedures
RET ;----------------------------------------------------------------------;
.LoadRootDir: ; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª.
LD HL,(FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤ ; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
LD IX,(FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à  ; [x] fat32 ;!TEST
LD A,(FatBuffer.DirSizeInSectors) SAVEDIR: ;!TODO optimize
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£  ; XOR A ; FILE MANIPULATOR = 0
CP B ; LD H,A
JR NC,.RTD1 ; LD L,A
LD B,A ; ç¨á«® ᥪâ®à®¢ ; LD IX,0
.RTD1: LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  ; LD B,A ; ®â ­ ç «  ä ©« 
LD DE,DIRPAGE.buffer ; ¡ãä¥à ; CALL MOVE_FP
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢ ; ;
RST ToDSS.DRV ; SET_PAGE_X DIRPAGE
POP AF ; AND A
OUT (SLOT3),A ; PUSH AF
RET ; ;
; LD A,(FatBuffer.DRIVE)
; LD (IY+_sFM.DRIVE),A
; ; [x] fat32
; LD A,(FatBuffer.FAT_TYPE)
; XOR 32
; JR Z,.save_dir
; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
; LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
; OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
CALL LOAD_SAVE_DIR_PREPARE
PUSH AF
EX AF,AF'
JR Z,.SaveRootDir
.save_dir: LD HL,DIRPAGE.buffer
; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory
;!FIXIT ¥á«¨ ®­  ­ã¦­ , â® ¯à®¢¥à¨âì ­  ¡ £¨ (­ ¯à¨¬¥à, à §¬¥à ¤¨à४â®à¨¨ ¬¥­ìè¥ ¯à¨ ®âªàë⨨ ¨ ¡®«ìè¥ ¯®á«¥ ¯à ¢®ª)
; ª®£¤  ¡ã¤¥â ç⥭¨¥ ªã᪠¬¨ ª â «®£  ¢ ªíè, âãâ ¥éñ áçñâ稪 ¯à¨ªàãâ¨âì
.DIRSIZE+1: LD DE,0
XOR A
CALL WRITE
POP AF
OUT (SLOT3),A
RET
;
.SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H)
LD IX,(FatBuffer.RootDirFirstSector_L)
LD A,(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)
LD DE,DIRPAGE.buffer
LD C,Dss.DRV.Write
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) ; ᪮¯¨à®¢ âì § ¯¨áì ¢ ᯨ᮪ ¤¨áª  (ª â «®£ ) de ix iy
; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ¢å®¤: (HANDBUF) - § ¯¨áì ª â «®£ 
WRT_HND: SET_PAGE_X DIRPAGE WRT_HND: SET_PAGE_X DIRPAGE
EX AF,AF' EX AF,AF'
; ;
@ -396,7 +569,7 @@ WRT_HND: SET_PAGE_X DIRPAGE
JR Z,.WRT_HN2 JR Z,.WRT_HN2
;ADD IX,BC ;ADD IX,BC
ADD HL,BC ADD HL,BC
JR NC,.loop JR NC,.loop ;!FIXIT ª®«¨ç¥á⢮ § ¯¨á¥© ª â «®£  = áâà ­¨æ 
; ;
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
@ -427,59 +600,6 @@ WRT_HND: SET_PAGE_X DIRPAGE
JP SAVEDIR JP SAVEDIR
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;!TODO FAT procedures
;----------------------------------------------------------------------;
; ‘¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª.
; ¢å®¤: iy=áâàãªâãà  ¤¥áªà¨¯â®à 
; [ ] fat32
SAVEDIR:
XOR A
LD HL,0
LD IX,0
LD B,0
CALL MOVE_FP
;
SET_PAGE_X DIRPAGE
PUSH AF
;
LD A,(FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A
;[ ] fat32
LD D,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
LD E,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
LD A,D
OR E
JP Z,.SaveRootDir
LD HL,DIRPAGE.buffer
; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory
;!FIXIT ¥á«¨ ®­  ­ã¦­ , â® ¯à®¢¥à¨âì ­  ¡ £¨ (­ ¯à¨¬¥à, à §¬¥à ¤¨à४â®à¨¨ ¬¥­ìè¥ ¯à¨ ®âªàë⨨ ¨ ¡®«ìè¥ ¯®á«¥ ¯à ¢®ª)
.DIRSIZE+1:
LD DE,0
XOR A
CALL WRITE
POP AF
OUT (SLOT3),A
AND A
RET
.SaveRootDir:
LD HL,(FatBuffer.RootDirFirstSector_H)
LD IX,(FatBuffer.RootDirFirstSector_L)
LD A,(FatBuffer.DirSizeInSectors)
LD B,32 ;!HARDCODE sector size 512
SUB B
JR NC,.RTD1S
ADD A,B
LD B,A
.RTD1S: LD A,(FatBuffer.DRIVE)
LD DE,DIRPAGE.buffer
LD C,Dss.DRV.Write
RST ToDSS.DRV
POP AF
OUT (SLOT3),A
AND A
RET
;----------------------------------------------------------------------;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ­¥ ¨á¯®«ì§ã¥âáï ; ­¥ ¨á¯®«ì§ã¥âáï
@ -490,7 +610,9 @@ SAVEDIR:
; OR A ; OR A
; RET Z ; RET Z
; ॣ. D - ­®¬¥à ¤¨áª  ; ॣ. D - ­®¬¥à ¤¨áª 
; [ ] fat32
RD_BPB: LD C,SLOT3 RD_BPB: LD C,SLOT3
IN B,(C) IN B,(C)
PUSH BC PUSH BC
@ -534,6 +656,8 @@ RD_BPB: LD C,SLOT3
LD E,A LD E,A
LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1
LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1
LD (FatBuffer.RootDirStartCluster_L),DE
LD (FatBuffer.RootDirStartCluster_H),DE
LD (FatBuffer.SectorsPerFAT_H),A LD (FatBuffer.SectorsPerFAT_H),A
; ;
; ;

View File

@ -1 +1 @@
953 956