From e82df4d29e93bc34b7e2d0987d277cfb55958ce6 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Wed, 5 Dec 2018 19:35:04 -0800 Subject: [PATCH] DeskTop disasm: ProDOS driver protocol --- desktop/ovl1b.s | 25 ++++++++++++---------- desktop/ovl1c.s | 56 ++++++++++++++++++++++++++++--------------------- desktop/ovl2.s | 21 ++++++++++--------- inc/prodos.inc | 16 ++++++++++++++ 4 files changed, 73 insertions(+), 45 deletions(-) diff --git a/desktop/ovl1b.s b/desktop/ovl1b.s index f5c21b0..1bba4a1 100644 --- a/desktop/ovl1b.s +++ b/desktop/ovl1b.s @@ -23,7 +23,7 @@ noop := $0C83 quit := $0C84 L0CAF := $0CAF eject_disk := $0CED -L0D26 := $0D26 +unit_number_to_driver_address := $0D26 L0D51 := $0D51 L0D5F := $0D5F L0DB5 := $0DB5 @@ -654,7 +654,7 @@ LD7F2: ldx dest_drive_index and #$0F beq LD817 lda drive_unitnum_table,x - jsr disk_copy_overlay4::L0D26 + jsr disk_copy_overlay4::unit_number_to_driver_address ldy #$FF lda ($06),y beq LD817 @@ -698,7 +698,7 @@ LD852: ldx dest_drive_index and #$0F beq LD87C lda drive_unitnum_table,x - jsr disk_copy_overlay4::L0D26 + jsr disk_copy_overlay4::unit_number_to_driver_address ldy #$FE lda ($06),y and #$08 @@ -1883,7 +1883,7 @@ LE3B8: pha beq LE3CC lda drive_unitnum_table,x and #$F0 - jsr disk_copy_overlay4::L0D26 + jsr disk_copy_overlay4::unit_number_to_driver_address jmp LE3DA LE3CC: pla @@ -1924,21 +1924,24 @@ LE402: stx LE448 sta LD407+1,x rts -LE415: ldy #$FF +LE415: ldy #$FF ; offset to low byte of driver address lda ($06),y sta $06 + lda #$00 - sta $42 - sta $44 - sta $45 - sta $46 - sta $47 + sta DRIVER_COMMAND + sta DRIVER_BUFFER + sta DRIVER_BUFFER+1 + sta DRIVER_BLOCK_NUMBER + sta DRIVER_BLOCK_NUMBER+1 + pla pha tax lda drive_unitnum_table,x and #$F0 - sta $43 + sta DRIVER_UNIT_NUMBER + jsr LE445 stx LE448 pla diff --git a/desktop/ovl1c.s b/desktop/ovl1c.s index a7d607d..8ba2862 100644 --- a/desktop/ovl1c.s +++ b/desktop/ovl1c.s @@ -676,41 +676,43 @@ params: .addr 0 ldx disk_copy_overlay3::dest_drive_index lda disk_copy_overlay3::drive_unitnum_table,x - sta L0CEC + sta unit_number and #$0F beq L0CCC lda disk_copy_overlay3::drive_unitnum_table,x - jsr L0D26 - ldy #$FF + jsr unit_number_to_driver_address + ldy #$FF ; offset to low byte of driver address lda ($06),y beq L0CCC cmp #$FF bne L0CD3 -L0CCC: lda L0CEC +L0CCC: lda unit_number jsr L0800 rts -L0CD3: lda L0CEC - jsr L0D26 - ldy #$FF +L0CD3: lda unit_number + jsr unit_number_to_driver_address + + ldy #$FF ; offset to low byte of driver address lda ($06),y sta $06 - lda #$03 - sta $42 - lda L0CEC - sta $43 + lda #DRIVER_COMMAND_FORMAT + sta DRIVER_COMMAND + lda unit_number + sta DRIVER_UNIT_NUMBER jmp ($06) rts -L0CEC: .byte 0 +unit_number: + .byte 0 ;;; ============================================================ ;;; Eject Disk via SmartPort .proc eject_disk sta L0D24 - jsr L0D26 ; Point $06 at $Cn00 + jsr unit_number_to_driver_address ; Point $06 at $Cn00 ldy #$07 ; Check firmware bytes lda ($06),y ; $Cn07 = $00 ?? @@ -756,16 +758,20 @@ L0D24: .byte 0 .endproc ;;; ============================================================ +;;; Get driver address for unit number +;;; Input: unit_number in A +;;; Output: $6/$7 points at driver address -L0D26: sta L0D50 - ldx #$11 - lda L0D50 - and #$80 - beq L0D34 - ldx #$21 -L0D34: stx @load_addr - lda L0D50 - and #$70 +.proc unit_number_to_driver_address + sta unit_number + ldx #$11 ; $BF11 is DEVADR+1 for S0D1 + lda unit_number + and #$80 ; high bit set? + beq :+ + ldx #$21 ; $BF21 is DEVADR+1 for S0D2 +: stx @load_addr + lda unit_number + and #$70 ; mask off slot lsr a lsr a lsr a @@ -775,12 +781,14 @@ L0D34: stx @load_addr @load_addr := *+1 lda MLI ; self-modified - sta $07 + sta $06+1 lda #$00 sta $06 rts -L0D50: .byte 0 +unit_number: + .byte 0 +.endproc ;;; ============================================================ diff --git a/desktop/ovl2.s b/desktop/ovl2.s index 3e1471a..0e39e41 100644 --- a/desktop/ovl2.s +++ b/desktop/ovl2.s @@ -1073,13 +1073,13 @@ L12A6: lda L12C0 jsr L0E00 rts -L12AD: ldy #$FF +L12AD: ldy #$FF ; offset to low byte of driver address lda ($06),y sta $06 - lda #$03 - sta $42 + lda #DRIVER_COMMAND_FORMAT + sta DRIVER_COMMAND lda L12C0 - sta $43 + sta DRIVER_UNIT_NUMBER jmp ($06) rts @@ -1176,17 +1176,18 @@ L134D: stx @lsb beq L1394 cmp #$FF beq L1394 - ldy #$FF + + ldy #$FF ; offset to low byte of driver address lda ($06),y sta $06 - lda #$00 - sta $42 + lda #DRIVER_COMMAND_STATUS + sta DRIVER_COMMAND lda L124A and #$F0 - sta $43 + sta DRIVER_UNIT_NUMBER lda #$00 - sta $46 - sta $47 + sta DRIVER_BLOCK_NUMBER + sta DRIVER_BLOCK_NUMBER+1 jsr L1391 bcc L1398 jmp L1483 diff --git a/inc/prodos.inc b/inc/prodos.inc index fa23793..d497bd4 100644 --- a/inc/prodos.inc +++ b/inc/prodos.inc @@ -199,6 +199,22 @@ NAME_LENGTH_MASK := $0F .endstruct .assert .sizeof(FileEntry) = $27, error, "incorrect struct size" +;;; ============================================================ +;;; ProDOS Driver Protocol +;;; ============================================================ + +;;; Addresses for command parameters +DRIVER_COMMAND := $42 +DRIVER_UNIT_NUMBER := $43 +DRIVER_BUFFER := $44 +DRIVER_BLOCK_NUMBER := $46 + +;;; Commands +DRIVER_COMMAND_STATUS := 0 +DRIVER_COMMAND_READ := 1 +DRIVER_COMMAND_WRITE := 2 +DRIVER_COMMAND_FORMAT := 3 + ;;; ============================================================ ;;; Macros