DeskTop disasm: ProDOS driver protocol

This commit is contained in:
Joshua Bell 2018-12-05 19:35:04 -08:00
parent 721c6ce90a
commit e82df4d29e
4 changed files with 73 additions and 45 deletions

View File

@ -23,7 +23,7 @@ noop := $0C83
quit := $0C84 quit := $0C84
L0CAF := $0CAF L0CAF := $0CAF
eject_disk := $0CED eject_disk := $0CED
L0D26 := $0D26 unit_number_to_driver_address := $0D26
L0D51 := $0D51 L0D51 := $0D51
L0D5F := $0D5F L0D5F := $0D5F
L0DB5 := $0DB5 L0DB5 := $0DB5
@ -654,7 +654,7 @@ LD7F2: ldx dest_drive_index
and #$0F and #$0F
beq LD817 beq LD817
lda drive_unitnum_table,x lda drive_unitnum_table,x
jsr disk_copy_overlay4::L0D26 jsr disk_copy_overlay4::unit_number_to_driver_address
ldy #$FF ldy #$FF
lda ($06),y lda ($06),y
beq LD817 beq LD817
@ -698,7 +698,7 @@ LD852: ldx dest_drive_index
and #$0F and #$0F
beq LD87C beq LD87C
lda drive_unitnum_table,x lda drive_unitnum_table,x
jsr disk_copy_overlay4::L0D26 jsr disk_copy_overlay4::unit_number_to_driver_address
ldy #$FE ldy #$FE
lda ($06),y lda ($06),y
and #$08 and #$08
@ -1883,7 +1883,7 @@ LE3B8: pha
beq LE3CC beq LE3CC
lda drive_unitnum_table,x lda drive_unitnum_table,x
and #$F0 and #$F0
jsr disk_copy_overlay4::L0D26 jsr disk_copy_overlay4::unit_number_to_driver_address
jmp LE3DA jmp LE3DA
LE3CC: pla LE3CC: pla
@ -1924,21 +1924,24 @@ LE402: stx LE448
sta LD407+1,x sta LD407+1,x
rts rts
LE415: ldy #$FF LE415: ldy #$FF ; offset to low byte of driver address
lda ($06),y lda ($06),y
sta $06 sta $06
lda #$00 lda #$00
sta $42 sta DRIVER_COMMAND
sta $44 sta DRIVER_BUFFER
sta $45 sta DRIVER_BUFFER+1
sta $46 sta DRIVER_BLOCK_NUMBER
sta $47 sta DRIVER_BLOCK_NUMBER+1
pla pla
pha pha
tax tax
lda drive_unitnum_table,x lda drive_unitnum_table,x
and #$F0 and #$F0
sta $43 sta DRIVER_UNIT_NUMBER
jsr LE445 jsr LE445
stx LE448 stx LE448
pla pla

View File

@ -676,41 +676,43 @@ params: .addr 0
ldx disk_copy_overlay3::dest_drive_index ldx disk_copy_overlay3::dest_drive_index
lda disk_copy_overlay3::drive_unitnum_table,x lda disk_copy_overlay3::drive_unitnum_table,x
sta L0CEC sta unit_number
and #$0F and #$0F
beq L0CCC beq L0CCC
lda disk_copy_overlay3::drive_unitnum_table,x lda disk_copy_overlay3::drive_unitnum_table,x
jsr L0D26 jsr unit_number_to_driver_address
ldy #$FF ldy #$FF ; offset to low byte of driver address
lda ($06),y lda ($06),y
beq L0CCC beq L0CCC
cmp #$FF cmp #$FF
bne L0CD3 bne L0CD3
L0CCC: lda L0CEC L0CCC: lda unit_number
jsr L0800 jsr L0800
rts rts
L0CD3: lda L0CEC L0CD3: lda unit_number
jsr L0D26 jsr unit_number_to_driver_address
ldy #$FF
ldy #$FF ; offset to low byte of driver address
lda ($06),y lda ($06),y
sta $06 sta $06
lda #$03 lda #DRIVER_COMMAND_FORMAT
sta $42 sta DRIVER_COMMAND
lda L0CEC lda unit_number
sta $43 sta DRIVER_UNIT_NUMBER
jmp ($06) jmp ($06)
rts rts
L0CEC: .byte 0 unit_number:
.byte 0
;;; ============================================================ ;;; ============================================================
;;; Eject Disk via SmartPort ;;; Eject Disk via SmartPort
.proc eject_disk .proc eject_disk
sta L0D24 sta L0D24
jsr L0D26 ; Point $06 at $Cn00 jsr unit_number_to_driver_address ; Point $06 at $Cn00
ldy #$07 ; Check firmware bytes ldy #$07 ; Check firmware bytes
lda ($06),y ; $Cn07 = $00 ?? lda ($06),y ; $Cn07 = $00 ??
@ -756,16 +758,20 @@ L0D24: .byte 0
.endproc .endproc
;;; ============================================================ ;;; ============================================================
;;; Get driver address for unit number
;;; Input: unit_number in A
;;; Output: $6/$7 points at driver address
L0D26: sta L0D50 .proc unit_number_to_driver_address
ldx #$11 sta unit_number
lda L0D50 ldx #$11 ; $BF11 is DEVADR+1 for S0D1
and #$80 lda unit_number
beq L0D34 and #$80 ; high bit set?
ldx #$21 beq :+
L0D34: stx @load_addr ldx #$21 ; $BF21 is DEVADR+1 for S0D2
lda L0D50 : stx @load_addr
and #$70 lda unit_number
and #$70 ; mask off slot
lsr a lsr a
lsr a lsr a
lsr a lsr a
@ -775,12 +781,14 @@ L0D34: stx @load_addr
@load_addr := *+1 @load_addr := *+1
lda MLI ; self-modified lda MLI ; self-modified
sta $07 sta $06+1
lda #$00 lda #$00
sta $06 sta $06
rts rts
L0D50: .byte 0 unit_number:
.byte 0
.endproc
;;; ============================================================ ;;; ============================================================

View File

@ -1073,13 +1073,13 @@ L12A6: lda L12C0
jsr L0E00 jsr L0E00
rts rts
L12AD: ldy #$FF L12AD: ldy #$FF ; offset to low byte of driver address
lda ($06),y lda ($06),y
sta $06 sta $06
lda #$03 lda #DRIVER_COMMAND_FORMAT
sta $42 sta DRIVER_COMMAND
lda L12C0 lda L12C0
sta $43 sta DRIVER_UNIT_NUMBER
jmp ($06) jmp ($06)
rts rts
@ -1176,17 +1176,18 @@ L134D: stx @lsb
beq L1394 beq L1394
cmp #$FF cmp #$FF
beq L1394 beq L1394
ldy #$FF
ldy #$FF ; offset to low byte of driver address
lda ($06),y lda ($06),y
sta $06 sta $06
lda #$00 lda #DRIVER_COMMAND_STATUS
sta $42 sta DRIVER_COMMAND
lda L124A lda L124A
and #$F0 and #$F0
sta $43 sta DRIVER_UNIT_NUMBER
lda #$00 lda #$00
sta $46 sta DRIVER_BLOCK_NUMBER
sta $47 sta DRIVER_BLOCK_NUMBER+1
jsr L1391 jsr L1391
bcc L1398 bcc L1398
jmp L1483 jmp L1483

View File

@ -199,6 +199,22 @@ NAME_LENGTH_MASK := $0F
.endstruct .endstruct
.assert .sizeof(FileEntry) = $27, error, "incorrect struct size" .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 ;;; Macros