home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / preprss.lbr / BSLP.BZS / BSLP.BAS
Encoding:
BASIC Source File  |  1993-10-25  |  15.6 KB  |  519 lines

  1. 100 DATA   proc...
  2. 101 DATA   prog...
  3. 102 DATA   when...
  4. 103 DATA   unless.
  5. 104 DATA   repeat.
  6. 105 DATA   loop...
  7. 106 DATA   switch.
  8. 107 DATA   case...
  9. 108 DATA   else...
  10. 109 DATA   break..
  11. 110 DATA   endp...
  12. 111 DATA   pend...
  13. 112 DATA   endw...
  14. 113 DATA   endu...
  15. 114 DATA   until..
  16. 115 DATA   endl...
  17. 116 DATA   endc...
  18. 117 PROC.%   = 1
  19. 118 PROG.%   = 2
  20. 119 WHEN.%   = 3
  21. 120 UNLESS.% = 4
  22. 121 REPEAT.% = 5
  23. 122 LOOP.%   = 6
  24. 123 SWITCH.% = 7
  25. 124 CASE.%   = 8
  26. 125 ELSE.%   = 9
  27. 126 BREAK.%  = 10
  28. 127 ENDP.%   = 11
  29. 128 PEND.%   = 12
  30. 129 ENDW.%   = 13
  31. 130 ENDU.%   = 14
  32. 131 UNTIL.%  = 15
  33. 132 ENDL.%   = 16
  34. 133 ENDC.%   = 17
  35. 134 DATA 11,12,13,14,15,16,17,17,13,17
  36. 135 DOT$     = "."
  37. 136 DOTS$    = "...."
  38. 137 SKIP$    = " "
  39. 138 SKIP1$   = "  '"
  40. 139 OEXT$    = ".BAS"
  41. 140 IEXT$    = ".P"
  42. 141 EEXT$    = ".E"
  43. 142 INCL$    = ".INC"
  44. 143 TM$      = " ,="
  45. 144 T.FILE$  = "BSLP.$$$"
  46. 145 T.FILE%  = 1
  47. 146 E.FILE%  = 2
  48. 147 I.FILE%  = 3
  49. 148 O.FILE%  = 3
  50. 149 ERRORS%  = 0
  51. 150 KERR%    = 1
  52. 151 LEVELS%  = 0
  53. 152 PUSH%    = 0
  54. 153 NUM%     = 0
  55. 154 STACK.%  = 0
  56. 155 NKEY%    = 17
  57. 156 INCS%    = 1
  58. 157 INC%     = 0
  59. 158 FILE%    = 2
  60. 159 BASIC$   = "restore.resume.return.goto.gosub"
  61. 160 DIM CLOSING%(10)        ' For error messages.
  62. 161 DIM INC$(50)            ' Include file stack.
  63. 162 DIM STACK$(500)
  64. 163 DIM STACK%(500)
  65. 164 DIM NUM.%(500)
  66. 165 DIM KEYWORD.%(99,2)
  67. 166 DIM XN.%(99)
  68. 167 DIM LOOPS%(99)
  69. 168 DIM SWITCH$(10)         ' For the left operand of SWITCH.
  70. 169 DIM KEYWORD$(22)        ' For error messages.
  71. 170 FOR I%=1 TO NKEY%:READ BUF$:TABLE$=TABLE$+BUF$:KEYWORD$(I%)=BUF$:NEXT I%
  72. 171 FOR I%=1 TO 10:READ CLOSING%(I%):NEXT I%
  73. 172 PRINT "BSLP   V1.1B (C) BENDORF ASSOCIATES, 1984-85"
  74. 173 PRINT:GOSUB 566
  75. 174 IF NOT(GOOD%) GOTO 177
  76. 175 GOSUB 181
  77. 176 GOTO 179
  78. 177 IF NOT(I.FILE$<>"") GOTO 179
  79. 178 PRINT"CANNOT OPEN ";I.FILE$
  80. 179 END
  81. 180    'BEGIN
  82. 181 GOSUB 194
  83. 182 CLOSE
  84. 183 IF NOT(ERRORS%=0) GOTO 186
  85. 184 KILL E.FILE$:GOSUB 463:CLOSE:KILL T.FILE$
  86. 185 GOTO 188
  87. 186 KILL T.FILE$:PRINT E.FILE$;" PRODUCED WITH ";STR$(ERRORS%);" ERROR(S)."
  88. 187 END
  89. 188 IF NOT(ERRORS%>0) GOTO 191
  90. 189 KILL O.FILE$:PRINT O.FILE$;" ABORTED WITH ";STR$(ERRORS%);" ERROR(S)."
  91. 190 GOTO 192
  92. 191 PRINT"<";O.FILE$;"> DONE!"
  93. 192 RETURN
  94. 193    'PASS_1
  95. 194 OPEN"O",T.FILE%,T.FILE$:OPEN"O",E.FILE%,E.FILE$:GOSUB 290:INC$(INCS%)=I.FILE$
  96. 195 INC%=INC%+1:FILE%=FILE%+1:FILE$=INC$(INC%):OPEN"I",FILE%,FILE$
  97. 196 GOSUB 201:GOSUB 275
  98. 197 IF NOT(FILE%=2) GOTO 196
  99. 198 IF NOT(INC%=INCS%) GOTO 195
  100. 199 RETURN
  101. 200    'INPUT-SOURCE
  102. 201 LINE INPUT #FILE%,BUF$
  103. 202 IF NOT(LEN(BUF$)>2) GOTO 226
  104. 203 XLINE$=BUF$:GOSUB 232
  105. 204 IF(LEN(BUF$)=0) GOTO 225
  106. 205 INDEX%=0:GOSUB 550
  107. 206 IF NOT(RIGHT$(TEXT$,1)=":") GOTO 210
  108. 207 IF(LEN(SBUFF$)>0)THEN GOSUB 266
  109. 208 FLAG%=2:LEVEL$=LEFT$(TEXT$,LEN(TEXT$)-1):COMMENT$=SKIP1$+LEVEL$:GOSUB 435
  110. 209 GOTO 225
  111. 210 L$=LEFT$(TEXT$,1):KEYWORD%=0
  112. 211 IF(LEN(TEXT$)<4 OR LEN(TEXT$)>6) GOTO 213
  113. 212 C.$=TEXT$:GOSUB 606:KEYS$=C.$+DOTS$:KEYWORD%=INSTR(1,TABLE$,LEFT$(KEYS$,7)):KEYWORD%=(KEYWORD%+6)\7
  114. 213 IF NOT(KEYWORD%>0) GOTO 217
  115. 214 IF(LEN(SBUFF$)>0)THEN GOSUB 266
  116. 215 GOSUB 269
  117. 216 GOTO 225
  118. 217 IF NOT(L$="-") GOTO 220
  119. 218 GOSUB 588
  120. 219 GOTO 225
  121. 220 IF NOT(L$="+") GOTO 224
  122. 221 IF(LEN(SBUFF$)>0)THEN GOSUB 266
  123. 222 GOSUB 581
  124. 223 GOTO 225
  125. 224 GOSUB 251
  126. 225 NERR%=NERR%+1:PRINT #E.FILE%,STR$(NERR%);SKIP$;XLINE$
  127. 226 IF NOT(EOF(FILE%)) GOTO 201
  128. 227 CLOSE #FILE%:FILE%=FILE%-1
  129. 228 IF(SBUFF$="") GOTO 230
  130. 229 BUF$="":CFLAG%=0:GOSUB 251
  131. 230 RETURN
  132. 231    'STRIP
  133. 232 Z1%=INSTR(BUF$,CHR$(9)):Z2%=INSTR(BUF$,CHR$(10))
  134. 233 WHILE (Z1% OR Z2%)
  135. 234 IF Z1% THEN MID$(BUF$,Z1%,1)=" "
  136. 235 IF Z2% THEN MID$(BUF$,Z2%,1)=" "
  137. 236 Z1%=INSTR(BUF$,CHR$(9)):Z2%=INSTR(BUF$,CHR$(10)):WEND
  138. 237 Z1%=1:WHILE (MID$(BUF$,Z1%,1)=" " AND Z1%<LEN(BUF$)):Z1%=Z1%+1:WEND
  139. 238 Z2%=LEN(BUF$):WHILE (MID$(BUF$,Z2%,1)=" " AND Z2%>1):Z2%=Z2%-1:WEND
  140. 239 IF NOT(Z2%<Z1%) GOTO 242
  141. 240 BUF$=""
  142. 241 GOTO 245
  143. 242 BUF$=MID$(BUF$,Z1%,Z2%-Z1%+1)
  144. 243 IF NOT(LEN(BUF$)>0) GOTO 245
  145. 244 IF(LEFT$(BUF$,1)="'" OR LEFT$(BUF$,3)="REM" OR BUF$=STRING$(LEN(BUF$),32))THEN BUF$=""
  146. 245 LN.%=LEN(BUF$):CFLAG%=0
  147. 246 IF(LN.%=0) GOTO 249
  148. 247 CFLAG%=(RIGHT$(BUF$,1)="|")
  149. 248 IF(CFLAG%)THEN BUF$=LEFT$(BUF$,LN.%-1):LN.%=LEN(BUF$)
  150. 249 RETURN
  151. 250    'OUT_PUT
  152. 251 IF NOT(CFLAG%=0) GOTO 259
  153. 252 IF NOT(LEN(SBUFF$)>0) GOTO 257
  154. 253 IF NOT(LEN(SBUFF$+BUF$)<=250) GOTO 256
  155. 254 BUF$=SBUFF$+BUF$:SBUFF$=""
  156. 255 GOTO 257
  157. 256 GOSUB 266
  158. 257 PBUF$=BUF$:FLAG%=3:GOSUB 435
  159. 258 GOTO 263
  160. 259 IF NOT(LEN(SBUFF$+BUF$)<=200) GOTO 262
  161. 260 SBUFF$=SBUFF$+BUF$+":"
  162. 261 GOTO 263
  163. 262 GOSUB 266:PBUF$=BUF$:GOSUB 435
  164. 263 BUF$=""
  165. 264 RETURN
  166. 265    'DUMP
  167. 266 PBUF$=LEFT$(SBUFF$,LEN(SBUFF$)-1):FLAG%=3:GOSUB 435:SBUFF$="":CFLAG%=0
  168. 267 RETURN
  169. 268    'KEYWORDS
  170. 269 KERR%=NERR%+1
  171. 270 ON KEYWORD% GOTO 302,319,328,354,364,364
  172. 271 ON KEYWORD%-6 GOTO 405,411,331,421,309,322,343
  173. 272 ON KEYWORD%-13 GOTO 357,371,381,428
  174. 273 RETURN
  175. 274    'POP_ERRORS
  176. 275 KER%=KERR%:KWDS%=KEYWORD%:GOSUB 293
  177. 276 WHILE KEYWORD%>0
  178. 277 GOSUB 282
  179. 278 WEND
  180. 279 GOSUB 290:KEYWORD%=KWDS%:KERR%=KER%
  181. 280 RETURN
  182. 281    'RESOLVE-ERRORS
  183. 282 IF(KEYWORD%<11)THEN KEYWORD%=CLOSING%(KEYWORD%)
  184. 283 EBUF$=KEYWORD$(KEYWORD%):GOSUB 603
  185. 284 IF NOT(KEYWORD%=ENDW.% OR KEYWORD%=ENDU.% OR KEYWORD%=ENDC.%) GOTO 287
  186. 285 IF(KEYWORD%=ENDC.%)THEN GOSUB 293
  187. 286 GOSUB 293
  188. 287 GOSUB 293
  189. 288 RETURN
  190. 289    'PUSH
  191. 290 PUSH%=PUSH%+1:KEYWORD.%(PUSH%,0)=KEYWORD%:KEYWORD.%(PUSH%,1)=KERR%:KEYWORD.%(PUSH%,2)=LEVEL%
  192. 291 RETURN
  193. 292    'POP
  194. 293 IF NOT(PUSH%>0) GOTO 296
  195. 294 KEYWORD%=KEYWORD.%(PUSH%,0):KERR%=KEYWORD.%(PUSH%,1):LEVEL%=KEYWORD.%(PUSH%,2):PUSH%=PUSH%-1
  196. 295 GOTO 297
  197. 296 LEVEL%=-1:KEYWORD%=-1
  198. 297 RETURN
  199. 298    'LEVEL
  200. 299 LEVELS%=LEVELS%+1:LEVEL%=LEVELS%:TK%=LEVEL%:GOSUB 290
  201. 300 RETURN
  202. 301    '_PROC
  203. 302 GOSUB 275:GOSUB 290:GOSUB 550
  204. 303 IF NOT(LEN(TEXT$)>0) GOTO 306
  205. 304 COMMENT$=SKIP1$+TEXT$:LPROC$=TEXT$:FLAG%=2:LEVEL$=TEXT$:GOSUB 435
  206. 305 GOTO 307
  207. 306 EBUF$="procedure name":GOSUB 603
  208. 307 RETURN
  209. 308    '_ENDP
  210. 309 GOSUB 293
  211. 310 WHILE KEYWORD%<>PROC.% AND KEYWORD%>0
  212. 311 GOSUB 282
  213. 312 WEND
  214. 313 IF NOT(KEYWORD%=PROC.%) GOTO 316
  215. 314 FLAG%=3:PBUF$="RETURN":GOSUB 435
  216. 315 GOTO 317
  217. 316 EBUF$=KEYWORD$(PROC.%):GOSUB 603
  218. 317 RETURN
  219. 318    '_PROG
  220. 319 PROG..%=1
  221. 320 RETURN
  222. 321    '_PEND
  223. 322 IF NOT(PROG..%=1) GOTO 325
  224. 323 FLAG%=3:PBUF$="END":GOSUB 435
  225. 324 GOTO 326
  226. 325 EBUF$=KEYWORD$(PROG.%):GOSUB 603
  227. 326 RETURN
  228. 327    '_WHEN
  229. 328 GOSUB 299:GOSUB 299:FLAG%=1:GOSUB 435
  230. 329 RETURN
  231. 330    '_ELSE
  232. 331 GOSUB 293
  233. 332 IF NOT(KEYWORD%=WHEN.%) GOTO 340
  234. 333 F.%=LEVEL%:GOSUB 293:T.%=LEVEL%:TK%=T.%:FLAG%=4:PBUF$="GOTO ":GOSUB 435:XN%=XN%+1:XN.%(XN%)=F.%:GOSUB 550:C.$=TEXT$:GOSUB 606
  235. 334 IF NOT(C.$="when" OR C.$="unless") GOTO 337
  236. 335 GOSUB 299:F.%=LEVEL%:FLAG%=ABS(C.$="when"):GOSUB 435:GOSUB 293
  237. 336 GOTO 338
  238. 337 F.%=0
  239. 338 KEYWORD%=WHEN.%:LEVEL%=T.%:GOSUB 290:LEVEL%=F.%:GOSUB 290
  240. 339 GOTO 341
  241. 340 GOSUB 290:EBUF$=KEYWORD$(WHEN.%):GOSUB 603
  242. 341 RETURN
  243. 342    '_ENDW
  244. 343 GOSUB 293
  245. 344 IF NOT(KEYWORD%=WHEN.%) GOTO 347
  246. 345 F.%=LEVEL%:GOSUB 293:T.%=LEVEL%:GOSUB 350
  247. 346 GOTO 348
  248. 347 GOSUB 290:EBUF$=KEYWORD$(WHEN.%):GOSUB 603
  249. 348 RETURN
  250. 349    'POPOFF
  251. 350 IF(F.%>0)THEN XN%=XN%+1:XN.%(XN%)=F.%
  252. 351 IF(T.%>0)THEN XN%=XN%+1:XN.%(XN%)=T.%
  253. 352 RETURN
  254. 353    '_UNLESS
  255. 354 GOSUB 299:GOSUB 299:FLAG%=0:GOSUB 435
  256. 355 RETURN
  257. 356    '_ENDU
  258. 357 GOSUB 293
  259. 358 IF NOT(KEYWORD%=UNLESS.%) GOTO 361
  260. 359 F.%=LEVEL%:GOSUB 293:T.%=LEVEL%:GOSUB 350
  261. 360 GOTO 362
  262. 361 GOSUB 290:EBUF$=KEYWORD$(UNLESS.%):GOSUB 603
  263. 362 RETURN
  264. 363    '_REPEAT
  265. 364 GOSUB 550:C.$=TEXT$:GOSUB 606:LOOP%=LOOP%+1:GOSUB 299:XN%=XN%+1:XN.%(XN%)=LEVEL%
  266. 365 IF NOT(C.$<>"when" AND C.$<>"unless") GOTO 368
  267. 366 LOOPS%(LOOP%)=LEVEL%
  268. 367 GOTO 369
  269. 368 LOOPS%(LOOP%)=LEVEL%*-1:GOSUB 293:LEVEL%=LEVEL%*-1:GOSUB 290:GOSUB 299:FLAG%=ABS(C.$="when"):GOSUB 435
  270. 369 RETURN
  271. 370    '_UNTIL
  272. 371 IF NOT(LOOP%>0) GOTO 378
  273. 372 GOSUB 293
  274. 373 IF NOT(KEYWORD%=REPEAT.% OR KEYWORD%=LOOP.%) GOTO 376
  275. 374 LOOP%=LOOP%-1:TK%=LOOPS%(LOOP%+1):FLAG%=1:GOSUB 435
  276. 375 GOTO 377
  277. 376 GOSUB 290:EBUF$=KEYWORD$(REPEAT.%):GOSUB 603
  278. 377 GOTO 379
  279. 378 EBUF$=KEYWORD$(REPEAT.%):GOSUB 603
  280. 379 RETURN
  281. 380    '_ENDL
  282. 381 IF NOT(LOOP%>0) GOTO 402
  283. 382 GOSUB 293
  284. 383 IF NOT(KEYWORD%=REPEAT.% OR KEYWORD%=LOOP.%) GOTO 400
  285. 384 GOSUB 550:C.$=TEXT$:GOSUB 606:LOOP%=LOOP%-1
  286. 385 IF NOT(LOOPS%(LOOP%+1)>0) GOTO 392
  287. 386 TK%=LOOPS%(LOOP%+1)
  288. 387 IF NOT(C.$="when" OR C.$="unless") GOTO 390
  289. 388 FLAG%=ABS(C.$="when"):GOSUB 435
  290. 389 GOTO 391
  291. 390 EBUF$=KEYWORD$(WHEN.%):GOSUB 603
  292. 391 GOTO 399
  293. 392 TK%=LOOPS%(LOOP%+1)*-1
  294. 393 IF NOT(C.$="when" OR C.$="unless") GOTO 396
  295. 394 FLAG%=ABS(C.$="when")
  296. 395 GOTO 397
  297. 396 FLAG%=4:PBUF$="GOTO "
  298. 397 GOSUB 435
  299. 398 F.%=LEVEL%:GOSUB 293:T.%=LEVEL%:GOSUB 350
  300. 399 GOTO 401
  301. 400 GOSUB 290:EBUF$=KEYWORD$(LOOP.%):GOSUB 603
  302. 401 GOTO 403
  303. 402 EBUF$=KEYWORD$(LOOP.%):GOSUB 603
  304. 403 RETURN
  305. 404    '_SWITCH
  306. 405 IF NOT(C.LN.%>0) GOTO 408
  307. 406 GOSUB 299:GOSUB 299:GOSUB 299:SWITCH$(SWITCH%+1)=COND$:SWITCH%=SWITCH%+1
  308. 407 GOTO 409
  309. 408 EBUF$="operand":GOSUB 603
  310. 409 RETURN
  311. 410    '_CASE
  312. 411 GOSUB 293
  313. 412 IF NOT(KEYWORD%=SWITCH.% AND SWITCH%>0) GOTO 418
  314. 413 IF NOT(C.LN.%>0) GOTO 416
  315. 414 XN%=XN%+1:XN.%(XN%)=LEVEL%:GOSUB 299:FLAG%=4:PBUF$="IF("+SWITCH$(SWITCH%)+"<>"+COND$+") GOTO ":GOSUB 435
  316. 415 GOTO 417
  317. 416 EBUF$="operand":GOSUB 603
  318. 417 GOTO 419
  319. 418 GOSUB 290:EBUF$=KEYWORD$(SWITCH.%):GOSUB 603
  320. 419 RETURN
  321. 420    '_BREAK
  322. 421 GOSUB 293
  323. 422 IF NOT(KEYWORD%=SWITCH.%) GOTO 425
  324. 423 F.%=LEVEL%:GOSUB 293:T.%=LEVEL%:TK%=T.%:FLAG%=4:PBUF$="GOTO ":GOSUB 435:KEYWORD%=SWITCH.%:LEVEL%=T.%:GOSUB 290:LEVEL%=F.%:GOSUB 290
  325. 424 GOTO 426
  326. 425 GOSUB 290:EBUF$=KEYWORD$(SWITCH.%):GOSUB 603
  327. 426 RETURN
  328. 427    '_ENDC
  329. 428 GOSUB 293
  330. 429 IF NOT(KEYWORD%=SWITCH.%) GOTO 432
  331. 430 F.%=LEVEL%:GOSUB 293:T.%=LEVEL%:GOSUB 293:GOSUB 350:SWITCH%=SWITCH%-1
  332. 431 GOTO 433
  333. 432 GOSUB 290:EBUF$=KEYWORD$(SWITCH.%):GOSUB 603
  334. 433 RETURN
  335. 434    'OUT_LINE
  336. 435 IF NOT(FLAG%<2 AND C.LN.%=0) GOTO 438
  337. 436 EBUF$="condition":GOSUB 603
  338. 437 GOTO 453
  339. 438 NUM%=NUM%+1:OFFSET%=1
  340. 439 IF(FLAG%<2 OR FLAG%>3)THEN LEVEL$=STR$(TK%):MID$(LEVEL$,1,1)="@"
  341. 440 IF(FLAG%<>0) GOTO 443
  342. 441 PBUF$="IF("+COND$+") GOTO "+LEVEL$
  343. 442 GOTO 451
  344. 443 IF(FLAG%<>1) GOTO 446
  345. 444 PBUF$="IF NOT("+COND$+") GOTO "+LEVEL$
  346. 445 GOTO 451
  347. 446 IF(FLAG%<>2) GOTO 449
  348. 447 GOSUB 459
  349. 448 GOTO 451
  350. 449 IF(FLAG%<>4) GOTO 451
  351. 450 PBUF$=PBUF$+LEVEL$
  352. 451 PRINT #T.FILE%,RIGHT$(STR$(NUM%),LEN(STR$(NUM%))-1);SKIP$;PBUF$;COMMENT$
  353. 452 IF(XN%>0 AND FLAG%<>2)THEN GOSUB 456
  354. 453 COMMENT$="":PBUF$="":LEVEL$=""
  355. 454 RETURN
  356. 455    'STORE_IT
  357. 456 OFFSET%=0:FOR I%=1 TO XN%:LEVEL$=STR$(XN.%(I%)):MID$(LEVEL$,1,1)="@":GOSUB 459:NEXT I%:XN%=0
  358. 457 RETURN
  359. 458    'STACK_IT
  360. 459 STACK.%=STACK.%+1:STACK%(STACK.%)=NUM%+OFFSET%:STACK$(STACK.%)=LEVEL$:IF(COMPIL%)THEN NUM.%(STACK.%)=NUM%+OFFSET%
  361. 460 OFFSET%=0
  362. 461 RETURN
  363. 462    'PASS_2
  364. 463 GOSUB 534:OFFSET%=2:OPEN"I",T.FILE%,T.FILE$:OPEN"O",O.FILE%,O.FILE$
  365. 464 LINE INPUT #T.FILE%,BUF$:GOSUB 468
  366. 465 IF NOT(EOF(T.FILE%)) GOTO 464
  367. 466 RETURN
  368. 467    'PROCESS_1
  369. 468 INDEX%=0:ONFLAG%=0:LN.%=LEN(BUF$):GOSUB 550:IF(COMPIL%)THEN GOSUB 477
  370. 469 WHILE FIRST%<=LEN(BUF$)
  371. 470 IF(LEN(TEXT$)>7 OR LEN(TEXT$)<2 OR VAL(TEXT$)>0) GOTO 472
  372. 471 GOSUB 491
  373. 472 GOSUB 550
  374. 473 WEND
  375. 474 PRINT #O.FILE%,BUF$
  376. 475 RETURN
  377. 476    'COMPIL
  378. 477 TEXT%=VAL(TEXT$):HIGH%=STACK.%+1:LOW%=0
  379. 478 IF(TEXT%<NUM.%(1) OR TEXT%>NUM.%(STACK.%)) GOTO 488
  380. 479 WHILE((HIGH%-LOW%)>1):I%=(HIGH%+LOW%)\2
  381. 480 IF NOT(NUM.%(I%)=TEXT%) GOTO 483
  382. 481 TEXT%=-1:LOW%=HIGH%
  383. 482 GOTO 487
  384. 483 IF NOT(NUM.%(I%)<TEXT%) GOTO 486
  385. 484 LOW%=I%
  386. 485 GOTO 487
  387. 486 HIGH%=I%
  388. 487 WEND
  389. 488 IF(TEXT%>0)THEN BUF$=SPACE$(LEN(TEXT$)+1)+COND$
  390. 489 RETURN
  391. 490    'FIND_IT
  392. 491 C.$=TEXT$:GOSUB 606
  393. 492 IF NOT(C.$="on") GOTO 495
  394. 493 ONFLAG%=-1
  395. 494 GOTO 502
  396. 495 IF NOT(LEN(C.$)>3) GOTO 502
  397. 496 IF(INSTR(BASIC$,C.$)=0 OR COLN%) GOTO 502
  398. 497 GOSUB 550:I$=LEFT$(TEXT$,1)
  399. 498 IF(I$="@" OR LEN(TEXT$)<>4) GOTO 500
  400. 499 C.$=TEXT$:GOSUB 606:IF(C.$="else")THEN RETURN
  401. 500 IF(I$="0" AND ONFLAG%) GOTO 502
  402. 501 IF(ONFLAG%)THEN GOSUB 504 ELSE GOSUB 512
  403. 502 RETURN
  404. 503    'ON_FLAG
  405. 504 OFFSET%=1
  406. 505 WHILE(FIRST%<=LEN(BUF$))
  407. 506 IF(TEXT$<>"")THEN GOSUB 512
  408. 507 GOSUB 550
  409. 508 WEND
  410. 509 OFFSET%=2
  411. 510 RETURN
  412. 511    'SEARCH
  413. 512 HIGH%=STACK.%+1:LOW%=0:FIND%=-1
  414. 513 WHILE((HIGH%-LOW%)>1):I%=(HIGH%+LOW%)\2
  415. 514 IF NOT(STACK$(I%)=TEXT$) GOTO 517
  416. 515 FIND%=STACK%(I%):LOW%=HIGH%
  417. 516 GOTO 521
  418. 517 IF NOT(STACK$(I%)<TEXT$) GOTO 520
  419. 518 LOW%=I%
  420. 519 GOTO 521
  421. 520 HIGH%=I%
  422. 521 WEND
  423. 522 IF NOT(FIND%>0) GOTO 525
  424. 523 GOSUB 529
  425. 524 GOTO 527
  426. 525 IF NOT(TEXT$<>"") GOTO 527
  427. 526 ERRORS%=ERRORS%+1:PRINT"MISSING LABEL (";TEXT$;")"
  428. 527 RETURN
  429. 528    'STUFF_IT
  430. 529 NUM$=STR$(FIND%):SP$="":L$=LEFT$(BUF$,FIRST%-OFFSET%)
  431. 530 IF(LEFT$(COND$,1)<>" " AND LEFT$(COND$,1)<>":" AND ONFLAG%=0)THEN SP$=" "
  432. 531 BUF$=L$+NUM$+SP$+COND$:INDEX%=LEN(L$)+LEN(NUM$):LN.%=LEN(BUF$)
  433. 532 RETURN
  434. 533    'SORT
  435. 534 PT.%=STACK.%:WHILE (PT.%>0):PT.%=PT.%\2
  436. 535 IF NOT(PT.%>0) GOTO 547
  437. 536 JT.%=1:KT.%=STACK.%-PT.%:WHILE (JT.%<=KT.%):LT.%=JT.%:CT.%=LT.%+PT.%
  438. 537 WHILE (LT.%>0 AND STACK$(LT.%)>=STACK$(CT.%))
  439. 538 SWAP STACK$(LT.%),STACK$(CT.%):SWAP STACK%(LT.%),STACK%(CT.%)
  440. 539 CT.%=LT.%:LT.%=LT.%-PT.%:LT.%=LT.%*(1+(LT.%<0))
  441. 540 WEND
  442. 541 IF NOT(COMPIL%) GOTO 546
  443. 542 LT.%=JT.%:CT.%=LT.%+PT.%
  444. 543 WHILE (LT.%>0 AND NUM.%(LT.%)>=NUM.%(CT.%))
  445. 544 SWAP NUM.%(LT.%),NUM.%(CT.%):CT.%=LT.%:LT.%=LT.%-PT.%:LT.%=LT.%*(1+(LT.%<0))
  446. 545 WEND
  447. 546 JT.%=JT.%+1:WEND
  448. 547 WEND
  449. 548 RETURN
  450. 549    'PARSER
  451. 550 C.LN.%=0:I.%=0:COLN%=0:II%=32:TEXT%=0:COND$="":TRM$=TM$+CHR$(58*ABS(INDEX%>0))
  452. 551 WHILE(INSTR(TRM$,CHR$(II%))>0):INDEX%=INDEX%+1:IF(INDEX%<=LEN(BUF$))THEN II%=ASC(MID$(BUF$,INDEX%,1)) ELSE II%=7
  453. 552 WEND:FIRST%=INDEX%
  454. 553 WHILE(II%<>32 AND II%<>7)
  455. 554 IF NOT(INSTR(TRM$,CHR$(II%))>0 AND TEXT%=0) GOTO 557
  456. 555 COLN%=(CHR$(II%)=":"):I.%=1:II%=32
  457. 556 GOTO 562
  458. 557 IF NOT(II%=34 OR II%=40 OR II%=41) GOTO 560
  459. 558 IF(II%=34)THEN INDEX%=INSTR(INDEX%+1,BUF$,CHR$(34))
  460. 559 IF(II%=40)THEN TEXT%=TEXT%+1 ELSE IF(II%=41)THEN TEXT%=TEXT%-1
  461. 560 INDEX%=INDEX%+1:IF(INDEX%<=LEN(BUF$))THEN II%=ASC(MID$(BUF$,INDEX%,1)) ELSE II%=7
  462. 561 IF(II%=32 AND TEXT%<>0) GOTO 560
  463. 562 WEND
  464. 563 TEXT$=MID$(BUF$,FIRST%,INDEX%-FIRST%):IF(LEN(BUF$)>INDEX%)THEN COND$=RIGHT$(BUF$,(LEN(BUF$)-INDEX%)+I.%):C.LN.%=LEN(COND$)
  465. 564 RETURN
  466. 565    'FILENAMES
  467. 566 LINE INPUT"INPUT FILE [.P]:",I.FILE$
  468. 567 IF(I.FILE$="") GOTO 579
  469. 568 COMPIL%=(INSTR(I.FILE$,"/")>0)
  470. 569 IF(COMPIL%)THEN I.FILE$=LEFT$(I.FILE$,LEN(I.FILE$)-1)
  471. 570 IF(INSTR(I.FILE$,DOT$)=0)THEN I.FILE$=I.FILE$+IEXT$
  472. 571 LK.$=I.FILE$:LK.%=I.FILE%:GOSUB 614:I.FILE%=LK.%:GOOD%=(I.FILE%<>FALSE%)
  473. 572 IF(GOOD%=FALSE%) GOTO 579
  474. 573 I%=INSTR(1,I.FILE$,DOT$)
  475. 574 IF(I%=0)THEN I%=LEN(I.FILE$)+1
  476. 575 E.FILE$=LEFT$(I.FILE$,I%-1):LINE INPUT"OUTPUT FILE [.BAS]:",O.FILE$
  477. 576 IF(O.FILE$="")THEN O.FILE$=E.FILE$
  478. 577 IF(INSTR(O.FILE$,DOT$)=0)THEN O.FILE$=O.FILE$+OEXT$
  479. 578 IF(INSTR(E.FILE$,DOT$)=0)THEN E.FILE$=E.FILE$+EEXT$
  480. 579 RETURN
  481. 580    'INCLUDES
  482. 581 GOSUB 599
  483. 582 IF NOT(FILE.%>0) GOTO 585
  484. 583 OPEN"I",FILE.%,FILE$:FILE%=FILE.%
  485. 584 GOTO 586
  486. 585 EBUF$="include "+FILE$:GOSUB 603
  487. 586 RETURN
  488. 587    'SUBROUTINE
  489. 588 GOSUB 599
  490. 589 IF NOT(FILE.%>0) GOTO 596
  491. 590 TEXT%=0
  492. 591 WHILE(TEXT%<INCS%)
  493. 592 TEXT%=TEXT%+1:IF(FILE$=INC$(TEXT%))THEN TEXT%=INCS%+1
  494. 593 WEND
  495. 594 IF(TEXT%=INCS%)THEN INCS%=INCS%+1:INC$(INCS%)=FILE$
  496. 595 GOTO 597
  497. 596 EBUF$="include "+FILE$:GOSUB 603
  498. 597 RETURN
  499. 598    'FILES
  500. 599 FILE$=RIGHT$(TEXT$,LEN(TEXT$)-1):IF(INSTR(FILE$,DOT$)=0)THEN FILE$=FILE$+INCL$
  501. 600 FILE.%=FILE%+1:LK.$=FILE$:LK.%=FILE.%:GOSUB 614:FILE.%=LK.%
  502. 601 RETURN
  503. 602    'ERRORS
  504. 603 ERRORS%=ERRORS%+1:EBUF$="ERR#"+STR$(ERRORS%)+" MISSING ("+EBUF$+") PROC <"+LPROC$+">":EBUF$=EBUF$+" AT"+STR$(KERR%):PRINT EBUF$:PRINT #E.FILE%,EBUF$
  505. 604 RETURN
  506. 605    '_Fold
  507. 606 F.0%=1
  508. 607 WHILE(F.0%<=LEN(C.$))
  509. 608 F.2%=ASC(MID$(C.$,F.0%,1))
  510. 609 F.2%=F.2%+(32*ABS(F.2%>64 AND F.2%<91))
  511. 610 MID$(C.$,F.0%,1)=CHR$(F.2%):F.0%=F.0%+1
  512. 611 WEND
  513. 612 RETURN
  514. 613    '_Lookup
  515. 614 OPEN"R",LK.%,LK.$:L.K!=LOF(LK.%):CLOSE LK.%
  516. 615 IF(L.K!<1)THEN LK.%=0:KILL LK.$
  517. 616 RETURN
  518. D
  519. 612 R