8000 org $8008 8008 ACIA: rmb 2 800A org $8010 8010 PIA: rmb 4 A400 org $A400 A400 rmb $3a3 A7A3 STACK: rmb 1 A7A4 YADDR: rmb 2 A7A6 XADDR: rmb 2 A7A8 DISPL: rmb $10 A7B8 CARRY: rmb 1 A7B9 KEY: rmb 1 A7BA SAVEX: rmb 2 A7BC INDEX: rmb 2 A7BE NMIV: rmb 2 A7C0 SWIV: rmb 2 A7C2 IRQV: rmb 2 A7C4 LENGTH: rmb 1 A7C5 HEADER: rmb 3 A7C8 BEGA: rmb 2 A7CA ENDA: rmb 2 A7CC ACTADD: rmb 2 A7CE CKSM: rmb 1 A7CF RG: rmb 2 A7D1 SWITCH: rmb 1 A7D2 HDRSW: rmb 1 A7D3 BPTABL: rmb $2d A800 ENDBPT: rmb 1 F800 org $F800 F800 START: F800 0E cli F801 CE FA EB ldx #SWIR F804 FF A7 C0 stx SWIV F807 CE FB 4C ldx #SSLOOP F80A FF A7 C2 stx IRQV F80D FF A7 BE stx NMIV F810 CE 80 10 ldx #PIA F813 6F 02 clr 2,x F815 6F 03 clr 3,x F817 86 0F ldaa #$F F819 A7 01 staa 1,x F81B 86 FF ldaa #$FF F81D A7 00 staa 0,x F81F 4A deca F820 A7 02 staa 2,x F822 A7 03 staa 3,x F824 86 03 ldaa #3 F826 B7 80 08 staa ACIA F829 86 18 ldaa #24 F82B B7 A7 C4 staa LENGTH F82E 7E FA 90 jmp GOTOK F831 ; display and entry multiplexor F831 DISP4: F831 8D 00 bsr *+2 F833 DISP2: F833 8D 00 bsr *+2 F835 DISP: F835 4F clra F836 CE A7 A8 ldx #DISPL F839 GOON: F839 C6 FF ldab #$FF F83B F7 80 10 stab PIA F83E B7 80 11 staa PIA+1 F841 8D 25 bsr TSTKEY F843 26 13 bne KPSH F845 E6 00 ldab 0,x F847 F7 80 10 stab PIA F84A 8D 23 bsr DEL F84C 08 inx F84D 4C inca F84E 81 08 cmpa #8 F850 26 E7 bne GOON F852 86 FF ldaa #$FF F854 B7 80 10 staa PIA F857 39 rts F858 ; wait for key release F858 KPSH: F858 1B aba F859 C6 FF ldab #$FF F85B F7 80 10 stab PIA F85E B7 A7 B9 staa KEY F861 KPSH1: F861 8D 0C bsr DEL F863 8D 03 bsr TSTKEY F865 26 FA bne KPSH1 F867 39 rts F868 ; query key F868 TSTKEY: F868 F6 80 11 ldab PIA+1 F86B CA 0F orab #$F F86D 53 comb F86E 39 rts F86F ; delay F86F DEL: F86F 36 psha F870 4F clra F871 DEL1: F871 4A deca F872 26 FD bne DEL1 F874 32 pula F875 39 rts F876 ; wait for input F876 WAIT: F876 8D 0B bsr BUILD F878 GETKEY: F878 7F A7 B9 clr KEY F87B WAIT1: F87B 8D B8 bsr DISP F87D 7D A7 B9 tst KEY F880 27 F9 beq WAIT1 F882 39 rts F883 ; build 7seg display from ASCII buffer F883 BUILD: F883 CE A7 A8 ldx #DISPL F886 BUILD1: F886 E6 08 ldab 8,x F888 FF A7 BA stx SAVEX F88B CE FE 82 ldx #CTABLE F88E ACODE1: F88E A6 00 ldaa 0,x F890 11 cba F891 26 04 bne ACODE2 F893 E6 01 ldab 1,x F895 20 0A bra ADONE F897 ACODE2: F897 08 inx F898 08 inx F899 08 inx F89A 8C FE D6 cpx #ENDTAB F89D 26 EF bne ACODE1 F89F C6 FF ldab #$FF F8A1 ADONE: F8A1 FE A7 BA ldx SAVEX F8A4 E7 00 stab 0,x F8A6 08 inx F8A7 8C A7 B0 cpx #(DISPL+8) F8AA 26 DA bne BUILD1 F8AC 39 rts F8AD ; Put CARRY into ASCII buffer F8AD ; put key input into CARRY F8AD INDIS4: F8AD 8D 00 bsr *+2 F8AF INDIS2: F8AF 8D 00 bsr *+2 F8B1 INDIS1: F8B1 8D 55 bsr SHIFT8 F8B3 INDIS0: F8B3 8D 09 bsr OUTDIS F8B5 27 04 beq CNTRL2 F8B7 F7 A7 B8 stab CARRY F8BA 39 rts F8BB CNTRL2: F8BB 7E FA 57 jmp CNTRLA F8BE ; put new key input into CARRY F8BE OUTDIS: F8BE 8D B6 bsr WAIT F8C0 F6 A7 B9 ldab KEY F8C3 CE FE 82 ldx #CTABLE F8C6 KCODE1: F8C6 A6 02 ldaa 2,x F8C8 11 cba F8C9 27 08 beq KDONE F8CB 08 inx F8CC 08 inx F8CD 08 inx F8CE 8C FE D6 cpx #ENDTAB F8D1 26 F3 bne KCODE1 F8D3 KDONE: F8D3 E6 00 ldab 0,x F8D5 ; check if keyboard input is hexadecimal F8D5 C1 30 cmpb #'0' F8D7 2B 0C bmi NO F8D9 C1 46 cmpb #'F' F8DB 2E 08 bgt NO F8DD C1 3A cmpb #':' F8DF 2B 05 bmi YES F8E1 C1 40 cmpb #'@' F8E3 2E 01 bgt YES F8E5 NO: F8E5 5F clrb F8E6 YES: F8E6 39 rts F8E7 ; convert ACIA data to hex F8E7 INHEX: F8E7 BD FD 72 jsr INACIA F8EA 80 30 suba #'0' F8EC 2B 0F bmi DERR F8EE 81 09 cmpa #9 F8F0 2F 0A ble INDONE F8F2 81 11 cmpa #$11 F8F4 2B 07 bmi DERR F8F6 81 16 cmpa #$16 F8F8 2E 03 bgt DERR F8FA 80 07 suba #7 F8FC INDONE: F8FC 39 rts F8FD DERR: F8FD C6 35 ldab #'5' F8FF 7E F9 CF jmp ERROR F902 ; shift ASCII buffer F902 SHIF88: F902 8D 00 bsr *+2 F904 SHIF48: F904 8D 00 bsr *+2 F906 SHIF28: F906 8D 00 bsr *+2 F908 SHIFT8: F908 CE A7 B0 ldx #(DISPL+8) F90B SHIFT: F90B A6 01 ldaa 1,x F90D A7 00 staa 0,x F90F 08 inx F910 8C A7 B8 cpx #(DISPL+16) F913 26 F6 bne SHIFT F915 6F 00 clr 0,x F917 39 rts F918 ; convert ASCII to hex F918 GETHEX: F918 7D A7 D1 tst SWITCH F91B 26 CA bne INHEX F91D A6 00 ldaa 0,x F91F 80 30 suba #'0' F921 81 09 cmpa #9 F923 2F 02 ble OUTHEX F925 80 07 suba #7 F927 OUTHEX: F927 08 inx F928 39 rts F929 ; convert 2 hex into 1 byte F929 BYTE: F929 8D ED bsr GETHEX F92B 48 asla F92C 48 asla F92D 48 asla F92E 48 asla F92F 37 pshb F930 16 tab F931 8D E5 bsr GETHEX F933 1B aba F934 16 tab F935 FB A7 CE addb CKSM F938 F7 A7 CE stab CKSM F93B 33 pulb F93C 39 rts F93D ; entry of command and address F93D DISADD: F93D 8D C3 bsr SHIF88 F93F DISAD1: F93F F7 A7 B8 stab CARRY F942 8D C4 bsr SHIFT8 F944 DIS: F944 BD F8 AD jsr INDIS4 F947 8D BF bsr SHIFT8 F949 7F A7 B9 clr KEY F94C BD FA 00 jsr TIMEDP F94F ; 2 byte to INDEX F94F CE A7 B4 ldx #(DISPL+$C) F952 BADDR: F952 8D D5 bsr BYTE F954 B7 A7 BC staa INDEX F957 8D D0 bsr BYTE F959 B7 A7 BD staa INDEX+1 F95C FE A7 BC ldx INDEX F95F 39 rts F960 ; jump to chosen address F960 GOTOG: F960 C6 47 ldab #'G' F962 8D D9 bsr DISADD F964 6E 00 jmp 0,x F966 ; nibble as ASCII into CARRY F966 ASCIH: F966 44 lsra F967 44 lsra F968 44 lsra F969 44 lsra F96A ASCIL: F96A 84 0F anda #$F F96C 8B 30 adda #$30 ; '0' F96E 81 39 cmpa #$39 ; '9' F970 23 02 bls OK F972 8B 07 adda #7 F974 OK: F974 39 rts F975 ; CARRY into ASCII buffer F975 LOADC: F975 B7 A7 B8 staa CARRY F978 20 8E bra SHIFT8 F97A ; 1 or 2 bytes into ASCII buffer F97A INBYT2: F97A 8D 00 bsr *+2 F97C INBYTE: F97C A6 00 ldaa 0,x F97E FF A7 BA stx SAVEX F981 8D E3 bsr ASCIH F983 8D F0 bsr LOADC F985 FE A7 BA ldx SAVEX F988 A6 00 ldaa 0,x F98A 8D DE bsr ASCIL F98C 8D E7 bsr LOADC F98E FE A7 BA ldx SAVEX F991 08 inx F992 39 rts F993 ; query and modify memory F993 GOTOM: F993 C6 4D ldab #'M' F995 8D A6 bsr DISADD F997 GOTOM1: F997 BD F9 06 jsr SHIF28 F99A FE A7 BC ldx INDEX F99D 8D DD bsr INBYTE F99F NEW: F99F BD F8 BE jsr OUTDIS F9A2 27 0B beq GORD F9A4 F7 A7 B8 stab CARRY F9A7 CE A7 B6 ldx #(DISPL+14) F9AA BD F9 0B jsr SHIFT F9AD 20 F0 bra NEW F9AF GORD: F9AF 8D 7F bsr ORDER F9B1 BD FA 44 jsr CHANGE F9B4 FE A7 BC ldx INDEX F9B7 F6 A7 B9 ldab KEY F9BA C1 46 cmpb #$46 ; down arrow key F9BC 27 06 beq INCR F9BE C1 45 cmpb #$45 ; up arrow key F9C0 26 20 bne CNTRL3 F9C2 09 dex F9C3 09 dex F9C4 INCR: F9C4 08 inx F9C5 FF A7 BC stx INDEX F9C8 CE A7 BC ldx #INDEX F9CB 8D AD bsr INBYT2 F9CD 20 C8 bra GOTOM1 F9CF ; emit error F9CF ; error code in B F9CF ERROR: F9CF 86 15 ldaa #$15 F9D1 B7 80 08 staa ACIA F9D4 37 pshb F9D5 CE FE 54 ldx #TERROR F9D8 8D 41 bsr LTEXT F9DA 33 pulb F9DB CE A7 B7 ldx #(DISPL+15) F9DE E7 00 stab 0,x F9E0 8D 05 bsr BLINK1 F9E2 CNTRL3: F9E2 20 73 bra CNTRLA F9E4 ; blink character F9E4 BLINK: F9E4 CE A7 B0 ldx #(DISPL+8) F9E7 BLINK1: F9E7 7F A7 B9 clr KEY F9EA BLINK2: F9EA A6 00 ldaa 0,x F9EC 36 psha F9ED 86 0A ldaa #$A F9EF 6F 00 clr 0,x F9F1 8D 0F bsr TIMED1 F9F3 32 pula F9F4 A7 00 staa 0,x F9F6 86 0A ldaa #$A F9F8 8D 08 bsr TIMED1 F9FA 7D A7 B9 tst KEY F9FD 27 EB beq BLINK2 F9FF 39 rts FA00 ; 1 second fixed display FA00 TIMEDP: FA00 86 32 ldaa #$32 FA02 TIMED1: FA02 36 psha FA03 FF A7 BC stx INDEX FA06 BD F8 83 jsr BUILD FA09 7D A7 B9 tst KEY FA0C 26 08 bne STOP FA0E TIME1: FA0E BD F8 35 jsr DISP FA11 32 pula FA12 4A deca FA13 36 psha FA14 26 F8 bne TIME1 FA16 STOP: FA16 FE A7 BC ldx INDEX FA19 32 pula FA1A 39 rts FA1B ; load text into ASCII buffer FA1B LTEXT: FA1B C6 08 ldab #8 FA1D LTEXT1: FA1D A6 00 ldaa 0,x FA1F B7 A7 B8 staa CARRY FA22 FF A7 BA stx SAVEX FA25 BD F9 08 jsr SHIFT8 FA28 FE A7 BA ldx SAVEX FA2B 08 inx FA2C 5A decb FA2D 26 EE bne LTEXT1 FA2F 39 rts FA30 ; check command modifier FA30 ORDER: FA30 F6 A7 B9 ldab KEY FA33 C1 44 cmpb #$44 ; left arrow FA35 27 08 beq ENDORD FA37 C1 45 cmpb #$45 ; up arrow FA39 27 04 beq ENDORD FA3B C1 46 cmpb #$46 ; down arrow FA3D 26 18 bne CNTRLA FA3F ENDORD: FA3F 39 rts FA40 ; modify error FA40 MERR1: FA40 C6 31 ldab #'1' FA42 ERROR0: FA42 20 8B bra ERROR FA44 ; change memory cell FA44 CHANGE: FA44 CE A7 B6 ldx #(DISPL+$E) FA47 CHANG1: FA47 BD F9 29 jsr BYTE FA4A FE A7 BC ldx INDEX FA4D A7 00 staa 0,x FA4F A1 00 cmpa 0,x FA51 26 ED bne MERR1 FA53 39 rts FA54 ; main loop FA54 CNTRL: FA54 7F A7 B9 clr KEY FA57 CNTRLA: FA57 8E A7 A3 lds #STACK FA5A 7F A7 D1 clr SWITCH FA5D 86 15 ldaa #$15 FA5F B7 80 08 staa ACIA FA62 CLOOP: FA62 CE FE 5A ldx #TEUROC FA65 8D B4 bsr LTEXT FA67 8D 97 bsr TIMEDP FA69 CE FE 62 ldx #TCONTR FA6C 8D AD bsr LTEXT FA6E 8D 90 bsr TIMEDP FA70 BD F9 02 jsr SHIF88 FA73 8D 8B bsr TIMEDP FA75 B6 A7 B9 ldaa KEY FA78 CE FE D5 ldx #FCTABL FA7B TSTNXT: FA7B A1 00 cmpa 0,x FA7D 27 0D beq GOOD FA7F 08 inx FA80 08 inx FA81 08 inx FA82 8C FE F3 cpx #IRQ ; end of function table FA85 26 F4 bne TSTNXT FA87 7F A7 B9 clr KEY FA8A 20 D6 bra CLOOP FA8C GOOD: FA8C EE 01 ldx 1,x FA8E 6E 00 jmp 0,x FA90 ; clear all break points FA90 GOTOK: FA90 CE A7 D3 ldx #BPTABL FA93 KILL: FA93 A6 02 ldaa 2,x FA95 27 08 beq NOBPT FA97 6F 02 clr 2,x FA99 EE 00 ldx 0,x FA9B A7 00 staa 0,x FA9D 20 F1 bra GOTOK FA9F NOBPT: FA9F 08 inx FAA0 08 inx FAA1 08 inx FAA2 8C A8 00 cpx #ENDBPT FAA5 26 EC bne KILL FAA7 CNTRL4: FAA7 20 AB bra CNTRL FAA9 PERR: FAA9 C6 34 ldab #'4' FAAB ERROR2: FAAB 20 95 bra ERROR0 FAAD MERR: FAAD C6 32 ldab #'2' FAAF 20 91 bra ERROR0 FAB1 ; set Breakpoint FAB1 GOTOP: FAB1 C6 50 ldab #'P' FAB3 BD F9 3D jsr DISADD FAB6 A6 00 ldaa 0,x FAB8 C6 3F ldab #$3F FABA 11 cba FABB 27 EC beq PERR FABD E7 00 stab 0,x FABF E6 00 ldab 0,x FAC1 C1 3F cmpb #$3F FAC3 26 E8 bne MERR FAC5 CE A7 D3 ldx #BPTABL FAC8 NXTTRY: FAC8 E6 02 ldab 2,x FACA 26 0E bne FILLED FACC A7 02 staa 2,x FACE F6 A7 BC ldab INDEX FAD1 E7 00 stab 0,x FAD3 F6 A7 BD ldab INDEX+1 FAD6 E7 01 stab 1,x FAD8 CNTRL5: FAD8 20 CD bra CNTRL4 FADA FILLED: FADA 08 inx FADB 08 inx FADC 08 inx FADD 8C A8 00 cpx #ENDBPT FAE0 26 E6 bne NXTTRY FAE2 FE A7 BC ldx INDEX FAE5 A7 00 staa 0,x FAE7 C6 33 ldab #'3' FAE9 20 C0 bra ERROR2 FAEB SWIR: FAEB 30 tsx FAEC 6D 06 tst 6,x FAEE 26 02 bne SWIR1 FAF0 6A 05 dec 5,x FAF2 SWIR1: FAF2 6A 06 dec 6,x FAF4 34 des FAF5 34 des FAF6 34 des FAF7 8D 72 bsr REGDIS FAF9 31 ins FAFA 31 ins FAFB 31 ins FAFC 30 tsx FAFD EE 05 ldx 5,x FAFF FF A7 BC stx INDEX FB02 CE A7 D3 ldx #BPTABL FB05 NXTBPT: FB05 A6 00 ldaa 0,x FB07 B1 A7 BC cmpa INDEX FB0A 26 19 bne NOFIT FB0C A6 01 ldaa 1,x FB0E B1 A7 BD cmpa INDEX+1 FB11 26 12 bne NOFIT FB13 A6 02 ldaa 2,x FB15 6F 02 clr 2,x FB17 FE A7 BC ldx INDEX FB1A A7 00 staa 0,x FB1C C1 47 cmpb #$47 ; key K FB1E 27 0D beq CNTRL6 FB20 C1 43 cmpb #$43 ; key S FB22 27 3E beq ST FB24 3B rti FB25 NOFIT: FB25 08 inx FB26 08 inx FB27 08 inx FB28 8C A8 00 cpx #ENDBPT FB2B 26 D8 bne NXTBPT FB2D CNTRL6: FB2D 20 A9 bra CNTRL5 FB2F GOTOS: FB2F 4F clra FB30 36 psha FB31 BF A7 CF sts RG FB34 36 psha FB35 36 psha FB36 36 psha FB37 36 psha FB38 36 psha FB39 36 psha FB3A C6 35 ldab #'5' FB3C BD F9 3D jsr DISADD FB3F FE A7 CF ldx RG FB42 B6 A7 BC ldaa INDEX FB45 A7 00 staa 0,x FB47 B6 A7 BD ldaa INDEX+1 FB4A A7 01 staa 1,x FB4C SSLOOP: FB4C 86 3E ldaa #%111110 FB4E B7 80 12 staa PIA+2 FB51 B6 80 10 ldaa PIA FB54 34 des FB55 34 des FB56 34 des FB57 8D 12 bsr REGDIS FB59 27 D2 beq CNTRL6 FB5B 31 ins FB5C 31 ins FB5D 31 ins FB5E C1 40 cmpb #$40 ; key G FB60 27 08 beq GO FB62 ST: FB62 86 37 ldaa #%110111 FB64 B7 80 12 staa PIA+2 FB67 01 nop FB68 01 nop FB69 01 nop FB6A GO: FB6A 3B rti FB6B ; display registers FB6B REGDIS: FB6B 30 tsx FB6C 08 inx FB6D 08 inx FB6E EF 00 stx 0,x FB70 6F 02 clr 2,x FB72 FF A7 CF stx RG FB75 86 05 ldaa #5 FB77 REGCH: FB77 36 psha FB78 FE A7 CF ldx RG FB7B FF A7 BC stx INDEX FB7E CE FE 6A ldx #TRGSTR FB81 SEARCH: FB81 4A deca FB82 27 12 beq REGOUT FB84 08 inx FB85 08 inx FB86 FF A7 BA stx SAVEX FB89 FE A7 BC ldx INDEX FB8C 08 inx FB8D 08 inx FB8E FF A7 BC stx INDEX FB91 FE A7 BA ldx SAVEX FB94 20 EB bra SEARCH FB96 REGOUT: FB96 A6 01 ldaa 1,x FB98 36 psha FB99 A6 00 ldaa 0,x FB9B BD F9 75 jsr LOADC FB9E 32 pula FB9F BD F9 75 jsr LOADC FBA2 86 3D ldaa #'=' FBA4 BD F9 75 jsr LOADC FBA7 BD F9 08 jsr SHIFT8 FBAA FE A7 BC ldx INDEX FBAD BD F9 7A jsr INBYT2 FBB0 RNEW: FBB0 BD F8 BE jsr OUTDIS FBB3 27 0B beq RORD FBB5 F7 A7 B8 stab CARRY FBB8 CE A7 B4 ldx #$A7B4 FBBB BD F9 0B jsr SHIFT FBBE 20 F0 bra RNEW FBC0 RORD: FBC0 F6 A7 B9 ldab KEY FBC3 C1 40 cmpb #$40 ; key G FBC5 27 0B beq RON FBC7 C1 43 cmpb #$43 ; key S FBC9 27 07 beq RON FBCB C1 47 cmpb #$47 ; key K FBCD 27 03 beq RON FBCF BD FA 30 jsr ORDER FBD2 RON: FBD2 CE A7 B4 ldx #(DISPL+$C) FBD5 BD FA 47 jsr CHANG1 FBD8 7C A7 BD inc INDEX+1 FBDB 26 03 bne NOCARR FBDD 7C A7 BC inc INDEX FBE0 NOCARR: FBE0 BD FA 44 jsr CHANGE FBE3 32 pula FBE4 C1 46 cmpb #$46 ; key down arrow FBE6 27 06 beq UP FBE8 C1 45 cmpb #$45 ; key up arrow FBEA 26 10 bne STEP FBEC 4A deca FBED 4A deca FBEE UP: FBEE 4C inca FBEF 26 02 bne POS FBF1 86 05 ldaa #5 FBF3 POS: FBF3 81 06 cmpa #6 FBF5 26 02 bne SUIT FBF7 86 01 ldaa #1 FBF9 SUIT: FBF9 7E FB 77 jmp REGCH FBFC STEP: FBFC 39 rts FBFD ; emit char through ACIA FBFD OUT: FBFD 36 psha FBFE 37 pshb FBFF FF A7 BC stx INDEX FC02 20 03 bra OUT2 FC04 OUT1: FC04 BD F8 35 jsr DISP FC07 OUT2: FC07 B6 80 08 ldaa ACIA FC0A 47 asra FC0B 47 asra FC0C 24 F6 bcc OUT1 FC0E 33 pulb FC0F 32 pula FC10 B7 80 09 staa ACIA+1 FC13 FE A7 BC ldx INDEX FC16 39 rts FC17 ; emit 4 hex chars to ACIA FC17 OUT4H: FC17 8D 00 bsr *+2 FC19 OUT2H: FC19 EB 00 addb 0,x FC1B A6 00 ldaa 0,x FC1D OUT2HA: FC1D 36 psha FC1E BD F9 66 jsr ASCIH FC21 8D DA bsr OUT FC23 32 pula FC24 08 inx FC25 BD F9 6A jsr ASCIL FC28 20 D3 bra OUT FC2A ; send S0/S1/S9 records to ACIA FC2A GOTOR: FC2A BD FC BA jsr AREA FC2D C6 72 ldab #'r' FC2F BD FC FB jsr HDRIN FC32 8D 7B bsr DELAY FC34 C6 0A ldab #$A FC36 4F clra FC37 COUNT: FC37 8D C4 bsr OUT FC39 5A decb FC3A 26 FB bne COUNT FC3C 7D A7 D2 tst HDRSW FC3F 26 0E bne REC FC41 BD FC CB jsr OUTST1 FC44 86 30 ldaa #'0' FC46 8D B5 bsr OUT FC48 CE A7 C5 ldx #HEADER FC4B 8D CA bsr OUT4H FC4D 8D CA bsr OUT2H FC4F REC: FC4F FE A7 C8 ldx BEGA FC52 FF A7 CC stx ACTADD FC55 REC0: FC55 B6 A7 CB ldaa ENDA+1 FC58 B0 A7 CD suba ACTADD+1 FC5B F6 A7 CA ldab ENDA FC5E F2 A7 CC sbcb ACTADD FC61 26 05 bne REC1 FC63 B1 A7 C4 cmpa LENGTH FC66 25 04 bcs REC2 FC68 REC1: FC68 B6 A7 C4 ldaa LENGTH FC6B 4A deca FC6C REC2: FC6C 8B 04 adda #4 FC6E B7 A7 D0 staa RG+1 FC71 80 03 suba #3 FC73 B7 A7 CF staa RG FC76 8D 53 bsr OUTST1 FC78 86 31 ldaa #'1' FC7A 8D 81 bsr OUT FC7C 5F clrb FC7D CE A7 D0 ldx #(RG+1) FC80 8D 97 bsr OUT2H FC82 CE A7 CC ldx #ACTADD FC85 8D 90 bsr OUT4H FC87 FE A7 CC ldx ACTADD FC8A REC3: FC8A 8D 8D bsr OUT2H FC8C 7A A7 CF dec RG FC8F 26 F9 bne REC3 FC91 FF A7 CC stx ACTADD FC94 53 comb FC95 17 tba FC96 8D 85 bsr OUT2HA FC98 FE A7 CC ldx ACTADD FC9B 09 dex FC9C BC A7 CA cpx ENDA FC9F 26 B4 bne REC0 FCA1 8D 28 bsr OUTST1 FCA3 86 39 ldaa #'9' FCA5 BD FB FD jsr OUT FCA8 86 22 ldaa #34 FCAA 8D 05 bsr DELAY1 FCAC 7E FA 54 jmp CNTRL FCAF ; 10 seconds prefix FCAF DELAY: FCAF 86 AA ldaa #170 FCB1 DELAY1: FCB1 36 psha FCB2 BD F8 31 jsr DISP4 FCB5 32 pula FCB6 4A deca FCB7 26 F8 bne DELAY1 FCB9 39 rts FCBA ; get address range from keyboard FCBA AREA: FCBA CE FE 74 ldx #TBEG FCBD 8D 2E bsr CHRIN FCBF FF A7 C8 stx BEGA FCC2 CE FE 77 ldx #TEND FCC5 8D 26 bsr CHRIN FCC7 FF A7 CA stx ENDA FCCA 39 rts FCCB ; emit $04 terminated text string to ACIA FCCB OUTST1: FCCB CE FE 7A ldx #TCRLFS FCCE OUTSTR: FCCE A6 00 ldaa 0,x FCD0 81 04 cmpa #4 FCD2 27 06 beq OUTEND FCD4 BD FB FD jsr OUT FCD7 08 inx FCD8 20 F4 bra OUTSTR FCDA OUTEND: FCDA 39 rts FCDB ; emit text string FCDB NXTCH2: FCDB 8D 00 bsr *+2 FCDD NXTCHR: FCDD F7 A7 B8 stab CARRY FCE0 BD F9 08 jsr SHIFT8 FCE3 NXTC1: FCE3 FE A7 BC ldx INDEX FCE6 E6 00 ldab 0,x FCE8 08 inx FCE9 FF A7 BC stx INDEX FCEC 39 rts FCED ; emit 3 chars and expect address input FCED CHRIN: FCED FF A7 BC stx INDEX FCF0 BD F9 02 jsr SHIF88 FCF3 8D EE bsr NXTC1 FCF5 8D E4 bsr NXTCH2 FCF7 BD F9 3F jsr DISAD1 FCFA 39 rts FCFB ; read header FCFB HDRIN: FCFB 7F A7 D2 clr HDRSW FCFE BD F9 02 jsr SHIF88 FD01 F7 A7 B8 stab CARRY FD04 BD F9 06 jsr SHIF28 FD07 BD F8 BE jsr OUTDIS FD0A 26 12 bne HDR1 FD0C F6 A7 B9 ldab KEY FD0F C1 44 cmpb #$44 ; left arrow key FD11 26 51 bne CNTRL7 FD13 7C A7 D2 inc HDRSW FD16 BD F9 04 jsr SHIF48 FD19 BD F9 06 jsr SHIF28 FD1C 20 15 bra NOHDR FD1E HDR1: FD1E F7 A7 B8 stab CARRY FD21 BD F8 B1 jsr INDIS1 FD24 BD F9 44 jsr DIS FD27 FF A7 C6 stx HEADER+1 FD2A CE A7 B2 ldx #(DISPL+$A) FD2D BD F9 29 jsr BYTE FD30 B7 A7 C5 staa HEADER FD33 NOHDR: FD33 86 15 ldaa #$15 FD35 B7 80 08 staa ACIA FD38 BD F8 76 jsr WAIT FD3B 20 08 bra OP FD3D MOON: FD3D 86 55 ldaa #%1010101 FD3F B7 80 08 staa ACIA FD42 BD F9 E4 jsr BLINK FD45 OP: FD45 F6 A7 B9 ldab KEY FD48 C1 46 cmpb #$46 ; down arrow key FD4A 27 E7 beq NOHDR FD4C C1 45 cmpb #$45 ; up arrow key FD4E 27 ED beq MOON FD50 C1 44 cmpb #$44 ; left arrow key FD52 26 10 bne CNTRL7 FD54 86 55 ldaa #%1010101 FD56 B7 80 08 staa ACIA FD59 7C A7 D1 inc SWITCH FD5C 86 2D ldaa #'-' FD5E B7 A7 B1 staa DISPL+9 FD61 7E F8 83 jmp BUILD FD64 CNTRL7: FD64 7E FA 57 jmp CNTRLA FD67 ; read single char from ACIA FD67 INA1: FD67 37 pshb FD68 FF A7 BA stx SAVEX FD6B BD F8 35 jsr DISP FD6E FE A7 BA ldx SAVEX FD71 33 pulb FD72 INACIA: FD72 B6 80 08 ldaa ACIA FD75 47 asra FD76 24 EF bcc INA1 FD78 B6 80 09 ldaa ACIA+1 FD7B 84 7F anda #$7F ; '' FD7D 39 rts FD7E ; read S0/S1/S9 records from ACIA FD7E GOTOL: FD7E C6 4C ldab #'L' FD80 BD FC FB jsr HDRIN FD83 LD1: FD83 8D ED bsr INACIA FD85 81 53 cmpa #'S' FD87 26 FA bne LD1 FD89 7D A7 D2 tst HDRSW FD8C 26 1A bne NOSLCT FD8E 8D E2 bsr INACIA FD90 81 30 cmpa #'0' FD92 26 EF bne LD1 FD94 CE A7 B2 ldx #(DISPL+10) FD97 LD2: FD97 E6 00 ldab 0,x FD99 LD3: FD99 8D D7 bsr INACIA FD9B 27 FC beq LD3 FD9D 11 cba FD9E 26 E3 bne LD1 FDA0 08 inx FDA1 8C A7 B8 cpx #CARRY FDA4 26 F1 bne LD2 FDA6 20 1B bra LOAD FDA8 NOSLCT: FDA8 8D C8 bsr INACIA FDAA 81 30 cmpa #'0' FDAC 26 21 bne LOAD0 FDAE C6 06 ldab #6 FDB0 NOS1: FDB0 8D C0 bsr INACIA FDB2 B7 A7 B8 staa CARRY FDB5 CE A7 B2 ldx #(DISPL+$A) FDB8 BD F9 0B jsr SHIFT FDBB 37 pshb FDBC BD F8 83 jsr BUILD FDBF 33 pulb FDC0 5A decb FDC1 26 ED bne NOS1 FDC3 LOAD: FDC3 8D AD bsr INACIA FDC5 81 53 cmpa #'S' FDC7 26 FA bne LOAD FDC9 8D A7 bsr INACIA FDCB 81 39 cmpa #'9' FDCD 27 95 beq CNTRL7 FDCF LOAD0: FDCF 81 31 cmpa #'1' FDD1 26 F0 bne LOAD FDD3 7F A7 CE clr CKSM FDD6 BD F9 29 jsr BYTE FDD9 80 02 suba #2 FDDB B7 A7 CF staa RG FDDE BD F9 52 jsr BADDR FDE1 FE A7 BC ldx INDEX FDE4 LOAD1: FDE4 BD F9 29 jsr BYTE FDE7 7A A7 CF dec RG FDEA 27 09 beq LOAD2 FDEC A7 00 staa 0,x FDEE A1 00 cmpa 0,x FDF0 26 0D bne MERR2 FDF2 08 inx FDF3 20 EF bra LOAD1 FDF5 LOAD2: FDF5 7C A7 CE inc CKSM FDF8 27 C9 beq LOAD FDFA C6 36 ldab #'6' FDFC ERROR1: FDFC 7E F9 CF jmp ERROR FDFF MERR2: FDFF C6 37 ldab #'7' FE01 20 F9 bra ERROR1 FE03 ; calculate branches FE03 GOTOB: FE03 C6 42 ldab #'B' FE05 BD F9 3D jsr DISADD FE08 FF A7 C8 stx BEGA FE0B BD F9 08 jsr SHIFT8 FE0E 86 74 ldaa #'t' FE10 BD F9 75 jsr LOADC FE13 C6 6F ldab #'o' FE15 BD F9 3F jsr DISAD1 FE18 FF A7 CA stx ENDA FE1B BD F9 02 jsr SHIF88 FE1E 86 3D ldaa #'=' FE20 BD F9 75 jsr LOADC FE23 BD F9 08 jsr SHIFT8 FE26 FE A7 C8 ldx BEGA FE29 86 7E ldaa #$7E FE2B B1: FE2B 09 dex FE2C 4A deca FE2D 26 FC bne B1 FE2F C6 80 ldab #$80 FE31 B2: FE31 BC A7 CA cpx ENDA FE34 27 0A beq BOUT FE36 08 inx FE37 5C incb FE38 C1 80 cmpb #$80 FE3A 26 F5 bne B2 FE3C C6 38 ldab #'8' FE3E 20 BC bra ERROR1 FE40 BOUT: FE40 CE A7 B9 ldx #KEY FE43 E7 00 stab 0,x FE45 BD F9 7C jsr INBYTE FE48 BD F9 06 jsr SHIF28 FE4B 7F A7 B9 clr KEY FE4E BD F8 76 jsr WAIT FE51 7E FA 57 jmp CNTRLA FE54 20 45 72 72 6F+ FE54 TERROR: fcb ' ', 'E', 'r', 'r', 'o', 'r' FE5A 20 45 75 72 6F+ FE5A TEUROC: fcb ' ', 'E', 'u', 'r', 'o', 'c', 'o', 'n' FE62 20 43 6F 6E 74+ FE62 TCONTR: fcb ' ', 'C', 'o', 'n', 't', 'r', 'o', '1' FE6A 35 50 43 43 42+ FE6A TRGSTR: fcb '5', 'P', 'C', 'C', 'B', 'A', '1', 'D', 'P', 'C' FE74 42 45 47 TBEG: fcb 'B', 'E', 'G' FE77 45 6E 44 TEND: fcb 'E', 'n', 'D' FE7A 0D TCRLFS: fcb $D, $A, 0, 0, 0, 0, 'S', 4 FE82 30 CTABLE: fcb '0' ; ASCI code of key FE83 C0 fcb %11000000 ; 7 seg pattern FE84 10 fcb $10 ; key 0 FE85 31 fcb '1' FE86 F9 fcb %11111001 FE87 11 fcb $11 ; key 1 FE88 32 fcb '2' FE89 A4 fcb %10100100 FE8A 12 fcb $12 ; key 2 FE8B 33 fcb '3' FE8C B0 fcb %10110000 FE8D 13 fcb $13 ; key 3 FE8E 34 fcb '4' FE8F 99 fcb %10011001 FE90 14 fcb $14 ; key 4 FE91 35 fcb '5' FE92 92 fcb %10010010 FE93 15 fcb $15 ; key 5 FE94 36 fcb '6' FE95 82 fcb %10000010 FE96 16 fcb $16 ; key 6 FE97 37 fcb '7' FE98 F8 fcb %11111000 FE99 17 fcb $17 ; key 7 FE9A 38 fcb '8' FE9B 80 fcb %10000000 FE9C 20 fcb $20 ; key 8 FE9D 39 fcb '9' FE9E 90 fcb %10010000 FE9F 21 fcb $21 ; key 9 FEA0 41 fcb 'A' FEA1 88 fcb %10001000 FEA2 22 fcb $22 ; key A FEA3 42 fcb 'B' FEA4 83 fcb %10000011 FEA5 23 fcb $23 ; key B FEA6 43 fcb 'C' FEA7 C6 fcb %11000110 FEA8 24 fcb $24 ; key C FEA9 44 fcb 'D' FEAA A1 fcb %10100001 FEAB 25 fcb $25 ; key D FEAC 45 fcb 'E' FEAD 86 fcb %10000110 FEAE 26 fcb $26 ; key E FEAF 46 fcb 'F' FEB0 8E fcb %10001110 FEB1 27 fcb $27 ; key F FEB2 47 fcb 'G' FEB3 C2 fcb %11000010 FEB4 00 fcb 0 FEB5 4C fcb 'L' FEB6 C7 fcb %11000111 FEB7 00 fcb 0 FEB8 4D fcb 'M' FEB9 C8 fcb %11001000 FEBA 00 fcb 0 FEBB 50 fcb 'P' FEBC 8C fcb %10001100 FEBD 00 fcb 0 FEBE 3D fcb '=' FEBF B7 fcb %10110111 FEC0 00 fcb 0 FEC1 2D fcb '-' FEC2 BF fcb %10111111 FEC3 00 fcb 0 FEC4 75 fcb 'u' FEC5 E3 fcb %11100011 FEC6 00 fcb 0 FEC7 74 fcb 't' FEC8 87 fcb %10000111 FEC9 00 fcb 0 FECA 72 fcb 'r' FECB AF fcb %10101111 FECC 00 fcb 0 FECD 63 fcb 'c' FECE A7 fcb %10100111 FECF 00 fcb 0 FED0 6E fcb 'n' FED1 AB fcb %10101011 FED2 00 fcb 0 FED3 6F fcb 'o' FED4 A3 fcb %10100011 FED5 40 FCTABL: fcb $40 ; key G FED6 F9 60 ENDTAB: fdb GOTOG FED8 47 fcb $47 ; key K FED9 FA 90 fdb GOTOK FEDB 41 fcb $41 ; key M FEDC F9 93 fdb GOTOM FEDE 42 fcb $42 ; key P FEDF FA B1 fdb GOTOP FEE1 43 fcb $43 ; key S FEE2 FB 2F fdb GOTOS FEE4 83 fcb $83 ; key L FEE5 FD 7E fdb GOTOL FEE7 82 fcb $82 ; key R FEE8 FC 2A fdb GOTOR FEEA 81 fcb $81 ; key B FEEB FE 03 fdb GOTOB FEED 84 fcb $84 ; key X FEEE FF 02 fdb GOTOX FEF0 80 fcb $80 ; key Y FEF1 FF 07 fdb GOTOY FEF3 IRQ: FEF3 FE A7 C2 ldx IRQV FEF6 6E 00 jmp 0,x FEF8 SWI: FEF8 FE A7 C0 ldx SWIV FEFB 6E 00 jmp 0,x FEFD NMI: FEFD FE A7 BE ldx NMIV FF00 6E 00 jmp 0,x FF02 GOTOX: FF02 FE A7 A6 ldx XADDR FF05 6E 00 jmp 0,x FF07 GOTOY: FF07 FE A7 A4 ldx YADDR FF0A 6E 00 jmp 0,x FF0C org $fff8 FFF8 FE F3 fdb IRQ FFFA FE F8 fdb SWI FFFC FE FD fdb NMI FFFE F8 00 fdb START FFFE end