Browse Source

ZPM3 Drive Map Fix

- Workaround to make ZPM3 consider all drives (A-P) valid so that subsequent drive ASSIGNments work properly.
patch
Wayne Warthen 6 years ago
parent
commit
df195ee75c
  1. 15
      Source/CBIOS/cbios.asm
  2. 37
      Source/CPM3/boot.z80
  3. 42
      Source/CPM3/diskio.z80

15
Source/CBIOS/cbios.asm

@ -1171,6 +1171,11 @@ DSK_GETINF:
RLCA ; ... TO USE AS OFFSET INTO DRVMAP
CALL ADDHLA ; ADD OFFSET
LD D,(HL) ; D := UNIT
LD A,D ; PUT UNIT IN ACCUM
INC A ; $FF -> $00
JR Z,DSK_GETINF1 ; HANDLE UNASSIGNED DRIVE LETTER
INC HL ; BUMP TO SLICE
LD E,(HL) ; E := SLICE
INC HL ; POINT TO DPH LSB
@ -1178,9 +1183,11 @@ DSK_GETINF:
INC HL ; POINT TO DPH MSB
LD H,(HL) ; H := DPH MSB
LD L,A ; L := DPH LSB
LD A,H ; TEST FOR INVALID DPH
OR L ; ... BY CHECKING FOR ZERO VALUE
JR Z,DSK_GETINF1 ; HANDLE ZERO DPH, DRIVE IS INVALID
;LD A,H ; TEST FOR INVALID DPH
;OR L ; ... BY CHECKING FOR ZERO VALUE
;JR Z,DSK_GETINF1 ; HANDLE ZERO DPH, DRIVE IS INVALID
XOR A ; SET SUCCESS
RET
;
@ -1198,7 +1205,7 @@ DSK_GETINF1: ; ERROR RETURN
DSK_SELECT:
LD B,E ; SAVE E IN B FOR NOW
CALL DSK_GETINF ; GET D=UNIT, E=SLICE, HL=DPH ADDRESS
CALL NZ,PANIC ; *DEBUG*
;CALL NZ,PANIC ; *DEBUG*
RET NZ ; RETURN IF INVALID DRIVE (A=1, NZ SET, HL=0)
PUSH BC ; WE NEED B LATER, SAVE ON STACK
;

37
Source/CPM3/boot.z80

@ -228,25 +228,26 @@ dinit6:
pop de ; restore drive list ptr
inc de ; increment active drive list ptr
djnz dinit6 ; loop as needed
ret
; zero out remaining dph table entries
ld a,16 ; dph table entries
sub l ; subtract entries used
ret z ; return if all entries used
ld b,a ; save as loop counter
ld a,l ; current dph to accum
rlca ; *2 for word entry
ld hl,@dtbl ; start of dtbl
call addhla ; hl now points to entry
dinit6a:
xor a ; zero accum
ld (hl),a ; zero lsb
inc hl ; next byte
ld (hl),a ; zero msb
inc hl ; next byte
djnz dinit6a
ret ; finished
; ; zero out remaining dph table entries
; ld a,16 ; dph table entries
; sub l ; subtract entries used
; ret z ; return if all entries used
; ld b,a ; save as loop counter
; ld a,l ; current dph to accum
; rlca ; *2 for word entry
; ld hl,@dtbl ; start of dtbl
; call addhla ; hl now points to entry
;
;dinit6a:
; xor a ; zero accum
; ld (hl),a ; zero lsb
; inc hl ; next byte
; ld (hl),a ; zero msb
; inc hl ; next byte
; djnz dinit6a
; ret ; finished
dinit7: ; process a unit (all slices)
ld e,0 ; initialize slice index

42
Source/CPM3/diskio.z80

@ -60,7 +60,7 @@ bell equ 7
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph0: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -68,7 +68,7 @@ dph0: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph1: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -76,7 +76,7 @@ dph1: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph2: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -84,7 +84,7 @@ dph2: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph3: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -92,7 +92,7 @@ dph3: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph4: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -100,7 +100,7 @@ dph4: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph5: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -108,7 +108,7 @@ dph5: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph6: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -116,7 +116,7 @@ dph6: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph7: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -124,7 +124,7 @@ dph7: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph8: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -132,7 +132,7 @@ dph8: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph9: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -140,7 +140,7 @@ dph9: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph10: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -148,7 +148,7 @@ dph10: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph11: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -156,7 +156,7 @@ dph11: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph12: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -164,7 +164,7 @@ dph12: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph13: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -172,7 +172,7 @@ dph13: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph14: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -180,7 +180,7 @@ dph14: dph 0,dpb$max ; Real DPB filled in at disk login
dw dsk$read
dw dsk$login
dw dsk$init
db 0,0 ; HBIOS Disk Unit/Slice (filled in at boot)
db 0FFh,0FFh ; HBIOS Disk Unit/Slice (filled in at boot)
dph15: dph 0,dpb$max ; Real DPB filled in at disk login
dw 0, 0 ; LBA Offset
@ -409,11 +409,11 @@ dsk$login:
dec hl ; point to disk unit
ld a,(hl) ; get unit
ld (unit),a ; save it
call media ; update DPH for media
; Need to do something on error, but bioskrnl provides
; no way for us to return an error.
;jr nz,???
ret
inc a ; 0FFh -> 000h
jp z,err_ret ; bail out on no disk mapped here
;call media ; update DPH for media
;ret
media:
; Set retry address

Loading…
Cancel
Save