mirror of https://github.com/mgcaret/romex.git
132 lines
3.9 KiB
ArmAsm
132 lines
3.9 KiB
ArmAsm
.pc02
|
|
|
|
.if no_tape
|
|
checkblk = $d8b1
|
|
checkatalk = $d8b3
|
|
getslotbyte = $d8b5
|
|
checkatalk2 = $d8b7 ; not used here
|
|
atwait = $d8b9
|
|
.else
|
|
; above must be defined by including file
|
|
.endif
|
|
|
|
.proc pressoa
|
|
ldx #msg7-msg0 ; Press open apple
|
|
jmp Disp
|
|
.endproc
|
|
.proc resete0x
|
|
.if ::no_tape
|
|
; if we are over tape code, we still have diags so allow access
|
|
bit butn0 ; open apple also pressed?
|
|
bpl :+ ; nope, just ca/option
|
|
jmp $c600 ; do diags
|
|
.endif
|
|
: jsr title
|
|
ldx #msg0-msg0 ; basic parts of menu
|
|
jsr Disp
|
|
; display slots now
|
|
stz $00 ; zero low byte of slot ptr
|
|
ldx #$07
|
|
: phx
|
|
jsr dslot
|
|
dec cv
|
|
jsr vtab ; wrecks y
|
|
lda #menucol
|
|
sta ch
|
|
plx
|
|
dex
|
|
bne :-
|
|
jsr rdkey
|
|
cmp #$b0 ; is 0 or less?
|
|
bcc :-- ; less than, re-draw
|
|
bne :+ ; not zero, skip
|
|
jmp monitor ; do not pass go, do not collect $200
|
|
: cmp #$b8 ; 8 or higher
|
|
bcs :--- ; yep, re-draw
|
|
sta $02 ; put in $02
|
|
eor #pwrbyte ; make check byte
|
|
sta $03 ; put in $03
|
|
lda #$80 ; flag to open-apple+reset
|
|
jmp $c2c6 ; back to resetx
|
|
.endproc
|
|
; entered with slot # in x, and scanslots having been called
|
|
.proc dslot
|
|
txa
|
|
jsr prhex
|
|
lda #$a0 ; space
|
|
jsr cout
|
|
txa
|
|
ora #$c0 ; to ref
|
|
sta $01 ; high nibble of ptr
|
|
jsr checkatalk
|
|
bcc :+ ; skip if not
|
|
ldx #msg2-msg0
|
|
jsr Disp ; print it
|
|
: jsr checkblk ; is block device
|
|
bcs block
|
|
ldy #$0b ; check for Pascal 1.1 FW protocol
|
|
jsr getslotbyte ; get byte (cxrom is on!)
|
|
dec a
|
|
beq pascal
|
|
exit: rts
|
|
pascal: ldx #msg5-msg0
|
|
jsr Disp
|
|
ldy #$0c ; Pascal card ID
|
|
jsr getslotbyte
|
|
jmp prbyte
|
|
block: beq smart
|
|
ldy #$ff ; last byte of firmware
|
|
jsr getslotbyte
|
|
beq disk ; $00 = 16-sector
|
|
inc a ; is $FF?
|
|
beq disk ; yes 13-sector
|
|
ldx #msg3-msg0 ; generic block device
|
|
.byte $2c ; BIT Absolute opcode
|
|
disk: ldx #msg4-msg0
|
|
.byte $2c
|
|
smart: ldx #msg6-msg0
|
|
; fall-through
|
|
.endproc
|
|
.proc Disp
|
|
lda msg0,x
|
|
bne :+
|
|
rts
|
|
: inx ; set up for next message byte
|
|
cmp #$18 ; last line + 1
|
|
bcc repos
|
|
eor #$80
|
|
jsr cout ; not supposed to change any regs
|
|
bra Disp
|
|
repos: jsr tabv ; destroys a and y, but not x
|
|
lda msg0,x ; get horizontal
|
|
sta ch ; and write
|
|
inx ; next message byte
|
|
bra Disp
|
|
.endproc
|
|
.if no_tape
|
|
msg0: .byte 3,menucol,"0 Mon"
|
|
.else
|
|
msg0: .byte 3,menucol,"0 Monitor"
|
|
.endif
|
|
.byte 5,menucol,"Slots:"
|
|
.byte 22,16,"By M.G."
|
|
msg1: .byte 23,13,"ROM eX 02-19B",13,menucol,$00
|
|
.if no_tape
|
|
msg2: .byte "AT ",$00
|
|
.else
|
|
msg2: .byte "AppleTalk ",$00
|
|
.endif
|
|
msg3: .byte "Block",$00
|
|
msg4: .byte "Disk II",$00
|
|
.if no_tape
|
|
msg5: .byte "Pas $",$00
|
|
.else
|
|
msg5: .byte "Pascal $",$00
|
|
.endif
|
|
.if no_tape
|
|
msg6: .byte "Smart",$00
|
|
.else
|
|
msg6: .byte "SmartPort",$00
|
|
.endif
|
|
msg7: .byte 3,15,"Press ",$C1,"+",$CD,$00
|