rom4x/rom4x/B1_E000_rom4x.s

217 lines
5.4 KiB
ArmAsm
Raw Normal View History

2017-03-19 03:00:43 +00:00
.psc02
.code
.include "iic.defs"
.org reset4x
2017-01-04 02:43:31 +00:00
stz power2 + rx_mslot ; action = normal boot
asl butn1 ; closed apple
bcs ckdiag
2017-03-19 03:00:43 +00:00
exitrst: jmp gorst4x ; return to RESET.X
2017-01-04 02:43:31 +00:00
; check to see if both apples are down
2017-03-19 03:00:43 +00:00
ckdiag: bit butn0 ; open apple
2017-01-04 02:43:31 +00:00
bmi exitrst ; return to RESET.X
; present menu because only closed apple is down
2017-03-19 03:00:43 +00:00
menu4x: jsr gobanner ; "Apple //c"
2017-01-04 02:43:31 +00:00
ldx #$00 ; menu start
jsr disp ; show it
jsr gtkey
cmp #$b0 ; "0"
bne ckkey1
ldx #$ff ; reset stack
txs
2017-01-21 19:45:53 +00:00
lda #>(monitor-1) ; monitor entry on stack
2017-01-04 02:43:31 +00:00
pha
lda #<(monitor-1)
pha
jmp swrts2 ; rts to enter monitor
2017-03-19 03:00:43 +00:00
ckkey1: cmp #$b2 ; "2"
2017-01-04 02:43:31 +00:00
beq doconf
cmp #$b4 ; "4"
bne ckkey2
2017-03-19 03:00:43 +00:00
doconf: jsr confirm
2017-01-04 02:43:31 +00:00
bne menu4x ; go back to menu4x
2017-03-19 03:00:43 +00:00
ckkey2: sec
2017-01-04 02:43:31 +00:00
sbc #$b0 ; ascii->number
bmi menu4x ; < 0 not valid
cmp #$08
bpl menu4x ; > 7 not valid
sta power2 + rx_mslot ; for boot4x
stz softev + 1 ; deinit coldstart
stz pwerdup ; ditto
bra exitrst
2017-03-19 03:00:43 +00:00
gtkey: lda #$60
2017-01-04 02:43:31 +00:00
sta ($0),y ; cursor
sta kbdstrb ; clr keyboard
2017-03-19 03:00:43 +00:00
kbdin: lda kbd ; get key
2017-01-04 02:43:31 +00:00
bpl kbdin
sta kbdstrb ; clear keyboard
sta ($0),y ; put it on screen
rts
; display message, input x = message start relative to msg1
2017-03-19 03:00:43 +00:00
disp: stz $0 ; load some safe defaults
lda #$04
2017-01-04 02:43:31 +00:00
sta $1
ldy #$0 ; needs to be zero
2017-03-19 03:00:43 +00:00
disp0: lda msg1,x ; get message byte
2017-01-04 02:43:31 +00:00
bne disp1 ; proceed if nonzero
rts ; exit if 0
2017-03-19 03:00:43 +00:00
disp1: inx ; next byte either way
2017-01-04 02:43:31 +00:00
cmp #$20 ; ' '
bcc disp2 ; start of ptr if < 20
eor #$80 ; invert high bit
sta ($0),y ; write to mem
inc $0 ; inc address low byte
bra disp0 ; back to the beginning
2017-03-19 03:00:43 +00:00
disp2: sta $1 ; write address high
2017-01-04 02:43:31 +00:00
lda msg1,x ; get it
sta $0 ; write address low
inx ; set next msg byte
bra disp0 ; back to the beginning
2017-03-19 03:00:43 +00:00
confirm: pha
2017-01-04 02:43:31 +00:00
ldx #(msg3-msg1) ; ask confirm
jsr disp
jsr gtkey
plx
ora #$20 ; to lower
cmp #$f9 ; "y"
php
txa
plp
rts
; msg format
; A byte < $20 indicates high byte of address.
; Next byte must be low byte of address. Anything
; else are characters to display and will have their
; upper bit inverted before being written to the screen.
2017-01-04 02:43:31 +00:00
msg1 = *
2017-03-19 03:00:43 +00:00
.byte $05,$06,"0 Monitor"
.byte $05,$86,"1 Reboot"
.byte $06,$06,"2 Zero RAM Card and Reboot"
.byte $06,$86,"3 Diagnostics"
.byte $07,$06,"4 RAM Card Diagnostics"
.byte $07,$86,"5 Boot SmartPort"
.byte $04,$2e,"6 Boot Int. 5.25"
.byte $04,$ae,"7 Boot Ext. 5.25"
.byte $07,$5f,"By M.G."
msg2: .byte $07,$db,"ROM 4X 01/01/17"
.byte $05,$ae,$00 ; cursor pos in menu
msg3: .byte $05,$b0,"SURE? ",$00
.res boot4x - *, 0
.org boot4x
2017-01-04 02:43:31 +00:00
jsr gobanner ; "Apple //c"
jsr rdrecov ; try to recover ramdisk
2017-01-04 02:43:31 +00:00
lda power2 + rx_mslot ; get action saved by reset4x
beq boot4 ; if zero, continue boot
ldx #(msg2-msg1) ; short banner offset
jsr disp ; display it
lda power2 + rx_mslot ; boot selection
2017-03-19 03:00:43 +00:00
btc2: cmp #$02 ; clear ramcard
2017-01-04 02:43:31 +00:00
bne btc3
jsr rdclear ; do clear
bra boot4
2017-03-19 03:00:43 +00:00
btc3: cmp #$03 ; Diags
2017-01-04 02:43:31 +00:00
bne btc4
jmp $c7c4
2017-03-19 03:00:43 +00:00
btc4: cmp #$04 ; RX diags
2017-01-04 02:43:31 +00:00
bne btc5
ldx #$ff
txs ; reset stack
2017-01-04 07:17:01 +00:00
jsr rdinit ; get x and y loaded
2017-01-04 02:43:31 +00:00
stx sl_devno ; diags need this
jsr testsize ; compute card size
lda #>(monitor-1) ; load "return" address
pha ; into stack so that we
lda #<(monitor-1) ; exit card test into
pha ; the monitor
lda numbanks,y ; get the card size in banks
bne dordiag ; do diag if memory present
jmp swrts2 ; otherwise jump to monitor
2017-03-19 03:00:43 +00:00
dordiag: jmp $db3a ; diags
2017-01-04 02:43:31 +00:00
;bra boot4
2017-03-19 03:00:43 +00:00
btc5: cmp #$05 ; boot smartport
2017-01-04 02:43:31 +00:00
beq boot5
2017-03-19 03:00:43 +00:00
btc6: cmp #$06 ; boot int drive
2017-01-04 02:43:31 +00:00
beq boot6
2017-03-19 03:00:43 +00:00
btc7: cmp #$07 ; boot ext drive
2017-01-04 02:43:31 +00:00
bne boot4 ; none of the above
; copy small routine to $800 to boot
2017-01-04 02:43:31 +00:00
; external 5.25
ldy #(bt4xend-bootext+1)
2017-03-19 03:00:43 +00:00
btc7lp: lda bootext,y
sta $800,y
2017-01-04 02:43:31 +00:00
dey
bpl btc7lp
lda #$08 ; copy done
bra bootsl
2017-03-19 03:00:43 +00:00
boot4: lda #rx_mslot ; boot slot 4
2017-01-04 02:43:31 +00:00
bra bootsl
2017-03-19 03:00:43 +00:00
boot5: lda #$c5 ; boot slot 5
2017-01-04 02:43:31 +00:00
bra bootsl
2017-03-19 03:00:43 +00:00
boot6: lda #$c6 ; boot slot 6
bootsl: ldx #$00 ; low byte of slot
bootadr: stx $0 ; store address
2017-01-04 02:43:31 +00:00
sta $1 ; return to bank 0 does jmp (0)
2017-03-19 03:00:43 +00:00
endbt4x: jmp gobt4x ; continue boot
rdrecov: jsr rdinit ; init ramcard
2017-01-04 02:43:31 +00:00
lda pwrup,y ; get power up flag
cmp #pwrbyte ; already initialized?
beq recovdn ; exit if initialized
jsr testsize ; does not wreck x or y
2017-01-04 02:43:31 +00:00
lda numbanks,y ; get discovered # banks
beq recovdn ; no mem
stz addrl,x ; set slinky address 0
2017-01-04 02:43:31 +00:00
stz addrm,x
stz addrh,x
lda data,x ; start check for bootable ramdisk
2017-01-04 02:43:31 +00:00
cmp #$01
bne recovdn ; not bootable
lda data,x ; next byte should be nonzero and not $ff
beq recovdn ; not bootable
cmp #$ff
beq recovdn ; not bootable
lda #pwrbyte
2017-01-04 02:43:31 +00:00
sta pwrup,y ; set power byte
2017-03-19 03:00:43 +00:00
lda #'R' ; tell user
2017-01-04 02:43:31 +00:00
sta $7d0 ; on screen
2017-03-19 03:00:43 +00:00
recovdn: rts
2017-01-04 02:43:31 +00:00
; zero ram card space
2017-03-19 03:00:43 +00:00
rdclear: jsr rdinit ; init ramcard
2017-01-04 02:43:31 +00:00
jsr testsize ; get size
2017-01-22 00:52:20 +00:00
lda numbanks,y ; # of 64Ks to write
beq clrdone ; no memory
2017-01-04 02:43:31 +00:00
lda #$c0 ; 'A' - 1
sta $400 ; upper left corner
2017-01-22 00:52:20 +00:00
stz addrl,x ; slinky address 0
stz addrm,x
stz addrh,x
2017-03-19 03:00:43 +00:00
clbnklp: inc $400 ; poor mans progress meter
2017-01-04 02:43:31 +00:00
ldy #$00
2017-03-19 03:00:43 +00:00
cl64klp: ldx #$00 ; loop for all pages in bank
cl256lp: txa ; loop for all bytes in page
2017-01-22 00:52:20 +00:00
ldx #rx_devno
stz data,x ; write a zero to card
tax
2017-01-04 02:43:31 +00:00
dex
2017-01-22 00:52:20 +00:00
bne cl256lp ; 256 byte loop
2017-01-04 02:43:31 +00:00
dey
2017-01-22 00:52:20 +00:00
bne cl64klp ; 64K loop
ldx #rx_mslot
dec numbanks,x
bne clbnklp ; if more banks
2017-03-19 03:00:43 +00:00
clrdone: ldx #rx_mslot
2017-01-22 00:52:20 +00:00
stz pwrup,x ; zero powerup byte
2017-01-04 02:43:31 +00:00
lda #$a0 ; ' '
sta $400 ; clear progress
rts
2017-03-19 03:00:43 +00:00
rdinit: bit rx_mslot*$100 ; activate registers
ldy #rx_mslot ; slot offset
ldx #rx_devno ; register offset
rts
2017-01-04 02:43:31 +00:00
; next is snippet of code to boot external 5.25
2017-03-19 03:00:43 +00:00
bootext: lda #$e0
2017-01-04 02:43:31 +00:00
ldy #$01
ldx #$60
jmp $c60b
bt4xend = *