home *** CD-ROM | disk | FTP | other *** search
/ ittybittycomputers.com / www.ittybittycomputers.com.tar / www.ittybittycomputers.com / IttyBitty / TinyBasic / TBasm.txt < prev    next >
Text File  |  2006-10-18  |  20KB  |  851 lines

  1. 1 REM TINY BASIC IL ASSEMBLER VERSION 0        1 JAN 1977
  2. 2 GOTO 100
  3. 3 *SX00JS30J 38BR40BVA0BNC0BEE0BC80PC24LB09LN0ANO08
  4. 4 *DS0BSP0CSB10RB11FV12SV13GS14RS15GO16NE17AD18SU19MP1ADV1B
  5. 5 *CP1CNX1DLS1FPN20PQ21PT22NL23GL27IL2AMT2BXQ2CWS2DUS2ERT2F
  6. 6
  7. 7               ....COPYRIGHT (C) 1977  BY TOM PITTMAN....
  8. 10 REMARKS:
  9. 11 LINES 3-5 ARE OPCODE TABLE
  10. 12 LABEL TABLE USES GOSUB STACK
  11. 13 .
  12. 14 THIS PROGRAM USES A 2-BYTE PEEK USR FUNCTION
  13. 15 PUT ITS ADDRESS IN VARIABLE D.
  14. 16 IN 6800:
  15. 17   LDA A,1,X        A IS LSB
  16. 18   LDA B,0,X
  17. 19   RTS
  18. 20 IN 6502:
  19. 21   STX $C3          ($C2=00)
  20. 22   LDA ($C2),Y      GET MSB
  21. 23   PHA              SAVE IT
  22. 24   INY
  23. 25   LDA ($C2),Y      GET LSB
  24. 26   TAX
  25. 27   PLA
  26. 28   TAY              Y=MSB
  27. 29   TXA
  28. 30   RTS
  29. 31 NOTE THAT THIS PROGRAM CORRECTS FOR 2-BYTE-DATA
  30. 32 IN 6502 FORMAT (LSB,MSB) WHEN INITIALIZING.
  31. 33 .
  32. 34 THE FOLLOWING VARIABLES ARE DEFINED:
  33. 35 A  STARTING ADDRESS
  34. 36 B  LINE BUFFER POINTER ADDRESS
  35. 37 C  LINE POINTER WORK
  36. 38 D  2-BYTE PEEK USR FUNCTION ADDRESS
  37. 39 E  END OF OPCODE TABLE
  38. 40 F  PASS #
  39. 41 G  PEEK USR FUNCTION ADDRESS
  40. 42 H  HEX WORK
  41. 43 I  TEMP WORK
  42. 44 J  TEMP WORK
  43. 45 K  TEMP WORK (HEX)
  44. 46 L  (RELATIVE) LOCATION COUNTER
  45. 47 M
  46. 48 N  LINE NUMBER
  47. 49 O  OP TABLE START
  48. 50 P  POKE USR FUNCTION ADDRESS
  49. 51 Q
  50. 52 R
  51. 53 S  SYMBOL TABLE START
  52. 54 T  TEMP (TABLE POINTER)
  53. 55 U
  54. 56 V  SYMBOL WORK
  55. 57 W  SYMBOL WORK
  56. 58 X  ERROR COUNT
  57. 59 Y
  58. 60 Z
  59. 61 .
  60. 62 SOURCE FILE IS IN THE FORM
  61. 63 (LINE NUMBER) :LABEL OP OPND COMMENTS
  62. 64 THE LINE NUMBER MUST BE >0.
  63. 65 THE LABEL IS IDENTIFIED BY THE LEADING COLON,
  64. 66 AND MAY BE 1-4 CHARACTERS LONG (FIRST IS LETTER);
  65. 67 IT IS TERMINATED BY BLANK, AND MAY BE OMITTED.
  66. 68 .
  67. 69 OP IS THE 2-LETTER OPCODE.
  68. 70 OPND IS THE OPERAND:
  69. 71 FOR SX IT MUST BE A DIGIT 1-7
  70. 72 FOR LB OR LN, A DECIMAL NUMBER 0-255 OR 0-65535
  71. 73 FOR PC, A STRING OF THE FORM 'STRING'
  72. 74 FOR JUMPS & BRANCHES IT MUST BE A SYMBOL
  73. 75 BRANCHES MAY REFER TO SYMBOL "*"
  74. 76 TO INVOKE ERROR STOP FORM.
  75. 77 BC REQUIRES BOTH A SYMBOL AND A STRING,
  76. 78 SEPARATED BY ONE OR MORE SPACES.
  77. 79 COMMENTS SHOULD BE PRECEDED BY A SPACE,
  78. 80 AND SHOULD NOT BEGIN WITH A DIGIT OR (+,-,*,/)
  79. 81 COMMENT LINES HAVE A PERIOD
  80. 82 FOLLOWING THE LINE NUMBER.
  81. 83 THE END OF FILE IS A LINE NUMBER 0.
  82. 84 .
  83. 85 SOURCE IS LISTED ON BOTH PASSES.
  84. 86 OUTPUT IS: HEX ADDRESS, HEX CODE, SEMICOLON,
  85. 87 ON SAME LINE AS FOLLOWING SOURCE.
  86. 88 .
  87. 89 .
  88. 90 ERROR FLAGS:
  89. 91 *DL* DUPLICATE LABEL (PASS 1)
  90. 92 *OP* OPERAND FORMAT ERROR
  91. 93 *IE* UNDEFINED OP CODE
  92. 94 *LE* INCOMPLETE LINE
  93. 95 *US* UNDEFINED SYMBOL (PASS 2)
  94. 99 .
  95. 100 REM
  96. 101 REM LINES 101-199 ONLY NEED TO EXECUTE ONCE.
  97. 102 REM THEY SHOULD BE DELETED AT STOP.
  98. 103 REM INPUT ADDRESS CONSTANTS
  99. 104 PRINT "PLEASE TYPE IN USR ADDRESS FOR PEEK (IN DECIMAL)";
  100. 105 INPUT G
  101. 106 PRINT "ADDRESS FOR POKE";
  102. 107 INPUT P
  103. 108 PRINT "ADDRESS FOR 2-BYTE PEEK";
  104. 109 INPUT D
  105. 110 B=47
  106. 111 O=USR(D,32)
  107. 112 E=USR(D,34)
  108. 113 IF USR(G,B)>0 GOTO 118
  109. 114 B=46
  110. 115 O=USR(G,32)+USR(G,33)*256
  111. 116 E=USR(G,34)+USR(G,35)*256
  112. 118 E=E+1
  113. 119 REM FIND OPCODE TABLE (LINE 3)
  114. 120 O=O+1
  115. 121 IF USR(G,O)<>3 GOTO 120
  116. 122 O=O+2
  117. 130 Y=1
  118. 131 N=0
  119. 132 PRINT "DO YOU NEED INSTRUCTIONS (Y OR N)";
  120. 133 INPUT I
  121. 134 IF I=Y LIST 61,99
  122. 190 PRINT "REMOVE LINES 10-99, 101-199"
  123. 191 PRINT "OR IF YOU HAVE PLENTY OF MEMORY,"
  124. 192 PRINT "RETYPE LINE: 100 GOTO 200"
  125. 193 PRINT "THEN TYPE RUN."
  126. 195 GOTO 200
  127. 198 END
  128. 199 REM 2-PASS ASSEMBLER. START FIRST PASS.
  129. 200 X=0
  130. 201 S=E
  131. 202 F=0
  132. 203 PRINT "(DECIMAL) STARTING ADDRESS";
  133. 204 INPUT A
  134. 205 F=F+1
  135. 206 IF F=3 GOTO 760
  136. 207 L=0
  137. 208 PRINT
  138. 209 PRINT "TBIL ASSEMBLER, PASS ";F
  139. 210 PRINT
  140. 211 GOSUB 460
  141. 212 PRINT ";    ";
  142. 213 REM GET NEXT INPUT LINE
  143. 214 I=USR(P,USR(G,B),13)
  144. 215 INPUT N
  145. 216 REM LINE NUMBER 0 IS EOF
  146. 217 IF N=0 GOTO 205
  147. 218 GOSUB 460
  148. 219 REM CHECK FOR COMMENT
  149. 220 I=USR(G,USR(G,B))
  150. 221 IF I<58 GOTO 212
  151. 222 REM PROCESS LABEL, IF ANY
  152. 223 IF I>64 GOTO 300
  153. 224 GOSUB 405
  154. 225 GOSUB 500
  155. 231 REM CHECK FOR DUPLICATES ON PASS 1
  156. 232 IF F>1 GOTO 300
  157. 234 IF T=0 GOSUB 237
  158. 235 GOTO 901
  159. 237 GOSUB 238
  160. 238 GOSUB 239
  161. 239 S=S-6
  162. 240 REM INSERT THIS ONE
  163. 241 I=USR(P,S,V/256)+USR(P,S+1,V)
  164. 242 I=USR(P,S+2,W/256)+USR(P,S+3,W)
  165. 243 I=USR(P,S+4,L/256)+USR(P,S+5,L)
  166. 290 REM LOOK AT OPCODE
  167. 300 GOSUB 410
  168. 301 IF I<65 GOTO 911
  169. 305 I=USR(D,USR(G,B))
  170. 306 GOSUB 404
  171. 307 REM SEARCH OPCODE TABLE
  172. 308 T=O
  173. 309 IF USR(D,T)=I GOTO 313
  174. 310 T=T+4
  175. 311 IF T<O+167 GOTO 309
  176. 312 GOTO 911
  177. 313 V=USR(G,T+2)
  178. 314 W=USR(G,T+3)
  179. 315 L=L+1
  180. 316 IF T=O GOTO 330
  181. 317 IF T<O+10 GOTO 340
  182. 318 IF T<O+30 GOTO 360
  183. 319 IF T=O+32 GOTO 380
  184. 320 IF T=O+36 GOTO 350
  185. 321 IF T=O+40 GOTO 550
  186. 322 REM THESE OPCODES HAVE NO OPERAND
  187. 323 H=V
  188. 324 GOSUB 434
  189. 325 H=W
  190. 326 GOSUB 434
  191. 327 PRINT ";  ";
  192. 328 GOTO 214
  193. 329 REM STACK EXCHANGE OPERATOR
  194. 330 GOSUB 410
  195. 331 W=USR(G,USR(G,B))
  196. 332 IF I>48 IF I<56 GOTO 323
  197. 333 REM OPERAND FORMAT ERROR
  198. 334 GOTO 921
  199. 336 IF F=1 GOTO 212
  200. 337 GOTO 931
  201. 339 REM JUMP & CALL
  202. 340 L=L+1
  203. 341 GOSUB 410
  204. 342 IF I<65 GOTO 334
  205. 344 K=W-W/16*16
  206. 345 GOSUB 500
  207. 346 IF T=0 GOTO 336
  208. 347 K=I+(K+48)*256
  209. 348 GOTO 356
  210. 349 REM PUSH LITERAL BYTE ON STACK
  211. 350 L=L+1
  212. 351 GOSUB 410
  213. 352 IF I<48 GOTO 334
  214. 353 IF I>57 GOTO 334
  215. 354 INPUT K
  216. 355 K=K+2304
  217. 356 GOSUB 440
  218. 357 PRINT ";";
  219. 358 GOTO 214
  220. 359 REM RELATIVE BRANCHES
  221. 360 K=T
  222. 362 GOSUB 410
  223. 363 IF I=42 GOTO 365
  224. 364 IF I<65 GOTO 334
  225. 365 GOSUB 500
  226. 366 IF T=0 IF K<O+28*F GOTO 336
  227. 367 IF I>L+31 GOTO 334
  228. 368 IF K=O+12 THEN I=I+32
  229. 369 IF I<L GOTO 334
  230. 370 I=I-L
  231. 371 T=K
  232. 372 H=USR(G,K+2)+I/16
  233. 373 K=I-I/16*16
  234. 374 GOSUB 434
  235. 375 GOSUB 455
  236. 376 IF T<O+28 GOTO 327
  237. 377 GOTO 381
  238. 379 REM STRING OPERATORS
  239. 380 PRINT "24";
  240. 381 GOSUB 410
  241. 382 J=L
  242. 383 T=I
  243. 384 GOSUB 405
  244. 385 K=USR(G,USR(G,B))
  245. 386 GOSUB 405
  246. 387 I=USR (G,USR(G,B))
  247. 388 IF I<>94 GOTO 391
  248. 389 K=K-64
  249. 390 GOTO 386
  250. 391 L=L+1
  251. 392 IF I=13 GOTO 334
  252. 393 IF T=I GOTO 397
  253. 394 GOSUB 450
  254. 395 K=I
  255. 396 GOTO 386
  256. 397 K=K+128
  257. 398 GOSUB 450
  258. 399 PRINT ";";
  259. 400 IF L=J+1 GOTO 214
  260. 401 GOTO 210
  261. 402 REM      ---      SUBROUTINES
  262. 403 REM ADVANCE INPUT LINE POINTER
  263. 404 GOSUB 405
  264. 405 C=USR(P,B,USR(G,B)+1)
  265. 406 RETURN
  266. 407 REM
  267. 408 REM SKIP BLANKS IN INPUT LINE
  268. 409 GOSUB 405
  269. 410 I=USR(G,USR(G,B))
  270. 411 IF I=32 GOTO 409
  271. 412 IF I>32 RETURN
  272. 413 GOTO 941
  273. 418 REM
  274. 419 REM PRINT HEX DIGITS
  275. 420 PRINT "A";
  276. 421 RETURN
  277. 422 PRINT "B";
  278. 423 RETURN
  279. 424 PRINT "C";
  280. 425 RETURN
  281. 426 PRINT "D";
  282. 427 RETURN
  283. 428 PRINT "E";
  284. 429 RETURN
  285. 430 PRINT "F";
  286. 431 RETURN
  287. 434 IF H>64 GOTO H+H+290
  288. 435 H=H-48
  289. 436 IF H>9 GOTO 400+H+H
  290. 437 PRINT H;
  291. 438 RETURN
  292. 439 REM PRINT NUMBER AS HEX
  293. 440 H=K/4096
  294. 441 IF K<0 THEN H=H-1
  295. 442 K=K-H*4096
  296. 443 IF H<0 THEN H=H+16
  297. 444 GOSUB 436
  298. 445 H=K/256
  299. 446 K=K-H*256
  300. 447 GOSUB 436
  301. 450 H=K/16
  302. 451 K=K-H*16
  303. 452 GOSUB 436
  304. 455 H=K
  305. 456 GOTO 436
  306. 458 REM
  307. 459 REM PRINT LOCATION COUNTER
  308. 460 K=A+L
  309. 461 GOSUB 440
  310. 462 PRINT " ";
  311. 463 RETURN
  312. 498 REM
  313. 499 REM LOOK UP SYMBOL IN TABLE
  314. 500 V=0
  315. 501 W=8224
  316. 502 C=USR(G,B)
  317. 503 I=USR(G,C)
  318. 504 IF I<48 GOTO 525
  319. 505 I=USR(G,C+1)
  320. 506 IF I<32 THEN I=(USR(P,C+1,32)+USR(P,C+2,13))*0+32
  321. 508 W=USR(D,C)
  322. 509 GOSUB 404
  323. 510 IF V>0 GOTO 513
  324. 511 V=W
  325. 512 GOTO 501
  326. 513 T=S
  327. 514 GOTO 518
  328. 515 I=USR(D,T+4)
  329. 516 IF V=USR(D,T) IF W=USR(D,T+2) RETURN
  330. 517 T=T+6
  331. 518 IF T<E GOTO 515
  332. 519 T=0
  333. 520 I=L
  334. 521 RETURN
  335. 524 REM ASTERISK OPERAND?
  336. 525 IF I<>42 GOTO 510
  337. 526 T=1
  338. 527 I=L
  339. 528 GOTO 405
  340. 548 REM
  341. 549 REM PUSH 2-BYTE LITERAL ONTO STACK
  342. 550 PRINT "0A;"
  343. 552 GOSUB 460
  344. 553 L=L+2
  345. 554 GOSUB 410
  346. 555 IF I<48 GOTO 334
  347. 556 IF I>57 GOTO 334
  348. 557 INPUT K
  349. 558 GOTO 356
  350. 700 REM PROGRAM END
  351. 760 PRINT
  352. 770 PRINT X;" ERRORS"
  353. 790 END
  354. 900 REM ERROR MESSAGES
  355. 901 PRINT "*DL* ";
  356. 902 X=X+1
  357. 903 GOTO 300
  358. 911 PRINT "*IE* ";
  359. 912 X=X+1
  360. 914 L=L+2
  361. 915 GOTO 214
  362. 921 PRINT "*OP* ";
  363. 922 X=X+1
  364. 923 GOTO 214
  365. 931 PRINT "*US* ";
  366. 932 X=X+1
  367. 933 GOTO 214
  368. 941 PRINT "*LE* ";
  369. 942 X=X+1
  370. 944 RETURN
  371. 999 END
  372.  
  373.  
  374.  
  375.  
  376. REM -- Run this assembler on original IL source code...
  377. RUN
  378. 276
  379. 280
  380. 277
  381. N
  382. 0
  383.    1 .  ORIGINAL TINY BASIC INTERMEDIATE INTERPRETER
  384.    2 .
  385.    3 .  EXECUTIVE INITIALIZATION
  386.    4 .
  387.    5 :STRT PC ":Q^"        COLON, X-ON
  388.    6       GL
  389.    7       SB
  390.    8       BE L0           BRANCH IF NOT EMPTY
  391.    9       BR STRT         TRY AGAIN IF NULL LINE
  392.   10 :L0   BN STMT         TEST FOR LINE NUMBER
  393.   11       IL              IF SO, INSERT INTO PROGRAM
  394.   12       BR STRT         GO GET NEXT
  395.   13 :XEC  SB              SAVE POINTERS FOR RUN WITH
  396.   14       RB                CONCATENATED INPUT
  397.   15       XQ
  398.   16 .
  399.   17 .  STATEMENT EXECUTOR
  400.   18 .
  401.   19 :STMT BC GOTO "LET"
  402.   20       BV *            MUST BE A VARIABLE NAME
  403.   21       BC * "="
  404.   22 :LET  JS EXPR         GO GET EXPRESSION
  405.   23       BE *            IF STATEMENT END,
  406.   24       SV                STORE RESULT
  407.   25       NX
  408.   26 .
  409.   27 :GOTO BC PRNT "GO"
  410.   28       BC GOSB "TO"
  411.   29       JS EXPR         GET LINE NUMBER
  412.   30       BE *
  413.   31       SB              (DO THIS FOR STARTING)
  414.   32       RB
  415.   33       GO              GO THERE
  416.   34 .
  417.   35 :GOSB BC * "SUB"      NO OTHER WORD BEGINS "GO..."
  418.   36       JS EXPR
  419.   37       BE *
  420.   38       GS
  421.   39       GO
  422.   40 .
  423.   41 :PRNT BC SKIP "PR"
  424.   42       BC P0 "INT"     OPTIONALLY OMIT "INT"
  425.   43 :P0   BE P3
  426.   44       BR P6           IF DONE, GO TO END
  427.   45 :P1   BC P4 ";"
  428.   46 :P2   BE P3
  429.   47       NX              NO CRLF IF ENDED BY ; OR ,
  430.   48 :P3   BC P7 '"'
  431.   49       PQ              QUOTE MARKS STRING
  432.   50       BR P1           GO CHECK DELIMITER
  433.   51 :SKIP BR IF           (ON THE WAY THRU)
  434.   52 :P4   BC P5 ","
  435.   53       PT              COMMA SPACING
  436.   54       BR P2
  437.   55 :P5   BC P6 ":"
  438.   56       PC "S^"         OUTPUT X-OFF
  439.   57 :P6   BE *
  440.   58       NL              THEN CRLF
  441.   59       NX
  442.   60 :P7   JS EXPR         TRY FOR AN EXPRESSION
  443.   61       PN
  444.   62       BR P1
  445.   63 .
  446.   64 :IF   BC INPT "IF"
  447.   65       JS EXPR
  448.   66       JS RELO
  449.   67       JS EXPR
  450.   68       BC I1 "THEN"    OPTIONAL NOISEWORD
  451.   69 :I1   CP              COMPARE SKIPS NEXT IF TRUE
  452.   70       NX              FALSE.
  453.   71       J STMT          TRUE. GO PROCESS STATEMENT
  454.   72 .
  455.   73 :INPT BC RETN "INPUT"
  456.   74 :I2   BV *            GET VARIABLE
  457.   75       SB              SWAP POINTERS
  458.   76       BE I4
  459.   77 :I3   PC "? Q^"       LINE IS EMPTY; TYPE PROMPT
  460.   78       GL              READ INPUT LINE
  461.   79       BE I4           DID ANYTHING COME?
  462.   80       BR I3           NO, TRY AGAIN
  463.   81 :I4   BC I5 ","       OPTIONAL COMMA
  464.   82 :I5   JS EXPR         READ A NUMBER
  465.   83       SV              STORE INTO VARIABLE
  466.   84       RB              SWAP BACK
  467.   85       BC I6 ","       ANOTHER?
  468.   86       BR I2           YES IF COMMA
  469.   87 :I6   BE *            OTHERWISE QUIT
  470.   88       NX
  471.   89 .
  472.   90 :RETN BC END "RETURN"
  473.   91       BE *
  474.   92       RS              RECOVER SAVED LINE
  475.   93       NX
  476.   94 .
  477.   95 :END  BC LIST "END"
  478.   96       BE *
  479.   97       WS
  480.   98 .
  481.   99 :LIST BC RUN "LIST"
  482.  100       BE L2
  483.  101 :L1   PC "@^@^@^@^J^@^" PUNCH LEADER
  484.  102       LS              LIST
  485.  103       PC "S^"         PUNCH X-OFF
  486.  104       NL
  487.  105       NX
  488.  106 :L2   JS EXPR         GET A LINE NUMBER
  489.  107       BE L3
  490.  108       BR L1
  491.  109 :L3   BC * ","        SEPARATED BY COMMAS
  492.  110       BR L2
  493.  111 .
  494.  112 :RUN  BC CLER "RUN"
  495.  113       J XEC
  496.  114 .
  497.  115 :CLER BC REM "CLEAR"
  498.  116       MT
  499.  117 .
  500.  118 :REM  BC DFLT "REM"
  501.  119       NX
  502.  120 .
  503.  121 :DFLT BV *            NO KEYWORD...
  504.  122       BC * "="        TRY FOR LET
  505.  123       J LET           IT'S A GOOD BET.
  506.  124 .
  507.  125 .  SUBROUTINES
  508.  126 .
  509.  127 :EXPR BC E0 "-"       TRY FOR UNARY MINUS
  510.  128       JS TERM         AHA
  511.  129       NE
  512.  130       BR E1
  513.  131 :E0   BC E4 "+"       IGNORE UNARY PLUS
  514.  132 :E4   JS TERM
  515.  133 :E1   BC E2 "+"       TERMS SEPARATED BY PLUS
  516.  134       JS TERM
  517.  135       AD
  518.  136       BR E1
  519.  137 :E2   BC E3 "-"       TERMS SEPARATED BY MINUS
  520.  138       JS TERM
  521.  139       SU
  522.  140       BR E1
  523.  141 :E3   RT
  524.  142 .
  525.  143 :TERM JS FACT
  526.  144 :T0   BC T1 "*"       FACTORS SEPARATED BY TIMES
  527.  145       JS FACT
  528.  146       MP
  529.  147       BR T0
  530.  148 :T1   BC T2 "/"       FACTORS SEPARATED BY DIVIDE
  531.  149       JS  FACT
  532.  150       DV
  533.  151       BR T0
  534.  152 :T2   RT
  535.  153 .
  536.  154 :FACT BC F0 "RND"     *RND FUNCTION*
  537.  155       LN 257*128      STACK POINTER FOR STORE
  538.  156       FV              THEN GET RNDM
  539.  157       LN 2345         R:=R*2345+6789
  540.  158       MP
  541.  159       LN 6789
  542.  160       AD
  543.  161       SV
  544.  162       LB 128          GET IT AGAIN
  545.  163       FV
  546.  263       SX 1            (slightly better RND)
  547.  164       DS
  548.  165       JS FUNC         GET ARGUMENT
  549.  166       BR F1
  550.  167 :F0   BR F2           (SKIPPING)
  551.  168 :F1   DS
  552.  169 .     SX 2            PUSH TOP INTO STACK
  553.  170       SX 4
  554.  171       SX 2
  555.  172       SX 3
  556.  173       SX 5
  557.  174       SX 3
  558.  175       DV              PERFORM MOD FUNCTION
  559.  176       MP
  560.  177       SU
  561.  178       DS              PERFORM ABS FUNCTION
  562.  179       LB 6
  563.  180       LN 0
  564.  181       CP              (SKIP IF + OR 0)
  565.  182       NE
  566.  183       RT
  567.  184 :F2   BC F3 "USR"     *USR FUNCTION*
  568.  185       BC * "("        3 ARGUMENTS POSSIBLE
  569.  186       JS EXPR         ONE REQUIRED
  570.  187       JS ARG
  571.  188       JS ARG
  572.  189       BC * ")"
  573.  190       US              GO DO IT
  574.  191       RT
  575.  192 :F3   BV F4           VARIABLE?
  576.  193       FV              YES.  GET IT
  577.  194       RT
  578.  195 :F4   BN F5           NUMBER?
  579.  196       RT              GOT IT.
  580.  197 :F5   BC * "("        OTHERWISE MUST BE (EXPR)
  581.  198 :F6   JS EXPR
  582.  199       BC * ")"
  583.  200       RT
  584.  201 .
  585.  202 :ARG  BC A0 ","        COMMA?
  586.  203       J  EXPR          YES, GET EXPRESSION
  587.  204 :A0   DS               NO, DUPLICATE STACK TOP
  588.  205       RT
  589.  206 .
  590.  207 :FUNC BC * "("
  591.  208       BR F6
  592.  209       RT
  593.  210 .
  594.  211 :RELO BC R0 "="        CONVERT RELATION OPERATORS
  595.  212       LB 2             TO CODE BYTE ON STACK
  596.  213       RT               =
  597.  214 :R0   BC R4 "<"
  598.  215       BC R1 "="
  599.  216       LB 3             <=
  600.  217       RT
  601.  218 :R1   BC R3 ">"
  602.  219       LB 5             <>
  603.  220       RT
  604.  221 :R3   LB 1             <
  605.  222       RT
  606.  223 :R4   BC * ">"
  607.  224       BC R5 "="
  608.  225       LB 6             >=
  609.  226       RT
  610.  227 :R5   BC R6 "<"
  611.  228       LB 5             ><
  612.  229       RT
  613.  230 :R6   LB 4             >
  614.  231       RT
  615.  232 .
  616. 0000
  617.    1 .  ORIGINAL TINY BASIC INTERMEDIATE INTERPRETER
  618.    2 .
  619.    3 .  EXECUTIVE INITIALIZATION
  620.    4 .
  621.    5 :STRT PC ":Q^"        COLON, X-ON
  622.    6       GL
  623.    7       SB
  624.    8       BE L0           BRANCH IF NOT EMPTY
  625.    9       BR STRT         TRY AGAIN IF NULL LINE
  626.   10 :L0   BN STMT         TEST FOR LINE NUMBER
  627.   11       IL              IF SO, INSERT INTO PROGRAM
  628.   12       BR STRT         GO GET NEXT
  629.   13 :XEC  SB              SAVE POINTERS FOR RUN WITH
  630.   14       RB                CONCATENATED INPUT
  631.   15       XQ
  632.   16 .
  633.   17 .  STATEMENT EXECUTOR
  634.   18 .
  635.   19 :STMT BC GOTO "LET"
  636.   20       BV *            MUST BE A VARIABLE NAME
  637.   21       BC * "="
  638.   22 :LET  JS EXPR         GO GET EXPRESSION
  639.   23       BE *            IF STATEMENT END,
  640.   24       SV                STORE RESULT
  641.   25       NX
  642.   26 .
  643.   27 :GOTO BC PRNT "GO"
  644.   28       BC GOSB "TO"
  645.   29       JS EXPR         GET LINE NUMBER
  646.   30       BE *
  647.   31       SB              (DO THIS FOR STARTING)
  648.   32       RB
  649.   33       GO              GO THERE
  650.   34 .
  651.   35 :GOSB BC * "SUB"      NO OTHER WORD BEGINS "GO..."
  652.   36       JS EXPR
  653.   37       BE *
  654.   38       GS
  655.   39       GO
  656.   40 .
  657.   41 :PRNT BC SKIP "PR"
  658.   42       BC P0 "INT"     OPTIONALLY OMIT "INT"
  659.   43 :P0   BE P3
  660.   44       BR P6           IF DONE, GO TO END
  661.   45 :P1   BC P4 ";"
  662.   46 :P2   BE P3
  663.   47       NX              NO CRLF IF ENDED BY ; OR ,
  664.   48 :P3   BC P7 '"'
  665.   49       PQ              QUOTE MARKS STRING
  666.   50       BR P1           GO CHECK DELIMITER
  667.   51 :SKIP BR IF           (ON THE WAY THRU)
  668.   52 :P4   BC P5 ","
  669.   53       PT              COMMA SPACING
  670.   54       BR P2
  671.   55 :P5   BC P6 ":"
  672.   56       PC "S^"         OUTPUT X-OFF
  673.   57 :P6   BE *
  674.   58       NL              THEN CRLF
  675.   59       NX
  676.   60 :P7   JS EXPR         TRY FOR AN EXPRESSION
  677.   61       PN
  678.   62       BR P1
  679.   63 .
  680.   64 :IF   BC INPT "IF"
  681.   65       JS EXPR
  682.   66       JS RELO
  683.   67       JS EXPR
  684.   68       BC I1 "THEN"    OPTIONAL NOISEWORD
  685.   69 :I1   CP              COMPARE SKIPS NEXT IF TRUE
  686.   70       NX              FALSE.
  687.   71       J STMT          TRUE. GO PROCESS STATEMENT
  688.   72 .
  689.   73 :INPT BC RETN "INPUT"
  690.   74 :I2   BV *            GET VARIABLE
  691.   75       SB              SWAP POINTERS
  692.   76       BE I4
  693.   77 :I3   PC "? Q^"       LINE IS EMPTY; TYPE PROMPT
  694.   78       GL              READ INPUT LINE
  695.   79       BE I4           DID ANYTHING COME?
  696.   80       BR I3           NO, TRY AGAIN
  697.   81 :I4   BC I5 ","       OPTIONAL COMMA
  698.   82 :I5   JS EXPR         READ A NUMBER
  699.   83       SV              STORE INTO VARIABLE
  700.   84       RB              SWAP BACK
  701.   85       BC I6 ","       ANOTHER?
  702.   86       BR I2           YES IF COMMA
  703.   87 :I6   BE *            OTHERWISE QUIT
  704.   88       NX
  705.   89 .
  706.   90 :RETN BC END "RETURN"
  707.   91       BE *
  708.   92       RS              RECOVER SAVED LINE
  709.   93       NX
  710.   94 .
  711.   95 :END  BC LIST "END"
  712.   96       BE *
  713.   97       WS
  714.   98 .
  715.   99 :LIST BC RUN "LIST"
  716.  100       BE L2
  717.  101 :L1   PC "@^@^@^@^J^@^" PUNCH LEADER
  718.  102       LS              LIST
  719.  103       PC "S^"         PUNCH X-OFF
  720.  104       NL
  721.  105       NX
  722.  106 :L2   JS EXPR         GET A LINE NUMBER
  723.  107       BE L3
  724.  108       BR L1
  725.  109 :L3   BC * ","        SEPARATED BY COMMAS
  726.  110       BR L2
  727.  111 .
  728.  112 :RUN  BC CLER "RUN"
  729.  113       J XEC
  730.  114 .
  731.  115 :CLER BC REM "CLEAR"
  732.  116       MT
  733.  117 .
  734.  118 :REM  BC DFLT "REM"
  735.  119       NX
  736.  120 .
  737.  121 :DFLT BV *            NO KEYWORD...
  738.  122       BC * "="        TRY FOR LET
  739.  123       J LET           IT'S A GOOD BET.
  740.  124 .
  741.  125 .  SUBROUTINES
  742.  126 .
  743.  127 :EXPR BC E0 "-"       TRY FOR UNARY MINUS
  744.  128       JS TERM         AHA
  745.  129       NE
  746.  130       BR E1
  747.  131 :E0   BC E4 "+"       IGNORE UNARY PLUS
  748.  132 :E4   JS TERM
  749.  133 :E1   BC E2 "+"       TERMS SEPARATED BY PLUS
  750.  134       JS TERM
  751.  135       AD
  752.  136       BR E1
  753.  137 :E2   BC E3 "-"       TERMS SEPARATED BY MINUS
  754.  138       JS TERM
  755.  139       SU
  756.  140       BR E1
  757.  141 :E3   RT
  758.  142 .
  759.  143 :TERM JS FACT
  760.  144 :T0   BC T1 "*"       FACTORS SEPARATED BY TIMES
  761.  145       JS FACT
  762.  146       MP
  763.  147       BR T0
  764.  148 :T1   BC T2 "/"       FACTORS SEPARATED BY DIVIDE
  765.  149       JS  FACT
  766.  150       DV
  767.  151       BR T0
  768.  152 :T2   RT
  769.  153 .
  770.  154 :FACT BC F0 "RND"     *RND FUNCTION*
  771.  155       LN 257*128      STACK POINTER FOR STORE
  772.  156       FV              THEN GET RNDM
  773.  157       LN 2345         R:=R*2345+6789
  774.  158       MP
  775.  159       LN 6789
  776.  160       AD
  777.  161       SV
  778.  162       LB 128          GET IT AGAIN
  779.  163       FV
  780.  263       SX 1            (slightly better RND)
  781.  164       DS
  782.  165       JS FUNC         GET ARGUMENT
  783.  166       BR F1
  784.  167 :F0   BR F2           (SKIPPING)
  785.  168 :F1   DS
  786.  169 .     SX 2            PUSH TOP INTO STACK
  787.  170       SX 4
  788.  171       SX 2
  789.  172       SX 3
  790.  173       SX 5
  791.  174       SX 3
  792.  175       DV              PERFORM MOD FUNCTION
  793.  176       MP
  794.  177       SU
  795.  178       DS              PERFORM ABS FUNCTION
  796.  179       LB 6
  797.  180       LN 0
  798.  181       CP              (SKIP IF + OR 0)
  799.  182       NE
  800.  183       RT
  801.  184 :F2   BC F3 "USR"     *USR FUNCTION*
  802.  185       BC * "("        3 ARGUMENTS POSSIBLE
  803.  186       JS EXPR         ONE REQUIRED
  804.  187       JS ARG
  805.  188       JS ARG
  806.  189       BC * ")"
  807.  190       US              GO DO IT
  808.  191       RT
  809.  192 :F3   BV F4           VARIABLE?
  810.  193       FV              YES.  GET IT
  811.  194       RT
  812.  195 :F4   BN F5           NUMBER?
  813.  196       RT              GOT IT.
  814.  197 :F5   BC * "("        OTHERWISE MUST BE (EXPR)
  815.  198 :F6   JS EXPR
  816.  199       BC * ")"
  817.  200       RT
  818.  201 .
  819.  202 :ARG  BC A0 ","        COMMA?
  820.  203       J  EXPR          YES, GET EXPRESSION
  821.  204 :A0   DS               NO, DUPLICATE STACK TOP
  822.  205       RT
  823.  206 .
  824.  207 :FUNC BC * "("
  825.  208       BR F6
  826.  209       RT
  827.  210 .
  828.  211 :RELO BC R0 "="        CONVERT RELATION OPERATORS
  829.  212       LB 2             TO CODE BYTE ON STACK
  830.  213       RT               =
  831.  214 :R0   BC R4 "<"
  832.  215       BC R1 "="
  833.  216       LB 3             <=
  834.  217       RT
  835.  218 :R1   BC R3 ">"
  836.  219       LB 5             <>
  837.  220       RT
  838.  221 :R3   LB 1             <
  839.  222       RT
  840.  223 :R4   BC * ">"
  841.  224       BC R5 "="
  842.  225       LB 6             >=
  843.  226       RT
  844.  227 :R5   BC R6 "<"
  845.  228       LB 5             ><
  846.  229       RT
  847.  230 :R6   LB 4             >
  848.  231       RT
  849.  232 .
  850. 0000
  851.