Estex-DSS/DSS/API/Read.asm

199 lines
2.7 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 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