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
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

View File

@ -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
;;; ============================================================

View File

@ -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

View File

@ -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