mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 01:11:48 +03:00
186 lines
2.9 KiB
NASM
186 lines
2.9 KiB
NASM
; 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 |