commit 99f1679255124fabfc2184d9b2fe6cbe4375d50b Author: Eric Smith Date: Sat Apr 3 18:51:52 2021 -0600 Initial commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..edb92e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +\#* +.#* +*~ +*.bin +*.bin.orig +*.p +*.lst +*.dis +old diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e5c1f26 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +all: check + +%.p %.lst: %.asm + asl -cpu 6502 -L $< + +%.bin: %.p + p2bin -r '$$c000-$$dfff' $< + +check: ramfactor14.bin + echo '3369e5e9838db52df7924e79e65451267953172390d30308a28c688a886989ce ramfactor14.bin' | sha256sum -c diff --git a/ramfactor14.asm b/ramfactor14.asm new file mode 100644 index 0000000..170cff0 --- /dev/null +++ b/ramfactor14.asm @@ -0,0 +1,1989 @@ +; Applied Engineering RamFactor firmware version 1.4 + +; Partially reverse-engineered by Eric Smith + +; Cross-assemble with Macro Assembler AS: +; http://john.ccac.rwth-aachen.de:8000/as/ +; Depends on AS "section" pseudo-op to provide separate namespaces +; for each slot ROM, and for diagnostics and partition manager + + +fillto macro endaddr,value,{noexpand} + ifnb value +v set value + else +v set $00 + endif + while *1024 + fcb [1024] v + else + fcb [endaddr-*] v + endif + endm + endm + + +L00 equ $00 +Z39 equ $39 +Z3e equ $3e +Z3f equ $3f +Z41 equ $41 +Z42 equ $42 ; ProDOS interface command +Z43 equ $43 ; ProDOS interface unit number +Z44 equ $44 ; ProDOS interface buffer pointer (two bytes) +Z45 equ $45 +Z46 equ $46 ; ProDOS interface block number (two bytes) +Z47 equ $47 +Z48 equ $48 +Z49 equ $49 +Z4a equ $4a +Z4b equ $4b + +D010b equ $010b +D010c equ $010c +D01a9 equ $01a9 +D0200 equ $0200 + +; screen holes, global +mslot equ $07f8 + +; screen holes, slot-indexed +D0478 equ $0478 ; # blocks of whole card, divided by 256 +D04f8 equ $04f8 ; index to partition data +D0578 equ $0578 ; partition base address, high bbyte +D05f8 equ $05f8 ; partition base address, mid byte +D0678 equ $0678 ; current partition size, pages, high byte +D06f8 equ $06f8 ; current partition size, pages, low byte +D0778 equ $0778 ; operating system code +D07f8 equ $07f8 ; operating system check code + +D0800 equ $0800 +L0801 equ $0801 +D0900 equ $0900 + +L0a00 equ $0a00 + +Dbd12 equ $bd12 ; RWTS patch loc, three bytes + +proflag equ $bf00 ; used to detect OS + ; $00 - Pascal + ; $4C - ProDOS + ; $33 - DOS 3.3 +Dbff8 equ $bff8 +Dbff9 equ $bff9 +Dbffa equ $bffa +Dbffb equ $bffb + +kbd equ $c000 ; read keyboard +rdmainram equ $c002 ; IIe read main RAM +rdcardram equ $c003 ; IIe read auxilliary RAM +wrmainram equ $c004 ; IIe write main RAM +wrcardram equ $c005 ; IIe write auxilliary RAM +clr80vid equ $c00c ; IIe disable 80col +clraltchar equ $c00e ; IIe disable altchar +kbdstrb equ $c010 ; clea rkeyboard strobe +rdramrd equ $c013 ; IIe MSB reads 1 if main RAM read enabled +rdramwrt equ $c014 ; IIe MSB reads 1 if main RAM write enabled + +Dc0nf equ $c08f ; bank select, add slot*$10 + +Dcfff equ $cfff ; turn off C800 shared ROM space + +sloop equ $faba +init equ $fb2f +bell12 equ $fbe2 +clreop equ $fc42 +home equ $fc58 +rdkey equ $fd0c +crout equ $fd8e +prbyte equ $fdda +cout equ $fded +setkbd equ $fe89 +setvid equ $fe93 +resetvec equ $fffc + + +pc_err_bad_cmd equ $01 +pc_err_bad_pcnt equ $04 +pc_err_bus_err equ $06 +pc_err_bad_unit_num equ $11 +pc_err_bad_ctl equ $21 +pc_err_bad_ctl_param equ $22 +pc_err_io_error equ $27 +pc_err_no_drive equ $28 +pc_err_no_write equ $2b ; write-protected +pc_err_bad_block_num equ $2d +pc_err_offline equ $2f +; Protocol Converter error codes $30..$3f are device-specific errors +; Protocol Converter error codes $50..$7f are device-specific non-fatal errors + + + irp banknum,0,1 + + org $c000+(banknum*$1000) + fcb "COPYRIGHT (C) 1986-89 APPLIED ENGINEERING",$00 + fcb "BOB SANDER-CEDERLOF",$00 + fcb "MICHAEL WILKS",$00 + fcb "STEVEN MALECHEK",$00 + fillto $c100+(banknum*$1000),$ae + + irp slotnum,1,2,3,4,5,6,7 + +; per-slot ROM code + section bank_banknum_slot_slotnum + org $c000+(banknum*$1000)+(slotnum*$0100) + phase $c000+(slotnum*$0100) + +; Bytes at Cn0{1,3,5} = $20, $00, $03 identify card as a block device +; Byte at Cn07 = $3C for Disk II, +; $00 for SmartPort interface supported +; Byte at CnFF = $00 for 16-sector Disk II, $ff for 13-sector Disk II, +; other value $xx = ProDOS block device, entry point = Cnxx, in this case +; $Cn2A +; For ProDOS block device: +; word at CnFC = device size in blocks, +; byte at CnFE = STATUS byte + +slot0: cmp #$20 ; $Cn01 = $20 + cmp #$00 ; $Cn03 = $00 + cmp #$03 ; $Cn05 = $03 + cmp #$00 ; $cn07 = $00 + bcs boot4 ; always taken + +; cn0a - RamFactor diagnostic (same entry point as Slinky memory test) + jsr Scn16 + jmp Lcn9b + +; cn10 - RamFactor Partion Manager + jsr Scn16 + jmp Lcn9f + +Scn16: sta clr80vid + sta kbd + sta clraltchar + jsr init + jsr setvid + jsr setkbd + +romsel: ldy #$c0+slotnum + ldx Dcfff ; turn off all shared (c800) ROMs, except our + asl Dc0nf+(slotnum*$10) ; set bank 0 + ldx #$88+(slotnum*$10) + sty mslot + stx D0778 + jmp Lc9df + +boot4: lda #$c0+slotnum + cmp Z39 + php + jsr Scn16 + plp + bne Lcn60 + jsr Scdec + beq Lcn60 + + lda #$20 ; Patch RWTS with jsr $eaea ??? + sta Dbd12 + lda #$ea + sta Dbd12+1 + sty Dbd12+2 + + ldx #$00 + lda #$8d + sta D0200 + rts + +Lcn60: lda L00 + bne Lcn6e + cpy L00+1 + bne Lcn6e + jsr Scn7b + jmp sloop + +Lcn6e: lda D04f8-$c0,Y + cmp #$01 + bne Lcn9f + jsr Scn7b + clc + bcc Lcn9f + +Scn7b: jsr Sca9a + jsr Scaeb + ldy #$c0+slotnum ; high byte of slot ROM base c100 + lda L0801 + beq Lcn9a + lda D07f8-$c0,Y + eor #$5a + cmp D0778-$c0,Y + bne Lcn9a + sta proflag + ldx #(slotnum*$10) + jmp L0801 + +Lcn9a: rts + +; diagnostic +Lcn9b: ldy #$03 + bne Lcna1 + +; partition managere +Lcn9f: ldy #$05 + +; copy four bytes from table to Z42..Z45 +; gets download routine start address in Z42, end+1 in Z44 +Lcna1: ldx #$03 +Lcna3: lda Dcnd5,Y + sta Z42,X + dey + dex + bpl Lcna3 + + php + sei + stx Dc0nf+(slotnum*$10) ; set bank 1 ? + ldx #$88+(slotnum*$10) + + ldy #$00 ; set Z3e to point to RAM where diag/partmgr load + sty Z3e + lda #$0a + sta Z3f + +Lcnbb: lda (Z42),Y ; copy down to RAM + sta (Z3e),Y + iny + bne Lcnc6 + inc Z3f + inc Z43 +Lcnc6: cpy Z44 + lda Z43 + sbc Z45 + bcc Lcnbb + + asl Dc0nf+(slotnum*$10) ; set bank 0 + plp + jmp L0a00 + +; table of bank 1 regions +Dcnd5: fdb b1_diag ; start of diag code + fdb b1_partmgr ; end of diag, start of partition manager + fdb b1_partmgr_end ; end of partition manager + + +slot_prodos: + clv + bvc slot_prodos_x + +slot_protocol_converter + jsr romsel + jmp protocol_converter + +slot_prodos_x: + jsr romsel + jmp prodos + +; cnea + cmp #(slotnum*$10) + beq Lcnf2 + tax + ldy #$0f + rts + +Lcnf2: pla + pla + jsr romsel + jmp Lcc6f + + fcb $ae ; distinguishes vendor of mem exp card + ; $ae = Applied Engineering + + fcb $01 ; low bit set = ramdisk + + fdb $0000 ; block count (must be obtained by a STATUS request) + fcb $4f ; status byte + ; 7 = 0: non-removable + ; 6 = 1: interruptible + ; 5..4 = 0: 0 volumes on device + ; 3 = 1: supports format + ; 2 = 1: supports write + ; 1 = 1: supports read + ; 0 = 1: supports status + fcb slot_prodos & $db ; ProDOS entry point pointer + + dephase + endsection bank_banknum_slot_slotnum + + endm ; irp slotnum,... + endm ; irp banknum,... + + +; C800 shared ROM code + + org $c800 + +protocol_converter: + jsr Scd99 + + ldx #$09 ; save ten bytes from Z42 on stack +Lc805: lda Z42,X + pha + dex + bpl Lc805 + tsx + + lda D010c,X + sta Z46 + lda D010b,X + sta Z45 + + ldy #$03 +Lc818: lda (Z45),Y + sta Z41,Y + inc D010b,X + bne Lc825 + inc D010c,X +Lc825: dey + bne Lc818 + sty D04f8 + sty D0578 + sty D05f8 + tax + cmp #$0a + bcs ret_pc_err_bad_cmd + lda Dc887,X + cmp (Z43),Y + bne ret_pc_err_bad_pcnt + + ldy #$08 +Lc83f: lda (Z43),Y + sta Z43,Y + dey + bne Lc83f + + lsr ; first param is unit num, only allow 0 and 1 + bne ret_pc_err_bad_unit_num + + ldx D0778 + + ldy Z42 ; protocol converter command + lda #$c8 + pha + lda Dc87d,Y + pha + lsr Z44 + lda Z47 + rts + +ret_pc_err_bad_unit_num: + lda #$11 + fcb $2c ; BIT abs opcode to skip two bytes +ret_pc_err_bad_cmd: + lda #pc_err_bad_cmd + fcb $2c ; BIT abs opcode to skip two bytes +ret_pc_err_bad_pcnt: + lda #pc_err_bad_pcnt +LC863: sta D04f8 +Lc866: ldx #$00 +Lc868: pla + sta Z42,X + inx + cpx #$0a + bcc Lc868 + ldy D05f8 + ldx D0578 + lda D04f8 + bne Lc87c + clc +Lc87c: rts + +; dispatch table for Protocol Converter calls +Dc87d: fcb (pc_cmd_status-1)&$ff ; status + fcb (pc_cmd_read_block-1)&$ff ; read block + fcb (pc_cmd_write_block-1)&$ff ; write block + fcb (pc_cmd_format_init-1)&$ff ; format (no-op) + fcb (pc_cmd_control-1)&$ff ; control + fcb (pc_cmd_format_init-1)&$ff ; init + fcb (pc_cmd_rw_char-1)&$ff ; open character + fcb (pc_cmd_rw_char-1)&$ff ; close character + fcb (pc_cmd_read_bytes-1)&$ff ; read bytes + fcb (pc_cmd_write_bytes-1)&$ff ; write bytes + +; parameter count for Protocol Converter calls +Dc887: fcb 3 ; status + fcb 3 ; read block + fcb 3 ; write block + fcb 1 ; format + fcb 3 ; control + fcb 1 ; init + fcb 1 ; open character + fcb 1 ; close character + fcb 4 ; read bytes + fcb 4 ; write bytes + +pc_cmd_format_init: + jmp Lc866 + +pc_cmd_rw_char: + jmp ret_pc_err_bad_cmd + +pc_cmd_write_bytes: + bcs Lc8c5 + +pc_cmd_read_bytes: + bcs Lc8b3 + bcc pc_cmd_rw_char + +pc_cmd_control: + beq pc_cmd_format_init + +Lc89f: lda #$21 + jmp Lc863 + +pc_cmd_read_block: + bcc pc_cmd_rw_char + jsr Sc90c + bcs Lc8c8 + lda rdramrd + asl Z4b + asl + ror Z4b +Lc8b3: jmp Lc923 + +pc_cmd_write_block: + bcc pc_cmd_rw_char + jsr Sc90c + bcs Lc8c8 + lda rdramwrt + asl Z4b + asl + ror Z4b +Lc8c5: jmp Lc982 + +Lc8c8: jmp Lc97d + +pc_cmd_status: + bcs Lc8e0 + bne Lc89f + ldy #$08 + sty D0578 +Lc8d4: dey + sta (Z45),Y + bne Lc8d4 + lda #$01 + sta (Z45),Y + jmp Lc866 + +Lc8e0: beq Lc8e9 + ldy #$19 + cmp #$03 + bne Lc89f + fcb $2c ; BIT abs opcode to skip two bytes +Lc8e9: ldy #$04 + sty D0578 + dey +Lc8ef: lda Dc9c6,Y + cpy #$02 + bne Lc904 + ldx D07f8 + lda D0678-$c0,X + lsr + sta (Z45),Y + dey + lda D06f8-$c0,X + ror +Lc904: sta (Z45),Y + dey + bpl Lc8ef + jmp Lc866 + +Sc90c: asl + sta Z4a + lda Z48 + rol + bcs Lc922 + sta Z4b + lda Z49 + cmp #$01 + bcs Lc922 + sta Z47 + lda #$02 + sta Z48 +Lc922: rts + +Lc923: jsr Sc964 + bcs Lc97d + bit rdramwrt + php + asl + bcc Lc932 + sta wrcardram +Lc932: lda Z48 + sta D05f8 + beq Lc947 +Lc939: lda Dbffb,X + sta (Z45),Y + iny + bne Lc939 + inc Z46 + dec Z48 + bne Lc939 +Lc947: lda Z47 + beq Lc958 + sta D0578 +Lc94e: lda Dbffb,X + sta (Z45),Y + iny + cpy Z47 + bne Lc94e +Lc958: sta wrmainram + plp + bpl Lc961 + sta wrcardram +Lc961: jmp Lc866 + +Sc964: lda Z49 + sta Dbff8,X + lda Z4a + sta Dbff9,X + lda Z4b + and #$7f + sta Dbffa,X + jsr Sca9d + ldy #$00 + lda Z4b + rts +Lc97d: lda #$2d + jmp Lc863 + +Lc982: jsr Sc964 + bcs Lc97d + bit rdramrd + php + sta rdmainram + asl + bcc Lc994 + sta rdcardram +Lc994: lda Z48 + sta D05f8 + beq Lc9a9 +Lc99b: lda (Z45),Y + sta Dbffb,X + iny + bne Lc99b + inc Z46 + dec Z48 + bne Lc99b +Lc9a9: lda Z47 + sta D0578 + beq Lc9ba +Lc9b0: lda (Z45),Y + sta Dbffb,X + iny + cpy Z47 + bne Lc9b0 +Lc9ba: sta rdmainram + plp + bpl Lc9c3 + sta rdcardram +Lc9c3: jmp Lc866 + +Dc9c6: fcb $f8,$00,$00,$00 + + fcb $07,"RAMCARD" + fcb " " + + fcb $00,$00,$00,$00 + +Lc9df: ldy D07f8 + jsr Sca8e + lda Dbffb,X + cmp #$ae + bne Lca31 + eor Dbffb,X + cmp #$5a + bne Lca31 + lda Dbffb,X + sta D04f8-$c0,Y + eor #$5a + cmp Dbffb,X + bne Lca31 + lda Dbffb,X + sta D0478-$c0,Y + lda D04f8-$c0,Y + sta Dbff8,X + lda Dbffb,X + sta D0578-$c0,Y + lda Dbffb,X + sta D05f8-$c0,Y + lda Dbffb,X + sta D0678-$c0,Y + lda Dbffb,X + sta D06f8-$c0,Y + lda Dbffb,X + sta D0778-$c0,Y + lda Dbffb,X + sta D07f8-$c0,Y + rts + +Lca31: lda D0778-$c0,Y + eor D07f8-$c0,Y + cmp #$5a + beq Lca73 + jsr Sca8e + lda #$04 + sta Dbff9,X + lda Dbffb,X + eor Dbffb,X + eor Dbffb,X + eor Dbffb,X + ldx #$4c + cmp #$03 + beq Lca61 + ldx #$00 + cmp #$06 + beq Lca61 + ldx #$33 + cmp #$be + bne Lca6a +Lca61: txa + sta D0778-$c0,Y + eor #$5a + sta D07f8-$c0,Y +Lca6a: jsr Scb00 + ldy D07f8 + sta D0478-$c0,Y +Lca73: lda D0478-$c0,Y + asl + sta D0678-$c0,Y + lda #$00 + sta D06f8-$c0,Y + sta D05f8-$c0,Y + sta D0578-$c0,Y + lda #$01 + sta D04f8-$c0,Y + rts + +Sca8b: ldx D0778 + +Sca8e: lda #$00 + sta Dbff8,X + sta Dbff9,X + sta Dbffa,X + rts + +Sca9a: jsr Sca8e + +Sca9d: ldy D07f8 + lda D0478-$c0,Y + cmp #$09 + lda Dbffa,X + bcs Lcaac + and #$0f +Lcaac: pha + bne Lcacd + lda D04f8-$c0,Y + cmp #$08 + bne Lcacd + lda Dbff9,X + cmp #$02 + bcs Lcacd + ora #$fe + sta Dbff9,X + lda D0478-$c0,Y + sbc #$00 + rol + sta Dbffa,X +Lcacb: pla + rts + +Lcacd: lda Dbff9,X + cmp D06f8-$c0,Y + pla + pha + sbc D0678-$c0,Y + bcs Lcacb + lda Dbff9,X + adc D05f8-$c0,Y + sta Dbff9,X + pla + adc D0578-$c0,Y + sta Dbffa,X + rts + +Scaeb: ldy #$00 +Lcaed: lda Dbffb,X + sta D0800,Y + iny + bne Lcaed +Lcaf6: lda Dbffb,X + sta D0900,Y + iny + bne Lcaf6 + rts + +Scb00: jsr Sca8b + tay + cmp Dbffa,X + bne Lcb0b + ldy #$02 +Lcb0b: ora Dcb95,Y +Lcb0e: sta Z3f + sta Z3e + sta Dbffa,X + lda Dbffb,X + dec Dbff8,X + pha + lda Z3f + sta Dbffb,X + dec Dbff8,X + and Dcb95,Y + beq Lcb3d + lda Z3f + sec + sbc Dcb98,Y + jmp Lcb0e + +Lcb32: clc + lda Z3f + adc Dcb98,Y + sta Z3f + sta Dbffa,X +Lcb3d: lda Dbffb,X + cmp Z3f + bne Lcb83 + eor #$ff + dec Dbff8,X + sta Dbffb,X + dec Dbff8,X + cmp Dbffb,X + bne Lcb83 + dec Dbff8,X + lda Z3f + and Dcb95,Y + cmp Dcb95,Y + bne Lcb32 +Lcb61: lda Z3e + sta Dbffa,X + pla + sta Dbffb,X + dec Dbff8,X + clc + lda Z3e + adc Dcb98,Y + sta Z3e + and Dcb95,Y + bne Lcb61 + lda Z3f + dey + bpl Lcb0b + lsr + adc #$02 + rts + +Lcb83: dec Dbff8,X + sec + lda Z3f + beq Lcb61 + sbc Dcb98,Y + sta Z3f + jmp Lcb61 + + fcb $ea,$ea + +Dcb95: fcb $0c,$30,$c0 +Dcb98: fcb $04,$10,$40 + +Scb9b: + fcb $a2,$04,$a0,$00,$a9 + fcb $00,$48,$38,$a5,$3e,$fd,$de,$cb + fcb $48,$a5,$3f,$fd,$e3,$cb,$90,$0a + fcb $85,$3f,$68,$85,$3e,$68,$69,$00 + fcb $d0,$e7,$68,$68,$d0,$08,$88,$10 + fcb $05,$8a,$f0,$02,$a9,$10,$c8,$49 + fcb $b0,$20,$ed,$fd,$ca,$10,$d0,$a9 + fcb $cb,$4c,$ed,$fd,$08,$08,$20,$38 + fcb $50,$68,$80,$98,$b0,$c8,$04,$28 + fcb $90,$a0,$40,$00,$00,$01,$0f,$9c + +prodos: + ldy Z42 + iny + beq Scc58 + jsr Scd99 + ldy #$2b + bcs Lcc0c + ldy #$28 + lda Z43 + bmi Lcc0c + ldy Z42 + beq Lcc0f + dey + beq Lcc1f + dey + beq Lcc3d + dey + beq Lcc1b + ldy #$01 + fcb $2c ; BIT abs opcode to skip two bytes +lcc0a: ldy #$27 +Lcc0c: tya + sec + rts + +Lcc0f: ldy D07f8 + jsr Scfe4 + ldy D0478 + ldx D04f8 +Lcc1b: lda #$00 + clc + rts + +Lcc1f: jsr Scc58 + bcs Lcc0a + ldy #$00 +Lcc26: lda Dbffb,X + sta (Z44),Y + iny + bne Lcc26 + inc Z45 +Lcc30: lda Dbffb,X + sta (Z44),Y + iny + bne Lcc30 +Lcc38: dec Z45 + tya + clc + rts + +Lcc3d: jsr Scc58 + bcs Lcc0a + ldy #$00 +Lcc44: lda (Z44),Y + sta Dbffb,X + iny + bne Lcc44 + inc Z45 +Lcc4e: lda (Z44),Y + sta Dbffb,X + iny + bne Lcc4e + beq Lcc38 + +Scc58: lda #$00 + sta Dbff8,X + lda Z46 + asl + sta Dbff9,X + lda Z47 + rol + bcs Lcc6e + sta Dbffa,X + jsr Sca9d +Lcc6e: rts + +Lcc6f: jsr Scd56 + ldy #$10 + bcs Lcce0 + jsr Sccfb + ldy #$02 + lda (Z48),Y + sta Z3e + eor #$01 + beq Lcc88 + bcc Lccdd + jsr Scd16 +Lcc88: ldy #$0e + lda #$fe + sta (Z48),Y + ldy #$04 + sty Z3f + lda (Z48),Y + cmp Dcd35,X + bcs Lccdd + lsr + ror Z3f + lsr + ror Z3f + lsr + ror Z3f + cpx #$01 + beq Lcca9 + lsr + ror Z3f +Lcca9: pha + iny + lda (Z48),Y + cmp Dcd37,X + bcs Lccdd + ora Z3f + pha + jsr Sca8b + pla + sta Dbff9,X + pla + sta Dbffa,X + jsr Sca9d + bcs Lccdd + ldy #$08 + lda (Z48),Y + sta Z3e + iny + lda (Z48),Y + sta Z3f + ldy #$0c + lda (Z48),Y + tay + beq Lccf4 + dey + beq Lccec + dey + beq Lcce2 +Lccdd: sec + ldy #$80 +Lcce0: bne Lccf5 +Lcce2: lda (Z3e),Y + sta Dbffb,X + iny + bne Lcce2 + beq Lccf4 +Lccec: lda Dbffb,X + sta (Z3e),Y + iny + bne Lccec +Lccf4: clc +Lccf5: tya + ldy #$0d + sta (Z48),Y + rts + +Sccfb: ldy D07f8 + ldx #$03 +Lcd00: lda D06f8-$c0,Y + cmp Dcd31,X + lda D0678-$c0,Y + sbc Dcd2d,X + bcs Lcd12 + dex + bpl Lcd00 + rts + +Lcd12: txa + lsr + tax + rts + +Scd16: clc + ldy D07f8 + lda D05f8-$c0,Y + adc Dcd3b,X + sta D05f8-$c0,Y + lda D0578-$c0,Y + adc Dcd39,X + sta D0578-$c0,Y + rts + +Dcd2d: fcb $02,$04,$06,$0c +Dcd31: fcb $30,$60,$40,$80 +Dcd35: fcb $23,$32 +Dcd37: fcb $10,$20 +Dcd39: fcb $02,$06 +Dcd3b: fcb $30,$40 + + +Scd3d: ldy D07f8 + jsr Scfe4 + cmp #$10 + bcs Lcd4c + lda D0478 + beq Lcd55 +Lcd4c: lda D07f8-$c0,Y + eor #$5a + cmp D0778-$c0,Y + sec +Lcd55: rts + +Scd56: jsr Scd3d + bcc Lcd97 + bne Lcd63 + cmp #$33 + bne Lcd97 + clc + rts + +Lcd63: lda #$33 + sta D0778-$c0,Y + jsr Sccfb + bmi Lcd97 + bcc Lcd91 + lda D05f8-$c0,Y + pha + lda D0578-$c0,Y + pha + stx D04f8 + jsr Scd16 + ldy Dcfe2,X + jsr Scdfb + ldx D04f8 + ldy D07f8 + pla + sta D0578-$c0,Y + pla + sta D05f8-$c0,Y +Lcd91: ldy Dcfe2,X + jmp Lcdc1 + +Lcd97: sec + rts + +Scd99: jsr Scd3d + bcc Lcdb0 + bne Lcdb2 + cmp #$cd + bne Lcda6 +Lcda4: clc + rts + +Lcda6: jsr Scdec + bne Lcdb0 + cmp D0778-$c0,Y + beq Lcda4 +Lcdb0: sec + rts + +Lcdb2: jsr Scdec + bne Lcdb0 + sta D0778-$c0,Y + ldy #$00 + asl + bne Lcdc1 + ldy #$87 +Lcdc1: jsr Scdfb + jsr Sca8e + ldy D07f8 + lda D04f8-$c0,Y + cmp #$01 + beq Lcde2 + clc + adc #$04 + sta Dbff8,X + lda D0778-$c0,Y + sta Dbffb,X + eor #$5a + sta Dbffb,X +Lcde2: lda D0778-$c0,Y + eor #$5a + sta D07f8-$c0,Y + clc + rts + +Scdec: lda proflag + beq Lcdf3 + cmp #$4c +Lcdf3: rts + +Lcdf4: ldx D0778 + jsr Sce67 + iny + +Scdfb: lda Dcf30,Y + bne Lcdf4 + rts + +Lce01: and #$0f + sta Dbffb,X + +Sce06: lda #$00 + sta Dbffb,X + rts + +Lce0c: tya + pha + lda D04f8 + cmp #$01 + lda D0478 + sbc #$00 + lsr + lsr + lsr + lsr + tay + lda #$ff + sta Z3e + lda #$03 +Lce23: lsr + ror Z3e + dey + bpl Lce23 + sta Dbffb,X + lda Z3e + sta Dbffb,X + pla + tay + rts + +Lce34: jsr Sce53 + lda #$01 +Lce39: pha + jsr Sce06 + lda #$11 + sta Dbffb,X + pla + pha + sta Dbffb,X + jsr Sce53 + pla + clc + adc #$01 + cmp #$1f + bcc Lce39 + rts + +Sce53: lda #$00 + fcb $2c ; BIT abs opcode to skip two bytes +Lce56: lda #$ff +Lce58: sta Dbffb,X + cmp Dbff8,X + bne Lce58 + ror + bcc Lce66 + sta Dbffb,X +Lce66: rts + +Sce67: cmp #$40 + bcs Lce8e + cmp #$30 + bcs Lcead + cmp #$20 + bcs Lce01 + cmp #$10 + bcs Lce0c + cmp #$04 + beq Lcec5 + bcs Lce85 + cmp #$02 + bcc Lced9 + beq Sce53 + bcs Lce56 +Lce85: cmp #$06 + bcc Lced2 + beq Lce34 + jmp Lcef4 + +Lce8e: pha + and #$3f + beq Lceab + pla + pha + and #$c0 + asl + beq Lcea2 + lda #$ff + bcs Lcea2 + iny + lda Dcf30,Y +Lcea2: sta Dbffb,X + pla + sec + sbc #$01 + bne Lce8e +Lceab: pla + rts + +Lcead: and #$0f +Lceaf: pha + lda #$ff + sta Dbffb,X + sta Dbffb,X + jsr Sce06 + sta Dbffb,X + pla + sec + sbc #$01 + bne Lceaf + rts + +Lcec5: lda D04f8 + sta Dbffb,X + lda D0478 +Lcece: sta Dbffb,X + rts + +Lced2: lda D07f8 + eor #$f0 + bne Lcece +Lced9: lda #$00 + sta Dbff8,X + iny + lda Dcf30,Y + sta Dbff9,X + iny + lda Dcf30,Y + sta Dbffa,X + tya + pha + jsr Sca9d + pla + tay + rts + +Lcef4: tya + pha + ldy D0478 + beq Lcf08 + nop +Lcefc: tya + pha + ldy #$20 + jsr Scf27 + pla + tay + dey + bne Lcefc +Lcf08: lda D04f8 + pha + lsr + lsr + lsr + beq Lcf15 + tay + jsr Scf27 +Lcf15: pla + and #$07 + tay + lda #$00 +Lcf1b: sec + ror + dey + bpl Lcf1b + asl + sta Dbffb,X + pla + tay + rts + +Scf27: lda #$ff +Lcf29: sta Dbffb,X + dey + bne Lcf29 + rts + +Dcf30: fcb $01,$00,$00,$02,$02,$01,$02,$00 + fcb $02,$02,$20,$23,$44,$f4 + fcb "RAM" + fcb $05,$99,$43,$c3,$27,$0d,$20 + fcb $26,$04,$02,$02,$22,$24,$02,$02 + fcb $23,$25,$02,$02,$24,$20,$02,$02 + fcb $07,$02,$02,$01,$0c,$00,$10,$00 + fcb $01,$00,$00,$02,$01,$04,$00,$44 + fcb $02,$0f,$20,$93,$01,$10,$01,$47 + fcb $33,$11,$0f,$04,$00,$00,$fe,$a0 + fcb $41,$7a,$88,$48,$11,$01,$00,$00 + fcb $23,$10,$00,$01,$88,$3f,$84,$3f + fcb $32,$02,$06,$00,$01,$00,$00,$02 + fcb $01,$04,$00,$44,$02,$0f,$20,$93 + fcb $01,$20,$02,$47,$33,$11,$1f,$04 + fcb $00,$00,$fe,$a0,$41,$7a,$88,$48 + fcb $11,$01,$00,$00,$32,$20,$00,$01 + fcb $84,$c8,$f8,$84,$03,$06,$00,$01 + fcb $00,$00,$02,$02,$01,$02,$00,$02 + fcb $02,$82,$41,$06,$83,$44,$04 + fcb "RAM" + fcb $05,$83,$04,$02,$02,$02 + fcb $02,$02,$02,$02,$02,$02,$02,$02 + fcb $02,$00,$44,$ae,$f4,$08,$52,$02 + fcb $02,$00 + +Dcfe2: fcb $30,$5c + +Scfe4: lda D0678-$c0,Y + lsr + sta D0478 + lda D06f8-$c0,Y + ror + sta D04f8 + rts + + fillto $d000,$ff + +; bank 1 common space ($c800-$cfff) + org $d800 + +b1_diag equ *-$1000 + + section diag + phase $0a00 + +Z24 equ $24 +Z28 equ $28 +Z29 equ $29 + +D0400 equ $0400 + +D0d29 equ $0d29 +D0d2a equ $0d2a +D0d2b equ $0d2b +D0d2f equ $0d2f + +diag: stx D0d2b + jsr home + ldy #$00 + jsr S0c7d + jsr Scb00 + sta D0d2a + ldy #$00 + sty D0d2f + asl + bcc L0a1b + dey + tya +L0a1b: sty Z3e + sta Z3f + jsr Scb9b + ldy #$21 + jsr S0c7d + jsr Sca8b + sta Dbffb,X + lda #$04 + sta Dbff9,X + lda #$ff + sta Dbffb,X + ldy D07f8 + sta D0778-$c0,Y +L0a3d: lda #$00 + sta Z24 + ldy #$27 + jsr S0c7d + lda D0d2f + jsr prbyte + ldy #$2c + jsr S0c7d + lda Z24 + clc + adc Z28 + sta S0ae4+1 + lda #$00 + adc Z29 + sta S0ae4+2 + ldy #$08 +L0a62: dey + dey + sty D0d29 + jsr S0ae4 + jsr S0ae8 + bcs L0a80 + ldy D0d29 + bne L0a62 + inc D0d2f + lda kbd + bpl L0a3d + sta kbdstrb + rts + +L0a80: tya + pha + ldy #$35 + jsr S0c7d + lda #$08 + sec + sbc D0d29 + lsr + tay + ora #$b0 + jsr cout + cpy #$03 + bcs L0a9a + pla + rts + +L0a9a: ldy #$42 + jsr S0c7d + ldx D0778 + lda Dbff8,X + dec Dbff8,X + and #$7f + bne L0ab9 + lda Dbff9,X + dec Dbff9,X + and #$7f + bne L0ab9 + dec Dbffa,X +L0ab9: lda Dbffa,X + ldy D0d2a + cpy #$09 + bcs L0ac5 + and #$0f +L0ac5: jsr prbyte + lda Dbff9,X + jsr prbyte + lda Dbff8,X + jsr prbyte + lda #$ad + jsr cout + pla + eor Dbffb,X + jsr prbyte + jsr crout + rts + +S0ae4: inc D0400 + rts + +S0ae8: lda D0af5,Y + pha + lda D0af4,Y + pha + ldx D0d2b + rts + +D0af4: fcb $e3 +D0af5: fcb $0b,$80,$0b,$1d,$0b,$fb,$0a,$a0 + fcb $00,$98,$20,$0a,$0d,$5d,$fa,$bf + fcb $29,$0f,$d0,$13,$98,$dd,$f9,$bf + fcb $d0,$0d,$dd,$f8,$bf,$d0,$08,$20 + fcb $e4,$0a,$c8,$d0,$e4,$18,$60,$38 + fcb $60,$a9,$00,$a0,$f0,$20,$0a,$0d + fcb $ad,$28,$0d,$20,$6b,$0b,$8d,$28 + fcb $0d,$ad,$27,$0d,$20,$6b,$0b,$8d + fcb $27,$0d,$20,$13,$0d,$ee,$28,$0d + fcb $d0,$0c,$ee,$27,$0d,$d0,$07,$ee + fcb $26,$0d,$d0,$02,$18,$60,$20,$e4 + fcb $0a,$bd,$fb,$bf,$bd,$fa,$bf,$4d + fcb $26,$0d,$d0,$10,$bd,$f9,$bf,$cd + fcb $27,$0d,$d0,$08,$bd,$f8,$bf,$cd + fcb $28,$0d,$f0,$bc,$38,$60,$c9,$10 + fcb $90,$06,$c9,$70,$b0,$03,$a9,$70 + fcb $60,$c9,$90,$90,$fb,$c9,$f0,$b0 + fcb $f7,$a9,$f0,$60,$ad,$2a,$0d,$f0 + fcb $0e,$a9,$00,$8d,$30,$0d,$20,$96 + fcb $0b,$20,$96,$0b,$20,$96,$0b,$18 + fcb $60,$20,$8e,$ca,$a8,$98,$9d,$fb + fcb $bf,$20,$be,$0b,$d0,$f7,$20,$e4 + fcb $0a,$98,$20,$0a,$0d,$98,$dd,$fb + fcb $bf,$d0,$0a,$20,$be,$0b,$d0,$f5 + fcb $38,$6e,$30,$0d,$60,$68,$68,$38 + fcb $60,$2c,$30,$0d,$10,$18,$ee,$26 + fcb $0d,$fe,$fa,$bf,$ad,$26,$0d,$4a + fcb $cd,$2a,$0d,$90,$09,$a0,$00,$60 + fcb $ee,$27,$0d,$fe,$f9,$bf,$ee,$28 + fcb $0d,$c8,$60,$00,$55,$aa,$ff,$ad + fcb $2a,$0d,$f0,$13,$a0,$03,$b9,$e0 + fcb $0b,$8d,$2c,$0d,$20,$fe,$0b,$20 + fcb $2e,$0c,$b0,$04,$88,$10,$ef,$18 + fcb $60,$20,$6d,$0c,$20,$0a,$0c,$ce + fcb $2d,$0d,$d0,$f8,$60,$98,$48,$ad + fcb $2c,$0d,$a0,$00,$8c,$2e,$0d,$9d + fcb $fb,$bf,$9d,$fb,$bf,$9d,$fb,$bf + fcb $9d,$fb,$bf,$c8,$d0,$f1,$20,$e4 + fcb $0a,$ee,$2e,$0d,$d0,$e9,$68,$a8 + fcb $60,$20,$6d,$0c,$20,$3c,$0c,$b0 + fcb $05,$ce,$2d,$0d,$d0,$f6,$60,$98 + fcb $48,$ad,$2c,$0d,$a0,$00,$8c,$2e + fcb $0d,$dd,$fb,$bf,$d0,$1e,$dd,$fb + fcb $bf,$d0,$19,$dd,$fb,$bf,$d0,$14 + fcb $dd,$fb,$bf,$d0,$0f,$c8,$d0,$e9 + fcb $20,$e4,$0a,$ee,$2e,$0d,$d0,$e1 + fcb $68,$a8,$18,$60,$a8,$68,$38,$60 + fcb $ad,$2a,$0d,$4a,$8d,$2d,$0d,$4c + fcb $8e,$ca + +L0c77: php + jsr cout + plp + fcb $24 ; BIT zp opcode to skip one byte +S0c7d: clc + jsr S0c8f + lda D0ca1,X + bne L0c77 + jsr S0c8f + lda D0cb0,X + bne L0c77 + rts + +S0c8f: lda D0cc0,Y + bcs L0c9b + lsr + lsr + lsr + lsr + tax + sec + rts + +L0c9b: iny + and #$0f + tax + clc + rts + +D0ca1: fcb $00,$8d,$d2,$c1,$cd,$ae,$d4,$c9 ; "..RAM.TI" + fcb $d3,$a0,$c7,$cf,$cc,$c4,$c5 ; "S GOLDE" +D0cb0: fcb $ce,$00,$c2,$c3,$c6,$c8,$d0,$d9 ; "N.BCFHPY" + fcb $da,$cd,$d1,$d5,$d6,$b1,$b4,$ba ; "ZMQUV14:" +D0cc0: fcb $30,$60,$6c,$7e,$d9,$ef,$a7,$fe + fcb $e2,$7f,$a9,$23,$40,$43,$03,$6b + fcb $29,$6e,$86,$90,$c0,$d5,$0e,$11 + fcb $4e,$4b,$20,$79,$87,$08,$e0,$f9 + fcb $01,$90,$20,$76,$e8,$11,$01,$06 + fcb $38,$80,$f9,$01,$99,$99,$6e,$86 + fcb $7f,$a9,$55,$50,$19,$11,$03,$32 + fcb $d9,$04,$37,$c0,$b2,$e5,$97,$d0 + fcb $f9,$01,$99,$93,$dd,$2e,$88,$0f + fcb $90,$19,$8d,$28,$0d,$8d,$27,$0d + fcb $8c,$26,$0d,$ad,$28,$0d,$9d,$f8 + fcb $bf,$ad,$27,$0d,$9d,$f9,$bf,$ad + fcb $26,$0d,$9d,$fa,$bf,$60 + + dephase + endsection diag + +b1_diag_end equ *-$1000 + +b1_partmgr equ *-$1000 + + section partmgr + phase $0a00 + +Z24 equ $24 +Z25 equ $25 +Z32 equ $32 +Z3e equ $3e +Z3f equ $3f + +D03b8 equ $03b8 +D06b8 equ $06b8 +D0738 equ $0738 +D0778 equ $0778 +nnD07f8 equ $07f8 + +D0800 equ $0800 +D0802 equ $0802 +D0803 equ $0803 +D0804 equ $0804 +D0805 equ $0805 +D0808 equ $0808 +D0900 equ $0900 +D0901 equ $0901 +D0902 equ $0902 +D0903 equ $0903 +D0908 equ $0908 + +Dbff8 equ $bff8 +Dbffb equ $bffb + +Lc9df equ $c9df +Sca8b equ $ca8b +Sca8e equ $ca8e +Scaeb equ $caeb +Scb9b equ $cb9b +Scdfb equ $cdfb + +bell12 equ $fbe2 +clreop equ $fc42 +home equ $fc58 +rdkey equ $fd0c +crout equ $fd8e +cout equ $fded + +partmgr: + jsr Sca8b + lda Dbffb,X + cmp #$ae + bne L0a1b + eor Dbffb,X + cmp #$5a + bne L0a1b + lda Dbffb,X + eor Dbffb,X + cmp #$5a + beq L0a6b +L0a1b: ldy D07f8 + lda D06b8,Y + eor D0738,Y + cmp #$5a + bne L0a3f + jsr home + ldy #$88 + jsr S0c8e + lda #'?'+$80 + jsr cout + jsr rdkey_uc + cmp #'Y'+$80 + beq L0a3f + jmp L0e06 + +L0a3f: jsr Sca8b + ldy #$aa + jsr Scdfb + jsr Sca8b + lda #$04 + sta Dbff8,X + ldy D07f8 + lda D03b8,Y + pha + sta Dbffb,X + lda #$0a + sta Dbff8,X + pla + asl + sec + sbc #$01 + sta Dbffb,X + lda #$fc + sta Dbffb,X +L0a6b: jsr Sca8e + jsr Scaeb + lda D0802 + sta D0901 + jsr home + lsr D0900 +L0a7d: lda #$00 + sta Z24 + sta Z25 + ldy #$00 + jsr S0c8e + lda D07f8 + eor #$70 + jsr cout + jsr crout + jsr crout + ldy #$00 +L0a98: jsr S0c03 + iny + cpy #$09 + bcc L0a98 + ldy #$14 + jsr S0c8e + ldy #$59 + bit D0900 + bpl L0aae + ldy #$27 +L0aae: jsr S0c8e + jsr clreop + + jsr rdkey_uc + cmp #'1'+$80 + bcc L0acf ; not a digit + cmp #'9'+1+$80 + bcs L0acf ; not a digit + + sbc #$b0 ; ASCII to binary digit + jsr S0c81 + sta D0901 + bit D0900 + bmi L0a7d + jmp L0df6 + +L0acf: sta D0902 + ldy #$06 + bit D0900 + bpl L0adb + ldy #$fd ; 253 } +L0adb: iny + iny + iny + lda D0af7,Y + beq L0af1 + cmp D0902 + bne L0adb + lda D0af9,Y + pha + lda D0af8,Y + pha + rts + +L0af1: jsr bell12 + jmp L0a7d + +D0af7: fcb $ce ; "N" +D0af8: fcb $50 ; "P" +D0af9: fcb $0b,$c3,$f4,$0b,$d3,$70,$0b,$8d ; ".Ct.Sp.." + fcb $15,$0b,$88,$38,$0b,$8b,$38,$0b ; "...8..8." + fcb $8a,$48,$0b,$95,$48,$0b,$9b,$2a ; ".H..H..*" + fcb $0b,$d2,$23,$0b,$00,$2c,$00,$09 ; ".R#..,.." + fcb $30,$03,$4c,$f6,$0d,$20,$e8,$0d ; "0.Lv. h." + fcb $4c,$7a,$0a,$38,$6e,$00,$09,$4c ; "Lz.8n..L" + fcb $7d,$0a,$2c,$00,$09,$10,$03,$4c ; "}.,....L" + fcb $00,$0a,$20,$d7,$0d,$4c,$36,$0e ; ".. W.L6." + fcb $ad,$01,$09,$38,$e9,$18,$c9,$e0 ; "-..8i.I`" + fcb $b0,$03,$8d,$01,$09,$4c,$7d,$0a ; "0....L}." + fcb $ad,$01,$09,$18,$69,$18,$90,$ee ; "-...i..n" + fcb $a0,$76,$20,$8e,$0c,$a2,$10,$20 ; " v ..". " + fcb $4f,$0e,$b0,$11,$a2,$00,$ac,$01 ; "O.0.".,." + fcb $09,$bd,$08,$09,$99,$08,$08,$c8 ; ".=.....H" + fcb $e8,$e0,$10,$90,$f4,$4c,$7d,$0a ; "h`..tL}." + fcb $20,$43,$0e,$f0,$74,$98,$18,$69 ; " C.pt..i" + fcb $18,$a8,$c0,$e0,$b0,$6b,$20,$46 ; ".(@`0k F" + fcb $0e,$f0,$66,$a0,$7f,$20,$8e,$0c ; ".pf . .." + fcb $a2,$06,$20,$4f,$0e,$20,$a1,$0e ; "". O. !." + fcb $0e,$04,$09,$2e,$05,$09,$0e,$04 ; "........" + fcb $09,$2e,$05,$09,$18,$ac,$01,$09 ; ".....,.." + fcb $b9,$03,$08,$79,$1b,$08,$8d,$06 ; "9..y...." + fcb $09,$b9,$02,$08,$79,$1a,$08,$8d ; ".9..y..." + fcb $07,$09,$38,$ad,$06,$09,$ed,$04 ; "..8-..m." + fcb $09,$48,$ad,$07,$09,$ed,$05,$09 ; ".H-..m.." + fcb $90,$23,$99,$1a,$08,$68,$99,$1b ; ".#...h.." + fcb $08,$18,$ad,$04,$09,$99,$03,$08 ; "..-....." + fcb $79,$01,$08,$99,$19,$08,$ad,$05 ; "y.....-." + fcb $09,$99,$02,$08,$79,$00,$08,$99 ; "....y..." + fcb $18,$08,$4c,$7d,$0a,$68,$a0,$d5 ; "..L}.h U" + fcb $2c,$a0,$c9,$20,$8e,$0c,$20,$0c ; ", I .. ." + fcb $fd,$4c,$7d,$0a,$20,$43,$0e,$d0 ; "}L}. C.P" + fcb $06,$ae,$01,$09,$fe,$05,$08,$4c ; "....~..L" + fcb $7d,$0a ; "}." + +S0c03: tya + pha + jsr S0c81 + pha + ldx #$ff + cmp D0901 + bne L0c12 + ldx #$3f +L0c12: stx Z32 + jsr S0c79 + tya + clc + adc #$b1 + jsr cout + jsr S0c79 + pla + pha + tay + ldx #$10 +L0c26: lda D0808,Y + bne L0c2d + lda #' '+$80 +L0c2d: jsr cout + iny + dex + bne L0c26 + jsr S0c79 + pla + pha + tay + lda D0802,Y + sta Z3f + lda D0803,Y + sta Z3e + jsr Scb9b + lda #$ff + sta Z32 + jsr S0c79 + pla + tay + lda D0805,Y + eor #$5a + cmp D0804,Y + beq L0c5c + lda #$01 +L0c5c: ldy #$04 +L0c5e: cmp D0c6f,Y + beq L0c66 + dey + bne L0c5e +L0c66: lda D0c74,Y + tay + jsr S0c8e + pla + tay +D0c6f: rts + + fcb $4c,$00,$33,$cd ; "L.3M" +D0c74: fcb $df,$e9,$f5,$e4,$ef ; "_iudo" + +S0c79: lda #' '+$80 + jsr cout + jmp cout + +S0c81: sta D0902 + asl + adc D0902 + asl + asl + asl + adc #$08 + rts + +S0c8e: clc +L0c8f: jsr S0cac + lda D0cbe,X + bne L0ca0 + jsr S0cac + lda D0ccd,X + bne L0ca0 + rts + +L0ca0: php + bmi L0ca6 + jsr S0c79 +L0ca6: jsr cout + plp + bne L0c8f + +S0cac: lda D0cdd,Y + bcs L0cb8 + lsr + lsr + lsr + lsr + tax + sec + rts + +L0cb8: iny + and #$0f + tax + clc + rts + +D0cbe: fcb $00,$8d,$01,$c7,$cc,$c9,$d4,$c3 ; "...GLITC" + fcb $c8,$a0,$d2,$c5,$c1,$d3,$cf ; "H REASO" +D0ccd: fcb $ce,$00,$c6,$d0,$d5,$c4,$cd,$ad ; "N.FPUDM-" + fcb $b1,$b9,$bd,$c2,$d1,$d7,$da,$d9 ; "19=BQWZY" +D0cdd: fcb $1a,$c0,$60,$2c,$76,$ea,$90,$3c ; ".@`,vj.<" + fcb $a6,$56,$5e,$fd,$22,$29,$9d,$4e ; "&V^}").N" + fcb $69,$0a,$90,$19,$10,$4d,$b9,$ca ; "i....M9J" + fcb $ae,$0d,$d9,$ea,$90,$80,$70,$99 ; "..Yj..p." + fcb $6e,$9d,$b4,$b7,$61,$10,$19,$f0 ; "n.47a..p" + fcb $af,$c0,$6b,$97,$8c,$f3,$b2,$29 ; "/@k..s2)" + fcb $ab,$60,$a5,$fd,$6c,$44,$97,$8c ; "+`%}lD.." + fcb $f3,$bd,$1d,$0a,$d5,$0e,$b9,$78 ; "s=..U.9x" + fcb $cf,$3b,$22,$9b,$d7,$0a,$02,$ea ; "O;".W..j" + fcb $3b,$69,$78,$cf,$3b,$d1,$70,$a7 ; ";ixO;Qp'" + fcb $4b,$ca,$90,$3c,$a6,$56,$5e,$f0 ; "KJ.<&V^p" + fcb $19,$ab,$60,$a0,$be,$e6,$96,$8b ; ".+` >f.." + fcb $90,$3c,$a6,$56,$5e,$f2,$9a,$0a ; ".<&V^r.." + fcb $ab,$7e,$f0,$25,$30,$4a,$b1,$bd ; "+~p%0J1=" + fcb $70,$a0,$c0,$45,$60,$19,$11,$fb ; "p @E`..{" + fcb $0d,$9f,$c0,$6b,$90,$a9,$01,$11 ; "..@k.).." + fcb $fb,$0d,$9d,$50,$eb,$90,$a9,$01 ; "{..Pk.)." + fcb $10,$dc,$af,$5f,$30,$79,$5f,$d6 ; ".\/_0y_V" + fcb $c4,$45,$f3,$90,$3c,$a6,$56,$5e ; "DEs.<&V^" + fcb $fd,$90,$5b,$d6,$ae,$0f,$d1,$68 ; "}.[V..Qh" + fcb $b9,$05,$5a,$b7,$6e,$a0,$f0,$79 ; "9.Z7n py" + fcb $3e,$9c,$8b,$c0,$50,$19,$11,$7c ; ">..@P..|" + fcb $ff,$e6,$90,$be,$e6,$96,$8c,$69 ; ".f.>f..i" + fcb $03,$ca,$65,$65,$ef,$10,$be,$e6 ; ".Jeeo.>f" + fcb $90,$2a,$e0,$69,$d4,$e6,$90,$a9 ; ".*`iTf.)" + fcb $01,$11,$7c,$ff,$e6,$97,$8c,$f3 ; "..|.f..s" + fcb $b9,$d5,$0e,$b0,$19,$11,$d5,$0e ; "9U.0..U." + fcb $b9,$6e,$e9,$4c,$a3,$b0,$19,$74 ; "9niL#0.t" + fcb $bc,$a9,$10,$19,$05,$ed,$99,$91 ; "<)...m.." + fcb $01,$03,$ae,$05,$ed,$10,$19,$70 ; "....m..p" + fcb $30,$70,$69,$91,$01,$03,$cd,$7c ; "0pi...M|" + fcb $41,$01 ; "A." + +S0dd7: lda D0901 + sta D0802 + eor #$5a + sta D0803 + jsr S0de8 + jmp Lc9df + +S0de8: jsr Sca8b + tay +L0dec: lda D0800,Y + sta Dbffb,X + iny + bne L0dec + rts + +L0df6: jsr S0dd7 + jsr S0e43 + bne L0e09 + lda D0802,Y + ora D0803,Y + beq L0e09 +L0e06: jsr S0e27 +L0e09: ldy #$ae + jsr S0c8e +L0e0e: ldx #$01 + jsr S0e4f + bcs L0e36 + lda D0908 + cmp #$b1 + bcc L0e0e + cmp #$b8 + bcs L0e0e + adc #$10 + tay + lda #$00 + beq L0e2f + +S0e27: ldx D0778 + ldy D07f8 + lda #$7b +L0e2f: sty L00+1 + sta L00 + jmp (L00) + +L0e36: ldx #$02 + lda #$00 +L0e3a: sta D0800,X + dex + bpl L0e3a + jmp (resetvec) + +S0e43: ldy D0901 + lda D0804,Y + eor D0805,Y + cmp #$5a + rts + +S0e4f: stx D0903 + lda #$a0 +L0e54: sta D0908,X + dex + bpl L0e54 + inx +L0e5b: jsr rdkey_uc + cmp #$88 + beq L0e84 + cmp #$8d + beq L0e82 + cmp #$9b + beq L0e83 + cmp #$a0 + bcs L0e74 +L0e6e: jsr bell12 + jmp L0e5b + +L0e74: cpx D0903 + bcs L0e6e + sta D0908,X + jsr cout + inx + bne L0e5b +L0e82: clc +L0e83: rts + +L0e84: txa + beq L0e5b + dex + dec Z24 + lda #$a0 + sta D0908,X + jsr cout + dec Z24 + jmp L0e5b + +rdkey_uc: + jsr rdkey + cmp #$e0 ; lower case? + bcc L0ea0 ; no + and #$df ; yes, convert to upper case +L0ea0: rts + + fcb $a9,$00,$a8,$aa,$8d,$04,$09,$8e ; ").(*...." + fcb $05,$09,$a9,$0a,$8d,$02,$09,$a2 ; "..)...."" + fcb $00,$b9,$08,$09,$49,$b0,$c9,$0a ; ".9..I0I." + fcb $90,$01,$60,$6d,$04,$09,$48,$8a ; "..`m..H." + fcb $6d,$05,$09,$aa,$68,$ce,$02,$09 ; "m..*hN.." + fcb $d0,$f1,$c8,$d0,$d7 ; "PqHPW" + + dephase + endsection partmgr + +b1_partmgr_end equ *-$1000 + + fillto $dfff,$ff