diff --git a/notes/rom5_zeros.txt b/notes/rom5_zeros.txt index 1574b1d..b2ecaf3 100644 --- a/notes/rom5_zeros.txt +++ b/notes/rom5_zeros.txt @@ -2,16 +2,15 @@ Inventory of zeros of 5 bytes or more in the IIc Plus ROM Main Bank C1FB - 5 bytes -C4EE - 12 bytes +C4EE - 12 bytes - delete key fix C5F3 - 5 bytes -C6FB - 5 bytes -C9A1 - 9 bytes +C6FB - 5 bytes - but Disk II ID here at C6FF +C9A1 - 9 bytes - beep merlin fix part 2 CFF9 - 7 bytes - ROM 5X switcher Aux Bank C572 - 8 bytes -C7FB - 8 bytes -C7FC - 7 bytes +C7FC - 7 bytes - ROM 5X dispatch jump at $C7FF CE00 - 512 bytes not usable (MIG space) D3B5 - 75 bytes - Accelerator menu text D516 - 234 bytes - ROM 5X boot diff --git a/rom5x/B0_C2FC_fix_merlin_1.s b/rom5x/B0_C2FC_fix_merlin_1.s new file mode 100644 index 0000000..15679fa --- /dev/null +++ b/rom5x/B0_C2FC_fix_merlin_1.s @@ -0,0 +1,8 @@ +; Code to fix merlin incompatibility with the beep patch +; this arises because switching to the aux firmware messes up the +; memory map slightly. The IIc Plus WAIT routine has a fix, we adopt it here. +.code +.pc02 + .org $c2fc + phx + jmp $c9a1 ; next step diff --git a/rom5x/B0_C7FC_5x_switch.s b/rom5x/B0_C7FC_5x_switch.s new file mode 100644 index 0000000..2ecb1e0 --- /dev/null +++ b/rom5x/B0_C7FC_5x_switch.s @@ -0,0 +1,10 @@ +; There's a bit of luck in the IIc Plus 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 + diff --git a/rom5x/B0_C9A1_fix_merlin_2.s b/rom5x/B0_C9A1_fix_merlin_2.s new file mode 100644 index 0000000..90afc4a --- /dev/null +++ b/rom5x/B0_C9A1_fix_merlin_2.s @@ -0,0 +1,7 @@ +; see B0 C2FC patch for commentary +.code +.pc02 + .org $c9a1 + jsr $cfe5 ; get memory config we need to fix + jsr $c7fc ; call ROM 5X dispatch + jmp $c2f5 ; fix memory, restore x, a=$00 diff --git a/rom5x/B0_CFF9_switch_cmd.s b/rom5x/B0_CFF9_switch_cmd.s index ad43e16..cdf1d49 100644 --- a/rom5x/B0_CFF9_switch_cmd.s +++ b/rom5x/B0_CFF9_switch_cmd.s @@ -10,6 +10,6 @@ .org $cff9 ; 7 bytes available here, but don't count on $CFFF lda #$a9 ; lda opcode nop ; jmp/jsr $cffa does lda #$ea - jmp $fbdf ; jump to bell1 hijack + jmp $c7fc ; jump to 5X dispatcher ; total 6 bytes. diff --git a/rom5x/B0_FBDF_bell1_hijack.s b/rom5x/B0_FBDF_bell1_hijack.s deleted file mode 100644 index 2db5a33..0000000 --- a/rom5x/B0_FBDF_bell1_hijack.s +++ /dev/null @@ -1,21 +0,0 @@ -; Hijack the BELL1 monitor routine to do our bidding. -; BELL1 implements the beep sound heard on reset or -; Ctrl-G, etc. It starts with -; LDA #$40 -; JSR WAIT ; delay .1 sec -; followed by code to actually beep the speaker -; In our case, BELL1 always loads the accumulator with -; a fixed number, and executes a 3-byte instruction -; Well, it turns out that to switch banks we need -; 3 bytes, and as luck would have it the other bank -; is empty here. -; So the routine on the other side is the ROM 5X -; dispatcher. It will take what is in the accumulator -; and use that to determine the next action. -; Obviously, $40 should beep the speaker, anything -; else can do whatever we want. - -.code - .org $fbdf - sta $c028 - diff --git a/rom5x/B0_FBE6_beep_fix.s b/rom5x/B0_FBE6_beep_fix.s new file mode 100644 index 0000000..4213bf0 --- /dev/null +++ b/rom5x/B0_FBE6_beep_fix.s @@ -0,0 +1,13 @@ +; Fix the beep +; inspired by http://quinndunki.com/blondihacks/?p=2471 +; see commentary in B1 FB3C patch +.code +.pc02 + .org $fbe6 + jmp $c2fc ; to 5X beep with merlin fix + .res $fbef-*,$ea ; fill up the rest with NOPs +.assert * = $fbef, error, "ROM 5X beep fix alignment problem" +; the rts at $fbef is sacred + + + \ No newline at end of file diff --git a/rom5x/B1_C7FF_5x_jump.s b/rom5x/B1_C7FF_5x_jump.s new file mode 100644 index 0000000..c41bfa9 --- /dev/null +++ b/rom5x/B1_C7FF_5x_jump.s @@ -0,0 +1,5 @@ +; See B0 C7FC patch for description +.code + .org $c7ff + jmp $fb3c ; to 5X dispatch + diff --git a/rom5x/B1_D6CE_rom5x_misc.s b/rom5x/B1_D6CE_rom5x_misc.s index 99b7961..c1accff 100644 --- a/rom5x/B1_D6CE_rom5x_misc.s +++ b/rom5x/B1_D6CE_rom5x_misc.s @@ -81,7 +81,7 @@ msg1 = * .byte $04,$2e,"6 Boot 5.25" .byte $04,$ae,"7 Accelerator" .byte $07,$5f,"By M.G." -msg2: .byte $07,$db,"ROM 5X 04/08/17" +msg2: .byte $07,$db,"ROM 5X 11/09/17" .byte $05,$ae,$00 ; cursor pos in menu msg3: .byte $05,$b0,"SURE? ",$00 ; metadata to identify build conditions diff --git a/rom5x/B1_DB63_reset5x.s b/rom5x/B1_DB63_reset5x.s index 8d519a4..aba8efc 100644 --- a/rom5x/B1_DB63_reset5x.s +++ b/rom5x/B1_DB63_reset5x.s @@ -1,47 +1,44 @@ .code .psc02 .include "iic+.defs" - .org reset5x ; max 157 bytes - stz power2 + rx_mslot ; action = normal reset - lda #>(rst5xrtn-1) ; common case - pha - lda #<(rst5xrtn-1) - pha ; note that this stays on stack - asl butn1 ; option (closed apple) - bcs ckdiag -exitrst: jmp swrts2 + .org reset5x ; max 157 bytes + stz power2 + rx_mslot ; action = normal reset + lda #>(rst5xrtn-1) ; common case + pha + lda #<(rst5xrtn-1) + pha ; note that this stays on stack + asl butn1 ; option (closed apple) + bcs ckdiag +exitrst: jmp swrts2 ; check to see if cmd_option (both apples) are down -ckdiag: bit butn0 ; command (open apple) - bmi exitrst ; return to RESET.X +ckdiag: bit butn0 ; command (open apple) + bmi exitrst ; return to RESET.X ; present menu because only closed apple is down -menu: jsr menu5x ; display menu - jsr gkey5x - cmp #$b0 ; "0" - bne ckkey1 - ldx #$ff ; reset stack - txs - lda #>(monitor-1) ; monitor entry on stack - pha - lda #<(monitor-1) - pha - jmp swrts2 ; rts to enter monitor -ckkey1: cmp #$b2 ; "2" - beq doconf - cmp #$b4 ; "4" - bne ckkey2 -doconf: jsr conf5x - bne menu ; go back to menu4x -ckkey2: cmp #$b7 ; "7" - bne ckkey3 - jsr $fd02 ; accelerator menu - bra menu -ckkey3: sec - sbc #$b0 ; ascii->number - bmi menu ; < 0 not valid - cmp #$07 ; we will use 7 for accelerator later - bpl menu ; > 7 not valid - sta power2 + rx_mslot ; for boot5x - stz softev + 1 ; deinit coldstart - stz pwerdup ; ditto - bra exitrst +menu: jsr menu5x ; display menu + jsr gkey5x + cmp #$b0 ; "0" + bne ckkey1 + ldx #$ff ; reset stack + txs + txa + jmp $fb3c ; now has crash-to-monitor function +ckkey1: cmp #$b2 ; "2" + beq doconf + cmp #$b4 ; "4" + bne ckkey2 +doconf: jsr conf5x + bne menu ; go back to menu4x +ckkey2: cmp #$b7 ; "7" + bne ckkey3 + jsr $fd02 ; accelerator menu + bra menu +ckkey3: sec + sbc #$b0 ; ascii->number + bmi menu ; < 0 not valid + cmp #$07 ; we will use 7 for accelerator later + bpl menu ; > 7 not valid + sta power2 + rx_mslot ; for boot5x + stz softev + 1 ; deinit coldstart + stz pwerdup ; ditto + bra exitrst diff --git a/rom5x/B1_FB3C_rom5x_dispatch.s b/rom5x/B1_FB3C_rom5x_dispatch.s index d83125d..d850804 100644 --- a/rom5x/B1_FB3C_rom5x_dispatch.s +++ b/rom5x/B1_FB3C_rom5x_dispatch.s @@ -1,45 +1,51 @@ .code .psc02 .include "iic+.defs" - .org $fb3c ; ~165 bytes free here - cmp #$a9 ; reset patch - bne chk2 - jmp reset5x -chk2: cmp #$ea ; boot patch - bne chk3 - jmp boot5x -.if newbeep -chk3: -.else -chk3: cmp #$40 ; beep - bne dowait + .org $fb3c ; ~165 bytes free here +.proc dispatch + cmp #$a9 ; reset patch + bne :+ + jmp reset5x +: cmp #$ea ; boot patch + bne :+ + jmp boot5x +: cmp #$0c + beq oldbelle1 + ; jump to monitor + lda #>(monitor-1) ; monitor entry on stack as return address + pha + lda #<(monitor-1) + pha + jmp swrts2 ; switch bank and rts to monitor +.endproc + ; "classic air raid beep" -; inspired by http://quinndunki.com/blondihacks/?p=2471 - ; jsr $fcb5 ; (new) WAIT for .1 sec delay - jsr owait - ldy #$c0 -obell2: lda #$0c - jsr owait ; old wait for correct sound - lda $c030 - dey - bne obell2 - bra dexit ; back to caller -.endif -dowait: jsr $fcb5 ; do delay if anything else - lda #>($fbe2-1) ; return to other bank here (in BELL1) - pha ; by pushing address onto - lda #<($fbe2-1) ; the stack - pha - lda #$00 ; in case someone assumes this -dexit: jmp swrts2 ; back to other bank +.proc oldbell + ldy #$c0 +obell2: lda #$0c +dowait: jsr oldwait ; old wait for correct sound, we also enter here + lda $c030 + dey + bne obell2 + jmp swrts2 +.endproc +; We jump into the old bell routine mid-way because it's possible for +; someone to want to call the bell routine with a different duration +; by putting a custom value in Y and calling fbe4 (BELL2) +oldbelle1 := oldbell::dowait + ; old wait - no ACIA access to enforce delay at -; accelerated speeds, speaker delay tkes care of it +; accelerated speeds, speaker delay takes care of it ; when we do the old beep -owait: sec -owait2: pha -owait3: sbc #$01 - bne owait3 - pla - sbc #$01 - bne owait2 - rts +.proc oldwait + sec +owait2: pha +owait3: sbc #$01 + bne owait3 + pla + sbc #$01 + bne owait2 + rts +.endproc + +.assert * <= $fc00, error, "ROM 5X dispatch overruns $fc00" diff --git a/rom5x/B1_FBE2_bell1_hijack_b1.s b/rom5x/options/B1_FBE2_bell1_hijack_b1.s similarity index 100% rename from rom5x/B1_FBE2_bell1_hijack_b1.s rename to rom5x/options/B1_FBE2_bell1_hijack_b1.s