From 42ceecc0fcb42288aa9b0ca9fa4887ec76269cfd Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Fri, 12 Nov 2021 20:38:12 -0800 Subject: [PATCH] moar disasm --- README.md | 4 +- ace2000_c000_cfff.s | 253 +++-------------------- ace500_c000_cfff.s | 492 +++++++++++++------------------------------- 3 files changed, 179 insertions(+), 570 deletions(-) diff --git a/README.md b/README.md index 29091fb..4f3b11a 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,6 @@ Only one version of the 500 ROM is known to exist: There are at least three significant compatibility bugs in the 6.0 Franklin ROMs: -* With 80-column/enhanced firmware active, once MouseText is activated (via outputting $1B), attempting to turn it off by outputting $18 fails. This affects both the 2X00 and 500. Root cause identified, fix identified, and (optionally) applied. * With 80-column/enhanced firmware active, horizontal cursor position must use `OURCH` ($57B) not `CH` ($24). This affects only the 2X00. This is documented by Apple, but real Apples, the Laser 128, and Franklin ACE 500 all support using just `CH` via clever firmware routines. Root cause identified, fix found in the 500 ROM and (optionally) applied to the 2X00 ROMs. -* With 80-column/enhanced firmware active, sending bytes $40-$5F through C3COut1 will appear as MouseText, whereas on real Apples they are mapped to inverse uppercase. This affects both the 2X00 and 500. Root cause identified, tentative fix identified and (optionally) applied. +* With 80-column/enhanced firmware active, once MouseText is activated (via outputting $1B), attempting to turn it off by outputting $18 fails. This affects both the 2X00 and 500. Root cause identified, fix identified and (optionally) applied. +* With 80-column/enhanced firmware active, sending bytes $40-$5F through C3COut1 will appear as MouseText, whereas on real Apples they are mapped to inverse uppercase. This affects both the 2X00 and 500. Root cause identified, fix identified and (optionally) applied. diff --git a/ace2000_c000_cfff.s b/ace2000_c000_cfff.s index d44213b..d62e2ff 100644 --- a/ace2000_c000_cfff.s +++ b/ace2000_c000_cfff.s @@ -14,8 +14,8 @@ ;;; Patches ;;; Set to 1 to include fixes for: -;;; * MouseText mode failing to exist on $18 output. ;;; * CH not working to set horizontal cursor position. +;;; * MouseText mode failing to exist on $18 output. ;;; * MouseText displaying if $40-$5F sent to COUT. INCLUDE_PATCHES = 0 @@ -148,225 +148,38 @@ USR := $FECA ;;; ============================================================ ;;; Page $C0 - Unused (garbage data?) - .byte $80 - .byte $2C - .byte $80 - .byte $03 - nop - pha - pla - pha - pla - clc - clv - pha - phx - phy - .byte $8D - .byte $79 - .byte $06 - .byte $8D - .byte $FF - .byte $CF - sta $C079 - .byte $50 - .byte $0B - .byte $A2 - rmb0 $86 - rol $A2,x - .byte $C1 - stx $37 - jsr $B000 - jsr $B02C - sta $C078 - ply - plx - pla - rts - - bit $C12D - bra $C00B - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - bbs7 $FF,$C0D3 - brk - bbs7 $FF,$C0D7 - brk - bbs7 $FF,$C0DB - brk - bbs7 $FF,$C0DF - brk - bbs7 $FF,$C0E3 - brk - bbs7 $FF,$C0E7 - brk - bbs7 $FF,$C0EB - brk - bbs7 $FF,$C0EF - brk - bbs7 $FF,$C0F3 - brk - bbs7 $FF,$C0F7 - brk - bbs7 $FF,$C0FB - brk - bbs7 $FF,$C0FF - brk + .byte $80, $2c, $80, $03, $ea, $48, $68, $48 + .byte $68, $18, $b8, $48, $da, $5a, $8d, $79 + .byte $06, $8d, $ff, $cf, $8d, $79, $c0, $50 + .byte $0b, $a2, $07, $86, $36, $a2, $c1, $86 + .byte $37, $20, $00, $b0, $20, $2c, $b0, $8d + .byte $78, $c0, $7a, $fa, $68, $60, $2c, $2d + .byte $c1, $80, $d8, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $00, $00, $00, $00, $00, $00, $00, $00 + .byte $ff, $ff, $00, $00, $ff, $ff, $00, $00 + .byte $ff, $ff, $00, $00, $ff, $ff, $00, $00 + .byte $ff, $ff, $00, $00, $ff, $ff, $00, $00 + .byte $ff, $ff, $00, $00, $ff, $ff, $00, $00 + .byte $ff, $ff, $00, $00, $ff, $ff, $00, $00 + .byte $ff, $ff, $00, $00, $ff, $ff, $00, $00 ;;; ============================================================ ;;; Page $C1 - Parallel Port Firmware diff --git a/ace500_c000_cfff.s b/ace500_c000_cfff.s index 96cf54e..82d1107 100644 --- a/ace500_c000_cfff.s +++ b/ace500_c000_cfff.s @@ -103,12 +103,19 @@ RDLCBNK2:= $C011 RDLCRAM := $C012 RDRAMRD := $C013 RDRAMWRT:= $C014 +RDCXROM := $C015 +RDALTZP := $C016 +RDC3ROM := $C017 RD80COL := $C018 +RDVBL := $C019 RDTEXT := $C01A +RDPAGE2 := $C01C ALTCHARSET := $C01E RD80VID := $C01F TXTPAGE1:= $C054 TXTPAGE2:= $C055 +RD63 := $C063 +PTRIG := $C070 ROMIN := $C081 ROMIN2 := $C082 LCBANK2 := $C083 @@ -130,9 +137,13 @@ SETWND := $FB4B SETKBD := $FE89 SETVID := $FE93 MON_VTAB:= $FC22 +VTABZ := $FC24 CLREOP := $FC42 HOME := $FC58 CLREOL := $FC9C +CLREOLZ := $FC9E +COUT := $FDED +COUT1 := $FDF0 ;;; ============================================================ @@ -141,282 +152,32 @@ CLREOL := $FC9C ;;; ============================================================ ;;; Page $C0 - Unused (garbage data?) -LC000: brk -LC001: brk -LC002: brk -LC003: brk -LC004: brk -LC005: brk - brk - brk -LC008: brk -LC009: brk - brk - brk -LC00C: brk -LC00D: brk -LC00E: brk -LC00F: brk -LC010: brk -LC011: brk -LC012: brk -LC013: brk -LC014: brk -LC015: brk -LC016: brk -LC017: brk -LC018: brk -LC019: brk -LC01A: brk - brk -LC01C: brk - brk -LC01E: brk -LC01F: brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk -LC048: brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk -LC054: brk -LC055: brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk -LC063: brk - brk - brk -LC066: brk -LC067: brk - brk - brk - brk - brk - brk - brk - brk - brk -LC070: brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk -LC080: brk -LC081: brk -LC082: brk -LC083: brk - brk - brk - brk - brk - brk -LC089: brk - brk -LC08B: brk - brk - brk - brk - brk -LC090: brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk -LC0A8: brk -LC0A9: brk -LC0AA: brk - brk - brk - brk - brk - brk - brk - brk - brk - brk -LC0B4: brk - brk - brk - brk -LC0B8: brk -LC0B9: brk -LC0BA: brk -LC0BB: brk -LC0BC: brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk - brk + .res $100, 0 ;;; ============================================================ ;;; Page $C1 - Parallel Port Firmware .scope pageC1 -LFDF0 := $FDF0 +LC100: bra LC111 +LC102: bra LC107 - bra LC111 - bra LC107 - nop +LC104: nop sec nop LC107: clc clv bra LC114 - ora ($31,x) - .byte $2B - .byte $33 - rol $3E,x + + ;; Signature bytes + .byte $01, $31 + + ;; Pascal 1.1 Firmware Protocol Table + .byte .lobyte(LC12B) + .byte .lobyte(LC133) + .byte .lobyte(LC136) + .byte .lobyte(LC13E) + LC111: bit LC135 LC114: jsr LC1D6 pha @@ -431,37 +192,39 @@ LC122: jsr $C83C pla LC128: jmp $C5FA - jsr LC1D6 +LC12B: jsr LC1D6 jsr $C897 bra LC128 - ldx #$03 + +LC133: ldx #$03 LC135: rts - jsr LC1D6 +LC136: jsr LC1D6 jsr $C89D bra LC128 - jsr LC1D6 + +LC13E: jsr LC1D6 jsr $C8A5 bra LC128 LC146: lda #$00 - bit LC016 + bit RDALTZP bpl LC14F ora #$80 -LC14F: bit LC013 +LC14F: bit RDRAMRD bpl LC156 ora #$40 -LC156: bit LC014 +LC156: bit RDRAMWRT bpl LC15D ora #$20 -LC15D: bit LC011 +LC15D: bit RDLCBNK2 bpl LC164 ora #$10 -LC164: bit LC012 +LC164: bit RDLCRAM bpl LC16B ora #$08 -LC16B: bit LC018 +LC16B: bit RD80COL bpl LC177 - bit LC01C + bit RDPAGE2 bpl LC177 ora #$04 LC177: rts @@ -470,10 +233,10 @@ LC178: phx asl a asl a bcc LC180 - sta LC003 + sta RDCARDRAM LC180: asl a bcc LC186 - sta LC005 + sta WRCARDRAM LC186: asl a bcc LC193 asl a @@ -487,20 +250,20 @@ LC193: asl a ldx #$0B .byte $2C LC199: ldx #$09 -LC19B: bit LC080,x - bit LC080,x +LC19B: bit $C080,x + bit $C080,x asl a bcc LC1A7 - sta LC055 + sta TXTPAGE2 LC1A7: plx rts LC1A9: bit #$04 beq LC1B0 - sta LC054 -LC1B0: sta LC002 - sta LC004 - bit LC081 + sta TXTPAGE1 +LC1B0: sta RDMAINRAM + sta WRMAINRAM + bit ROMIN rts brk @@ -526,14 +289,14 @@ LC1C1: brk brk brk jsr LC128 - jsr LFDF0 + jsr COUT1 LC1D6: php sei pha lda #$C1 sta $07F8 - sta LC0BA - sta LC0B8 + sta $C0BA + sta $C0B8 sta CLRROM pla plp @@ -561,33 +324,41 @@ LC1FD: jmp LC1A9 ;;; ============================================================ ;;; Page $C2 - ??? +.scope pageC2 bit $C5A7 bra LC211 + sec bcc LC220 clv bra LC211 - ora ($31,x) - trb $17 - inc a - .byte $1D + + ;; Signature bytes + .byte $01, $31 + + ;; Pascal 1.1 Firmware Protocol Table + .byte .lobyte(LC214) + .byte .lobyte(LC217) + .byte .lobyte(LC21A) + .byte .lobyte(LC21D) + LC211: jmp $C500 - jmp $C51F +LC214: jmp $C51F - jmp $C528 +LC217: jmp $C528 - jmp $C530 +LC21A: jmp $C530 - jmp $C538 +LC21D: jmp $C538 LC220: lda $077C and #$F1 sta $077C sec - lda LC019 + lda RDVBL bmi LC258 - sta LC070 + sta PTRIG lda #$08 tsb $077C clc @@ -600,18 +371,18 @@ LC220: lda $077C beq LC24E tsb $077C stz $067C -LC24E: bit LC063 +LC24E: bit RD63 bmi LC258 lda #$04 tsb $077C -LC258: lda LC015 - ora LC017 +LC258: lda RDCXROM + ora RDC3ROM bmi LC263 jmp LC2ED LC263: sta $067C - lda LC015 - sta LC048 + lda RDCXROM + sta $C048 ; ??? bpl LC2AE txa bpl LC28B @@ -676,6 +447,7 @@ LC2F8: rts lda $0342,x .byte $8D .byte $12 +.endscope ;;; ============================================================ ;;; Page $C3 - Enhanced 80 Column Firmware @@ -710,7 +482,7 @@ LC307: clc ;; XFER .assert * = XFER, error, "Entry point mismatch" - jsr extra_DoBankC5 + jsr pageC5_DoBankC5 jmp $CC03 ; ??? ;;; ============================================================ @@ -719,7 +491,7 @@ LC307: clc JPINIT: jsr ClearROM jsr PascalInit -LC320: jmp extra_DoBankC5 +LC320: jmp pageC5_DoBankC5 JPREAD: jsr ClearROM jsr PascalRead @@ -734,7 +506,7 @@ JPSTAT: jsr ClearROM bra LC320 JumpAuxMove: - jsr extra_DoBankC5 + jsr pageC5_DoBankC5 jmp $CC06 ;;; ============================================================ @@ -796,7 +568,7 @@ l8: ldx SAVEX sty OURCH sty XCOORD ldy SAVEY - jmp extra_DoBankC5 + jmp pageC5_DoBankC5 ;;; ============================================================ ;;; Escape Mode @@ -835,7 +607,7 @@ SETV: rts brk brk brk - jsr extra_DoBankC5 + jsr pageC5_DoBankC5 jmp $CC00 LC3E2: plx @@ -856,17 +628,9 @@ LC3FA: jsr ClearROM jmp LCCF5 ;;; ============================================================ -;;; Pages $C4-C7 - ??? - -.scope extra - -LFC24 := $FC24 -LFC58 := $FC58 -LFC9E := $FC9E -LFDED := $FDED -LFDF0 := $FDF0 -LFF4A := $FF4A +;;; Page $C4 - ??? +.scope pageC4 bit LC42E bra LC41C @@ -874,15 +638,24 @@ LFF4A := $FF4A bcc LC420 clv bra LC41C - ora ($20,x) - bit $2C2C - bit $2F00 + + ;; Signature bytes + .byte $01, $20 + + ;; Pascal 1.1 Firmware Protocol Table + .byte .lobyte(LC42C) + .byte .lobyte(LC42C) + .byte .lobyte(LC42C) + .byte .lobyte(LC42C) + + .byte 0 + .byte $2F and $3B,x eor ($47,x) eor $5953 .byte $2C .byte $5F -LC41C: jsr DoBankC5 +LC41C: jsr pageC5_DoBankC5 .byte $50 LC420: .byte $03 jsr LC806 @@ -891,38 +664,38 @@ LC420: .byte $03 LC429: jmp LC825 - ldx #$03 +LC42C: ldx #$03 LC42E: rts - jsr DoBankC5 + jsr pageC5_DoBankC5 jmp $C8D4 - jsr DoBankC5 + jsr pageC5_DoBankC5 jmp $C916 - jsr DoBankC5 + jsr pageC5_DoBankC5 jmp $C922 - jsr DoBankC5 + jsr pageC5_DoBankC5 jmp $C958 - jsr DoBankC5 + jsr pageC5_DoBankC5 jmp $C967 - jsr DoBankC5 + jsr pageC5_DoBankC5 jmp $C969 - jsr DoBankC5 + jsr pageC5_DoBankC5 jmp $C93E -LC459: jsr DoBankC5 +LC459: jsr pageC5_DoBankC5 jmp $C8AC ldx $C066 ldy $C067 jmp $C220 -LC468: jsr DoBankC5 +LC468: jsr pageC5_DoBankC5 jmp $C9A0 brk @@ -1015,7 +788,7 @@ LC4E4: jmp $C1F2 LC4E7: jmp LC3E2 -LC4EA: jmp LC5F5 +LC4EA: jmp pageC5_LC5F5 brk brk @@ -1032,6 +805,12 @@ LC4F8: jmp LC468 dec $00,x jmp LC459 +.endscope + +;;; ============================================================ +;;; Page $C5 + +.scope pageC5 LC500: jsr BankC5 sta $067A @@ -1068,12 +847,12 @@ LC51A: ply jsr BankC8 ora #$80 - jsr LFDF0 + jsr COUT1 bra BankC5 jsr BankC8 ora #$80 - jsr LFDED + jsr COUT bra BankC5 jsr BankC8 @@ -1086,11 +865,11 @@ LC51A: ply bra BankC5 jsr BankC8 - jsr LFC9E + jsr CLREOLZ bra BankC5 jsr BankC8 - jsr LFC58 + jsr HOME bra BankC5 jsr BankC8 @@ -1098,15 +877,15 @@ LC51A: ply bra BankC5 jsr BankC8 - jsr LC4F8 + jsr pageC4::LC4F8 bra BankC5 jsr BankC8 - jsr LC7FD + jsr pageC7_LC7FD bra BankC5 jsr BankC8 - jsr LFC24 + jsr VTABZ ;; Fall through ;;; ============================================================ @@ -1202,12 +981,19 @@ DoBankC5: ;;; ============================================================ jmp LC5C6 +.endscope +pageC5_DoBankC5 := pageC5::DoBankC5 +pageC5_LC5F5 := pageC5::LC5F5 +;;; ============================================================ +;;; Page $C6 - Disk II Driver + +.scope pageC6 bit $20 cpy $00 ldx #$03 asl A1L - jsr DoBankC5 + jsr pageC5::DoBankC5 ldy #$69 LC60D: lda $CF26,y sta $036C,y @@ -1306,7 +1092,7 @@ LC62D: dec $27 nop nop LC683: pla -LC684: jsr DoBankC5 +LC684: jsr pageC5::DoBankC5 jsr LCE00 bra LC6EA brk @@ -1413,7 +1199,17 @@ LC6EA: nop jmp $0801 .byte $DE - brk + .byte $00 ; $00 = Disk II, 16-Sector +.endscope + +;;; ============================================================ +;;; Page $C7 - ??? + +LC700: +.scope pageC7 + +LFF4A := $FF4A + LC700: jsr $C1F7 pha jsr $C1FD @@ -1452,7 +1248,7 @@ LC739: pha php jmp (L03FE) -LC744: jmp LC4BE +LC744: jmp pageC4::LC4BE LC747: pla sta $44 @@ -1469,7 +1265,7 @@ LC751: pla sta $3A ply sty $3B - bit $C016 + bit RDALTZP bpl LC781 tsx stx $0101 @@ -1554,7 +1350,7 @@ LC7E5: sta WRCARDRAM brk LC7FD: jmp LC792 .endscope -extra_DoBankC5 := extra::DoBankC5 +pageC7_LC7FD := pageC7::LC7FD ;;; ============================================================ @@ -2352,7 +2148,7 @@ LCC8D: bit TXTPAGE2 sta CLR80COL bra LCC64 LCCB2: jsr LCCB8 - jmp extra::DoBankC5 ; bad disasm or ...? + jmp pageC5::DoBankC5 ; bad disasm or ...? LCCB8: bit $0579 bmi LCCD7 @@ -2385,7 +2181,7 @@ LCCE1: phx beq LCCDC bra LCCD5 LCCF5: jsr LCCFB - jmp extra::DoBankC5 + jmp pageC5::DoBankC5 LCCFB: bit $0579 bpl LCD03 @@ -2531,7 +2327,7 @@ LCE00: asl $9D stz $0579 LCE0D: jsr LCDA8 sta $04F9 - jmp extra::DoBankC5 + jmp pageC5::DoBankC5 LCE16: pha lda RDRAMRD