; 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