diff --git a/DSS/API.asm b/DSS/API.asm index b0c0c0d..4d4695e 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -55,6 +55,9 @@ include 'API/MkDir.asm' include 'API/RmDir.asm' include 'API/DosName.asm' + include 'API/Read.asm' + include 'API/Write.asm' + ;R09 ;Дубль - CHNDISK = OPENDSK diff --git a/DSS/API/Read.asm b/DSS/API/Read.asm new file mode 100644 index 0000000..e5b1a00 --- /dev/null +++ b/DSS/API/Read.asm @@ -0,0 +1,199 @@ +; HL - ADDRESS +; DE - 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 C,(IY+_sFM.F_POSITION) + ; LD E,(IY+_sFM.F_POSITION+1) + ; LD A,E + ; AND #01 + ; LD B,A + ; LD D,(IY+_sFM.F_POSITION+2) + ; LD L,(IY+_sFM.F_POSITION+3) + ; LD H,0 + ; OR A + ; RR L + ; RR D + ; RR E + LD H,0 + 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) + ; + ;LD A,B + 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 BLOK_RD + 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 BLOK_RD + 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 BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR_3 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + EXX + POP DE + LD HL,512 ;!HARDCODE + 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.F_SIZE) + LD B,(IY+_sFM.F_SIZE+1) ;SIZE LOW + AND A + SBC HL,BC + EXX + LD C,(IY+_sFM.F_SIZE+2) ;SIZE HIGH + LD B,(IY+_sFM.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/API/Write.asm b/DSS/API/Write.asm new file mode 100644 index 0000000..c8eb8db --- /dev/null +++ b/DSS/API/Write.asm @@ -0,0 +1,208 @@ +WRITE.ERR3: + POP HL +WRITE.ERR2: + POP HL +WRITE.ERR1: + POP BC + SCF + RET +WRITE.RD_ONLY: + POP DE + LD A,DSS_Error.sys.READONLY + SCF + RET + +; HL - ADDRESS +; DE - SIZE +; A - FM +WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WR_FAT + CALL .Start + PUSH AF + LD A,(FatCache.Update) + OR A + CALL NZ,WR_FAT ; подкл. банку кеша FAT и записать его на диск + POP AF + RET + ; +.Start: LD (.R_POINT),HL + LD (.S_POINT),HL + PUSH DE + CALL SET_FM + JR C,.ERR1 + LD A,(IY+_sFM.ACCESS_MODE) + AND FAT_ATTR.READ_ONLY + JR NZ,.RD_ONLY + SET 7,(IY+_sFM.ACCESS_MODE) + SET 5,(IY+_sFM.ATTRIBUT) + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + JR C,.ERR1 + ; + LD C,(IY+_sFM.F_POSITION) + LD A,(IY+_sFM.F_POSITION+1) + LD E,A + AND #01 + LD B,A + LD D,(IY+_sFM.F_POSITION+2) + LD L,(IY+_sFM.F_POSITION+3) + LD H,0 + OR A + RR L + RR D + RR E + ; HL:DE - FP (in sectors) + ; BC - FP residue (in bytes) + LD A,B + OR C + JP NZ,.WOV1 +.WOV4: POP BC + PUSH BC + SRL B + JR Z,.WOV2 + PUSH HL + PUSH DE + PUSH BC +.R_POINT+2: + LD IX,0 + CALL BLOK_WR + POP BC + JR C,.ERR3 + LD C,B + LD HL,(.R_POINT) + LD DE,#0200 ;!HARDCODE +.WOV5: ADD HL,DE + DJNZ .WOV5 + ; B=0 + LD (.R_POINT),HL + ;LD B,0 + POP HL + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC +.WOV2: POP BC + LD A,B + AND #01 + LD B,A + OR C + JR Z,.WOV6 + PUSH HL + PUSH DE + PUSH BC + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + LD DE,CORE_BUFFERS.BUFFER + LD HL,(.R_POINT) + POP BC + JP C,.ERR2 + LDIR + LD (.R_POINT),HL + POP DE + POP HL + LD IX,CORE_BUFFERS.BUFFER+#C000 + LD B,1 + IN A,(SLOT3) + PUSH AF + IN A,(SLOT0) + OUT (SLOT3),A + CALL BLOK_WR + POP BC + LD C,SLOT3 + OUT (C),B + RET C +.WOV6: LD HL,(.R_POINT) +.S_POINT+1: LD DE,0 + ; CF=0 + ;AND A + SBC HL,DE + PUSH HL + EX DE,HL + LD XH,D + LD XL,E + LD HL,0 + CALL MOVE_FP.F_current + CALL MOVE_CP + POP DE + RET NC ; Если размер файла на диске НЕ стал больше, чем был + ; Если размер файла на диске стал больше, чем был + LD L,(IY+_sFM.F_POSITION+0) + LD H,(IY+_sFM.F_POSITION+1) + LD C,(IY+_sFM.F_POSITION+2) + LD B,(IY+_sFM.F_POSITION+3) + LD (IY+_sFM.F_SIZE+0),L + LD (IY+_sFM.F_SIZE+1),H + LD (IY+_sFM.F_SIZE+2),C + LD (IY+_sFM.F_SIZE+3),B + AND A + RET + ; +.WOV1: 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 BLOK_RD + POP BC + LD C,SLOT3 + OUT (C),B + POP DE + POP HL + EXX + POP DE + JP C,.ERR1 + LD HL,512 ;!HARDCODE + AND A + SBC HL,DE + LD B,H + LD C,L + POP HL + AND A + SBC HL,BC + JR NC,.WOV3 + ADD HL,BC + LD B,H + LD C,L + LD HL,0 +.WOV3: PUSH HL + LD HL,CORE_BUFFERS.BUFFER + ADD HL,DE + LD DE,(.R_POINT) + EX DE,HL + LDIR + LD (.R_POINT),HL + EXX + 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 BLOK_WR + POP BC + LD C,SLOT3 + OUT (C),B + POP HL + JP C,.ERR2 + LD BC,1 + ADD HL,BC + EX DE,HL + POP HL + LD C,B + ADC HL,BC + JP .WOV4 +; \ No newline at end of file diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index e4a72e6..b6e4855 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -177,840 +177,6 @@ MOVE_CP: SBC HL,DE RET -;-------------------- -ECL2: - ;[x] SAVE CLUSTER AFTER READ ;!TEST - POP BC - ; - POP BC - POP DE - AND A - RET - -BLOKRD0 POP BC - POP DE - SCF - RET - -;READ SECTORS OF FILE -;HL:DE - FP (in sectors) -; B - Amount sectors -BLOK_RD: PUSH BC - LD (READ.MEM),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER - LD C,A - LD B,0 ;!FIXIT - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb - LD B,XH - LD C,XL - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) - LD A,H - OR L - ;[x] SAVE CLUSTER AFTER READ ;!TEST - ;JR NZ,BLOKRD2 - PUSH BC - JR NZ,.saveClustersOffset - ; - JP ECL2 ;R01 JR BLOKRD0 - -.saveClustersOffset: - ;[x] SAVE CLUSTER AFTER READ ;!TEST - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_H) - LD A,D - OR E - JR Z,BLOKRD2 - - PUSH DE - PUSH HL - PUSH BC - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_H) - LD A,D - OR E - JR Z,.noOptimization_1 - - POP HL - AND A - SBC HL,DE - JR C,.noOptimization_2 - - LD C,L - LD B,H - POP HL - POP DE - - - EX DE,HL - JP BLOKRD2 -.noOptimization_1: - POP BC -.noOptimization_2: - POP HL - POP DE - JP BLOKRD2 - ; -BLOKRD1: - PUSH BC - CALL R_F_FAT - POP BC - JR C,ECL2 ;R01 - EX DE,HL - DEC BC -BLOKRD2: - LD A,B ; ВС - смещение внутри файла в кластерах - OR C - JR NZ,BLOKRD1 - - ;[x] SAVE CLUSTER AFTER READ ;!TEST - LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_H),H - POP BC - LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_H),B - ; - - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) - SUB E - LD C,A ;\ - CP B ; \ - JR C,BLOKRD3 ;SIZE > RESIDUE CLUSTER ; \ - LD C,B ;SIZE < CLUSTER ;->-|--> ; !TODO разобраться -BLOKRD3 LD A,B ; / - SUB C ; / - LD B,A ;/ - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,BLOKRD4 - INC HL -BLOKRD4 LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JP C,BLOKRD0 - POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) -BLOKRD5 ADD HL,DE - DEC C - JR NZ,BLOKRD5 - LD (READ.MEM),HL - POP DE - LD A,B - OR A - RET Z -BLOKRD6 LD HL,CORE_BUFFERS.BootSector.S_P_C - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,BLOKRD7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -BLOKRD7 EX DE,HL - PUSH BC - CALL R_F_FAT - POP BC - JP C,ECL1 ;R01? - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Read - RST ToDSS.DRV - JP C,BLOKRD0 - POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) -BLOKRD8 ADD HL,DE - DEC C - JR NZ,BLOKRD8 - LD (READ.MEM),HL - POP DE - JR BLOKRD6 - -ECL1 AND A - RET - -;----------------------------------------------------------------------- -BLOK_WR.Error: - POP BC - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - POP BC - ; -BLOK_WR.ErrorWrite: - POP BC - POP DE - LD A,DSS_Error.sys.WRITE_ERROR - SCF - RET - ; -;WRITE SECTORS OF FILE -;HL:DE - FP (in sectors), IX - data in RAM -; B - Amount sectors -BLOK_WR: - PUSH BC - LD (READ.MEM),IX - LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER - LD C,A - LD B,0 - ;HL:DE / BC => DE:IX HL-OSTATOK - CALL DIV_for_SPC - LD B,XH - LD C,XL - - PUSH HL ;RESIDUE - LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER - LD H,(IY+_sFM.ST_CLUSTER+1) - LD A,H - OR L - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - ;JR NZ,BLOKWR2 - PUSH BC - JR NZ,.saveClustersOffset - ; - PUSH BC - CALL G_CLUST - JR C,.Error - LD (IY+_sFM.ST_CLUSTER),L - LD (IY+_sFM.ST_CLUSTER+1),H - LD DE,(FatBuffer.ENDCLUS) - CALL W_T_FAT - PUSH HL - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? - ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск - ; - POP HL - POP BC - JP .WR2 - -.saveClustersOffset: - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - LD E,(IY+_sFM.KnownCluster_L) - LD D,(IY+_sFM.KnownCluster_H) - LD A,D - OR E - JR Z,.WR2 - ; - PUSH DE - PUSH HL - PUSH BC - LD E,(IY+_sFM.KnownOffset_L) - LD D,(IY+_sFM.KnownOffset_H) - LD A,D - OR E - JR Z,.noOptimization_1 - ; - POP HL - AND A - SBC HL,DE - JR C,.noOptimization_2 - ; - LD C,L - LD B,H - POP HL - POP DE - ; - EX DE,HL - JP .WR2 -.noOptimization_1: - POP BC -.noOptimization_2: - POP HL - POP DE - JP .WR2 - ; - -.loop: PUSH BC - CALL R_F_FAT - JR NC,.WRB - PUSH HL - CALL INC_FAT - POP HL - JR C,.Error - CALL R_F_FAT -.WRB: POP BC - EX DE,HL - DEC BC -.WR2: LD A,B - OR C - JR NZ,.loop - - ;[x] SAVE CLUSTER AFTER WRITE ;!TEST - LD (IY+_sFM.KnownCluster_L),L - LD (IY+_sFM.KnownCluster_H),H - POP BC - LD (IY+_sFM.KnownOffset_L),C - LD (IY+_sFM.KnownOffset_H),B - ; - POP DE - POP BC - LD A,(CORE_BUFFERS.BootSector.S_P_C) - SUB E - LD C,A - CP B - JR C,.WR3 ;SIZE > RESIDUE CLUSTER - LD C,B ;SIZE < CLUSTER -.WR3: LD A,B - SUB C - LD B,A - PUSH HL - PUSH BC - PUSH DE - CALL NSECTOR - POP DE - ADD IX,DE - JR NC,.WR4 - INC HL - ; DOUBLE 1 -.WR4: LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV - JP C,.ErrorWrite - POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) - ; -.loop2: ADD HL,DE - DEC C - JR NZ,.loop2 - ; - LD (READ.MEM),HL - POP DE - ; - LD A,B - OR A - RET Z - ; -.big_loop: - LD HL,CORE_BUFFERS.BootSector.S_P_C - LD A,B - SUB (HL) - LD B,A - LD C,(HL) - JR NC,.WR7 - LD B,0 - ADD A,(HL) ;0 AND CF - LD C,A - OR A ;CLEAR CF - RET Z -.WR7: EX DE,HL - PUSH BC - CALL R_F_FAT - JR NC,.WR9 - PUSH HL - CALL INC_FAT - POP HL - JR C,.ErrorFull - CALL R_F_FAT -.WR9: POP BC - EX DE,HL - PUSH HL - PUSH BC - CALL NSECTOR - ; DOUBLE 1 - LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV - JP C,.ErrorWrite - POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) -.loop3: ADD HL,DE - DEC C - JR NZ,.loop3 - LD (READ.MEM),HL - POP DE - ; - JR .big_loop - ; -.ErrorFull: - POP BC - LD A,DSS_Error.sys.DISK_FULL - 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.F_SIZE) - LD B,(IY+_sFM.F_SIZE+1) ;SIZE LOW - AND A - SBC HL,BC - EXX - LD C,(IY+_sFM.F_SIZE+2) ;SIZE HIGH - LD B,(IY+_sFM.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 - -; HL - ADDRESS -; DE - SIZE -; A - FM -;READ_FN: -; _mSavePath 1 -; HL - ADDRESS -; DE - 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 C,(IY+_sFM.F_POSITION) - ; LD E,(IY+_sFM.F_POSITION+1) - ; LD A,E - ; AND #01 - ; LD B,A - ; LD D,(IY+_sFM.F_POSITION+2) - ; LD L,(IY+_sFM.F_POSITION+3) - ; LD H,0 - ; OR A - ; RR L - ; RR D - ; RR E - LD H,0 - 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) - ; - ;LD A,B - 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 BLOK_RD - JP C,.ERR_1 - LD DE,(.R_POINT) -.MEM+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 BLOK_RD - 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 BLOK_RD - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,.ERR_3 - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - EXX - POP DE - LD HL,512 ;!HARDCODE - 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 - -PWERR3: POP HL -PWERR2: POP HL -PWERR1: POP BC - SCF - RET - -RD_ONLY: POP DE - LD A,DSS_Error.sys.READONLY - SCF - RET - -; HL - ADDRESS -; DE - SIZE -; A - FM -WRITE: - ;!TEST ;!TODO 5/12/23 [ ] баг с избыточной записью WR_FAT? - CALL WRITE_ - PUSH AF - LD A,(FatCache.Update) - OR A - CALL NZ,WR_FAT ; подкл. банку кеша FAT и записать его на диск - POP AF - RET - ; - ; -WRITE_: LD (.R_POINT),HL - LD (.S_POINT),HL - PUSH DE - CALL SET_FM - JR C,PWERR1 - LD A,(IY+_sFM.ACCESS_MODE) - AND FAT_ATTR.READ_ONLY - JR NZ,RD_ONLY - SET 7,(IY+_sFM.ACCESS_MODE) - SET 5,(IY+_sFM.ATTRIBUT) - LD A,(IY+_sFM.DRIVE) - CALL OPENDSK - JR C,PWERR1 - ; - LD C,(IY+_sFM.F_POSITION) - LD A,(IY+_sFM.F_POSITION+1) - LD E,A - AND #01 - LD B,A - LD D,(IY+_sFM.F_POSITION+2) - LD L,(IY+_sFM.F_POSITION+3) - LD H,0 - OR A - RR L - RR D - RR E - ; HL:DE - FP (in sectors) - ; BC - FP residue (in bytes) - LD A,B - OR C - JP NZ,.WOV1 -.WOV4: POP BC - PUSH BC - SRL B - JR Z,.WOV2 - PUSH HL - PUSH DE - PUSH BC -.R_POINT+2: - LD IX,0 - CALL BLOK_WR - POP BC - JR C,PWERR3 - LD C,B - LD HL,(.R_POINT) - LD DE,#0200 ;!HARDCODE -.WOV5: ADD HL,DE - DJNZ .WOV5 - ; B=0 - LD (.R_POINT),HL - ;LD B,0 - POP HL - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC -.WOV2: POP BC - LD A,B - AND #01 - LD B,A - OR C - JR Z,.WOV6 - PUSH HL - PUSH DE - PUSH BC - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_RD - POP BC - LD C,SLOT3 - OUT (C),B - LD DE,CORE_BUFFERS.BUFFER - LD HL,(.R_POINT) - POP BC - JP C,PWERR2 - LDIR - LD (.R_POINT),HL - POP DE - POP HL - LD IX,CORE_BUFFERS.BUFFER+#C000 - LD B,1 - IN A,(SLOT3) - PUSH AF - IN A,(SLOT0) - OUT (SLOT3),A - CALL BLOK_WR - POP BC - LD C,SLOT3 - OUT (C),B - RET C -.WOV6: LD HL,(.R_POINT) -.S_POINT+1: LD DE,0 - ; CF=0 - ;AND A - SBC HL,DE - PUSH HL - EX DE,HL - LD XH,D - LD XL,E - LD HL,0 - CALL MOVE_FP.F_current - CALL MOVE_CP - POP DE - RET NC ; Если размер файла на диске НЕ стал больше, чем был - ; Если размер файла на диске стал больше, чем был - LD L,(IY+_sFM.F_POSITION+0) - LD H,(IY+_sFM.F_POSITION+1) - LD C,(IY+_sFM.F_POSITION+2) - LD B,(IY+_sFM.F_POSITION+3) - LD (IY+_sFM.F_SIZE+0),L - LD (IY+_sFM.F_SIZE+1),H - LD (IY+_sFM.F_SIZE+2),C - LD (IY+_sFM.F_SIZE+3),B - AND A - RET - ; -.WOV1: 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 BLOK_RD - POP BC - LD C,SLOT3 - OUT (C),B - POP DE - POP HL - EXX - POP DE - JP C,PWERR1 - LD HL,512 ;!HARDCODE - AND A - SBC HL,DE - LD B,H - LD C,L - POP HL - AND A - SBC HL,BC - JR NC,.WOV3 - ADD HL,BC - LD B,H - LD C,L - LD HL,0 -.WOV3: PUSH HL - LD HL,CORE_BUFFERS.BUFFER - ADD HL,DE - LD DE,(.R_POINT) - EX DE,HL - LDIR - LD (.R_POINT),HL - EXX - 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 BLOK_WR - POP BC - LD C,SLOT3 - OUT (C),B - POP HL - JP C,PWERR2 - LD BC,1 - ADD HL,BC - EX DE,HL - POP HL - LD C,B - ADC HL,BC - JP .WOV4 - -////////////// OLD //////////////// -; HL - CLUSTER -; HL:IX - SECTOR -; NSECTOR: DEC HL -; DEC HL -; EX DE,HL -; LD A,(CORE_BUFFERS.BootSector.S_P_C) -; LD B,A -; LD HL,0 -; LD IX,0 -; ADD_DE1: ADD IX,DE -; JR NC,ADD_DE2 -; INC HL -; ADD_DE2: DJNZ ADD_DE1 -; LD DE,(FatBuffer.DAT_FRM) ;first data sector -; ADD IX,DE -; LD DE,#0000 -; ADC HL,DE -; RET -////////////// NEW ////////////////// -; in: HL - CLUSTER -; out: HL:IX - SECTOR -NSECTOR: - LD DE,0 - DEC HL - DEC HL - LD A,(CORE_BUFFERS.BootSector.S_P_C) - XOR 1 - JR Z,.skip - ; - RRA -.loop: ADD HL,HL - RL E - RL D - ; - RRA - JP NC,.loop - ; -.skip: EX DE,HL - LD XL,E - LD XH,D - LD DE,(FatBuffer.DAT_FRM) ;first data sector - XOR A - ADD IX,DE - LD D,A - LD E,A - ADC HL,DE - ;!TODO а надо ли проверять переполнение HL:IX? - RET -///////////////////////////////////// - ; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A DIV_for_SPC: diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index c3040f3..07c1f41 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -196,8 +196,7 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; ; IN: A - drive number ; -OPENDSK: - ;!TEST DRV.Open обход R10 +OPENDSK:;!TEST DRV.Open обход R10 LD C,A LD A,(FatBuffer.DRIVE) CP C diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index d757d91..378fe4d 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -485,7 +485,7 @@ SAVEDIR: ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; !FIXIT чёт не используется IF COMPILE_UNUSED_CODE -TESTDSK: +TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.MediaCheck RST ToDSS.DRV diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index a8b3a82..1ce58f4 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -33,7 +33,8 @@ G_CLUST: RET ; HL - CLUSTER -INC_FAT PUSH HL +INC_FAT: + PUSH HL CALL G_CLUST POP DE RET C @@ -53,7 +54,7 @@ INC_FAT PUSH HL POP HL LD DE,(FatBuffer.ENDCLUS) ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера - ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? + ;!TEST ;!TODO 2/12/23 ; [ ] баг с избыточной записью WR_FAT? ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск ; AND A @@ -281,7 +282,7 @@ W_T_F12: ;!FIXIT CALL GET_FAT12_CELL POP DE - JP C,W_T_F01 ; номер нечётный + JR C,W_T_F01 ; номер нечётный LD (HL),E INC HL LD A,(HL) @@ -299,16 +300,23 @@ W_T_F12: ;!FIXIT RET ; W_T_F01:; влево на 4 битa - SLA E - LD A,E - RL D - RLA - RL D - RLA - RL D - RLA - RL D - LD E,A + ;SLA E + ;LD A,E + ;RL D + ;RLA + ;RL D + ;RLA + ;RL D + ;RLA + ;RL D + ;LD E,A + ; + ex de,hl + add hl,hl + add hl,hl + add hl,hl + add hl,hl + ex de,hl ; LD A,(HL) AND #0F @@ -390,7 +398,7 @@ WR_FAT: SET_PAGE_X FATPAGE LD HL,FAT_CACHE.Sectors ; CF = 0 SBC HL,DE - JP C,.ERR + JR C,.ERR LD A,L .WALLFAT:; !TODO чёб сразу в IX не грузить FAT_FRM? LD H,B @@ -473,33 +481,33 @@ GET_FAT12_CELL: PUSH AF ; сохр. флаг ADD HL,DE ; CLUSTER * 1.5 ; - ;!FIXIT оптимизировать ;IF COMPILE_UNUSED_CODE - LD A,H - LD B,H - - ; - AND #1F - ;AND FAT_CACHE.Size_Mask_16 - ; + ;!FIXIT оптимизировать + LD A,H + LD B,H + + ; + AND #1F + ;AND FAT_CACHE.Size_Mask_16 + ; - LD H,A - LD A,B + LD H,A + LD A,B - ; - RLCA - RLCA - RLCA - ;DUP FAT_CACHE.Degree_16 - ; RRCA - ;EDUP - AND #07 - ;AND FAT_CACHE.Part_Mask_16 - ; - - LD BC,(FatCache) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а + ; + RLCA + RLCA + RLCA + ;DUP FAT_CACHE.Degree_16 + ; RRCA + ;EDUP + AND #07 + ;AND FAT_CACHE.Part_Mask_16 + ; + + LD BC,(FatCache) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а ;ENDIF ; LD DE,FATPAGE.cache @@ -508,6 +516,392 @@ GET_FAT12_CELL: RET +; in: HL - CLUSTER +; out: HL:IX - SECTOR +NSECTOR: + LD DE,0 + DEC HL + DEC HL + LD A,(CORE_BUFFERS.BootSector.S_P_C) + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + ; + RRA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D + LD DE,(FatBuffer.DAT_FRM) ;first data sector + XOR A + ADD IX,DE + LD D,A + LD E,A + ADC HL,DE + ;!TODO а надо ли проверять переполнение HL:IX? + RET + +//////////////////////////////////////////////////////////////////////// +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + MACRO _GetSavedCluster exit_to + LD E,(IY+_sFM.KnownCluster_L) + LD D,(IY+_sFM.KnownCluster_H) + LD A,D + OR E + JR Z,exit_to + ; + PUSH DE + PUSH HL + PUSH BC + LD E,(IY+_sFM.KnownOffset_L) + LD D,(IY+_sFM.KnownOffset_H) + LD A,D + OR E + JR Z,.noOptimization_1 + ; + POP HL + AND A + SBC HL,DE + JR C,.noOptimization_2 + ; + LD C,L + LD B,H + POP HL + POP DE + ; + EX DE,HL + JP exit_to +.noOptimization_1: + POP BC +.noOptimization_2: + POP HL + POP DE + JP exit_to + ENDM +;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + MACRO _SaveGetedCluster + LD (IY+_sFM.KnownCluster_L),L + LD (IY+_sFM.KnownCluster_H),H + POP BC + LD (IY+_sFM.KnownOffset_L),C + LD (IY+_sFM.KnownOffset_H),B + ENDM +;; + +BLOK_RD.ECL2: + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + POP BC + ; + POP BC + POP DE + AND A + RET + ; +;READ SECTORS OF FILE +;HL:DE - FP (in sectors) +; B - Amount sectors +BLOK_RD: PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD C,A + LD B,0 ;!FIXIT + ;HL:DE / BC => DE:IX HL-OSTATOK + CALL DIV_for_SPC + ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb + LD B,XH + LD C,XL + PUSH HL ;RESIDUE + LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER + LD H,(IY+_sFM.ST_CLUSTER+1) + LD A,H + OR L + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + ;JR NZ,BLOKRD2 + PUSH BC + JR Z,.ECL2 + ;JP ECL2 ;R01 JR BLOKRD0 + _GetSavedCluster .enter_loop1 + ; +.loop1: PUSH BC + CALL R_F_FAT + POP BC + JR C,.ECL2 ;R01 + EX DE,HL + DEC BC +.enter_loop1: + LD A,B ; ВС - смещение внутри файла в кластерах + OR C + JR NZ,.loop1 + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + _SaveGetedCluster + ; + POP DE + POP BC + LD A,(CORE_BUFFERS.BootSector.S_P_C) + 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 + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.skip2 + INC HL +.skip2: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) + ;!TEST + LD A,B + LD B,C +.loop2: ADD HL,DE + ;DEC C + ;JR NZ,.loop2 + DJNZ .loop2 + LD (READ.PointerOnBuffer),HL + POP DE + ;LD A,B + OR A + RET Z + LD B,A + ; +.loop4: LD HL,CORE_BUFFERS.BootSector.S_P_C + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.BLOKRD7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +.BLOKRD7: + EX DE,HL + PUSH BC + CALL R_F_FAT + POP BC + JR C,.ECL1 ;R01? + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Read + RST ToDSS.DRV + JR C,.Error + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + JP .loop4 + ; +.Error: POP BC + POP DE + ;SCF + RET + ; +.ECL1: AND A + RET + +;----------------------------------------------------------------------- +; BLOK_WR.Error: +; POP BC +; ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +; POP BC + ; +; BLOK_WR.ErrorWrite: +; POP BC +; POP DE +; LD A,DSS_Error.sys.WRITE_ERROR +; SCF +; RET + ; +;WRITE SECTORS OF FILE +;HL:DE - FP (in sectors), IX - data in RAM +; B - Amount sectors +BLOK_WR: + PUSH BC + LD (READ.PointerOnBuffer),IX + LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER + LD C,A + LD B,0 + ;HL:DE / BC => DE:IX HL-OSTATOK + CALL DIV_for_SPC + LD B,XH + LD C,XL + + PUSH HL ;RESIDUE + LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER + LD H,(IY+_sFM.ST_CLUSTER+1) + LD A,H + OR L + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + ;JR NZ,BLOKWR2 + PUSH BC + JR NZ,.GetSavedCluster + ; + PUSH BC + CALL G_CLUST + JP C,.Error + LD (IY+_sFM.ST_CLUSTER),L + LD (IY+_sFM.ST_CLUSTER+1),H + LD DE,(FatBuffer.ENDCLUS) + CALL W_T_FAT + PUSH HL + ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? + ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ; + POP HL + POP BC + JP .WR2 + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.GetSavedCluster: + _GetSavedCluster .WR2 + ; +.loop: PUSH BC + CALL R_F_FAT + JR NC,.WRB + PUSH HL + CALL INC_FAT + POP HL + JP C,.Error + CALL R_F_FAT +.WRB: POP BC + EX DE,HL + DEC BC +.WR2: LD A,B + OR C + JR NZ,.loop + + ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE + _SaveGetedCluster + ; + POP DE + POP BC + LD A,(CORE_BUFFERS.BootSector.S_P_C) + SUB E + LD C,A + CP B + JR C,.WR3 ;SIZE > RESIDUE CLUSTER + LD C,B ;SIZE < CLUSTER +.WR3: LD A,B + SUB C + LD B,A + PUSH HL + PUSH BC + PUSH DE + CALL NSECTOR + POP DE + ADD IX,DE + JR NC,.WR4 + INC HL + ; DOUBLE 1 +.WR4: LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JR C,.ErrorWrite + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) + ; +.loop2: ADD HL,DE + DEC C + JR NZ,.loop2 + ; + LD (READ.PointerOnBuffer),HL + POP DE + ; + LD A,B + OR A + RET Z + ; +.big_loop: + LD HL,CORE_BUFFERS.BootSector.S_P_C + LD A,B + SUB (HL) + LD B,A + LD C,(HL) + JR NC,.WR7 + LD B,0 + ADD A,(HL) ;0 AND CF + LD C,A + OR A ;CLEAR CF + RET Z +.WR7: EX DE,HL + PUSH BC + CALL R_F_FAT + JR NC,.WR9 + PUSH HL + CALL INC_FAT + POP HL + JR C,.ErrorFull + CALL R_F_FAT +.WR9: POP BC + EX DE,HL + PUSH HL + PUSH BC + CALL NSECTOR + ; DOUBLE 1 + LD DE,(READ.PointerOnBuffer) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JR C,.ErrorWrite + POP BC + LD HL,(READ.PointerOnBuffer) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.PointerOnBuffer),HL + POP DE + ; + JP .big_loop + ; +.Error: POP BC + POP BC ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE +.ErrorWrite: + POP BC + POP DE + LD A,DSS_Error.sys.WRITE_ERROR + ;SCF + RET + ; +.ErrorFull: + POP BC + LD A,DSS_Error.sys.DISK_FULL + ;SCF + RET +//////////////////////////////////////////////////////////////////////// + + FatCache: WORD #0000 .Block EQU FatCache .Update EQU FatCache+1 @@ -629,4 +1023,25 @@ FAT_Max_Cluster: WORD #0FF0 ; ; LD C,6 ; RST #18 ; RET + + +////////////// OLD //////////////// +; HL - CLUSTER +; HL:IX - SECTOR +; NSECTOR: DEC HL +; DEC HL +; EX DE,HL +; LD A,(CORE_BUFFERS.BootSector.S_P_C) +; LD B,A +; LD HL,0 +; LD IX,0 +; ADD_DE1: ADD IX,DE +; JR NC,ADD_DE2 +; INC HL +; ADD_DE2: DJNZ ADD_DE1 +; LD DE,(FatBuffer.DAT_FRM) ;first data sector +; ADD IX,DE +; LD DE,#0000 +; ADC HL,DE +; RET //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index c04091d..4c88dcf 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -790 \ No newline at end of file +805 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 0611879..1590968 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +15,7 @@ define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128)) ; FAT_CACHE: -.Size EQU #1000 +.Size EQU #2000 .Sector_Size EQU #200 .Sectors EQU .Size / .Sector_Size ; for FAT16 diff --git a/SHELL/build.txt b/SHELL/build.txt index 022e7e6..2d82846 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -288 \ No newline at end of file +289 \ No newline at end of file