Estex-DSS/DSS/API/Read.asm
2024-04-06 04:27:47 +10:00

186 lines
2.9 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; HL - BUFFER ADDRESS
; DE - BLOCK SIZE
; A - FM
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
CALL GET_OFFSET_IN_SECTORS
; ;<3B> áçñâ ᬥ饭¨ï ¢ ᥪâ®à å ;!HARDCODE sector 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
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