mii_emu/test/asm/mii_smartport_driver.asm
Michel Pollet f7a56ebc01 Initial Commit
Cleaned up for release at last!

Signed-off-by: Michel Pollet <buserror@gmail.com>
2023-10-25 08:50:14 +01:00

101 lines
2.8 KiB
NASM

; Smartport Firmware for MII
; This is included in the MII ROM by mii_smartport.c
;
; This is shamelessly lifted and heavily adapted from
; https:github.com/ct6502/apple2ts/blob/main/src/emulator/harddrivedata.ts
; With inspiration from Terence Boldt's driver for the ROM card
;
; ProDOS defines
command = $42 ; ProDOS command
unit = $43 ; 7=drive 6-4=slot 3-0=not used
buflo = $44 ; low address of buffer
bufhi = $45 ; hi address of buffer
blklo = $46 ; low block
blkhi = $47 ; hi block
ioerr = $27 ; I/O error code
nodev = $28 ; no device connected
wperr = $2B ; write protect error
knownRts = $FF58
.org $c000
.verbose
entryOffset = $c0 ; entry point offset
ldx #$20 ; Apple IIe looks for magic bytes $20, $00, $03.
lda #$00 ; These indicate a disk drive or SmartPort device.
ldx #$03
lda #$00 ; $3C=disk drive, $00=SmartPort
start:
bit $CFFF ; Trigger all peripheral cards to turn off expansion ROMs
ldy #$0
sty buflo
sty blklo
sty blkhi
iny ;set command = 1 for read block
sty command
lda #$4C ; jmp
sta $07FD
lda #entryOffset ; jump address
sta $07FE
jsr knownRts
tsx
lda $100,X ; High byte of slot adddress
sta $07FF ; Store this for the high byte of our jmp command
asl ; Shift $Cs up to $s0 (e.g. $C7 -> $70)
asl ; We need this for the ProDOS unit number (below).
asl ; Format = bits DSSS0000
asl ; D = drive number (0), SSS = slot number (1-7)
sta unit ; Store ProDOS unit number here
lda #$08 ; Store block (512 bytes) at address $0800
sta bufhi ; Address high byte
stz buflo ; Address low byte
stz blklo ; Block 0 low byte
stz blkhi ; Block 0 high byte
jsr $07FD ; Read the block (will jmp to our driver and trigger it)
bcs error
lda #$0A ; Store block (512 bytes) at address $0A00
sta bufhi ; Address high byte
lda #$01
sta blklo ; Block 1 low byte
jsr $07FD ; Read
bcs error
lda $0801 ; Should be nonzero
beq error
lda #$01 ; Should always be 1
cmp $0800
bne error
ldx unit ; ProDOS block 0 code wants ProDOS unit number in X
jmp $801 ; Continue reading the disk
error jmp $E000 ; Out to BASIC on error
.org $c0c0
; jump back to mii code
entryHD nop ; Hard drive driver address
bra magicHD
bra magicSM
.org $c0d0
magicHD .db $db, $fb, $0
bra done
.org $c0e0
magicSM .db $db, $fb, $0
bra done
.org $c0f0
DONE bcs ERR
lda #$00
rts
ERR lda #$27
rts
; $CnFE status byte
; bit 7 - Medium is removable.
; bit 6 - Device is interruptable.
; bit 5-4 - Number of volumes on the device (0-3).
; bit 3 - The device supports formatting.
; bit 2 - The device can be written to.
; bit 1 - The device can be read from (must be on).
; bit 0 - The device's status can be read (must be on).
.org $c0fe
.db $17
.db entryOffset ; entry point offset