10 REM TODO: INTEGER VALUES "#123"
100 PRINT:PRINT "ASSEMBLING...";
110 READ M0$
120 READ M0:M=M0
130 READ DN
140 FOR D=1 TO DN
150 READ D$
160 OP$=LEFT$(D$,3)
170 OP=-1
200 IF OP$="ADC" THEN OP=105
210 IF OP$="BNE" THEN OP=208
220 IF OP$="CLC" THEN OP=24
230 IF OP$="CLD" THEN OP=216
240 IF OP$="CMP" THEN OP=205
250 IF OP$="DEC" THEN OP=206
260 IF OP$="INC" THEN OP=238
270 IF OP$="INX" THEN OP=232
280 IF OP$="JMP" THEN OP=76
290 IF OP$="JSR" THEN OP=32
300 IF OP$="LDA" THEN OP=169
310 IF OP$="LDX" THEN OP=162
320 IF OP$="RTS" THEN OP=96
330 IF OP$="SBC" THEN OP=233
340 IF OP$="SED" THEN OP=248
350 IF OP$="STA" THEN OP=141
800 VL$="":LD=LEN(D$)
810 IF LD>3 THEN VL$=RIGHT$(D$,LD-4)
820 IF VL$="" THEN GOSUB 2000
830 IF LEN(VL$)=3 THEN GOSUB 2100
840 IF LEN(VL$)=5 THEN GOSUB 2200
850 NEXT D
860 PRINT "DONE."
870 PRINT "EXECUTE!":SYS M0
880 END
2000 REM -- POKE OP (NO VALUE) --
2010 POKE M,OP:M=M+1
2020 RETURN
2100 REM -- POKE OP $XX --
2110 POKE M,OP:M=M+1
2120 GOSUB 4100
2130 RETURN
2200 REM -- POKE OP $XXXX --
2210 POKE M,OP:M=M+1
2220 GOSUB 4000
2230 RETURN
4000 REM -- POKE $XXXX VL$ --
4010 HX$=MID$(VL$,4,2)
4020 GOSUB 6000
4030 POKE M,HX:M=M+1
4040 REM FALL THROUGH FOR HIGH BYTE
4100 REM -- POKE $XX VL$ --
4110 HX$=MID$(VL$,2,2)
4120 GOSUB 6000
4130 POKE M,HX:M=M+1
4140 RETURN
6000 REM -- 1 BYTE STR TO INT --
6010 REM IN:HX$ OUT:HX
6020 C0=ASC("0"):CA=ASC("A")
6030 C$=RIGHT$(HX$,1):C=ASC(C$)
6040 IF C$<"A" THEN HX=C-C0
6050 IF C$>="A" THEN HX=10+C-CA
6060 C$=LEFT$(HX$,1):C=ASC(C$)
6070 IF C$<"A" THEN HX=HX+16*(C-C0)
6080 IF C$>="A" THEN HX=HX+16*(10+C-CA)
6090 RETURN
8000 REM ---- ASM ----
8010 DATA "$8000",32768 :REM MEM START
8020 DATA 8 :REM LINE COUNT
8030 DATA "LDA $41" :REM +00
8040 DATA "JSR $FFD2" :REM +02
8050 DATA "LDA $42" :REM +05
8060 DATA "JSR $FFD2" :REM +07
8070 DATA "LDA $43" :REM +0A
8080 DATA "JSR $FFD2" :REM +0C
8090 DATA "INC $D020" :REM +0F
8100 DATA "JMP $800F" :REM +12
Comments