1 REM TINY BASIC IL ASSEMBLER VERSION 0 1 JAN 1977 2 GOTO 100 3 *SX00JS30J 38BR40BVA0BNC0BEE0BC80PC24LB09LN0ANO08 4 *DS0BSP0CSB10RB11FV12SV13GS14RS15GO16NE17AD18SU19MP1ADV1B 5 *CP1CNX1DLS1FPN20PQ21PT22NL23GL27IL2AMT2BXQ2CWS2DUS2ERT2F 6 7 ....COPYRIGHT (C) 1977 BY TOM PITTMAN.... 10 REMARKS: 11 LINES 3-5 ARE OPCODE TABLE 12 LABEL TABLE USES GOSUB STACK 13 . 14 THIS PROGRAM USES A 2-BYTE PEEK USR FUNCTION 15 PUT ITS ADDRESS IN VARIABLE D. 16 IN 6800: 17 LDA A,1,X A IS LSB 18 LDA B,0,X 19 RTS 20 IN 6502: 21 STX $C3 ($C2=00) 22 LDA ($C2),Y GET MSB 23 PHA SAVE IT 24 INY 25 LDA ($C2),Y GET LSB 26 TAX 27 PLA 28 TAY Y=MSB 29 TXA 30 RTS 31 NOTE THAT THIS PROGRAM CORRECTS FOR 2-BYTE-DATA 32 IN 6502 FORMAT (LSB,MSB) WHEN INITIALIZING. 33 . 34 THE FOLLOWING VARIABLES ARE DEFINED: 35 A STARTING ADDRESS 36 B LINE BUFFER POINTER ADDRESS 37 C LINE POINTER WORK 38 D 2-BYTE PEEK USR FUNCTION ADDRESS 39 E END OF OPCODE TABLE 40 F PASS # 41 G PEEK USR FUNCTION ADDRESS 42 H HEX WORK 43 I TEMP WORK 44 J TEMP WORK 45 K TEMP WORK (HEX) 46 L (RELATIVE) LOCATION COUNTER 47 M 48 N LINE NUMBER 49 O OP TABLE START 50 P POKE USR FUNCTION ADDRESS 51 Q 52 R 53 S SYMBOL TABLE START 54 T TEMP (TABLE POINTER) 55 U 56 V SYMBOL WORK 57 W SYMBOL WORK 58 X ERROR COUNT 59 Y 60 Z 61 . 62 SOURCE FILE IS IN THE FORM 63 (LINE NUMBER) :LABEL OP OPND COMMENTS 64 THE LINE NUMBER MUST BE >0. 65 THE LABEL IS IDENTIFIED BY THE LEADING COLON, 66 AND MAY BE 1-4 CHARACTERS LONG (FIRST IS LETTER); 67 IT IS TERMINATED BY BLANK, AND MAY BE OMITTED. 68 . 69 OP IS THE 2-LETTER OPCODE. 70 OPND IS THE OPERAND: 71 FOR SX IT MUST BE A DIGIT 1-7 72 FOR LB OR LN, A DECIMAL NUMBER 0-255 OR 0-65535 73 FOR PC, A STRING OF THE FORM 'STRING' 74 FOR JUMPS & BRANCHES IT MUST BE A SYMBOL 75 BRANCHES MAY REFER TO SYMBOL "*" 76 TO INVOKE ERROR STOP FORM. 77 BC REQUIRES BOTH A SYMBOL AND A STRING, 78 SEPARATED BY ONE OR MORE SPACES. 79 COMMENTS SHOULD BE PRECEDED BY A SPACE, 80 AND SHOULD NOT BEGIN WITH A DIGIT OR (+,-,*,/) 81 COMMENT LINES HAVE A PERIOD 82 FOLLOWING THE LINE NUMBER. 83 THE END OF FILE IS A LINE NUMBER 0. 84 . 85 SOURCE IS LISTED ON BOTH PASSES. 86 OUTPUT IS: HEX ADDRESS, HEX CODE, SEMICOLON, 87 ON SAME LINE AS FOLLOWING SOURCE. 88 . 89 . 90 ERROR FLAGS: 91 *DL* DUPLICATE LABEL (PASS 1) 92 *OP* OPERAND FORMAT ERROR 93 *IE* UNDEFINED OP CODE 94 *LE* INCOMPLETE LINE 95 *US* UNDEFINED SYMBOL (PASS 2) 99 . 100 REM 101 REM LINES 101-199 ONLY NEED TO EXECUTE ONCE. 102 REM THEY SHOULD BE DELETED AT STOP. 103 REM INPUT ADDRESS CONSTANTS 104 PRINT "PLEASE TYPE IN USR ADDRESS FOR PEEK (IN DECIMAL)"; 105 INPUT G 106 PRINT "ADDRESS FOR POKE"; 107 INPUT P 108 PRINT "ADDRESS FOR 2-BYTE PEEK"; 109 INPUT D 110 B=47 111 O=USR(D,32) 112 E=USR(D,34) 113 IF USR(G,B)>0 GOTO 118 114 B=46 115 O=USR(G,32)+USR(G,33)*256 116 E=USR(G,34)+USR(G,35)*256 118 E=E+1 119 REM FIND OPCODE TABLE (LINE 3) 120 O=O+1 121 IF USR(G,O)<>3 GOTO 120 122 O=O+2 130 Y=1 131 N=0 132 PRINT "DO YOU NEED INSTRUCTIONS (Y OR N)"; 133 INPUT I 134 IF I=Y LIST 61,99 190 PRINT "REMOVE LINES 10-99, 101-199" 191 PRINT "OR IF YOU HAVE PLENTY OF MEMORY," 192 PRINT "RETYPE LINE: 100 GOTO 200" 193 PRINT "THEN TYPE RUN." 195 GOTO 200 198 END 199 REM 2-PASS ASSEMBLER. START FIRST PASS. 200 X=0 201 S=E 202 F=0 203 PRINT "(DECIMAL) STARTING ADDRESS"; 204 INPUT A 205 F=F+1 206 IF F=3 GOTO 760 207 L=0 208 PRINT 209 PRINT "TBIL ASSEMBLER, PASS ";F 210 PRINT 211 GOSUB 460 212 PRINT "; "; 213 REM GET NEXT INPUT LINE 214 I=USR(P,USR(G,B),13) 215 INPUT N 216 REM LINE NUMBER 0 IS EOF 217 IF N=0 GOTO 205 218 GOSUB 460 219 REM CHECK FOR COMMENT 220 I=USR(G,USR(G,B)) 221 IF I<58 GOTO 212 222 REM PROCESS LABEL, IF ANY 223 IF I>64 GOTO 300 224 GOSUB 405 225 GOSUB 500 231 REM CHECK FOR DUPLICATES ON PASS 1 232 IF F>1 GOTO 300 234 IF T=0 GOSUB 237 235 GOTO 901 237 GOSUB 238 238 GOSUB 239 239 S=S-6 240 REM INSERT THIS ONE 241 I=USR(P,S,V/256)+USR(P,S+1,V) 242 I=USR(P,S+2,W/256)+USR(P,S+3,W) 243 I=USR(P,S+4,L/256)+USR(P,S+5,L) 290 REM LOOK AT OPCODE 300 GOSUB 410 301 IF I<65 GOTO 911 305 I=USR(D,USR(G,B)) 306 GOSUB 404 307 REM SEARCH OPCODE TABLE 308 T=O 309 IF USR(D,T)=I GOTO 313 310 T=T+4 311 IF T48 IF I<56 GOTO 323 333 REM OPERAND FORMAT ERROR 334 GOTO 921 336 IF F=1 GOTO 212 337 GOTO 931 339 REM JUMP & CALL 340 L=L+1 341 GOSUB 410 342 IF I<65 GOTO 334 344 K=W-W/16*16 345 GOSUB 500 346 IF T=0 GOTO 336 347 K=I+(K+48)*256 348 GOTO 356 349 REM PUSH LITERAL BYTE ON STACK 350 L=L+1 351 GOSUB 410 352 IF I<48 GOTO 334 353 IF I>57 GOTO 334 354 INPUT K 355 K=K+2304 356 GOSUB 440 357 PRINT ";"; 358 GOTO 214 359 REM RELATIVE BRANCHES 360 K=T 362 GOSUB 410 363 IF I=42 GOTO 365 364 IF I<65 GOTO 334 365 GOSUB 500 366 IF T=0 IF KL+31 GOTO 334 368 IF K=O+12 THEN I=I+32 369 IF I94 GOTO 391 389 K=K-64 390 GOTO 386 391 L=L+1 392 IF I=13 GOTO 334 393 IF T=I GOTO 397 394 GOSUB 450 395 K=I 396 GOTO 386 397 K=K+128 398 GOSUB 450 399 PRINT ";"; 400 IF L=J+1 GOTO 214 401 GOTO 210 402 REM --- SUBROUTINES 403 REM ADVANCE INPUT LINE POINTER 404 GOSUB 405 405 C=USR(P,B,USR(G,B)+1) 406 RETURN 407 REM 408 REM SKIP BLANKS IN INPUT LINE 409 GOSUB 405 410 I=USR(G,USR(G,B)) 411 IF I=32 GOTO 409 412 IF I>32 RETURN 413 GOTO 941 418 REM 419 REM PRINT HEX DIGITS 420 PRINT "A"; 421 RETURN 422 PRINT "B"; 423 RETURN 424 PRINT "C"; 425 RETURN 426 PRINT "D"; 427 RETURN 428 PRINT "E"; 429 RETURN 430 PRINT "F"; 431 RETURN 434 IF H>64 GOTO H+H+290 435 H=H-48 436 IF H>9 GOTO 400+H+H 437 PRINT H; 438 RETURN 439 REM PRINT NUMBER AS HEX 440 H=K/4096 441 IF K<0 THEN H=H-1 442 K=K-H*4096 443 IF H<0 THEN H=H+16 444 GOSUB 436 445 H=K/256 446 K=K-H*256 447 GOSUB 436 450 H=K/16 451 K=K-H*16 452 GOSUB 436 455 H=K 456 GOTO 436 458 REM 459 REM PRINT LOCATION COUNTER 460 K=A+L 461 GOSUB 440 462 PRINT " "; 463 RETURN 498 REM 499 REM LOOK UP SYMBOL IN TABLE 500 V=0 501 W=8224 502 C=USR(G,B) 503 I=USR(G,C) 504 IF I<48 GOTO 525 505 I=USR(G,C+1) 506 IF I<32 THEN I=(USR(P,C+1,32)+USR(P,C+2,13))*0+32 508 W=USR(D,C) 509 GOSUB 404 510 IF V>0 GOTO 513 511 V=W 512 GOTO 501 513 T=S 514 GOTO 518 515 I=USR(D,T+4) 516 IF V=USR(D,T) IF W=USR(D,T+2) RETURN 517 T=T+6 518 IF T42 GOTO 510 526 T=1 527 I=L 528 GOTO 405 548 REM 549 REM PUSH 2-BYTE LITERAL ONTO STACK 550 PRINT "0A;" 552 GOSUB 460 553 L=L+2 554 GOSUB 410 555 IF I<48 GOTO 334 556 IF I>57 GOTO 334 557 INPUT K 558 GOTO 356 700 REM PROGRAM END 760 PRINT 770 PRINT X;" ERRORS" 790 END 900 REM ERROR MESSAGES 901 PRINT "*DL* "; 902 X=X+1 903 GOTO 300 911 PRINT "*IE* "; 912 X=X+1 914 L=L+2 915 GOTO 214 921 PRINT "*OP* "; 922 X=X+1 923 GOTO 214 931 PRINT "*US* "; 932 X=X+1 933 GOTO 214 941 PRINT "*LE* "; 942 X=X+1 944 RETURN 999 END REM -- Run this assembler on original IL source code... RUN 276 280 277 N 0 1 . ORIGINAL TINY BASIC INTERMEDIATE INTERPRETER 2 . 3 . EXECUTIVE INITIALIZATION 4 . 5 :STRT PC ":Q^" COLON, X-ON 6 GL 7 SB 8 BE L0 BRANCH IF NOT EMPTY 9 BR STRT TRY AGAIN IF NULL LINE 10 :L0 BN STMT TEST FOR LINE NUMBER 11 IL IF SO, INSERT INTO PROGRAM 12 BR STRT GO GET NEXT 13 :XEC SB SAVE POINTERS FOR RUN WITH 14 RB CONCATENATED INPUT 15 XQ 16 . 17 . STATEMENT EXECUTOR 18 . 19 :STMT BC GOTO "LET" 20 BV * MUST BE A VARIABLE NAME 21 BC * "=" 22 :LET JS EXPR GO GET EXPRESSION 23 BE * IF STATEMENT END, 24 SV STORE RESULT 25 NX 26 . 27 :GOTO BC PRNT "GO" 28 BC GOSB "TO" 29 JS EXPR GET LINE NUMBER 30 BE * 31 SB (DO THIS FOR STARTING) 32 RB 33 GO GO THERE 34 . 35 :GOSB BC * "SUB" NO OTHER WORD BEGINS "GO..." 36 JS EXPR 37 BE * 38 GS 39 GO 40 . 41 :PRNT BC SKIP "PR" 42 BC P0 "INT" OPTIONALLY OMIT "INT" 43 :P0 BE P3 44 BR P6 IF DONE, GO TO END 45 :P1 BC P4 ";" 46 :P2 BE P3 47 NX NO CRLF IF ENDED BY ; OR , 48 :P3 BC P7 '"' 49 PQ QUOTE MARKS STRING 50 BR P1 GO CHECK DELIMITER 51 :SKIP BR IF (ON THE WAY THRU) 52 :P4 BC P5 "," 53 PT COMMA SPACING 54 BR P2 55 :P5 BC P6 ":" 56 PC "S^" OUTPUT X-OFF 57 :P6 BE * 58 NL THEN CRLF 59 NX 60 :P7 JS EXPR TRY FOR AN EXPRESSION 61 PN 62 BR P1 63 . 64 :IF BC INPT "IF" 65 JS EXPR 66 JS RELO 67 JS EXPR 68 BC I1 "THEN" OPTIONAL NOISEWORD 69 :I1 CP COMPARE SKIPS NEXT IF TRUE 70 NX FALSE. 71 J STMT TRUE. GO PROCESS STATEMENT 72 . 73 :INPT BC RETN "INPUT" 74 :I2 BV * GET VARIABLE 75 SB SWAP POINTERS 76 BE I4 77 :I3 PC "? Q^" LINE IS EMPTY; TYPE PROMPT 78 GL READ INPUT LINE 79 BE I4 DID ANYTHING COME? 80 BR I3 NO, TRY AGAIN 81 :I4 BC I5 "," OPTIONAL COMMA 82 :I5 JS EXPR READ A NUMBER 83 SV STORE INTO VARIABLE 84 RB SWAP BACK 85 BC I6 "," ANOTHER? 86 BR I2 YES IF COMMA 87 :I6 BE * OTHERWISE QUIT 88 NX 89 . 90 :RETN BC END "RETURN" 91 BE * 92 RS RECOVER SAVED LINE 93 NX 94 . 95 :END BC LIST "END" 96 BE * 97 WS 98 . 99 :LIST BC RUN "LIST" 100 BE L2 101 :L1 PC "@^@^@^@^J^@^" PUNCH LEADER 102 LS LIST 103 PC "S^" PUNCH X-OFF 104 NL 105 NX 106 :L2 JS EXPR GET A LINE NUMBER 107 BE L3 108 BR L1 109 :L3 BC * "," SEPARATED BY COMMAS 110 BR L2 111 . 112 :RUN BC CLER "RUN" 113 J XEC 114 . 115 :CLER BC REM "CLEAR" 116 MT 117 . 118 :REM BC DFLT "REM" 119 NX 120 . 121 :DFLT BV * NO KEYWORD... 122 BC * "=" TRY FOR LET 123 J LET IT'S A GOOD BET. 124 . 125 . SUBROUTINES 126 . 127 :EXPR BC E0 "-" TRY FOR UNARY MINUS 128 JS TERM AHA 129 NE 130 BR E1 131 :E0 BC E4 "+" IGNORE UNARY PLUS 132 :E4 JS TERM 133 :E1 BC E2 "+" TERMS SEPARATED BY PLUS 134 JS TERM 135 AD 136 BR E1 137 :E2 BC E3 "-" TERMS SEPARATED BY MINUS 138 JS TERM 139 SU 140 BR E1 141 :E3 RT 142 . 143 :TERM JS FACT 144 :T0 BC T1 "*" FACTORS SEPARATED BY TIMES 145 JS FACT 146 MP 147 BR T0 148 :T1 BC T2 "/" FACTORS SEPARATED BY DIVIDE 149 JS FACT 150 DV 151 BR T0 152 :T2 RT 153 . 154 :FACT BC F0 "RND" *RND FUNCTION* 155 LN 257*128 STACK POINTER FOR STORE 156 FV THEN GET RNDM 157 LN 2345 R:=R*2345+6789 158 MP 159 LN 6789 160 AD 161 SV 162 LB 128 GET IT AGAIN 163 FV 263 SX 1 (slightly better RND) 164 DS 165 JS FUNC GET ARGUMENT 166 BR F1 167 :F0 BR F2 (SKIPPING) 168 :F1 DS 169 . SX 2 PUSH TOP INTO STACK 170 SX 4 171 SX 2 172 SX 3 173 SX 5 174 SX 3 175 DV PERFORM MOD FUNCTION 176 MP 177 SU 178 DS PERFORM ABS FUNCTION 179 LB 6 180 LN 0 181 CP (SKIP IF + OR 0) 182 NE 183 RT 184 :F2 BC F3 "USR" *USR FUNCTION* 185 BC * "(" 3 ARGUMENTS POSSIBLE 186 JS EXPR ONE REQUIRED 187 JS ARG 188 JS ARG 189 BC * ")" 190 US GO DO IT 191 RT 192 :F3 BV F4 VARIABLE? 193 FV YES. GET IT 194 RT 195 :F4 BN F5 NUMBER? 196 RT GOT IT. 197 :F5 BC * "(" OTHERWISE MUST BE (EXPR) 198 :F6 JS EXPR 199 BC * ")" 200 RT 201 . 202 :ARG BC A0 "," COMMA? 203 J EXPR YES, GET EXPRESSION 204 :A0 DS NO, DUPLICATE STACK TOP 205 RT 206 . 207 :FUNC BC * "(" 208 BR F6 209 RT 210 . 211 :RELO BC R0 "=" CONVERT RELATION OPERATORS 212 LB 2 TO CODE BYTE ON STACK 213 RT = 214 :R0 BC R4 "<" 215 BC R1 "=" 216 LB 3 <= 217 RT 218 :R1 BC R3 ">" 219 LB 5 <> 220 RT 221 :R3 LB 1 < 222 RT 223 :R4 BC * ">" 224 BC R5 "=" 225 LB 6 >= 226 RT 227 :R5 BC R6 "<" 228 LB 5 >< 229 RT 230 :R6 LB 4 > 231 RT 232 . 0000 1 . ORIGINAL TINY BASIC INTERMEDIATE INTERPRETER 2 . 3 . EXECUTIVE INITIALIZATION 4 . 5 :STRT PC ":Q^" COLON, X-ON 6 GL 7 SB 8 BE L0 BRANCH IF NOT EMPTY 9 BR STRT TRY AGAIN IF NULL LINE 10 :L0 BN STMT TEST FOR LINE NUMBER 11 IL IF SO, INSERT INTO PROGRAM 12 BR STRT GO GET NEXT 13 :XEC SB SAVE POINTERS FOR RUN WITH 14 RB CONCATENATED INPUT 15 XQ 16 . 17 . STATEMENT EXECUTOR 18 . 19 :STMT BC GOTO "LET" 20 BV * MUST BE A VARIABLE NAME 21 BC * "=" 22 :LET JS EXPR GO GET EXPRESSION 23 BE * IF STATEMENT END, 24 SV STORE RESULT 25 NX 26 . 27 :GOTO BC PRNT "GO" 28 BC GOSB "TO" 29 JS EXPR GET LINE NUMBER 30 BE * 31 SB (DO THIS FOR STARTING) 32 RB 33 GO GO THERE 34 . 35 :GOSB BC * "SUB" NO OTHER WORD BEGINS "GO..." 36 JS EXPR 37 BE * 38 GS 39 GO 40 . 41 :PRNT BC SKIP "PR" 42 BC P0 "INT" OPTIONALLY OMIT "INT" 43 :P0 BE P3 44 BR P6 IF DONE, GO TO END 45 :P1 BC P4 ";" 46 :P2 BE P3 47 NX NO CRLF IF ENDED BY ; OR , 48 :P3 BC P7 '"' 49 PQ QUOTE MARKS STRING 50 BR P1 GO CHECK DELIMITER 51 :SKIP BR IF (ON THE WAY THRU) 52 :P4 BC P5 "," 53 PT COMMA SPACING 54 BR P2 55 :P5 BC P6 ":" 56 PC "S^" OUTPUT X-OFF 57 :P6 BE * 58 NL THEN CRLF 59 NX 60 :P7 JS EXPR TRY FOR AN EXPRESSION 61 PN 62 BR P1 63 . 64 :IF BC INPT "IF" 65 JS EXPR 66 JS RELO 67 JS EXPR 68 BC I1 "THEN" OPTIONAL NOISEWORD 69 :I1 CP COMPARE SKIPS NEXT IF TRUE 70 NX FALSE. 71 J STMT TRUE. GO PROCESS STATEMENT 72 . 73 :INPT BC RETN "INPUT" 74 :I2 BV * GET VARIABLE 75 SB SWAP POINTERS 76 BE I4 77 :I3 PC "? Q^" LINE IS EMPTY; TYPE PROMPT 78 GL READ INPUT LINE 79 BE I4 DID ANYTHING COME? 80 BR I3 NO, TRY AGAIN 81 :I4 BC I5 "," OPTIONAL COMMA 82 :I5 JS EXPR READ A NUMBER 83 SV STORE INTO VARIABLE 84 RB SWAP BACK 85 BC I6 "," ANOTHER? 86 BR I2 YES IF COMMA 87 :I6 BE * OTHERWISE QUIT 88 NX 89 . 90 :RETN BC END "RETURN" 91 BE * 92 RS RECOVER SAVED LINE 93 NX 94 . 95 :END BC LIST "END" 96 BE * 97 WS 98 . 99 :LIST BC RUN "LIST" 100 BE L2 101 :L1 PC "@^@^@^@^J^@^" PUNCH LEADER 102 LS LIST 103 PC "S^" PUNCH X-OFF 104 NL 105 NX 106 :L2 JS EXPR GET A LINE NUMBER 107 BE L3 108 BR L1 109 :L3 BC * "," SEPARATED BY COMMAS 110 BR L2 111 . 112 :RUN BC CLER "RUN" 113 J XEC 114 . 115 :CLER BC REM "CLEAR" 116 MT 117 . 118 :REM BC DFLT "REM" 119 NX 120 . 121 :DFLT BV * NO KEYWORD... 122 BC * "=" TRY FOR LET 123 J LET IT'S A GOOD BET. 124 . 125 . SUBROUTINES 126 . 127 :EXPR BC E0 "-" TRY FOR UNARY MINUS 128 JS TERM AHA 129 NE 130 BR E1 131 :E0 BC E4 "+" IGNORE UNARY PLUS 132 :E4 JS TERM 133 :E1 BC E2 "+" TERMS SEPARATED BY PLUS 134 JS TERM 135 AD 136 BR E1 137 :E2 BC E3 "-" TERMS SEPARATED BY MINUS 138 JS TERM 139 SU 140 BR E1 141 :E3 RT 142 . 143 :TERM JS FACT 144 :T0 BC T1 "*" FACTORS SEPARATED BY TIMES 145 JS FACT 146 MP 147 BR T0 148 :T1 BC T2 "/" FACTORS SEPARATED BY DIVIDE 149 JS FACT 150 DV 151 BR T0 152 :T2 RT 153 . 154 :FACT BC F0 "RND" *RND FUNCTION* 155 LN 257*128 STACK POINTER FOR STORE 156 FV THEN GET RNDM 157 LN 2345 R:=R*2345+6789 158 MP 159 LN 6789 160 AD 161 SV 162 LB 128 GET IT AGAIN 163 FV 263 SX 1 (slightly better RND) 164 DS 165 JS FUNC GET ARGUMENT 166 BR F1 167 :F0 BR F2 (SKIPPING) 168 :F1 DS 169 . SX 2 PUSH TOP INTO STACK 170 SX 4 171 SX 2 172 SX 3 173 SX 5 174 SX 3 175 DV PERFORM MOD FUNCTION 176 MP 177 SU 178 DS PERFORM ABS FUNCTION 179 LB 6 180 LN 0 181 CP (SKIP IF + OR 0) 182 NE 183 RT 184 :F2 BC F3 "USR" *USR FUNCTION* 185 BC * "(" 3 ARGUMENTS POSSIBLE 186 JS EXPR ONE REQUIRED 187 JS ARG 188 JS ARG 189 BC * ")" 190 US GO DO IT 191 RT 192 :F3 BV F4 VARIABLE? 193 FV YES. GET IT 194 RT 195 :F4 BN F5 NUMBER? 196 RT GOT IT. 197 :F5 BC * "(" OTHERWISE MUST BE (EXPR) 198 :F6 JS EXPR 199 BC * ")" 200 RT 201 . 202 :ARG BC A0 "," COMMA? 203 J EXPR YES, GET EXPRESSION 204 :A0 DS NO, DUPLICATE STACK TOP 205 RT 206 . 207 :FUNC BC * "(" 208 BR F6 209 RT 210 . 211 :RELO BC R0 "=" CONVERT RELATION OPERATORS 212 LB 2 TO CODE BYTE ON STACK 213 RT = 214 :R0 BC R4 "<" 215 BC R1 "=" 216 LB 3 <= 217 RT 218 :R1 BC R3 ">" 219 LB 5 <> 220 RT 221 :R3 LB 1 < 222 RT 223 :R4 BC * ">" 224 BC R5 "=" 225 LB 6 >= 226 RT 227 :R5 BC R6 "<" 228 LB 5 >< 229 RT 230 :R6 LB 4 > 231 RT 232 . 0000