mirror of
https://github.com/mi57730/a2d.git
synced 2025-04-14 14:37:02 +00:00
DeskTop disasm: ProDOS driver protocol
This commit is contained in:
parent
721c6ce90a
commit
e82df4d29e
@ -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
|
||||
|
@ -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
|
||||
|
||||
;;; ============================================================
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user