Estex-DSS/DSS/API/Read.asm
Anatoliy Belyanskiy 0312779217 Preparing for FAT32
2024-03-12 03:51:04 +10:00

189 lines
2.6 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 - 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 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)
.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