extrn @dtbl ; table of pointers to XDPHs\r
public @adrv,@rdrv,@trk,@sect ; parameters for disk I/O\r
public @dma,@dbnk,@cnt ; '' '' '' ''\r
+ public @xdph,@op\r
\r
; memory control\r
\r
seldsk:\r
ld a,c ; save drive select code\r
ld (@adrv),a\r
- ld b,0 ; create index from drive code\r
+ xor a\r
+ ld (@op),a\r
+ ld (@cnt),a\r
+ ld b,a ; create index from drive code\r
ld hl,@dtbl\r
add hl,bc ; get pointer to dispatch table\r
add hl,bc\r
or h\r
ret z ; if no entry in table, no disk\r
\r
- ld a,e ; examine login bit\r
- and 1\r
- ret nz\r
-\r
- push ix\r
- ld ix,(@xdph)\r
- ld a,(ix-2)\r
- ld (@RDRV),a ; get relative drive\r
- ld l,(ix-6) ; get address of LOGIN routine\r
- ld h,(ix-5)\r
- ex (sp),ix\r
- pop de\r
+ bit 0,e ; login bit to zero flag\r
+ ex de,hl\r
+ ld hl,-2 ; get relative drive\r
+ add hl,de\r
+ ld a,(hl)\r
+ ld (@RDRV),a\r
+ jr nz,notfirst ; examine login bit\r
+ ld hl,-6\r
+ add hl,de\r
+ ld a,(hl)\r
+ inc hl\r
+ ld h,(hl)\r
+ ld l,a\r
call ipchl ; call LOGIN\r
+notfirst:\r
ld hl,(@xdph) ; recover DPH pointer\r
ret\r
\r
; extended disk parameter header (XDPH).\r
\r
read:\r
+ ld a,1\r
+ ld (@op),a\r
ld ix,(@xdph) ; get drive descriptor pointer\r
ld l,(ix-8) ; get read routine entry\r
ld h,(ix-7)\r
; extended disk parameter header (XDPH).\r
\r
write:\r
+ ld a,2\r
+ ld (@op),a\r
ld ix,(@xdph) ; get drive descriptor pointer\r
ld l,(ix-10) ; get write routine entry\r
ld h,(ix- 9)\r
; do not change order. sd driver depends on this\r
\r
@xdph: ds 2 ; pointer to currently selected drives dph\r
+@op ds 1 ; current disk operation 0:select, 1:read, 2 write\r
@adrv: ds 1 ; currently selected disk drive\r
@rdrv: ds 1 ; controller relative disk drive\r
@trk: ds 2 ; current track number\r