diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm index 5218696..8fe813b 100644 --- a/DSS/API/Read.asm +++ b/DSS/API/Read.asm @@ -1,189 +1,185 @@ -; HL - ADDRESS -; DE - SIZE +; HL - BUFFER ADDRESS +; DE - BLOCK SIZE ; A - FM -READ: LD (.R_POINT),HL - LD (.S_POINT),HL - CALL SET_FM - RET C - CALL TSTSIZE - ; - LD A,D - OR E - JP Z,.NOREAD - ; - PUSH DE - LD A,(IY+_sFM.DRIVE) - CALL OPENDSK - JP C,.ERR_1 - ;Расчёт смещения в секторах - LD H,0 ;!HARDCODE max file size = 8 gb - LD L,(IY+_sFM.F_POSITION+3) - LD D,(IY+_sFM.F_POSITION+2) - LD E,(IY+_sFM.F_POSITION+1) - LD A,E - AND #01 - LD B,A - LD C,(IY+_sFM.F_POSITION) - ;OR A - RR L - RR D - RR E - ;HL:DE FP (in sectors) - ;BC FP residue (in bytes) - ; - OR C - JP NZ,.ROV1 -.ROV4: POP BC - PUSH BC - SRL B - JR Z,.ROV2 - LD (.SECTORH),HL - LD (.SECTORL),DE -.R_POINT+2: LD IX,0 - CALL BLOCK_READ - JP C,.ERR_1 - LD DE,(.R_POINT) +READ: LD (.R_POINT),HL + LD (.S_POINT),HL + CALL SET_FM + RET C + CALL .TEST_SIZE + ; + LD A,D + OR E + JP Z,.NOREAD + ; + PUSH DE + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JP C,.ERR_1 + ;Расчёт смещения в секторах ;!HARDCODE sectro size + LD H,0 ;!HARDCODE max file size = 8 gb + LD E,(IY+_sFM.F_POSITION+1) + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD A,E + AND #01 + LD B,A + LD C,(IY+_sFM.F_POSITION) + RR L + RR D + RR E + ;HL:DE FP (in sectors) + ;BC FP residue (in bytes) + ; + OR C + JP NZ,.ROV1 +.ROV4: POP BC + PUSH BC + SRL B + JR Z,.ROV2 + LD (.SECTORH),HL + LD (.SECTORL),DE +.R_POINT+2: LD IX,0 + CALL BLOCK_READ + JP C,.ERR_1 + LD DE,(.R_POINT) .PointerOnBuffer+1: - LD HL,0 // LD HL,(READMEM) - AND A - SBC HL,DE - LD C,H - LD B,0 - ADD HL,DE - LD (.R_POINT),HL - SRL C -.SECTORL+1: LD HL,0 // LD HL,(SECTORL) - ADD HL,BC - EX DE,HL -.SECTORH+1: LD HL,0 // LD HL,(SECTORH) - LD C,B - ADC HL,BC -.ROV2: POP BC - LD A,B - AND #01 - LD B,A - OR C - JP Z,.ROV6 - PUSH BC - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - JP C,.ERR_1 - LD HL,CORE_BUFFERS.BUFFER - LD DE,(.R_POINT) - POP BC - LDIR - LD (.R_POINT),DE -.ROV6: LD HL,(.R_POINT) -.S_POINT+1: LD DE,0 - ;EX DE,HL - AND A - SBC HL,DE - PUSH HL - EX DE,HL - LD XH,D - LD XL,E - LD HL,0 - CALL MOVE_FP.F_current - POP DE -.NOREAD: -.COD+1: LD A,0 - OR A - RET - ; -.ROV1: PUSH BC - PUSH HL - PUSH DE - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOCK_READ - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,.ERR_3 - ; inc HL:DE - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - ; - EXX - POP DE - LD HL,512 ;!HARDCODE sector size! - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.ROV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? -.ROV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - LDIR - LD (.R_POINT),DE - EXX - JP .ROV4 -.ERR_3: POP HL -.ERR_2: POP HL -.ERR_1: POP BC - SCF - RET - - - -TSTSIZE: - XOR A - LD (READ.COD),A - LD L,(IY+_sFM.F_POSITION) ;FP LOW - LD H,(IY+_sFM.F_POSITION+1) - ADD HL,DE - ; - EXX - ;LD DE,0 ;!TEST - LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH - LD H,(IY+_sFM.F_POSITION+3) - ;!TEST - JR NC,.no_inc_hl - INC HL - ;ADC HL,DE - ; -.no_inc_hl: - EXX ;HL':HL - NEW FP - ; - LD C,(IY+_sFM.FS_REC.F_SIZE) - LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW - AND A - SBC HL,BC - EXX - LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH - LD B,(IY+_sFM.FS_REC.F_SIZE+3) - SBC HL,BC - EXX - RET C ;OK READ ALL - EX DE,HL - SBC HL,DE ;VERY BIG - EX DE,HL - LD A,#FF - LD (READ.COD),A - RET \ No newline at end of file + LD HL,0 // LD HL,(READMEM) + AND A + SBC HL,DE + LD C,H + LD B,0 + ADD HL,DE + LD (.R_POINT),HL + SRL C +.SECTORL+1: LD HL,0 // LD HL,(SECTORL) + ADD HL,BC + EX DE,HL +.SECTORH+1: LD HL,0 // LD HL,(SECTORH) + LD C,B + ADC HL,BC +.ROV2: POP BC + LD A,B + AND #01 + LD B,A + OR C + JP Z,.ROV6 + PUSH BC + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + JP C,.ERR_1 + LD HL,CORE_BUFFERS.BUFFER + LD DE,(.R_POINT) + POP BC + LDIR + LD (.R_POINT),DE +.ROV6: LD HL,(.R_POINT) +.S_POINT+1: LD DE,0 + ;EX DE,HL + AND A + SBC HL,DE + PUSH HL + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + POP DE +.NOREAD: ; +.COD+1: LD A,0 + OR A + RET + ; +.ROV1: PUSH BC + PUSH HL + PUSH DE + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOCK_READ + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR_3 + ; inc HL:DE + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + ; + EXX + POP DE + LD HL,512 ;!HARDCODE sector size! + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.ROV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? +.ROV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + LDIR + LD (.R_POINT),DE + EXX + JP .ROV4 + ; +.ERR_3: POP HL +.ERR_2: POP HL +.ERR_1: POP BC + SCF + RET + ; +.TEST_SIZE: XOR A + LD (READ.COD),A + LD L,(IY+_sFM.F_POSITION) ;FP LOW + LD H,(IY+_sFM.F_POSITION+1) + ADD HL,DE + ; + EXX + ;LD DE,0 ;!TEST + LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH + LD H,(IY+_sFM.F_POSITION+3) + ;!TEST + JR NC,.no_inc_hl + INC HL + ;ADC HL,DE + ; +.no_inc_hl: EXX ;HL':HL - NEW FP + ; + LD C,(IY+_sFM.FS_REC.F_SIZE) + LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW + AND A + SBC HL,BC + EXX + LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH + LD B,(IY+_sFM.FS_REC.F_SIZE+3) + SBC HL,BC + EXX + RET C ;OK READ ALL + EX DE,HL + SBC HL,DE ;VERY BIG + EX DE,HL + LD A,#FF + LD (READ.COD),A + RET \ No newline at end of file diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 91d1f5a..3585f13 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -79,6 +79,7 @@ FM_FIND: CP FMCOUNT+1 ; A=0 OR (IY) ;+00 NAME RET + ; .error: XOR A LD A,DSS_Error.sys.INVALID_HANDLE RET @@ -145,48 +146,48 @@ GET_FM: LD IY,0 ; HL:IX - OFFSET POINTER ; A - FILE MANIPULATOR -MOVE_FP: - CALL SET_FM - RET C - INC B - DEC B - JR Z,.F_start - DEC B - JR Z,.F_current - DEC B - JR Z,.B_end - LD A,DSS_Error.sys.INVALID_FUNCTION - SCF - RET -;from Start File -.F_start: - ; B=0 - LD C,B - LD D,B - LD E,B - JP .DO -;from End File -.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) - LD B,(IY + _sFM.FS_REC.F_SIZE+1) - LD E,(IY + _sFM.FS_REC.F_SIZE+2) - LD D,(IY + _sFM.FS_REC.F_SIZE+3) - JP .DO -;from Current Position -.F_current: - LD C,(IY+_sFM.F_POSITION) - LD B,(IY+_sFM.F_POSITION+1) - LD E,(IY+_sFM.F_POSITION+2) - LD D,(IY+_sFM.F_POSITION+3) -.DO: ADD IX,BC - ADC HL,DE - LD D,XH - LD E,XL - LD (IY+_sFM.F_POSITION),E - LD (IY+_sFM.F_POSITION+1),D - LD (IY+_sFM.F_POSITION+2),L - LD (IY+_sFM.F_POSITION+3),H - XOR A - RET +MOVE_FP: CALL SET_FM + RET C + INC B + DJNZ .B_1 + ;from Start File + ; B=0 +.F_start: LD C,B + LD D,B + LD E,B + JP .DO + ; +.B_1: DJNZ .B_2 + ;from Current Position +.F_current: LD C,(IY+_sFM.F_POSITION) + LD B,(IY+_sFM.F_POSITION+1) + LD E,(IY+_sFM.F_POSITION+2) + LD D,(IY+_sFM.F_POSITION+3) +.DO: ADD IX,BC + ADC HL,DE + LD D,XH + LD E,XL + LD (IY+_sFM.F_POSITION),E + LD (IY+_sFM.F_POSITION+1),D + LD (IY+_sFM.F_POSITION+2),L + LD (IY+_sFM.F_POSITION+3),H + XOR A + RET + ; +.B_2: DJNZ .error + ;from End File +.B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) + LD B,(IY + _sFM.FS_REC.F_SIZE+1) + LD E,(IY + _sFM.FS_REC.F_SIZE+2) + LD D,(IY + _sFM.FS_REC.F_SIZE+3) + JP .DO + ; B > 2 +.error: LD A,DSS_Error.sys.INVALID_FUNCTION + SCF + RET +;;;;;;;;; + + ;FP COMPARE ; CY - FILE POINTER > SIZE diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 86b816f..71eb2a6 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -63,116 +63,106 @@ ; DJNZ .GETN6 ; RET ;---------------;---------------;--------------- -GetName: - LD BC,#08FF ;!HARDCODE длина имени + счётчик - LD A,' ' -.loop: CP (HL) - JR Z,.skip - LDI - DJNZ .loop - ;;;; - JP .extension - ;;;; -.skip: LD C,B - LD B,0 - ; CF=0 - ADC HL,BC - ;;;; -.extension: - CP (HL) - LD A,"." - JR NZ,.copy_extension - XOR A -.copy_extension: - LD (DE),A - INC DE - RET Z ;no copy extension - ; copy extension - LD BC,#03FF ;!HARDCODE длина расширения + счётчик - LD A,' ' -.loop2: CP (HL) - JR Z,.exit - LDI - DJNZ .loop2 -.exit: XOR A - LD (DE),A - RET +GetName: LD BC,#08FF ;!HARDCODE длина имени + счётчик + LD A,' ' +.loop: CP (HL) + JR Z,.skip + LDI + DJNZ .loop + JP .extension + ; +.skip: LD C,B + LD B,0 + ; CF=0 + ADC HL,BC +.extension: CP (HL) + LD A,"." + JR NZ,.copy_ext + XOR A +.copy_ext: LD (DE),A + INC DE + RET Z ;no copy extension + ; copy extension + LD BC,#03FF ;!HARDCODE длина расширения + счётчик + LD A,' ' +.loop2: CP (HL) + JR Z,.exit + LDI + DJNZ .loop2 +.exit: XOR A + LD (DE),A + RET ;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; ; Тест на допустимое имя и настроиться на диск. ; вход: hl=строка имени ; выход: (TMPNAME) -GETWORD: - ; !TEST - INC HL - LD A,(HL) - DEC HL - CP ':' - JR NZ,.dir_loop +GETWORD: ; !TEST + INC HL + LD A,(HL) + DEC HL + CP ':' + JR NZ,.dir_loop - LD A,(HL) - CP 'a' - JR C,.next - CP 'z'+1 - JR NC,.next - SUB #20 -.next: SUB 'A' - INC HL - INC HL - PUSH HL - CALL CHNDISK - ;CALL OPENDSK - POP HL - RET C - LD A,(HL) - OR A - JR Z,.done - CP ' ' ; - JR Z,.done - CP '\' ; - SCF - LD A,DSS_Error.sys.PATH_NOT_FOUND - RET NZ - INC HL - ; -.dir_loop: - LD DE,TMPNAME - LD BC,#0DFF - ; -.loop: LD A,(HL) - INC HL - CP '\' ; - JR Z,.DIR_NAME - ; AND A - ; JR Z,.DIR_NAME - ;CP ':' - ;JR Z,.DRV_NAME - LD (DE),A - INC DE - CP ' '+1 - CCF - RET NC - DJNZ .loop - LD A,DSS_Error.sys.INVALID_NAME - SCF - RET - ; -.done: XOR A - LD (TMPNAME),A - RET - ; -.DIR_NAME: - XOR A - LD (DE),A - PUSH HL - LD HL,TMPNAME - CALL OPENDIR - POP HL - RET C - JR .dir_loop + LD A,(HL) + CP 'a' + JR C,.next + CP 'z'+1 + JR NC,.next + SUB #20 +.next: SUB 'A' + INC HL + INC HL + PUSH HL + CALL CHNDISK + ;CALL OPENDSK + POP HL + RET C + LD A,(HL) + OR A + JR Z,.done + CP ' ' ; + JR Z,.done + CP '\' ; + SCF + LD A,DSS_Error.sys.PATH_NOT_FOUND + RET NZ + INC HL + ; +.dir_loop: LD DE,TMPNAME + LD BC,#0DFF +.loop: LD A,(HL) + INC HL + CP '\' ; + JR Z,.DIR_NAME + ; AND A + ; JR Z,.DIR_NAME + ;CP ':' + ;JR Z,.DRV_NAME + LD (DE),A + INC DE + CP ' '+1 + CCF + RET NC + DJNZ .loop + LD A,DSS_Error.sys.INVALID_NAME + SCF + RET + ; +.done: XOR A + LD (TMPNAME),A + RET + ; +.DIR_NAME: XOR A + LD (DE),A + PUSH HL + LD HL,TMPNAME + CALL OPENDIR + POP HL + RET C + JR .dir_loop ; .DRV_NAME: ; LD A,(TMPNAME) ; CP 'a' @@ -191,6 +181,7 @@ GETWORD: ; JR .loop ; + ; Буфер имени 8.3 формата 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 -;----------------------------------------------------------------------; - - - ;----------------------------------------------------------------------; ; Преобразовать имя 8.3 -> 11 формат ; вход: hl = 8.3 имя @@ -528,7 +436,6 @@ DIR_PATH_CHECK: LD A,(HL) ;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; CHECK_NAME: LD HL,MASKARE diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index e3c9e92..0e758b9 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -170,6 +170,8 @@ SEARCH: ;----------------------------------------------------------------------; ; FIND "MASKAREA" IN DIRECTORY +; [ ] fat32 +; выход: IY:DE - cluster number FINDDIR: SET_PAGE_X DIRPAGE ; @@ -237,7 +239,8 @@ FINDDIR: OUT (SLOT3),A LD A,DSS_Error.sys.PATH_NOT_FOUND SCF - RET + RET + ; .ADDSPEC: LD HL,WorkDirectory+1 LD BC,WorkDirectory.DEPTH-1 @@ -290,8 +293,12 @@ FINDDIR: ; ; JP IT_DIR ; .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 D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) + LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1) POP AF OUT (SLOT3),A AND A @@ -316,67 +323,233 @@ FINDDIR: 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 +;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; Прочитать список каталога -LOADDIR: - XOR A - LD H,A - LD L,A - LD IX,0 - LD B,A ; от начала файла - CALL MOVE_FP +; [x] fat32 ;!TEST +LOADDIR: ;!TODO optimize + ; XOR A ; FILE MANIPULATOR = 0 + ; LD H,A + ; LD L,A + ; LD IX,0 + ; 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 - 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 ; сохр. в дескриптор - ; номер первого кластера - ; [ ] fat32 - LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) - OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) - JP Z,.LoadRootDir - ; - 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 +LOAD_SAVE_DIR_PREPARE: + ;!TODO optimize + XOR A ; FILE MANIPULATOR = 0 + LD H,A + LD L,A + LD IX,0 + LD B,A ; от начала файла + CALL MOVE_FP + ; + SET_PAGE_X DIRPAGE + AND A + EX AF,AF' + ; + LD A,(FatBuffer.DRIVE) + LD (IY+_sFM.DRIVE),A + ; [x] fat32 + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 - 1 + JR NC,.exit + ;!FIXIT переделать на работу без IY + LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) + OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) +.exit: EX AF,AF' + RET + +;!TODO FAT procedures +;----------------------------------------------------------------------; +; Сбросить кеш каталога на диск. +; вход: iy=структура дескриптора +; [x] fat32 ;!TEST +SAVEDIR: ;!TODO optimize + ; XOR A ; FILE MANIPULATOR = 0 + ; LD H,A + ; LD L,A + ; LD IX,0 + ; LD B,A ; от начала файла + ; CALL MOVE_FP + ; ; + ; SET_PAGE_X DIRPAGE + ; AND A + ; PUSH AF + ; ; + ; 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 EX AF,AF' ; @@ -396,7 +569,7 @@ WRT_HND: SET_PAGE_X DIRPAGE JR Z,.WRT_HN2 ;ADD IX,BC ADD HL,BC - JR NC,.loop + JR NC,.loop ;!FIXIT количество записей каталога = страница ; EX AF,AF' OUT (SLOT3),A @@ -427,59 +600,6 @@ WRT_HND: SET_PAGE_X DIRPAGE 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 ; RET Z + ; рег. D - номер диска +; [ ] fat32 RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC @@ -534,6 +656,8 @@ RD_BPB: LD C,SLOT3 LD E,A 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.RootDirStartCluster_L),DE + LD (FatBuffer.RootDirStartCluster_H),DE LD (FatBuffer.SectorsPerFAT_H),A ; ; diff --git a/DSS/build.txt b/DSS/build.txt index b7cbeb8..1307450 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -953 \ No newline at end of file +956 \ No newline at end of file