Код:
;device fd
;external low-level disk driver v1.3
;for rawr disk distribution system
;by michael borisov (c) 1996
; 0 - init
; 1 - set drive (>a - number drive 0,1,2,3)
; 2 - read (>hl - to address, >de - start track/block, >b - blocks to read)
; 3 - write (>hl - from address, >de - start track/block, >b - blocks to write)
device_fd_ent
cp #00
call z,fd_00 ;init
cp #01
call z,fd_01 ;set drive
cp #02
call z,fd_02 ;read
cp #03
call z,fd_03 ;write
ret
fd_clr_error
ld a,#ff
ld (fd_err_co),a
ret
fd_00 call fd_inifdc ;init
call fd_motor_on
jr fd_res_head
fd_inifdc
di
call fd_clr_error
ld a,%00011000
ld c,#ff
call fd_out_c_a
ld a,%00011100
call fd_out_c_a
ld hl,300
call fd_pause
ld a,#d0
ld c,#1f
call fd_out_c_a
ld hl,1000
jp fd_pause
fd_res_head
di
ld a,8
jr fd_posrt
fd_motor_on
di
call fd_inifdc
call fd_get_pos
call fd_position
ld hl,#2134
jp fd_pause
fd_position
di
srl a
call fd_store_pos
ld c,#7f
call fd_out_c_a
ccf
sbc a,a
and %00010000 ;side
ld b,a
ld a,(fd_drive_no)
or b
or %00001100
ld c,#ff
call fd_out_c_a
; call fd_break_key
ld c,#1f
ld a,#18 ;position cmd
fd_posrt
call fd_out_c_a
call fd_wt_irq
ret
fd_01 ;set drive:
ld a,c
and 3
ld (fd_drive_no),a
call fd_get_pos
ld c,#3f
call fd_out_c_a
call fd_clr_error
ret
fd_02 ;readgr:
ld a,#80
ld c,0
jr fd_rdwrgr
fd_03 ;writgr
ld a,#a0
ld c,1
fd_rdwrgr
ld (fd_rwcmd+1),a
ld a,c
ld (fd_dmatyp+1),a
ld a,b
ld (fd_sec_remain),a
ld (fd_err_sp),sp
call fd_clr_error
fd_rwgpos
ld a,d
call fd_position
fd_rwgnxt
ld (fd_dma_addr),hl
ld (fd_rw_loc),de
fd_rwretr
ld de,(fd_rw_loc)
ld hl,(fd_dma_addr)
;call break_key
ld c,#5f
ld a,e
inc a
call fd_out_c_a
fd_rwcmd
ld a,0
ld c,#1f
call fd_out_c_a
ld c,#7f
fd_dmatyp
ld a,0
or a
jr nz,fd_rwgr0
call fd_dma_rd
jr fd_rwgr1
fd_rwgr0
call fd_dma_wr
fd_rwgr1
ld a,b
or a
ld a,1 ;no disk
jp z,fd_err_ret
call fd_in_1f
ld c,a
and #1f
jr z,fd_rwgr2
ld a,4 ;snf/crc err
jp fd_err_ret
fd_rwgr2
bit 6,c
ld a,2 ;wprt
jp nz,fd_err_ret
fd_rwignr
ld de,(fd_rw_loc)
inc e
bit 4,e ;16 secs/trk
jr z,fd_xalal
ld e,0
inc d
scf
fd_xalal
ld a,(fd_sec_remain)
dec a
ld (fd_sec_remain),a
ret z
jr nc,fd_rwgnxt
jr fd_rwgpos
fd_err_ret
ld (fd_err_co),a
ld a,#d0
ld c,#1f
call fd_out_c_a
ld sp,(fd_err_sp)
ret
fd_store_pos
push hl
push af
ld hl,fd_drv_head
ld a,(fd_drive_no)
add a,l
ld l,a
adc a,h
sub l
ld h,a
pop af
ld (hl),a
pop hl
ret
fd_get_pos
push hl
ld hl,fd_drv_head
ld a,(fd_drive_no)
add a,l
ld l,a
adc a,h
sub l
ld h,a
ld a,(hl)
pop hl
ret
fd_pause
push af
fd_pau_0
dec hl
ld a,h
or l
jr nz,fd_pau_0
pop af
ret
;'radisk v1.3 (c) 1996, michael borisov'
;tr-dos port routines
fd_out_c_a
push hl
ld hl,#2a53
ex (sp),hl
jp #3d30
fd_dma_rd
push hl
ld hl,#3fd5
ex (sp),hl
jp #3d30
fd_dma_wr
push hl
ld hl,#3fba
ex (sp),hl
jp #3d30
fd_wt_irq
push hl
ld hl,#3fe5
ex (sp),hl
jp #3d30
fd_irz
ld hl,#3f33
push hl
jp #3d30
fd_in_1f
push hl
push bc
push de
xor a
ld c,#3f
call fd_out_c_a
ld a,#0a
ld c,#5f
call fd_out_c_a
ld d,#01
call fd_irz
call fd_get_pos
ld c,#3f
call fd_out_c_a
ld a,b
pop de
pop bc
pop hl
ret
fd_drive_no
db 00
fd_drv_head
db 00 ;a
db 00 ;b
db 00 ;c
db 00 ;d
fd_ttbl_adr
dw 0000
fd_dma_addr
dw 0000
fd_rw_loc dw 0000
fd_sec_remain
db 00
fd_err_sp dw 0000
fd_err_co db #ff
Вызываю на чтение так (fdc это сам драйвер):