mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
173 lines
2.7 KiB
NASM
173 lines
2.7 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
|
|
;
|
|
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
|
|
; ç⥨¥ ç¥à¥§ ¡ãä¥à DSS, ¥á«¨ à §¬¥à ¤ ëå < 512
|
|
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 ;!FIXIT ; [ ] 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 |