; LAST UPDATE: 18.10.2023 savelij
; ДРАЙВЕР ЭЛЕКТРОННОГО ДИСКА
ED_DRV DW ED_RES
DW ED_SEEK
DW ED_FRM
DW ED_REC
DW ED_RD
DW ED_NOP
DW ED_WR
;-------------------------
; КОМАНДЫ НЕ ВЫПОЛНЯЮТСЯ
ED_RES:
ED_REC:
ED_NOP
; CALL TST_RT
XOR A
RET
;-------------------------
ED_SEEK: LD A,(RQCYL)
LD (ED_CYL),A
XOR A
RET
;-------------------------
; ВЫЧИСЛЕНИЕ АДРЕСА
ED_ADR BIT ED_INI,(IX-_TST_IS1)
CALL NZ,ED_INIT
ld a,~RAM_RAMDISK
RST 18H
EX AF,AF'
ld hl,(ED_CYL)
ld h,0xc2
LD de,(RQSECT)
inc e
ld d,0
ld b,126
ED_ADR_LOOP:
ld a,(hl)
cp e
jr z,ED_ADR_END
inc h
ld a,(hl)
add a,d
ld d,a
inc h
djnz ED_ADR_LOOP
EX AF,AF'
rst 0x18
JR ED_ERRA1
ED_ADR_END:
ld e,0
srl d
rr e
ld h,0xc0
ld a,(hl)
add a,d
ld d,a
inc h
ld a,RAM_DATARAMD
add a,(hl)
set 7,d
bit 6,d
jr z,ED_ADR_NINC
res 6,d
inc a
ED_ADR_NINC:
EX AF,AF'
rst 0x18
RET
ED_INIT:RES ED_INI,(IX-_TST_IS1)
XOR A
CALL ED_PG
RST 18H
EX AF,AF'
LD A,0E5H
JP ED_CLR
;-------------------------
; ЧТЕНИЕ
ED_LDIR:
ld a,0x06
in a,(0xbe)
EX AF,AF'
push bc
ld bc,WIN_P2
out (c),a
pop bc
ldir
EX AF,AF'
ld bc,WIN_P2
out (c),a
ret
;-------------------------
;
ED_RD: CALL ED_ADR ; COPY FROM HL ...
EX DE,HL
LD BC,256
LD DE,(DCBUF) ; ... TO DE 128 BYTE
call ED_LDIR
EI
XOR A
RET
ED_ERRA1: POP AF
ED_ERRA:LD A,_ADRERR
RET
;------------------------
; ЗАПИСЬ
ED_WR: CALL ED_ADR ; COPY TO HL ...
LD BC,256
LD HL,(DCBUF)
call ED_LDIR
EI
XOR A
RET
;----------------------------
; FORMAT
ED_FRM: LD A,(RQCYL)
DEC A
JP M,ED_ERRA
CALL ED_PG
RST 18H
EX AF,AF'
LD A,(RQBLN)
ED_CLR LD HL,0C000H
LD DE,0C001H
LD BC,03FFFH
LD (HL),A
LDIR
EX AF,AF'
RST 18H
EI
XOR A
RET