Reformat boot5x, fix #2, and shorten code all at the same time

This commit is contained in:
mgcaret 2017-04-08 19:20:36 -07:00
parent 740044802d
commit 34ff8a48bf
1 changed files with 106 additions and 102 deletions

View File

@ -1,106 +1,110 @@
.code .code
.psc02 .psc02
.include "iic+.defs" .include "iic+.defs"
.org boot5x ; 234 bytes available, code assembles to 222 .org boot5x ; 234 bytes available, code assembles to 222
jsr titl5x ; "Apple IIc +" jsr titl5x ; "Apple IIc +"
jsr rdrecov ; try to recover ramdisk jsr rdrecov ; try to recover ramdisk
lda power2 + rx_mslot ; get action saved by reset5x lda power2 + rx_mslot ; get action saved by reset5x
beq boot4 ; if zero, continue boot beq boot4 ; if zero, continue boot
jsr bann5x ; display ROM 5X footer jsr bann5x ; display ROM 5X footer
lda power2 + rx_mslot ; boot selection lda power2 + rx_mslot ; boot selection
btc2: cmp #$02 ; clear ramcard btc2: cmp #$02 ; clear ramcard
bne btc3 bne btc3
jsr rdclear ; do clear jsr rdclear ; do clear
bra boot4 bra boot4
btc3: cmp #$03 ; Diags btc3: cmp #$03 ; Diags
bne btc4 bne btc4
jmp $c7c4 jmp $c7c4
btc4: cmp #$04 ; RX diags btc4: cmp #$04 ; RX diags
bne btc5 bne btc5
ldx #$ff ldx #$ff
txs ; reset stack txs ; reset stack
jsr rdinit ; get x and y loaded jsr rdinit ; get x and y loaded
stx sl_devno ; diags need this stx sl_devno ; diags need this
jsr testsize ; compute card size jsr testsize ; compute card size
lda #>(monitor-1) ; load "return" address lda #>(monitor-1) ; load "return" address
pha ; into stack so that we pha ; into stack so that we
lda #<(monitor-1) ; exit card test into lda #<(monitor-1) ; exit card test into
pha ; the monitor pha ; the monitor
lda numbanks,y ; get the card size in banks lda numbanks,y ; get the card size in banks
bne dordiag ; do diag if memory present bne dordiag ; do diag if memory present
jmp swrts2 ; otherwise jump to monitor jmp swrts2 ; otherwise jump to monitor
dordiag: jmp $db3a ; diags dordiag: jmp $db3a ; diags
btc5: cmp #$05 ; boot smartport btc5: cmp #$05 ; boot smartport
beq boot5 beq bootcx
; fall through if none of the above cmp #$06 ; boot 5.25
boot4: lda #rx_mslot ; boot slot 4 beq bootcx
bra bootsl ; fall through to default boot if none of the above
boot5: lda #$c5 ; boot slot 5 boot4: lda #rx_mslot ; boot slot 4 (should be, anyway)
bra bootsl bootcx: ora #$c0 ; convert to slot addr high byte if needed
boot6: lda #$c6 ; boot slot 6 ldx #$00 ; low byte of slot
bootsl: ldx #$00 ; low byte of slot bootadr: stx $0 ; store address
bootadr: stx $0 ; store address sta $1 ; return to bank 0 does jmp (0)
sta $1 ; return to bank 0 does jmp (0) endbt4x: lda #>(bt5xrtn-1)
endbt4x: lda #>(bt5xrtn-1) pha
pha lda #<(bt5xrtn-1)
lda #<(bt5xrtn-1) pha
pha lda $1
lda $1 jmp swrts2
jmp swrts2 ; try to recover RAM disk
rdrecov: jsr rdinit ; init ramcard .proc rdrecov
lda pwrup,y ; get power up flag jsr rdinit ; init ramcard
cmp #pwrbyte ; already initialized? lda pwrup,y ; get power up flag
beq recovdn ; exit if initialized cmp #pwrbyte ; already initialized?
jsr testsize ; does not wreck x or y beq :+ ; exit if initialized
lda numbanks,y ; get discovered # banks jsr testsize ; does not wreck x or y
beq recovdn ; no mem lda numbanks,y ; get discovered # banks
stz addrl,x ; set slinky address 0 beq :+ ; no mem
stz addrm,x stz addrl,x ; set slinky address 0
stz addrh,x stz addrm,x
lda data,x ; start check for bootable ramdisk stz addrh,x
cmp #$01 lda data,x ; start check for bootable ramdisk
bne recovdn ; not bootable cmp #$01
lda data,x ; next byte should be nonzero and not $ff bne :+ ; not bootable
beq recovdn ; not bootable lda data,x ; next byte should be nonzero and not $ff
cmp #$ff beq :+ ; not bootable
beq recovdn ; not bootable cmp #$ff
lda #pwrbyte beq :+ ; not bootable
sta pwrup,y ; set power byte lda #pwrbyte
lda #'R' ; tell user sta pwrup,y ; set power byte
sta $7d0 ; on screen lda #'R' ; tell user
recovdn: rts sta $7d0 ; on screen
: rts
.endproc
; zero ram card space ; zero ram card space
rdclear: jsr rdinit ; init ramcard .proc rdclear
jsr testsize ; get size jsr rdinit ; init ramcard
lda numbanks,y ; # of 64Ks to write jsr testsize ; get size
beq clrdone ; no memory lda numbanks,y ; # of 64Ks to write
lda #$c0 ; 'A' - 1 beq clrdone ; no memory
sta $400 ; upper left corner lda #$c0 ; 'A' - 1
stz addrl,x ; slinky address 0 sta $400 ; upper left corner
stz addrm,x stz addrl,x ; slinky address 0
stz addrh,x stz addrm,x
clbnklp: inc $400 ; poor mans progress meter stz addrh,x
ldy #$00 clbnklp: inc $400 ; poor mans progress meter
cl64klp: ldx #$00 ; loop for all pages in bank ldy #$00
cl256lp: txa ; loop for all bytes in page cl64klp: ldx #$00 ; loop for all pages in bank
ldx #rx_devno cl256lp: txa ; loop for all bytes in page
stz data,x ; write a zero to card ldx #rx_devno
tax stz data,x ; write a zero to card
dex tax
bne cl256lp ; 256 byte loop dex
dey bne cl256lp ; 256 byte loop
bne cl64klp ; 64K loop dey
ldx #rx_mslot bne cl64klp ; 64K loop
dec numbanks,x ldx #rx_mslot
bne clbnklp ; if more banks dec numbanks,x
clrdone: ldx #rx_mslot bne clbnklp ; if more banks
stz pwrup,x ; zero powerup byte clrdone: ldx #rx_mslot
lda #$a0 ; ' ' stz pwrup,x ; zero powerup byte
sta $400 ; clear progress lda #$a0 ; ' '
rts sta $400 ; clear progress
rdinit: bit rx_mslot*$100 ; activate registers rts
ldy #rx_mslot ; slot offset .endproc
ldx #rx_devno ; register offset .proc rdinit
rts bit rx_mslot*$100 ; activate registers
ldy #rx_mslot ; slot offset
ldx #rx_devno ; register offset
rts
.endproc