From df195ee75c0061bf41a0c67e5491e8960bb57b7e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 10 May 2020 11:52:44 -0700 Subject: [PATCH] ZPM3 Drive Map Fix - Workaround to make ZPM3 consider all drives (A-P) valid so that subsequent drive ASSIGNments work properly. --- Source/CBIOS/cbios.asm | 15 +++++++++++---- Source/CPM3/boot.z80 | 37 +++++++++++++++++++------------------ Source/CPM3/diskio.z80 | 42 +++++++++++++++++++++--------------------- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 4482cf6e..acaaa3df 100644 --- a/Source/CBIOS/cbios.asm +++ b/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 ; diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index e84adb31..b9f58bc7 100644 --- a/Source/CPM3/boot.z80 +++ b/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 diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 3e52d60a..ec3ff124 100644 --- a/Source/CPM3/diskio.z80 +++ b/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