home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / tech / design2 / pbas.bas < prev    next >
BASIC Source File  |  1986-09-22  |  16KB  |  315 lines

  1. 10 REM  *********
  2. 12 REM
  3. 14 REM  PBAS.BAS  10-September-1986
  4. 16 REM
  5. 18 REM  *********
  6. 20 '
  7. 22 '    Compiled from SQUISH and XREFBUZZ in public domain by Tom Story.
  8. 24 '
  9. 26 ON ERROR GOTO 632
  10. 28 SCREEN 0:KEY OFF:WIDTH 80:COLOR 7,0:CLS:CLEAR:VERSION$=" Version 3.1  10-September-1986"
  11. 30 PRINT"PBAS PROGRAM  V3.1  10-September-1986":PRINT:PRINT:PRINT"Select:":PRINT:PRINT"(E)xit or <cr>":PRINT:PRINT"(C)ross Reference/(S)quash";:LOCATE ,,0
  12. 32 X$=INKEY$:IF X$="" THEN GOTO 32
  13. 34 IF X$="E" OR X$="e" OR X$=CHR$(13) THEN CLS:END
  14. 36 IF X$="C" OR X$="c" THEN GOTO 286
  15. 38 IF X$="S" OR X$="s" THEN GOTO 40 ELSE BEEP:GOTO 32
  16. 40 REM  *********
  17. 42 REM
  18. 44 REM  SQUASH.BAS
  19. 46 REM
  20. 48 REM  *********
  21. 50 '
  22. 52 '    Author: Dave Archibald
  23. 54 '    Translation: Alan J. Zett
  24. 56 '    Copyright (c) 1982, SoftSide Publications, Inc.
  25. 58 '    Squished some bugs 2/5/83: Herb Shear
  26. 60 '    Squished some bugs and made some cosmetic changes 4/11/86: Tom Story
  27. 62 '    Added line number stripping 4/16/86: Tom Story
  28. 64 '
  29. 66 REM Initialize variables, DIMension arrays, DEFine Function I$, and select          run time options.
  30. 68 CLEAR:DEF FNI$(A$)=CHR$(ASC(LEFT$(A$,1))+32*(LEFT$(A$,1)>"Z")):DEFINT B-K,S-Z:DIM REF(1000),PRO(100)
  31. 70 REM Clear screen, input selections.
  32. 72 SCREEN 0,0,0:WIDTH 80:COLOR 7,0:KEY OFF:CLS
  33. 74 LOCATE 1,15:PRINT"SQUASH  COPYRIGHT (C) 1982 BY SOFTSIDE PUBLICATIONS, INC.":LOCATE 2,33:PRINT"V3.1  10-September-1986":PRINT:PRINT
  34. 76 PRINT"Enter the name of the program to be Squished,":PRINT"(or <cr> for menu). ":PRINT:LINE INPUT"Drive:Filename(.Extension) ";SQ$
  35. 78 IF SQ$="" THEN GOTO 10
  36. 80 IF INSTR(SQ$,".")=0 THEN SQ$=SQ$+".BAS"
  37. 82 OPEN SQ$ FOR INPUT AS #1
  38. 84 PRINT:PRINT:PRINT"Enter the name for the final Squished program.":PRINT:LINE INPUT"Drive:Filename(.Extension) ";SV$
  39. 86 IF SV$="" THEN GOTO 10
  40. 88 IF INSTR(SV$,".")=0 THEN SV$=SV$+".BAS"
  41. 90 OPEN SV$ FOR OUTPUT AS #2
  42. 92 PRINT:PRINT:PRINT"Would you like extra spaces deleted ? (Y/N) ";
  43. 94 XS$=INKEY$:IF XS$="" THEN GOTO 94 ELSE XS$=FNI$(XS$):IF XS$="Y" OR XS$="N" THEN GOTO 96 ELSE GOTO 94
  44. 96 PRINT:PRINT"Would you like REM statements deleted ? (Y/N) ";
  45. 98 IP$=INKEY$:IF IP$="" THEN GOTO 98 ELSE IP$=FNI$(IP$):IF IP$="Y" OR IP$="N" THEN GOTO 100 ELSE GOTO 98
  46. 100 PRINT:PRINT"Would you like to combine lines ? (Y/N) ";
  47. 102 XC$=INKEY$:IF XC$="" THEN GOTO 102 ELSE XC$=FNI$(XC$):IF XC$="Y" OR XC$="N" THEN GOTO 104 ELSE GOTO 102
  48. 104 PRINT:PRINT"Would you like to strip out line numbers (compiler /N option) ? (Y/N) ";
  49. 106 SL$=INKEY$:IF SL$="" THEN GOTO 106 ELSE SL$=FNI$(SL$):IF SL$="Y" OR SL$="N" THEN GOTO 108 ELSE GOTO 106
  50. 108 PRINT:PRINT"Would you like to protect any lines ? (Y/N) ";
  51. 110 XP$=INKEY$:IF XP$="" THEN GOTO 110 ELSE XP$=FNI$(XP$):IF XP$="Y" OR XP$="N" THEN GOTO 114 ELSE GOTO 110
  52. 112 REM If nothing is to be done, reRUN the program.
  53. 114 IF XS$="N" AND IP$="N" AND XC$="N" AND SL$="N" AND XP$="N" THEN GOTO 10
  54. 116 REM Store user protected lines.
  55. 118 PRINT:PRINT
  56. 120 IF XP$="Y" THEN INPUT"Enter line number to protect (or <cr> to exit) ";PRO(PV):IF PRO(PV)>0 AND PV<100 THEN PV=PV+1: GOTO 120 ELSE PRINT
  57. 122 REM *********
  58. 124 REM Check for EndOfFile and PRINT error if current line does not start with         a line number.
  59. 126 IF EOF(1) THEN CLOSE:GOTO 166
  60. 128 LINE INPUT #1,A$:LOCATE ,1:PRINT "Scanning Line (Pass #1): ";VAL(LEFT$(A$,INSTR(A$," ")));:IF ASC(A$)>58 THEN CLS:PRINT"**** '";SQ$;"' is not an ASCII file ****":PRINT:PRINT"<cr> for menu.";:INPUT GO$:GOTO 10
  61. 130 REM Search for reserved words that reference other program lines.
  62. 132 G1=1:G2=1:G3=1:G4=1:G5=1:G6=1:G7=1:G8=1
  63. 134 D=5:T=INSTR(G1,A$,"THEN "):IF T THEN G1=T+D:GOTO 154
  64. 136 T=INSTR(G2,A$,"GOTO "):IF T THEN G2=T+D: GOTO 154
  65. 138 T=INSTR(G3,A$,"ELSE "):IF T THEN G3=T+D: GOTO 154
  66. 140 T=INSTR(G4,A$,"GOSUB "):IF T THEN D=6:G4=T+D:GOTO 154
  67. 142 T=INSTR(G7,A$,"RETURN "):IF T THEN D=7:G7=T+D:GOTO 154
  68. 144 T=INSTR(G5,A$,"RESUME "):IF T THEN D=7:G5=T+D:GOTO 154
  69. 146 T=INSTR(G8,A$,"RESTORE "):IF T THEN D=8:G8=T+D:GOTO 154
  70. 148 T=INSTR(G6,A$,"RUN "):IF T THEN D=4:G6=T+D:GOTO 154
  71. 150 GOTO 126
  72. 152 REM Store all referenced lines into an array.
  73. 154 L$=MID$(A$,T-1,1):IF L$=" " OR L$=":" THEN 156 ELSE 134
  74. 156 A=VAL(MID$(A$,T+D)):IF A THEN FOR HH=1 TO R:IF REF(HH)<>A THEN NEXT:R=R+1:REF(R)=A
  75. 158 IF A>0 THEN T=T+D:D=1:T1=INSTR(T,A$,","):T2=INSTR(T,A$,":"):IF T1>0 AND (T2=0 OR T1<T2) THEN T=T1:GOTO 156
  76. 160 GOTO 134
  77. 162 REM *********
  78. 164 REM Sort all referenced and protected lines in ascending order.
  79. 166 FOR S=1 TO R:FOR S1=S TO R:IF REF(S)<REF(S1) THEN SWAP REF(S),REF(S1)
  80. 168 NEXT S1,S:FOR S=0 TO PV:FOR S1=S TO PV:IF PRO(S)>PRO(S1) THEN SWAP PRO(S),PRO(S1):NEXT S1,S
  81. 170 REM ReOPEN source file for INPUT and OPEN destination for OUTPUT.
  82. 172 OPEN SQ$ FOR INPUT AS #1:OPEN SV$ FOR OUTPUT AS #2:LOCATE ,1:PRINT SPACE$(79);
  83. 174 REM Get next program line to be processed.
  84. 176 IF EOF(1) THEN 282
  85. 178 LINE INPUT #1,A$:FOR HH=INSTR(A$," ") TO LEN(A$)-1:IF MID$(A$,HH+1,1)=" " THEN NEXT
  86. 180 REM Set up pointer variables and update display.
  87. 182 PP=HH:X=PP:LN=VAL(LEFT$(A$,INSTR(A$," "))):LOCATE ,1:PRINT"Scanning line (Pass #2):";LN;:GOTO 218
  88. 184 REM If combining lines is not allowed, then write new line.
  89. 186 IF XC$<>"Y" THEN PRINT #2,A$:GOTO 176
  90. 188 REM Set up C$ to start combining lines.
  91. 190 IF C$="" THEN C$=A$:GOTO 176
  92. 192 REM Checks if current line is referenced.
  93. 194 IF R>0 THEN IF LN=REF(R) THEN R=R-1:GOTO 212 ELSE IF LN>REF(R) THEN R=R-1:GOTO 194
  94. 196 V$=RIGHT$(A$,LEN(A$)-X)
  95. 198 REM strip out line number if allowed.
  96. 200 IF SL$="Y" THEN A$=V$:SL=SL+1
  97. 202 REM Never combine lines with IF or RETURN statements.
  98. 204 IF INSTR(C$,"IF") OR INSTR(C$,"RETURN") THEN 212
  99. 206 REM Combine two program lines and go for more.
  100. 208 IF LEN(C$)+LEN(V$)<=240 THEN C$=C$+":"+V$:RE=RE+1:GOTO 176
  101. 210 REM Not enough space in C$ to combine another line so write it out first,           then continue.
  102. 212 PRINT #2,C$:C$=A$:GOTO 176
  103. 214 REM *********
  104. 216 REM Change color of current character being scanned.
  105. 218 N$=LEFT$(A$,PP):ZC=160+PP:PP=PP+1:P=0:J$="":DT=0:FOR T=PP TO LEN(A$):L$=MID$(A$,T,1):AZ=INT(ZC/80)
  106. 220 REM Set P equal to 1 on the first quote mark in a PRINT statement, ELSE set     P equal to 0 on second.
  107. 222 IF L$=CHR$(34) THEN IF P THEN P=0 ELSE P=1
  108. 224 IF OD$="SCRN:" THEN PRINT #3,:PRINT #3,
  109. 226 IF P THEN 254
  110. 228 REM Branch to line XXX if DATA is found in the current program line.
  111. 230 IF MID$(A$,T,4)="DATA" THEN DT=1 ELSE IF L$=":" THEN DT=0
  112. 232 IF DT THEN 254
  113. 234 REM Remove all spaces when safe to do so and update Spaces Deleted counter.
  114. 236 IF L$<>" " OR XS$<>"Y" THEN 246 ELSE IF J$>"" THEN L1$=RIGHT$(J$,1):IF L1$=CHR$(34)OR L1$="^" OR (L1$>="(" AND L1$<"0") OR (L1$>"9" AND L1$<"A") THEN L$=""
  115. 238 L1$="X":IF T<LEN(A$) THEN L1$=MID$(A$,T+1,1)
  116. 240 IF L1$="^" OR L1$=CHR$(34) OR L1$=" " OR (L1$>="'" AND L1$<"0") OR (L1$>"9" AND L1$<"A") THEN L$=""
  117. 242 IF L$="" THEN SD=SD+1
  118. 244 REM Check for a user protected line.
  119. 246 IF PV=>PJ THEN IF LN=PRO(PJ) THEN PJ=PJ+1:GOTO 264 ELSE IF LN>PRO(PJ) THEN PJ=PJ+1:GOTO 246
  120. 248 REM Search for REMarks and remove if allowed.
  121. 250 IF MID$(A$,T,3)="REM" OR L$="'" THEN IF IP$<>"Y" THEN GOSUB 274:A$=N$+J$+MID$(A$,T):GOTO 264 ELSE RD=RD+1:WHILE LN>REF(R)AND R>0:R=R-1:WEND:IF LN=REF(R) THEN R=R-1:GOSUB 274:WHILE J$="":J$="'":WEND:A$=N$+J$:GOTO 264 ELSE IF J$="" THEN 176 ELSE 258
  122. 252 REM Construct a new Squished version of the currect line in J$.  Also add a         trailing quote mark if none found after a PRINT statement.
  123. 254 J$=J$+L$:NEXT:IF P THEN J$=J$+CHR$(34)
  124. 256 REM Add the current program line number and jump to line XXX.
  125. 258 GOSUB 274:A$=N$+J$:GOTO 186
  126. 260 REM *********
  127. 262 REM If lines have been combined, then save them.
  128. 264 IF C$<>"" THEN PRINT #2,C$:C$=""
  129. 266 REM Then save new program line.
  130. 268 PRINT #2,A$:GOTO 176
  131. 270 REM *********
  132. 272 REM Patch to remove indentation if spaces being deleted.  Add `AND XC$="Y"  to the logic if you want to preserve indentation when not combining.
  133. 274 IF XS$="Y"THEN X=INSTR(N$," "):N$=LEFT$(N$,X):SD=SD+PP-X-1
  134. 276 RETURN
  135. 278 REM *********
  136. 280 REM Write out last program line, update display, and start new program.
  137. 282 PRINT #2,C$:CLOSE:CLS:PRINT"Number of Lines Combined: ";RE:PRINT:PRINT"Number of Spaces Deleted: ";SD:PRINT:PRINT"Number of REM Statements Deleted: ";RD:PRINT:PRINT"Number of Line Numbers Removed: ";SL
  138. 284 COLOR 23,0:LOCATE 18,30:PRINT"Squashing Complete.":COLOR 7,0:LOCATE 20,30:INPUT"<cr> to Continue: ";GO$:GOTO 40
  139. 286 REM  *********
  140. 288 REM
  141. 290 REM  XREFBAS.BAS
  142. 292 REM
  143. 294 REM  *********
  144. 296 'MODIFIED FOR IBM PC BY STEVE NOSSEN V1.10 1/13/82
  145. 298 'MODIFIED BY Buzz Hamilton V1.2 12/2/82
  146. 300 '    Add Keywords APPEND,ERROR, and SOUND
  147. 302 '    Relocate Keywords COM,INPUT, and LOC
  148. 304 '    Change end of DATA line check from space to colon
  149. 306 '    Permit dot in variable names
  150. 308 '    Eliminate dash spacer lines
  151. 310 '    Change default extension of input file to LST
  152. 312 'MODIFIED BY Tom Story V2.1, 27-June-1986
  153. 314 '    Added additional reserved words for Basic 3.0
  154. 316 '    Added references by RESTORE and RETURN
  155. 318 '    Added minor cosmetic changes
  156. 320 '    Corrected CSNC to CSNG in DATA block
  157. 322 '    Changed name to XREFBAS
  158. 324 '    Fixed problem with reserved words embedded in variable name.
  159. 326 CLS:CLEAR
  160. 328 LOCATE 1,15:PRINT "XREFBAS ";
  161. 330 PRINT"COPYRIGHT (C) 1980 BY ADVANCED INFORMATICS"
  162. 332 LOCATE 2,33:PRINT"V3.1  10-September-1986":PRINT:PRINT
  163. 334 '
  164. 336 DEFINT I-J:LW=79:DIM VNXT%(490),V$(490),FRST%(400),LST%(400),RFL%(2000),NXT%(2000),RW$(250),PT%(25)
  165. 338 '
  166. 340 ' RESERVED WORDS
  167. 342 '
  168. 344 DATA ABS,AND,APPEND AS,ASC,ATN,AUTO,BEEP,BLOAD,BSAVE
  169. 346 DATA CALL,CDBL,CHAIN,CHDIR,CHR$,CINT,CIRCLE,CLEAR,CLOSE,CLS,COLOR,COMMON
  170. 348 DATA COM,CONT,COS,CSNG,CSRLIN,CVD,CVI,CVS,DATA,DATE$
  171. 350 DATA DEFDBL,DEFINT,DEFSNG,DEFSTR,DEF,DELETE,DIM,DRAW
  172. 352 DATA EDIT,ELSE,END,ENVIRON$,ENVIRON,EOF,EQV,ERASE,ERDEV$,ERDEV,ERL,ERROR
  173. 354 DATA ERR,EXP,FIELD,FILES,FIX,FOR,FRE,GET,GOSUB,GOTO,HEX$
  174. 356 DATA IF,IMP,INKEY$,INPUT AS,INPUT$,INPUT#,INPUT,INP,INSTR,INTER$,INT,IOCTL$
  175. 358 DATA IOCTL,KEY,KILL,LEFT$,LEN,LET,LINE,LIST
  176. 360 DATA LLIST,LOAD,LOCATE,LOC,LOF,LOG,LPOS,LPRINT,LSET,MERGE,MID$,MKDIR$,MKD$
  177. 362 DATA MKI$,MKS$,MOD,MOTOR,NAME,NEW,NEXT,NOT,OCT$,OFF,ON,OPEN,OPTION,OR
  178. 364 DATA OUTPUT AS,OUT,PAINT,PEEK,PEN,PLAY,PMAP,POINT,POKE,POS,PRESET,PRINT#
  179. 366 DATA PRINT,PSET,PUT,RANDOMIZE,READ,REM,RENUM,RESET
  180. 368 DATA RESTORE,RESUME,RETURN,RIGHT$,RMDIR,RND,RSET,RUN
  181. 370 DATA SAVE,SCREEN,SGN,SHELL,SIN,SOUND,SPACE$,SPC(,SQR
  182. 372 DATA STEP,STICK,STOP,STR$,STRIG,STRING$,SWAP,SYSTEM
  183. 374 DATA TAB(,TAN,THEN,TIMER,TIME$,TO,TROFF,TRON
  184. 376 DATA USING,USR,VAL,VARPTR$,VARPTR,WAIT,WEND,WHILE,WIDTH,WRITE#,WRITE,XOR,"\"
  185. 378 '
  186. 380 ' FILL ARRAY WITH RESERVED WORDS
  187. 382 '
  188. 384 RW%=0
  189. 386 READ RW$
  190. 388 RW%=RW%+1:RW$(RW%)=RW$:IF RW$="\" THEN 396
  191. 390 I=ASC(RW$)-ASC("A"):IF PT%(I)=0 THEN PT%(I)=RW%
  192. 392 GOTO 386
  193. 394 '
  194. 396 FOR I=0 TO 25:IF PT%(I)=0 THEN PT%(I)=RW%
  195. 398 NEXT
  196. 400 '
  197. 402 ' GET FILE NAME
  198. 404 '
  199. 406 PRINT:PRINT"Enter the name of the program to be cross referenced,":PRINT"(or <cr> for menu).":PRINT:LINE INPUT"Drive:Filename(.Extension) ";FILE$:PRINT
  200. 408 IF FILE$="" THEN GOTO 10
  201. 410 IF INSTR(FILE$,".")=0 THEN FILE$=FILE$+".BAS"
  202. 412 '
  203. 414 OD$="LPT1:":PRINT:LINE INPUT "Output File (default is LPT1:) -> ";TEMP$:PRINT
  204. 416 IF TEMP$="" THEN 420 ELSE OD$=TEMP$
  205. 418 IF INSTR(OD$,":")=0 THEN OD$=OD$+":"
  206. 420 IF LEFT$(OD$,5)="COM1:" THEN OPEN OD$ AS 3 ELSE OPEN "O",3,OD$
  207. 422 PRINT:PRINT"1) Cross Reference   2) List   3) Both";
  208. 424 SEL$=INKEY$:IF SEL$="" THEN GOTO 424 ELSE M=VAL(SEL$)
  209. 426 IF M<1 OR M>3 THEN BEEP:GOTO 424 ELSE PRINT:PRINT
  210. 428 OPEN FILE$ FOR INPUT AS #1: PRG$="'"+FILE$+"'       "+DATE$+"     "+TIME$:GOSUB 440:IF INSTR(OD$,"SCRN")=0 THEN PRINT #3,CHR$(12);
  211. 430 IF OD$="SCRN:" THEN PRINT:INPUT"<cr> to continue: ";GO$
  212. 432 GOTO 286
  213. 434 '
  214. 436 ' INITIALIZE FOR CROSS REFERENCE
  215. 438 '
  216. 440 LC=0:BC=0:PZ%=0:V$="":C$="":VC%=91:RC%=-1
  217. 442 FOR I=0 TO 91: VNXT%(I)=-1: NEXT
  218. 444 IF M>1 THEN GOSUB 620
  219. 446 '
  220. 448 ' INPUT LINE AND EXTRACT LINE NUMBER
  221. 450 '
  222. 452 IF EOF(1) THEN IF M=2 THEN GOTO 430 ELSE GOTO 568
  223. 454 LINE INPUT #1,L$:IF ASC(L$)>58 THEN CLS:PRINT"**** ";FILE$;" is not an ASCII file ****":PRINT:PRINT"<cr> for menu.";:INPUT GO$:GOTO 10
  224. 456 IF M>1 THEN GOSUB 610:IF M=2 THEN 452
  225. 458 LG=LEN(L$): BRNCH%=0: ER$="": LC=LC+1: BC=BC+LG
  226. 460 LP%=INSTR(L$," "):LN=VAL(LEFT$(L$,LP%)):IF LEFT$(OD$,5)="SCRN:" AND M=3 THEN 462 ELSE LOCATE 17,1:PRINT"Scanning Line: ";LN;
  227. 462 IF LN>32767 THEN LN=LN-65536!
  228. 464 '
  229. 466 ' PARSE REST OF LINE
  230. 468 '
  231. 470 LP%=LP%+1: IF LP%>LG THEN GOSUB 528: GOTO 452
  232. 472 C$=MID$(L$,LP%,1)
  233. 474 IF C$>="A" AND C$<="Z" THEN 498 ELSE IF (C$>="0" AND C$<="9") OR C$="." THEN 556
  234. 476 IF C$=" " THEN GOSUB 528: GOTO 470 ELSE IF C$<>","THEN BRNCH%=0
  235. 478 IF C$=CHR$(34) THEN GOSUB 528:LP%=INSTR(LP%+1,L$,C$):IF LP%>0 THEN 470 ELSE 452
  236. 480 IF C$="'" THEN GOSUB 528: GOTO 452
  237. 482 IF C$="&" THEN GOSUB 528: V$=C$: GOTO 470
  238. 484 IF C$="$" OR C$="!" OR C$="%" OR C$="#" THEN GOSUB 552:GOTO 470
  239. 486 IF C$="(" THEN GOSUB 552
  240. 488 GOSUB 528: IF C$<>"," THEN ER$=""
  241. 490 GOTO 470
  242. 492 '
  243. 494 ' TEST FOR COMMAND
  244. 496 '
  245. 498 IF V$>"" THEN 558 ELSE C%=ASC(C$): P%=PT%(C%-ASC("A")): BRNCH%=0
  246. 500 IF C%<ASC(RW$(P%))  THEN 558
  247. 502 IF INSTR(LP%,L$,RW$(P%))<>LP% THEN P%=P%+1: GOTO 500
  248. 504 VTEST$=MID$(L$,LP%+LEN(RW$(P%)),1):IF (VTEST$=>"0" AND VTEST$<="9") OR (VTEST$=>"A" AND VTEST$<="Z") THEN GOTO 558
  249. 506 GOSUB 528: RW$=RW$(P%)
  250. 508 IF RW$="DATA" THEN  LP%=INSTR(LP%,L$,":"): IF LP%>0 THEN 470 ELSE 452
  251. 510 IF RW$="REM" THEN 452
  252. 512 IF RW$="GOTO" OR RW$="GOSUB" OR RW$="THEN" THEN BRNCH%=1
  253. 514 IF RW$="ELSE" OR RW$="RESUME" THEN BRNCH%=1
  254. 516 IF RW$="RETURN" OR RW$="RESTORE" THEN BRNCH%=1
  255. 518 IF RW$="ERASE" THEN ER$="(" ELSE ER$=""
  256. 520 LP%=LP%+LEN(RW$)-1:GOTO 470
  257. 522 '
  258. 524 ' END VARIABLE
  259. 526 '
  260. 528 IF V$="" THEN RETURN
  261. 530 IF V$>="A" THEN V$=V$+ER$: C%=ASC(V$)+1 ELSE IF V$>="" THEN V$=RIGHT$("    "+V$,5): C%=VAL(LEFT$(V$,2)) ELSE 544
  262. 532 IL=-1: I=C%
  263. 534 IF V$>V$(I) THEN IL=I: I=VNXT%(I): IF I>0 THEN 534 ELSE 538
  264. 536 IF V$=V$(I) THEN J=LST%(I-91): IF RFL%(J)=LN THEN 544 ELSE RC%=RC%+1: NXT%(J)=RC%: GOTO 542
  265. 538 VC%=VC%+1: IF IL>=0 THEN VNXT%(IL)=VC%
  266. 540 V$(VC%)=V$: VNXT%(VC%)=I: RC%=RC%+1: FRST%(VC%-91)=RC%:I=VC%
  267. 542 RFL%(RC%)=LN: NXT%(RC%)=-1: LST%(I-91)=RC%
  268. 544 V$="": RETURN
  269. 546 '
  270. 548 ' EXPAND VARIABLE
  271. 550 '
  272. 552 IF V$<>"" THEN V$=V$+C$
  273. 554 RETURN
  274. 556 IF V$="" AND BRNCH%=0 THEN 470
  275. 558 V$=V$+C$: GOTO 470
  276. 560 '
  277. 562 ' LIST VARIABLES
  278. 564 '
  279. 566 IF M=2 THEN RETURN
  280. 568 PZ%=0:LZ%=60
  281. 570 FOR J=0 TO 91: V%=J
  282. 572 V%=VNXT%(V%): IF V%<0 THEN 594
  283. 574 IF LZ%>56 THEN GOSUB 606
  284. 576 RZ%=0:I=FRST%(V%-91): PRINT #3,V$(V%);
  285. 578 IF RZ%=0 THEN  PRINT #3,TAB(16);
  286. 580 LN=RFL%(I): IF LN<0 THEN LN=LN+65536!
  287. 582 PRINT #3,USING "    #####";LN,
  288. 584 RZ%=RZ%+1
  289. 586 IF RZ%>6 THEN RZ%=0: PRINT #3,: LZ%=LZ%+1: IF LZ%>56 THEN GOSUB 606
  290. 588 I=NXT%(I): IF I>0 THEN 578
  291. 590 IF RZ%>0 THEN PRINT #3,: LZ%=LZ%+1
  292. 592 GOTO 572
  293. 594 NEXT J
  294. 596 '
  295. 598 PRINT:PRINT #3,STRING$(79,"=")
  296. 600 PRINT #3,"LINES: ";LC;"    BYTES: ";BC;:PRINT #3,"     SYMBOLS: ";VC%-91;"    REFERENCES: ";RC%+1
  297. 602 LZ%=LZ%+2: RETURN
  298. 604 '
  299. 606 GOSUB 620: PRINT #3,"SYMBOL" TAB(20) "REFERENCE IN LINE #":PRINT #3,:LZ%=LZ%+2:RETURN
  300. 608 '
  301. 610 X%=1
  302. 612 IF LZ%>57 OR RIGHT$(L$,3)="'PG" THEN GOSUB 620
  303. 614 Y%=INSTR(X%,L$,CHR$(10)): IF Y%>0 THEN PRINT #3,MID$(L$,X%,Y%-X%):LZ%=LZ%+1:X%=Y%+1:GOTO 614
  304. 616 PRINT #3,MID$(L$,X%,LW): LZ%=LZ%+1:X%=X%+LW: IF X%<=LEN(L$) THEN 616 ELSE RETURN
  305. 618 '
  306. 620 IF INSTR(OD$,"SCRN")=0 THEN IF PZ%>0 OR M>1 THEN PRINT #3,CHR$(12);   'FORM FEED
  307. 622 IF OD$="SCRN:" THEN PRINT #3,:PRINT #3,
  308. 624 PZ%=PZ%+1:PRINT #3,CHR$(10):PRINT #3,PRG$;TAB(68) "PAGE"PZ%
  309. 626 PRINT #3,
  310. 628 LZ%=3: RETURN
  311. 630 REM *********
  312. 632 REM Error trapping done here.
  313. 634 CLS:COLOR 7,0:BEEP:CLOSE #1
  314. 636 PRINT"Error Code: ";ERR:PRINT:PRINT"Line: ";ERL:PRINT:PRINT"Device: ";ERDEV$:PRINT:PRINT:INPUT"<cr> to continue.";GO$:RESUME 10
  315.