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
