00000000: 00 20 54 4F 20 41 53 53 45 4D 42 4C 45 20 3A 43 |. TO ASSEMBLE :C|
00000010: 4F 44 45 0D 20 49 46 20 54 48 49 4E 47 3F 20 22 |ODE. IF THING? "|
00000020: 4C 41 42 45 4C 53 20 45 52 4E 53 20 3A 4C 41 42 |LABELS ERNS :LAB|
00000030: 45 4C 53 0D 20 4D 41 4B 45 20 22 4C 41 42 45 4C |ELS. MAKE "LABEL|
00000040: 53 20 5B 5D 0D 20 4E 44 20 50 52 20 3A 43 4F 44 |S []. ND PR :COD|
00000050: 45 0D 20 4D 41 4B 45 20 22 43 4F 44 45 20 42 46 |E. MAKE "CODE BF|
00000060: 20 54 45 58 54 20 3A 43 4F 44 45 0D 20 53 59 4D | TEXT :CODE. SYM|
00000070: 42 4F 4C 53 20 3A 43 4F 44 45 20 3A 4F 52 47 0D |BOLS :CODE :ORG.|
00000080: 20 53 54 4F 52 45 20 3A 43 4F 44 45 20 3A 4F 52 | STORE :CODE :OR|
00000090: 47 0D 45 4E 44 0D 0D 54 4F 20 45 52 4E 53 20 3A |G.END..TO ERNS :|
000000A0: 4E 41 4D 45 53 0D 20 49 46 20 3A 4E 41 4D 45 53 |NAMES. IF :NAMES|
000000B0: 20 3D 20 5B 5D 20 53 54 4F 50 0D 20 45 52 4E 41 | = [] STOP. ERNA|
000000C0: 4D 45 20 46 49 52 53 54 20 3A 4E 41 4D 45 53 0D |ME FIRST :NAMES.|
000000D0: 20 45 52 4E 53 20 42 46 20 3A 4E 41 4D 45 53 0D | ERNS BF :NAMES.|
000000E0: 45 4E 44 0D 0D 54 4F 20 53 59 4D 42 4F 4C 53 20 |END..TO SYMBOLS |
000000F0: 3A 43 4F 44 45 20 3A 44 4F 54 0D 20 49 46 20 3A |:CODE :DOT. IF :|
00000100: 43 4F 44 45 20 3D 20 5B 5D 20 4D 41 4B 45 20 22 |CODE = [] MAKE "|
00000110: 45 4E 44 20 3A 44 4F 54 20 2D 20 31 20 53 54 4F |END :DOT - 1 STO|
00000120: 50 0D 20 53 59 4D 42 4F 4C 53 20 42 46 20 3A 43 |P. SYMBOLS BF :C|
00000130: 4F 44 45 20 3A 44 4F 54 20 2B 20 28 20 53 59 4D |ODE :DOT + ( SYM|
00000140: 53 2E 4C 20 46 49 52 53 54 20 3A 43 4F 44 45 20 |S.L FIRST :CODE |
00000150: 46 49 52 53 54 20 46 49 52 53 54 20 3A 43 4F 44 |FIRST FIRST :COD|
00000160: 45 20 29 0D 45 4E 44 0D 0D 54 4F 20 53 59 4D 53 |E ).END..TO SYMS|
00000170: 2E 4C 20 3A 4C 49 4E 45 20 3A 54 4F 4B 45 4E 0D |.L :LINE :TOKEN.|
00000180: 20 49 46 20 49 4E 53 3F 20 3A 54 4F 4B 45 4E 20 | IF INS? :TOKEN |
00000190: 4F 50 20 49 4E 53 4C 45 4E 20 41 4D 4F 44 45 20 |OP INSLEN AMODE |
000001A0: 3A 54 4F 4B 45 4E 20 42 46 20 3A 4C 49 4E 45 0D |:TOKEN BF :LINE.|
000001B0: 20 49 46 20 4C 41 42 45 4C 3F 20 3A 54 4F 4B 45 | IF LABEL? :TOKE|
000001C0: 4E 20 41 53 53 49 47 4E 20 3A 54 4F 4B 45 4E 20 |N ASSIGN :TOKEN |
000001D0: 3A 44 4F 54 20 4F 50 20 53 59 4D 53 2E 4C 20 42 |:DOT OP SYMS.L B|
000001E0: 46 20 3A 4C 49 4E 45 20 46 49 52 53 54 20 42 46 |F :LINE FIRST BF|
000001F0: 20 3A 4C 49 4E 45 0D 20 49 46 20 4C 49 53 54 3F | :LINE. IF LIST?|
00000200: 20 3A 54 4F 4B 45 4E 20 52 55 4E 20 3A 54 4F 4B | :TOKEN RUN :TOK|
00000210: 45 4E 20 4F 50 20 30 0D 20 49 46 20 4E 55 4D 42 |EN OP 0. IF NUMB|
00000220: 45 52 3F 20 3A 54 4F 4B 45 4E 20 4F 50 20 31 0D |ER? :TOKEN OP 1.|
00000230: 20 45 52 52 4F 52 20 3A 54 4F 4B 45 4E 20 5B 4E | ERROR :TOKEN [N|
00000240: 4F 54 20 41 4E 20 49 4E 53 54 52 55 43 54 49 4F |OT AN INSTRUCTIO|
00000250: 4E 5D 0D 45 4E 44 0D 0D 54 4F 20 41 53 53 49 47 |N].END..TO ASSIG|
00000260: 4E 20 3A 4C 41 42 45 4C 20 3A 54 48 49 4E 47 0D |N :LABEL :THING.|
00000270: 20 4D 41 4B 45 20 22 4C 41 42 45 4C 20 42 4C 20 | MAKE "LABEL BL |
00000280: 3A 4C 41 42 45 4C 0D 20 49 46 20 54 48 49 4E 47 |:LABEL. IF THING|
00000290: 3F 20 3A 4C 41 42 45 4C 20 45 52 52 4F 52 20 3A |? :LABEL ERROR :|
000002A0: 4C 41 42 45 4C 20 5B 41 4C 52 45 41 44 59 20 55 |LABEL [ALREADY U|
000002B0: 53 45 44 5D 0D 20 4D 41 4B 45 20 3A 4C 41 42 45 |SED]. MAKE :LABE|
000002C0: 4C 20 3A 44 4F 54 0D 20 4D 41 4B 45 20 22 4C 41 |L :DOT. MAKE "LA|
000002D0: 42 45 4C 53 20 46 50 55 54 20 3A 4C 41 42 45 4C |BELS FPUT :LABEL|
000002E0: 20 3A 4C 41 42 45 4C 53 0D 45 4E 44 0D 0D 54 4F | :LABELS.END..TO|
000002F0: 20 52 45 4C 49 4E 53 3F 20 3A 54 4F 4B 45 4E 0D | RELINS? :TOKEN.|
00000300: 20 49 46 20 49 4E 53 3F 20 3A 54 4F 4B 45 4E 20 | IF INS? :TOKEN |
00000310: 4F 50 20 22 52 45 4C 20 3D 20 46 49 52 53 54 20 |OP "REL = FIRST |
00000320: 54 48 49 4E 47 20 3A 54 4F 4B 45 4E 0D 20 4F 50 |THING :TOKEN. OP|
00000330: 20 22 46 41 4C 53 45 0D 45 4E 44 0D 0D 54 4F 20 | "FALSE.END..TO |
00000340: 49 4E 53 3F 20 3A 54 4F 4B 45 4E 0D 20 49 46 20 |INS? :TOKEN. IF |
00000350: 54 48 49 4E 47 3F 20 3A 54 4F 4B 45 4E 20 4F 50 |THING? :TOKEN OP|
00000360: 20 4C 49 53 54 3F 20 54 48 49 4E 47 20 3A 54 4F | LIST? THING :TO|
00000370: 4B 45 4E 0D 20 4F 50 20 22 46 41 4C 53 45 0D 45 |KEN. OP "FALSE.E|
00000380: 4E 44 0D 0D 54 4F 20 49 4D 50 49 4E 53 3F 20 3A |ND..TO IMPINS? :|
00000390: 54 4F 4B 45 4E 0D 20 49 46 20 49 4E 53 3F 20 3A |TOKEN. IF INS? :|
000003A0: 54 4F 4B 45 4E 20 4F 50 20 22 49 4D 50 20 3D 20 |TOKEN OP "IMP = |
000003B0: 46 49 52 53 54 20 54 48 49 4E 47 20 3A 54 4F 4B |FIRST THING :TOK|
000003C0: 45 4E 0D 20 4F 50 20 22 46 41 4C 53 45 0D 45 4E |EN. OP "FALSE.EN|
000003D0: 44 0D 0D 54 4F 20 41 4D 4F 44 45 31 20 3A 46 50 |D..TO AMODE1 :FP|
000003E0: 41 52 54 20 3A 4C 50 41 52 54 0D 20 49 46 20 3A |ART :LPART. IF :|
000003F0: 46 50 41 52 54 20 3D 20 22 23 20 4F 50 20 4C 4F |FPART = "# OP LO|
00000400: 4F 4B 55 50 20 42 46 20 3A 4C 50 41 52 54 20 3A |OKUP BF :LPART :|
00000410: 49 4D 4D 53 0D 20 49 46 20 3A 46 50 41 52 54 20 |IMMS. IF :FPART |
00000420: 3D 20 22 21 20 4F 50 20 4C 4F 4F 4B 55 50 20 42 |= "! OP LOOKUP B|
00000430: 46 20 3A 4C 50 41 52 54 20 3A 5A 50 53 0D 20 49 |F :LPART :ZPS. I|
00000440: 46 20 3A 46 50 41 52 54 20 3D 20 22 28 20 4F 50 |F :FPART = "( OP|
00000450: 20 4C 4F 4F 4B 55 50 20 42 46 20 3A 4C 50 41 52 | LOOKUP BF :LPAR|
00000460: 54 20 3A 49 4E 44 49 52 53 0D 20 4F 50 20 4C 4F |T :INDIRS. OP LO|
00000470: 4F 4B 55 50 20 3A 4C 50 41 52 54 20 3A 49 4E 44 |OKUP :LPART :IND|
00000480: 45 58 45 53 0D 45 4E 44 0D 0D 54 4F 20 4C 4F 4F |EXES.END..TO LOO|
00000490: 4B 55 50 20 3A 54 48 49 4E 47 20 3A 50 4C 41 43 |KUP :THING :PLAC|
000004A0: 45 0D 20 49 46 20 3A 50 4C 41 43 45 20 3D 20 5B |E. IF :PLACE = [|
000004B0: 5D 20 45 52 52 4F 52 20 3A 54 48 49 4E 47 20 5B |] ERROR :THING [|
000004C0: 42 41 44 20 4D 4F 44 45 5D 0D 20 49 46 20 3A 54 |BAD MODE]. IF :T|
000004D0: 48 49 4E 47 20 3D 20 46 49 52 53 54 20 3A 50 4C |HING = FIRST :PL|
000004E0: 41 43 45 20 4F 50 20 46 49 52 53 54 20 42 46 20 |ACE OP FIRST BF |
000004F0: 3A 50 4C 41 43 45 0D 20 4F 50 20 4C 4F 4F 4B 55 |:PLACE. OP LOOKU|
00000500: 50 20 3A 54 48 49 4E 47 20 42 46 20 42 46 20 3A |P :THING BF BF :|
00000510: 50 4C 41 43 45 0D 45 4E 44 0D 0D 54 4F 20 48 49 |PLACE.END..TO HI|
00000520: 38 20 3A 4E 0D 20 4F 50 20 51 55 4F 54 49 45 4E |8 :N. OP QUOTIEN|
00000530: 54 20 3A 4E 20 32 35 36 0D 45 4E 44 0D 0D 54 4F |T :N 256.END..TO|
00000540: 20 4C 4F 38 20 3A 4E 0D 20 4F 50 20 42 49 54 41 | LO8 :N. OP BITA|
00000550: 4E 44 20 3A 4E 20 32 35 35 0D 45 4E 44 0D 0D 54 |ND :N 255.END..T|
00000560: 4F 20 49 4E 53 4C 45 4E 20 3A 4D 4F 44 45 0D 20 |O INSLEN :MODE. |
00000570: 4F 50 20 46 49 52 53 54 20 54 48 49 4E 47 20 3A |OP FIRST THING :|
00000580: 4D 4F 44 45 0D 45 4E 44 0D 0D 54 4F 20 4F 50 43 |MODE.END..TO OPC|
00000590: 4F 44 45 20 3A 49 4E 53 20 3A 4D 4F 44 45 0D 20 |ODE :INS :MODE. |
000005A0: 4F 50 20 4C 4F 4F 4B 55 50 20 3A 4D 4F 44 45 20 |OP LOOKUP :MODE |
000005B0: 54 48 49 4E 47 20 3A 49 4E 53 0D 45 4E 44 0D 0D |THING :INS.END..|
000005C0: 54 4F 20 49 4E 44 45 4E 54 20 3A 53 50 41 43 45 |TO INDENT :SPACE|
000005D0: 53 0D 20 49 46 20 3A 53 50 41 43 45 53 20 3C 20 |S. IF :SPACES < |
000005E0: 30 20 50 52 49 4E 54 31 20 22 27 20 27 20 53 54 |0 PRINT1 "' ' ST|
000005F0: 4F 50 0D 20 52 45 50 45 41 54 20 3A 53 50 41 43 |OP. REPEAT :SPAC|
00000600: 45 53 20 5B 50 52 49 4E 54 31 20 22 27 20 27 5D |ES [PRINT1 "' ']|
00000610: 0D 45 4E 44 0D 0D 54 4F 20 41 4D 4F 44 45 20 3A |.END..TO AMODE :|
00000620: 54 4F 4B 45 4E 20 3A 41 52 47 53 0D 20 49 46 20 |TOKEN :ARGS. IF |
00000630: 52 45 4C 49 4E 53 3F 20 3A 54 4F 4B 45 4E 20 4F |RELINS? :TOKEN O|
00000640: 50 20 22 52 45 4C 0D 20 49 46 20 49 4D 50 49 4E |P "REL. IF IMPIN|
00000650: 53 3F 20 3A 54 4F 4B 45 4E 20 4F 50 20 22 49 4D |S? :TOKEN OP "IM|
00000660: 50 0D 20 49 46 20 3A 41 52 47 53 20 3D 20 5B 5D |P. IF :ARGS = []|
00000670: 20 4F 50 20 22 49 4D 50 0D 20 49 46 20 3A 41 52 | OP "IMP. IF :AR|
00000680: 47 53 20 3D 20 5B 41 5D 20 4F 50 20 22 41 43 43 |GS = [A] OP "ACC|
00000690: 0D 20 49 46 20 42 46 20 3A 41 52 47 53 20 3D 20 |. IF BF :ARGS = |
000006A0: 5B 5D 20 4F 50 20 22 41 42 53 0D 20 4F 50 20 41 |[] OP "ABS. OP A|
000006B0: 4D 4F 44 45 31 20 46 49 52 53 54 20 3A 41 52 47 |MODE1 FIRST :ARG|
000006C0: 53 20 42 46 20 3A 41 52 47 53 0D 45 4E 44 0D 0D |S BF :ARGS.END..|
000006D0: 54 4F 20 53 54 4F 52 45 32 20 3A 4C 49 4E 45 20 |TO STORE2 :LINE |
000006E0: 3A 4D 4F 44 45 0D 20 4C 4F 43 41 4C 20 22 42 59 |:MODE. LOCAL "BY|
000006F0: 54 45 20 4C 4F 43 41 4C 20 22 4C 45 4E 0D 20 4D |TE LOCAL "LEN. M|
00000700: 41 4B 45 20 22 42 59 54 45 20 4F 50 43 4F 44 45 |AKE "BYTE OPCODE|
00000710: 20 46 49 52 53 54 20 3A 4C 49 4E 45 20 3A 4D 4F | FIRST :LINE :MO|
00000720: 44 45 0D 20 4D 41 4B 45 20 22 4C 45 4E 20 49 4E |DE. MAKE "LEN IN|
00000730: 53 4C 45 4E 20 3A 4D 4F 44 45 0D 20 45 4D 49 54 |SLEN :MODE. EMIT|
00000740: 20 3A 44 4F 54 20 3A 42 59 54 45 0D 20 49 46 20 | :DOT :BYTE. IF |
00000750: 3A 4C 45 4E 20 3D 20 31 20 4F 50 20 3A 4C 45 4E |:LEN = 1 OP :LEN|
00000760: 0D 20 4D 41 4B 45 20 22 42 59 54 45 20 4F 50 45 |. MAKE "BYTE OPE|
00000770: 52 41 4E 44 20 3A 4D 4F 44 45 20 42 46 20 3A 4C |RAND :MODE BF :L|
00000780: 49 4E 45 0D 20 49 46 20 3A 4C 45 4E 20 3D 20 32 |INE. IF :LEN = 2|
00000790: 20 45 4D 49 54 20 3A 44 4F 54 20 2B 20 31 20 3A | EMIT :DOT + 1 :|
000007A0: 42 59 54 45 20 4F 50 20 3A 4C 45 4E 0D 20 45 4D |BYTE OP :LEN. EM|
000007B0: 49 54 20 3A 44 4F 54 20 2B 20 31 20 4C 4F 38 20 |IT :DOT + 1 LO8 |
000007C0: 3A 42 59 54 45 0D 20 45 4D 49 54 20 3A 44 4F 54 |:BYTE. EMIT :DOT|
000007D0: 20 2B 20 32 20 48 49 38 20 3A 42 59 54 45 0D 20 | + 2 HI8 :BYTE. |
000007E0: 4F 50 20 3A 4C 45 4E 0D 45 4E 44 0D 0D 54 4F 20 |OP :LEN.END..TO |
000007F0: 45 4D 49 54 20 3A 44 4F 54 20 3A 42 59 54 45 0D |EMIT :DOT :BYTE.|
00000800: 20 49 4E 44 45 4E 54 20 32 39 20 2D 20 46 49 52 | INDENT 29 - FIR|
00000810: 53 54 20 43 55 52 53 4F 52 50 4F 53 0D 20 28 20 |ST CURSORPOS. ( |
00000820: 50 52 49 4E 54 31 20 3A 44 4F 54 20 22 3D 20 3A |PRINT1 :DOT "= :|
00000830: 42 59 54 45 20 29 0D 20 50 52 49 4E 54 20 5B 5D |BYTE ). PRINT []|
00000840: 0D 20 2E 44 45 50 4F 53 49 54 20 3A 44 4F 54 20 |. .DEPOSIT :DOT |
00000850: 3A 42 59 54 45 0D 45 4E 44 0D 0D 54 4F 20 4C 41 |:BYTE.END..TO LA|
00000860: 42 45 4C 3F 20 3A 54 4F 4B 45 4E 0D 20 4F 50 20 |BEL? :TOKEN. OP |
00000870: 22 3A 20 3D 20 4C 41 53 54 20 3A 54 4F 4B 45 4E |": = LAST :TOKEN|
00000880: 0D 45 4E 44 0D 0D 54 4F 20 53 54 4F 52 45 20 3A |.END..TO STORE :|
00000890: 43 4F 44 45 20 3A 44 4F 54 0D 20 49 46 20 3A 43 |CODE :DOT. IF :C|
000008A0: 4F 44 45 20 3D 20 5B 5D 20 53 54 4F 50 0D 20 53 |ODE = [] STOP. S|
000008B0: 54 4F 52 45 31 20 46 49 52 53 54 20 3A 43 4F 44 |TORE1 FIRST :COD|
000008C0: 45 20 46 49 52 53 54 20 46 49 52 53 54 20 3A 43 |E FIRST FIRST :C|
000008D0: 4F 44 45 0D 45 4E 44 0D 0D 54 4F 20 53 54 4F 52 |ODE.END..TO STOR|
000008E0: 45 31 20 3A 4C 49 4E 45 20 3A 54 4F 4B 45 4E 0D |E1 :LINE :TOKEN.|
000008F0: 20 50 52 49 4E 54 31 20 3A 4C 49 4E 45 0D 20 49 | PRINT1 :LINE. I|
00000900: 46 20 4C 49 53 54 3F 20 3A 54 4F 4B 45 4E 20 50 |F LIST? :TOKEN P|
00000910: 52 49 4E 54 20 5B 5D 20 53 54 4F 52 45 20 42 46 |RINT [] STORE BF|
00000920: 20 3A 43 4F 44 45 20 3A 44 4F 54 20 53 54 4F 50 | :CODE :DOT STOP|
00000930: 0D 20 49 46 20 4C 41 42 45 4C 3F 20 3A 54 4F 4B |. IF LABEL? :TOK|
00000940: 45 4E 20 4D 41 4B 45 20 22 4C 49 4E 45 20 42 46 |EN MAKE "LINE BF|
00000950: 20 3A 4C 49 4E 45 20 4D 41 4B 45 20 22 54 4F 4B | :LINE MAKE "TOK|
00000960: 45 4E 20 46 49 52 53 54 20 3A 4C 49 4E 45 0D 20 |EN FIRST :LINE. |
00000970: 49 46 20 4E 55 4D 42 45 52 3F 20 3A 54 4F 4B 45 |IF NUMBER? :TOKE|
00000980: 4E 20 45 4D 49 54 20 3A 44 4F 54 20 3A 54 4F 4B |N EMIT :DOT :TOK|
00000990: 45 4E 20 53 54 4F 52 45 20 42 46 20 3A 43 4F 44 |EN STORE BF :COD|
000009A0: 45 20 3A 44 4F 54 20 2B 20 31 20 53 54 4F 50 0D |E :DOT + 1 STOP.|
000009B0: 20 53 54 4F 52 45 20 42 46 20 3A 43 4F 44 45 20 | STORE BF :CODE |
000009C0: 3A 44 4F 54 20 2B 20 28 20 53 54 4F 52 45 32 20 |:DOT + ( STORE2 |
000009D0: 3A 4C 49 4E 45 20 28 20 41 4D 4F 44 45 20 3A 54 |:LINE ( AMODE :T|
000009E0: 4F 4B 45 4E 20 42 46 20 3A 4C 49 4E 45 20 29 20 |OKEN BF :LINE ) |
000009F0: 29 0D 45 4E 44 0D 0D 54 4F 20 4F 50 45 52 41 4E |).END..TO OPERAN|
00000A00: 44 20 3A 4D 4F 44 45 20 3A 41 52 47 53 0D 20 49 |D :MODE :ARGS. I|
00000A10: 46 20 3A 4D 4F 44 45 20 3D 20 22 52 45 4C 20 4F |F :MODE = "REL O|
00000A20: 50 20 52 45 4C 4F 50 45 52 0D 20 4D 41 4B 45 20 |P RELOPER. MAKE |
00000A30: 22 41 52 47 53 20 49 54 45 4D 20 28 20 4F 50 2E |"ARGS ITEM ( OP.|
00000A40: 4C 4F 43 20 3A 4D 4F 44 45 20 29 20 3A 41 52 47 |LOC :MODE ) :ARG|
00000A50: 53 0D 20 49 46 20 4C 49 53 54 3F 20 3A 41 52 47 |S. IF LIST? :ARG|
00000A60: 53 20 4F 50 20 52 55 4E 20 3A 41 52 47 53 0D 20 |S OP RUN :ARGS. |
00000A70: 49 46 20 4E 55 4D 42 45 52 3F 20 3A 41 52 47 53 |IF NUMBER? :ARGS|
00000A80: 20 4F 50 20 3A 41 52 47 53 0D 20 49 46 20 46 49 | OP :ARGS. IF FI|
00000A90: 52 53 54 20 3A 41 52 47 53 20 3D 20 22 22 20 4F |RST :ARGS = "" O|
00000AA0: 50 20 41 53 43 49 49 20 42 46 20 3A 41 52 47 53 |P ASCII BF :ARGS|
00000AB0: 0D 20 49 46 20 54 48 49 4E 47 3F 20 3A 41 52 47 |. IF THING? :ARG|
00000AC0: 53 20 4F 50 20 54 48 49 4E 47 20 3A 41 52 47 53 |S OP THING :ARGS|
00000AD0: 0D 20 45 52 52 4F 52 20 3A 41 52 47 53 20 5B 4E |. ERROR :ARGS [N|
00000AE0: 4F 54 20 41 20 4C 41 42 45 4C 5D 0D 45 4E 44 0D |OT A LABEL].END.|
00000AF0: 0D 54 4F 20 52 45 4C 4F 50 45 52 0D 20 4D 41 4B |.TO RELOPER. MAK|
00000B00: 45 20 22 41 52 47 53 20 28 20 4F 50 45 52 41 4E |E "ARGS ( OPERAN|
00000B10: 44 20 22 41 42 53 20 3A 41 52 47 53 20 29 20 2D |D "ABS :ARGS ) -|
00000B20: 20 3A 44 4F 54 20 2D 20 32 0D 20 49 46 20 3A 41 | :DOT - 2. IF :A|
00000B30: 52 47 53 20 3C 20 30 20 4F 50 20 32 35 36 20 2B |RGS < 0 OP 256 +|
00000B40: 20 3A 41 52 47 53 20 45 4C 53 45 20 4F 50 20 3A | :ARGS ELSE OP :|
00000B50: 41 52 47 53 0D 45 4E 44 0D 0D 54 4F 20 4F 50 2E |ARGS.END..TO OP.|
00000B60: 4C 4F 43 20 3A 4D 4F 44 45 0D 20 4F 50 20 46 49 |LOC :MODE. OP FI|
00000B70: 52 53 54 20 42 46 20 54 48 49 4E 47 20 3A 4D 4F |RST BF THING :MO|
00000B80: 44 45 0D 45 4E 44 0D 0D 54 4F 20 45 52 52 4F 52 |DE.END..TO ERROR|
00000B90: 20 3A 41 20 3A 42 0D 20 28 20 50 52 49 4E 54 20 | :A :B. ( PRINT |
00000BA0: 5B 49 4E 20 4C 49 4E 45 5D 20 3A 4C 49 4E 45 20 |[IN LINE] :LINE |
00000BB0: 29 0D 20 28 20 50 52 49 4E 54 20 3A 41 20 3A 42 |). ( PRINT :A :B|
00000BC0: 20 29 0D 20 54 4F 50 4C 45 56 45 4C 0D 45 4E 44 | ). TOPLEVEL.END|
00000BD0: 0D 0D 54 4F 20 24 31 20 3A 57 4F 52 44 20 3A 56 |..TO $1 :WORD :V|
00000BE0: 41 4C 0D 20 49 46 20 3A 57 4F 52 44 20 3D 20 22 |AL. IF :WORD = "|
00000BF0: 20 4F 50 20 3A 56 41 4C 0D 20 49 46 20 4E 55 4D | OP :VAL. IF NUM|
00000C00: 42 45 52 3F 20 46 49 52 53 54 20 3A 57 4F 52 44 |BER? FIRST :WORD|
00000C10: 20 4F 50 20 24 31 20 42 46 20 3A 57 4F 52 44 20 | OP $1 BF :WORD |
00000C20: 3A 56 41 4C 20 2A 20 3A 24 42 41 53 45 20 2B 20 |:VAL * :$BASE + |
00000C30: 46 49 52 53 54 20 3A 57 4F 52 44 0D 20 4C 4F 43 |FIRST :WORD. LOC|
00000C40: 41 4C 20 22 44 49 47 49 54 0D 20 4D 41 4B 45 20 |AL "DIGIT. MAKE |
00000C50: 22 44 49 47 49 54 20 28 20 41 53 43 49 49 20 46 |"DIGIT ( ASCII F|
00000C60: 49 52 53 54 20 3A 57 4F 52 44 20 29 20 2D 20 35 |IRST :WORD ) - 5|
00000C70: 35 0D 20 49 46 20 41 4E 59 4F 46 20 3A 44 49 47 |5. IF ANYOF :DIG|
00000C80: 49 54 20 3C 20 30 20 3A 44 49 47 49 54 20 2D 20 |IT < 0 :DIGIT - |
00000C90: 31 20 3E 20 3A 24 42 41 53 45 20 45 52 52 4F 52 |1 > :$BASE ERROR|
00000CA0: 20 46 49 52 53 54 20 3A 57 4F 52 44 20 5B 4E 4F | FIRST :WORD [NO|
00000CB0: 54 20 41 20 44 49 47 49 54 5D 0D 20 4F 50 20 24 |T A DIGIT]. OP $|
00000CC0: 31 20 42 46 20 3A 57 4F 52 44 20 3A 56 41 4C 20 |1 BF :WORD :VAL |
00000CD0: 2A 20 3A 24 42 41 53 45 20 2B 20 3A 44 49 47 49 |* :$BASE + :DIGI|
00000CE0: 54 0D 45 4E 44 0D 0D 54 4F 20 24 20 3A 57 4F 52 |T.END..TO $ :WOR|
00000CF0: 44 0D 20 4F 50 20 24 31 20 3A 57 4F 52 44 20 30 |D. OP $1 :WORD 0|
00000D00: 0D 45 4E 44 0D 0D 54 4F 20 53 45 54 55 50 0D 20 |.END..TO SETUP. |
00000D10: 4D 41 4B 45 20 22 24 42 41 53 45 20 31 36 0D 20 |MAKE "$BASE 16. |
00000D20: 52 45 41 44 20 22 41 4D 4F 44 45 53 0D 20 52 45 |READ "AMODES. RE|
00000D30: 41 44 20 22 4F 50 43 4F 44 45 53 0D 20 4D 41 4B |AD "OPCODES. MAK|
00000D40: 45 20 22 4F 52 47 20 24 20 22 43 34 30 0D 20 45 |E "ORG $ "C40. E|
00000D50: 52 4E 41 4D 45 20 22 53 54 41 52 54 55 50 0D 20 |RNAME "STARTUP. |
00000D60: 45 52 20 53 45 54 55 50 0D 45 4E 44 0D 0D 4D 41 |ER SETUP.END..MA|
00000D70: 4B 45 20 22 53 54 41 52 54 55 50 20 5B 53 45 54 |KE "STARTUP [SET|
00000D80: 55 50 5D 0D |UP]. |
. TO ASSEMBLE :CODE. IF THING? "LABELS E
RNS :LABELS. MAKE "LABELS []. ND PR :COD
E. MAKE "CODE BF TEXT :CODE. SYMBOLS :CO
DE :ORG. STORE :CODE :ORG.END..TO ERNS :
NAMES. IF :NAMES = [] STOP. ERNAME FIRST
:NAMES. ERNS BF :NAMES.END..TO SYMBOLS
:CODE :DOT. IF :CODE = [] MAKE "END :DOT
- 1 STOP. SYMBOLS BF :CODE :DOT + ( SYM
S.L FIRST :CODE FIRST FIRST :CODE ).END.
.TO SYMS.L :LINE :TOKEN. IF INS? :TOKEN
OP INSLEN AMODE :TOKEN BF :LINE. IF LABE
L? :TOKEN ASSIGN :TOKEN :DOT OP SYMS.L B
F :LINE FIRST BF :LINE. IF LIST? :TOKEN
RUN :TOKEN OP 0. IF NUMBER? :TOKEN OP 1.
ERROR :TOKEN [NOT AN INSTRUCTION].END..
TO ASSIGN :LABEL :THING. MAKE "LABEL BL
:LABEL. IF THING? :LABEL ERROR :LABEL [A
LREADY USED]. MAKE :LABEL :DOT. MAKE "LA
BELS FPUT :LABEL :LABELS.END..TO RELINS?
:TOKEN. IF INS? :TOKEN OP "REL = FIRST
THING :TOKEN. OP "FALSE.END..TO INS? :TO
KEN. IF THING? :TOKEN OP LIST? THING :TO
KEN. OP "FALSE.END..TO IMPINS? :TOKEN. I
F INS? :TOKEN OP "IMP = FIRST THING :TOK
EN. OP "FALSE.END..TO AMODE1 :FPART :LPA
RT. IF :FPART = "# OP LOOKUP BF :LPART :
IMMS. IF :FPART = "! OP LOOKUP BF :LPART
:ZPS. IF :FPART = "( OP LOOKUP BF :LPAR
T :INDIRS. OP LOOKUP :LPART :INDEXES.END
..TO LOOKUP :THING :PLACE. IF :PLACE = [
] ERROR :THING [BAD MODE]. IF :THING = F
IRST :PLACE OP FIRST BF :PLACE. OP LOOKU
P :THING BF BF :PLACE.END..TO HI8 :N. OP
QUOTIENT :N 256.END..TO LO8 :N. OP BITA
ND :N 255.END..TO INSLEN :MODE. OP FIRST
THING :MODE.END..TO OPCODE :INS :MODE.
OP LOOKUP :MODE THING :INS.END..TO INDEN
T :SPACES. IF :SPACES < 0 PRINT1 "' ' ST
OP. REPEAT :SPACES [PRINT1 "' '].END..TO
AMODE :TOKEN :ARGS. IF RELINS? :TOKEN O
P "REL. IF IMPINS? :TOKEN OP "IMP. IF :A
RGS = [] OP "IMP. IF :ARGS = [A] OP "ACC
. IF BF :ARGS = [] OP "ABS. OP AMODE1 FI
RST :ARGS BF :ARGS.END..TO STORE2 :LINE
:MODE. LOCAL "BYTE LOCAL "LEN. MAKE "BYT
E OPCODE FIRST :LINE :MODE. MAKE "LEN IN
SLEN :MODE. EMIT :DOT :BYTE. IF :LEN = 1
OP :LEN. MAKE "BYTE OPERAND :MODE BF :L
INE. IF :LEN = 2 EMIT :DOT + 1 :BYTE OP
:LEN. EMIT :DOT + 1 LO8 :BYTE. EMIT :DOT
+ 2 HI8 :BYTE. OP :LEN.END..TO EMIT :DO
T :BYTE. INDENT 29 - FIRST CURSORPOS. (
PRINT1 :DOT "= :BYTE ). PRINT []. .DEPOS
IT :DOT :BYTE.END..TO LABEL? :TOKEN. OP
": = LAST :TOKEN.END..TO STORE :CODE :DO
T. IF :CODE = [] STOP. STORE1 FIRST :COD
E FIRST FIRST :CODE.END..TO STORE1 :LINE
:TOKEN. PRINT1 :LINE. IF LIST? :TOKEN P
RINT [] STORE BF :CODE :DOT STOP. IF LAB
EL? :TOKEN MAKE "LINE BF :LINE MAKE "TOK
EN FIRST :LINE. IF NUMBER? :TOKEN EMIT :
DOT :TOKEN STORE BF :CODE :DOT + 1 STOP.
STORE BF :CODE :DOT + ( STORE2 :LINE (
AMODE :TOKEN BF :LINE ) ).END..TO OPERAN
D :MODE :ARGS. IF :MODE = "REL OP RELOPE
R. MAKE "ARGS ITEM ( OP.LOC :MODE ) :ARG
S. IF LIST? :ARGS OP RUN :ARGS. IF NUMBE
R? :ARGS OP :ARGS. IF FIRST :ARGS = "" O
P ASCII BF :ARGS. IF THING? :ARGS OP THI
NG :ARGS. ERROR :ARGS [NOT A LABEL].END.
.TO RELOPER. MAKE "ARGS ( OPERAND "ABS :
ARGS ) - :DOT - 2. IF :ARGS < 0 OP 256 +
:ARGS ELSE OP :ARGS.END..TO OP.LOC :MOD
E. OP FIRST BF THING :MODE.END..TO ERROR
:A :B. ( PRINT [IN LINE] :LINE ). ( PRI
NT :A :B ). TOPLEVEL.END..TO $1 :WORD :V
AL. IF :WORD = " OP :VAL. IF NUMBER? FIR
ST :WORD OP $1 BF :WORD :VAL * :$BASE +
FIRST :WORD. LOCAL "DIGIT. MAKE "DIGIT (
ASCII FIRST :WORD ) - 55. IF ANYOF :DIG
IT < 0 :DIGIT - 1 > :$BASE ERROR FIRST :
WORD [NOT A DIGIT]. OP $1 BF :WORD :VAL
* :$BASE + :DIGIT.END..TO $ :WORD. OP $1
:WORD 0.END..TO SETUP. MAKE "$BASE 16.
READ "AMODES. READ "OPCODES. MAKE "ORG $
"C40. ERNAME "STARTUP. ER SETUP.END..MA
KE "STARTUP [SETUP].
×
C64 Image
> CLICK IMAGE PREVIEW FOR FULL MODAL