mirror of
https://github.com/mgcaret/rom4x.git
synced 2024-12-22 18:30:25 +00:00
reorganize dispatching to work like 5X
This commit is contained in:
parent
ee1faf6cc7
commit
264bf5ce0d
@ -10,9 +10,5 @@
|
|||||||
.byte 0 ; rom4x present
|
.byte 0 ; rom4x present
|
||||||
cbtfail: jsr setvid
|
cbtfail: jsr setvid
|
||||||
jsr setkbd
|
jsr setkbd
|
||||||
lda #>(nbtfail-1)
|
lda #$01 ; cmd = boot fail1
|
||||||
pha
|
jmp $c7fc ; to dispatcher
|
||||||
lda #<(nbtfail-1)
|
|
||||||
pha
|
|
||||||
jmp swrts2
|
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
.code
|
|
||||||
.include "iic.defs"
|
|
||||||
.org gorst4x
|
|
||||||
sta rombank ; gorst4x
|
|
||||||
jmp rst4xrtn ; in other bank jmp reset4x
|
|
||||||
sta rombank ; gobt4x
|
|
||||||
jmp bt4xrtn ; in other bank jmp boot4x
|
|
||||||
sta rombank ; gobanner
|
|
||||||
jsr banner ; in other bank jmp $c784 for now
|
|
||||||
sta rombank ; return to other bank
|
|
||||||
rts ; should never get here
|
|
||||||
|
|
10
rom4x/B0_C7FC_4x_switch.s
Normal file
10
rom4x/B0_C7FC_4x_switch.s
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
; There's a bit of luck in the firmware
|
||||||
|
; there are 4 $00 bytes at $C7FC in the main bank, of which the last
|
||||||
|
; is "AppleTalk version" according to the ROM $03 source code
|
||||||
|
; in the tech ref, and should be left at $00.
|
||||||
|
; There are also 7 $00 bytes at $C7FC in the aux bank. So if we switch at
|
||||||
|
; $C7FC, then we get a 4 bytes in the aux bank, just enough for a jump.
|
||||||
|
.code
|
||||||
|
.org $c7fc
|
||||||
|
sta $c028
|
||||||
|
|
15
rom4x/B0_CFF9_switch_cmd.s
Normal file
15
rom4x/B0_CFF9_switch_cmd.s
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
; This is the dispatch routine to call the primary ROM 4X
|
||||||
|
; functions of intercepting RESET and the boot process.
|
||||||
|
; If one enters at $CFF9, the command $A9 is loaded and
|
||||||
|
; we go to the BELL1 hijack. If entering at $CFFA, we
|
||||||
|
; load the command $EA and proceed the same way.
|
||||||
|
; thus we get two dispatch codes in 6 bytes.
|
||||||
|
|
||||||
|
.include "iic.defs"
|
||||||
|
.code
|
||||||
|
.org $cff9 ; 7 bytes available here, but don't count on $CFFF
|
||||||
|
lda #$a9 ; lda opcode
|
||||||
|
nop ; jmp/jsr $cffa does lda #$ea
|
||||||
|
jmp $c7fc ; jump to 4X dispatcher
|
||||||
|
; total 6 bytes.
|
||||||
|
|
@ -1,6 +1,7 @@
|
|||||||
; patch PWRUP to call boot4x
|
; patch PWRUP to call boot4x
|
||||||
.code
|
|
||||||
.include "iic.defs"
|
.include "iic.defs"
|
||||||
|
.code
|
||||||
.org $fab4
|
.org $fab4
|
||||||
nop
|
nop
|
||||||
jmp gobt4x
|
jmp gobt4x
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; patch RESET.X to call reset4x
|
; patch RESET.X to call reset4x
|
||||||
.code
|
|
||||||
.include "iic.defs"
|
.include "iic.defs"
|
||||||
|
.code
|
||||||
.org $fac8
|
.org $fac8
|
||||||
jmp gorst4x
|
jmp gorst4x
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
.code
|
|
||||||
.include "iic.defs"
|
|
||||||
.org gorst4x
|
|
||||||
sta rombank ; gorst4x
|
|
||||||
jmp reset4x ; in other bank jmp rstxrtn
|
|
||||||
sta rombank ; gobt4x
|
|
||||||
jmp boot4x
|
|
||||||
sta rombank ; gobanner
|
|
||||||
jmp $c784 ; in other bank jsr appleii
|
|
||||||
sta rombank
|
|
||||||
rts ; not in other bank
|
|
||||||
|
|
||||||
|
|
6
rom4x/B1_C7FF_4x_jump.s
Normal file
6
rom4x/B1_C7FF_4x_jump.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
; See B0 C7FC patch for description
|
||||||
|
.include "iic.defs"
|
||||||
|
.code
|
||||||
|
.org $c7ff
|
||||||
|
jmp rom4x_disp
|
||||||
|
|
@ -1,16 +1,47 @@
|
|||||||
.psc02
|
.psc02
|
||||||
.code
|
.code
|
||||||
.include "iic.defs"
|
.include "iic.defs"
|
||||||
.org reset4x
|
.org rom4x_disp
|
||||||
|
.proc dispatch
|
||||||
|
cmp #$a9 ; reset patch
|
||||||
|
bne :+
|
||||||
|
bra reset4x
|
||||||
|
: cmp #$ea ; boot patch
|
||||||
|
bne :+
|
||||||
|
jmp boot4x
|
||||||
|
: dec a ; $01 = new boot fail routine
|
||||||
|
bne :+
|
||||||
|
jmp nbtfail
|
||||||
|
; TODO: Dispatch XModem stuff here
|
||||||
|
: lda #>(monitor-1)
|
||||||
|
pha
|
||||||
|
lda #<(monitor-1)
|
||||||
|
pha
|
||||||
|
jmp swrts2 ; jump to monitor
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
; next is snippet of code to boot external 5.25
|
||||||
|
.proc bootext
|
||||||
|
lda #$e0
|
||||||
|
ldy #$01 ; unit #
|
||||||
|
ldx #$60 ; slot #
|
||||||
|
jmp $c60b ; jump into Disk II code
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
.proc reset4x
|
||||||
stz power2 + rx_mslot ; action = normal boot
|
stz power2 + rx_mslot ; action = normal boot
|
||||||
asl butn1 ; closed apple
|
asl butn1 ; closed apple
|
||||||
bcs ckdiag
|
bcs ckdiag
|
||||||
exitrst: jmp gorst4x ; return to RESET.X
|
exitrst: lda #>(rst4xrtn-1)
|
||||||
|
pha
|
||||||
|
lda #<(rst4xrtn-1)
|
||||||
|
pha
|
||||||
|
jmp swrts2
|
||||||
; check to see if both apples are down
|
; check to see if both apples are down
|
||||||
ckdiag: bit butn0 ; open apple
|
ckdiag: bit butn0 ; open apple
|
||||||
bmi exitrst ; return to RESET.X
|
bmi exitrst ; return to RESET.X
|
||||||
; present menu because only closed apple is down
|
; present menu because only closed apple is down
|
||||||
menu4x: jsr gobanner ; "Apple //c"
|
menu4x: jsr ntitle ; "Apple //c"
|
||||||
ldx #$00 ; menu start
|
ldx #$00 ; menu start
|
||||||
jsr disp ; show it
|
jsr disp ; show it
|
||||||
jsr gtkey
|
jsr gtkey
|
||||||
@ -38,6 +69,9 @@ ckkey2: sec
|
|||||||
stz softev + 1 ; deinit coldstart
|
stz softev + 1 ; deinit coldstart
|
||||||
stz pwerdup ; ditto
|
stz pwerdup ; ditto
|
||||||
bra exitrst
|
bra exitrst
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
.proc gtkey
|
||||||
gtkey: lda #$60
|
gtkey: lda #$60
|
||||||
sta ($0),y ; cursor
|
sta ($0),y ; cursor
|
||||||
sta kbdstrb ; clr keyboard
|
sta kbdstrb ; clr keyboard
|
||||||
@ -46,7 +80,10 @@ kbdin: lda kbd ; get key
|
|||||||
sta kbdstrb ; clear keyboard
|
sta kbdstrb ; clear keyboard
|
||||||
sta ($0),y ; put it on screen
|
sta ($0),y ; put it on screen
|
||||||
rts
|
rts
|
||||||
|
.endproc
|
||||||
|
|
||||||
; display message, input x = message start relative to msg1
|
; display message, input x = message start relative to msg1
|
||||||
|
.proc disp
|
||||||
disp: stz $0 ; load some safe defaults
|
disp: stz $0 ; load some safe defaults
|
||||||
lda #$04
|
lda #$04
|
||||||
sta $1
|
sta $1
|
||||||
@ -66,7 +103,10 @@ disp2: sta $1 ; write address high
|
|||||||
sta $0 ; write address low
|
sta $0 ; write address low
|
||||||
inx ; set next msg byte
|
inx ; set next msg byte
|
||||||
bra disp0 ; back to the beginning
|
bra disp0 ; back to the beginning
|
||||||
confirm: pha
|
.endproc
|
||||||
|
|
||||||
|
.proc confirm
|
||||||
|
pha
|
||||||
ldx #(msg3-msg1) ; ask confirm
|
ldx #(msg3-msg1) ; ask confirm
|
||||||
jsr disp
|
jsr disp
|
||||||
jsr gtkey
|
jsr gtkey
|
||||||
@ -77,6 +117,8 @@ confirm: pha
|
|||||||
txa
|
txa
|
||||||
plp
|
plp
|
||||||
rts
|
rts
|
||||||
|
.endproc
|
||||||
|
|
||||||
; msg format
|
; msg format
|
||||||
; A byte < $20 indicates high byte of address.
|
; A byte < $20 indicates high byte of address.
|
||||||
; Next byte must be low byte of address. Anything
|
; Next byte must be low byte of address. Anything
|
||||||
@ -97,10 +139,8 @@ msg2: .byte $07,$db,"ROM 4X 05/27/17"
|
|||||||
msg3: .byte $05,$b0,"SURE? ",$00
|
msg3: .byte $05,$b0,"SURE? ",$00
|
||||||
|
|
||||||
; Boot4X - the boot portion of the program
|
; Boot4X - the boot portion of the program
|
||||||
.assert * < boot4x, warning, .sprintf("Boot4X overrun! * = %x, > %x", *, boot4x)
|
.proc boot4x
|
||||||
.res boot4x - *, 0
|
jsr ntitle ; "Apple //c"
|
||||||
.org boot4x
|
|
||||||
jsr gobanner ; "Apple //c"
|
|
||||||
jsr rdrecov ; try to recover ramdisk
|
jsr rdrecov ; try to recover ramdisk
|
||||||
lda power2 + rx_mslot ; get action saved by reset4x
|
lda power2 + rx_mslot ; get action saved by reset4x
|
||||||
beq :+ ; unset, go look for config on ram card
|
beq :+ ; unset, go look for config on ram card
|
||||||
@ -115,7 +155,7 @@ msg3: .byte $05,$b0,"SURE? ",$00
|
|||||||
phx ; config present, save it and move on
|
phx ; config present, save it and move on
|
||||||
lda #'C' ; tell user
|
lda #'C' ; tell user
|
||||||
sta $7d1 ; on screen
|
sta $7d1 ; on screen
|
||||||
selboot: ldx #(msg2-msg1) ; short banner offset
|
selboot: ldx #(msg2-msg1) ; short offset
|
||||||
jsr disp ; display it
|
jsr disp ; display it
|
||||||
pla ; get boot selection from stack
|
pla ; get boot selection from stack
|
||||||
;sta $7d2
|
;sta $7d2
|
||||||
@ -150,7 +190,7 @@ btc7: cmp #$07 ; boot ext drive
|
|||||||
bne boot4 ; none of the above
|
bne boot4 ; none of the above
|
||||||
; copy small routine to $800 to boot
|
; copy small routine to $800 to boot
|
||||||
; external 5.25
|
; external 5.25
|
||||||
ldy #(bt4xend-bootext+1)
|
ldy #.sizeof(bootext)
|
||||||
btc7lp: lda bootext,y
|
btc7lp: lda bootext,y
|
||||||
sta $800,y
|
sta $800,y
|
||||||
dey
|
dey
|
||||||
@ -165,8 +205,15 @@ boot6: lda #$c6 ; boot slot 6
|
|||||||
bootsl: 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: jmp gobt4x ; continue boot
|
endbt4x: lda #>(bt4xrtn-1)
|
||||||
rdrecov: jsr rdinit ; init ramcard
|
pha
|
||||||
|
lda #<(bt4xrtn-1)
|
||||||
|
pha
|
||||||
|
jmp swrts2
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
.proc rdrecov
|
||||||
|
jsr rdinit ; init ramcard
|
||||||
lda pwrup,y ; get power up flag
|
lda pwrup,y ; get power up flag
|
||||||
cmp #pwrbyte ; already initialized?
|
cmp #pwrbyte ; already initialized?
|
||||||
beq recovdn ; exit if initialized
|
beq recovdn ; exit if initialized
|
||||||
@ -188,8 +235,11 @@ rdrecov: jsr rdinit ; init ramcard
|
|||||||
lda #'R' ; tell user
|
lda #'R' ; tell user
|
||||||
sta $7d0 ; on screen
|
sta $7d0 ; on screen
|
||||||
recovdn: rts
|
recovdn: rts
|
||||||
|
.endproc
|
||||||
|
|
||||||
; zero ram card space
|
; zero ram card space
|
||||||
rdclear: jsr rdinit ; init ramcard
|
.proc rdclear
|
||||||
|
jsr rdinit ; init ramcard
|
||||||
jsr testsize ; get size
|
jsr testsize ; get size
|
||||||
lda numbanks,y ; # of 64Ks to write
|
lda numbanks,y ; # of 64Ks to write
|
||||||
beq clrdone ; no memory
|
beq clrdone ; no memory
|
||||||
@ -217,16 +267,28 @@ clrdone: ldx #rx_mslot
|
|||||||
lda #$a0 ; ' '
|
lda #$a0 ; ' '
|
||||||
sta $400 ; clear progress
|
sta $400 ; clear progress
|
||||||
rts
|
rts
|
||||||
rdinit: bit rx_mslot*$100 ; activate registers
|
.endproc
|
||||||
|
|
||||||
|
.proc rdinit
|
||||||
|
bit rx_mslot*$100 ; activate registers
|
||||||
ldy #rx_mslot ; slot offset
|
ldy #rx_mslot ; slot offset
|
||||||
ldx #rx_devno ; register offset
|
ldx #rx_devno ; register offset
|
||||||
rts
|
rts
|
||||||
; next is snippet of code to boot external 5.25
|
.endproc
|
||||||
bootext: lda #$e0
|
|
||||||
ldy #$01 ; unit #
|
; arrange a sequence of RTS tricks to display title screen
|
||||||
ldx #$60 ; slot #
|
.proc ntitle
|
||||||
jmp $c60b ; jump into Disk II code
|
lda #>(swrts2-1) ; put return addr of swrts/swrts2 on stack
|
||||||
bt4xend = *
|
pha
|
||||||
|
lda #<(swrts2-1)
|
||||||
|
pha
|
||||||
|
lda #>(banner-1) ; put addr of the Title routine on the stack
|
||||||
|
pha
|
||||||
|
lda #<(banner-1)
|
||||||
|
pha
|
||||||
|
jmp swrts2 ; jump to swrts2
|
||||||
|
.endproc
|
||||||
|
|
||||||
; --------------------------------------------------
|
; --------------------------------------------------
|
||||||
; config getter
|
; config getter
|
||||||
; values and locs
|
; values and locs
|
||||||
@ -346,4 +408,22 @@ fname_ = *
|
|||||||
rts
|
rts
|
||||||
.endproc
|
.endproc
|
||||||
|
|
||||||
|
; Display new boot failure message and jump to BASIC
|
||||||
|
.proc nbtfail
|
||||||
|
ldx #msglen
|
||||||
|
lp1: lda bootmsg,x
|
||||||
|
ora #$80
|
||||||
|
sta $7d0+19-(<msglen/2),x
|
||||||
|
dex
|
||||||
|
bpl lp1
|
||||||
|
lda #23 ; last line
|
||||||
|
sta cv
|
||||||
|
lda #>(basic-1)
|
||||||
|
pha
|
||||||
|
lda #<(basic-1)
|
||||||
|
pha
|
||||||
|
jmp swrts2
|
||||||
|
bootmsg:
|
||||||
|
.byte "No bootable device."
|
||||||
|
msglen = * - bootmsg - 1
|
||||||
|
.endproc
|
@ -1,19 +0,0 @@
|
|||||||
.code
|
|
||||||
.include "iic.defs"
|
|
||||||
.org nbtfail
|
|
||||||
ldx #msglen
|
|
||||||
lp1: lda bootmsg,x
|
|
||||||
ora #$80
|
|
||||||
sta $7d0+19-(<msglen/2),x
|
|
||||||
dex
|
|
||||||
bpl lp1
|
|
||||||
lda #23 ; last line
|
|
||||||
sta cv
|
|
||||||
lda #>(basic-1)
|
|
||||||
pha
|
|
||||||
lda #<(basic-1)
|
|
||||||
pha
|
|
||||||
jmp swrts2
|
|
||||||
bootmsg: .byte "No bootable device."
|
|
||||||
msglen = * - bootmsg - 1
|
|
||||||
|
|
@ -39,15 +39,11 @@ rx_mslot = rx_slot + $c0
|
|||||||
rx_devno = rx_slot * $10 + $88
|
rx_devno = rx_slot * $10 + $88
|
||||||
|
|
||||||
; entry points
|
; entry points
|
||||||
gorst4x = $c763 ; switch to/from reset4x
|
gorst4x = $cff9 ; reset patch destination
|
||||||
gobt4x = gorst4x + 6 ; switch to/from boot4x
|
gobt4x = $cffa ; boot patch destination
|
||||||
gobanner = gobt4x + 6 ; banner from bank 1
|
|
||||||
rst4xrtn = $facb ; where to return from reset4x
|
rst4xrtn = $facb ; where to return from reset4x
|
||||||
;bt4xrtn = $fb12 ; where to return from boot4x
|
|
||||||
bt4xrtn = $fb19 ; where to return from boot4x
|
bt4xrtn = $fb19 ; where to return from boot4x
|
||||||
reset4x = $e000 ; reset routine
|
rom4x_disp = $e000 ; main dispatch code
|
||||||
boot4x = $e180 ; boot routine
|
|
||||||
nbtfail = $e400 ; new boot fail
|
|
||||||
banner = $fb60 ; 'Apple //c'
|
banner = $fb60 ; 'Apple //c'
|
||||||
testsize = $d99f ; test ramdisk size (rom 3 = $d995)
|
testsize = $d99f ; test ramdisk size (rom 3 = $d995)
|
||||||
monitor = $ff59 ; monitor
|
monitor = $ff59 ; monitor
|
||||||
|
Loading…
Reference in New Issue
Block a user