mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-17 18:30:35 +03:00
...
This commit is contained in:
parent
81595cbb58
commit
2a6d817a9d
@ -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
|
||||
|
||||
199
DSS/API/Read.asm
Normal file
199
DSS/API/Read.asm
Normal file
@ -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
|
||||
;<3B> áçñâ á¬¥é¥¨ï ¢ ᥪâ®à å
|
||||
; 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
|
||||
208
DSS/API/Write.asm
Normal file
208
DSS/API/Write.asm
Normal file
@ -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 ; …᫨ à §¬¥à ä ©« ¤¨áª¥ <20>… áâ « ¡®«ìè¥, 祬 ¡ë«
|
||||
; …᫨ à §¬¥à ä ©« ¤¨áª¥ áâ « ¡®«ìè¥, 祬 ¡ë«
|
||||
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
|
||||
;
|
||||
834
DSS/DOS_FM.ASM
834
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
|
||||
;<3B> áçñâ á¬¥é¥¨ï ¢ ᥪâ®à å
|
||||
; 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 ; …᫨ à §¬¥à ä ©« ¤¨áª¥ <20>… áâ « ¡®«ìè¥, 祬 ¡ë«
|
||||
; …᫨ à §¬¥à ä ©« ¤¨áª¥ áâ « ¡®«ìè¥, 祬 ¡ë«
|
||||
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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -1 +1 @@
|
||||
790
|
||||
805
|
||||
@ -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
|
||||
|
||||
@ -1 +1 @@
|
||||
288
|
||||
289
|
||||
Loading…
Reference in New Issue
Block a user