home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / basic / prebas.lbr / PREBAS.BQS / PREBAS.BAS
Encoding:
BASIC Source File  |  1985-03-19  |  28.8 KB  |  757 lines

  1. 10 '-----------------------------------------------------------------
  2. 20 '                        PREBAS.BAS
  3. 30 '
  4. 40 '         Copyright (c) 1985 by Greywolf
  5. 50 '
  6. 60 '    Pre-processor for BASIC. Will add line numbers to a standard
  7. 70 '    ASCII file, and (optionally) resolve labels in that file. 
  8. 80 '    Labels are identified by starting with the MARKER$ character,
  9. 90 '    (default is "@").
  10. 100 '
  11. 110 REVDATE$ = "22 JAN 1985" '        DATE OF LAST REVISION
  12. 120 '-----------------------------------------------------------------
  13. 130 '
  14. 140 ESC$ = CHR$(27): QUOTES$ = CHR$(34): TAB$ = CHR$(9): BELL$ = CHR$(7)
  15. 150 CR$ = CHR$(13): LF$ = CHR$(10): NL$ = CR$ + LF$
  16. 160 DEFINT A-Z: TRUE = -1: FALSE = 0: ABORT = FALSE: DEBUG = FALSE
  17. 170 MSDOS = FALSE '            True if we're running on a PC or clone.
  18. 180 OSEXEC = TRUE '            True if we're on an Osborne Exec.
  19. 190 '                    (Or an Osborne 1)
  20. 200 IF OSEXEC = TRUE THEN CLS$ = CHR$(26) '  The clear screen string.
  21. 210 MARKER$ = "@" '            The label identifier
  22. 220 OPTION BASE 1
  23. 230 DIM LABTAB$(2,1000) '        THE SECOND IS THE NUMBER OF LABELS
  24. 240 '                    WE CAN HANDLE
  25. 250 STARTNUM = 10: STEPSIZE = 10
  26. 260 ADDVECTS = TRUE '            Show the replaced labels as comments
  27. 270 '                    at the end of the line.
  28. 280 COMBUF = &H80 '            CPM comand line buffer
  29. 290 COMPILE = TRUE '            Set TRUE if compiling this
  30. 300 INFEXT$ = "": OUTFEXT$ = ".BAS" '    Default file extents 
  31. 310 HAVECL = FALSE '            At present we don't have a command line
  32. 320 CLERROR = FALSE
  33. 330 GOSUB 4340 '            @SIGNON
  34. 340 DOLABELS = TRUE: DOLINUMS = TRUE
  35. 350 KILLOLDOUT = FALSE
  36. 360 GOSUB 4440 '            See if we have a command line
  37. 370 IF CLERROR = TRUE THEN PRINT BELL$: SYSTEM
  38. 380 A$ = "Y"
  39. 390 WHILE A$ = "Y"
  40. 400    ABORT = FALSE
  41. 410    IF HAVECL = FALSE THEN GOSUB 620 '    GET THE FILE NAMES AND PARAMETERS
  42. 420    IF HAVECL = FALSE THEN GOSUB 4250 '    Clear screen.
  43. 430    IF ABORT = TRUE THEN GOTO 480
  44. 440    IF DOLABELS = FALSE THEN GOSUB 1770 
  45.     ELSE GOSUB 2410: GOSUB 3050 '    TO @ADLNUMS ELSE TO @RESOLVE, @ADLABLN
  46. 450    PRINT
  47. 460    PRINT "PROCESSED " ((PRESNUM - STEPSIZE)/STEPSIZE) 
  48.     " LINES, NUMBERED FROM" STARTNUM " TO " (PRESNUM - STEPSIZE)
  49. 470    PRINT
  50. 480    CLOSE
  51. 490    IF HAVECL = TRUE THEN A$ = "N": GOTO 570 'If we entered from comline
  52. 500 '                         we get out here.
  53. 510    PRINT:PRINT "DO YOU WANT TO NUMBER ANOTHER FILE (Y/N)? ";
  54. 520    GOSUB 4170 '            GET AN UPPER CASE KEY INTO A$
  55. 530    PRINT A$
  56. 540    IF A$ = "Y" THEN GOSUB 4250 '        @CLEARSCREEN
  57. 550    HAVECL = FALSE '    WE DONT HAVE A COMMAND LINE ANYMORE
  58. 560    KILLOLDOUT = FALSE
  59. 570 CLOSE
  60. 580 WEND
  61. 590 PRINT: PRINT "RETURNING YOU TO SYSTEM --"
  62. 600 PRINT    "                    BEANNACHD LEIBH."
  63. 610 END
  64. 620 '---------------------------------------------------------------------
  65. 630 '                                  @GETPARMS
  66. 640 '   Get the parameters from the user
  67. 650 '
  68. 660 ' ENTRY: Nothing
  69. 670 ' EXIT: INFILE$, OUTFILE$,STARTNUM,STEP  all set.
  70. 680 '---------------------------------------------------------------------
  71. 690 KILLOLDOUT = FALSE
  72. 700 PRINT: PRINT "INPUT X TO EXIT, OR ESC TO ACCEPT THE DEFAULTS"
  73. 710 PRINT  "(AFTER YOU HAVE GIVEN A FILENAME)" :PRINT
  74. 720 PRINT "WHAT IS THE NAME OF THE INFILE";
  75. 730 IF INFILE$ <> "" THEN PRINT: PRINT " ( <CR> FOR " + INFILE$ + ")";
  76. 740 PRINT "?:";
  77. 750 GOSUB 4020 '       GET AN ECHOED UPPER CASE LINE
  78. 760 IF UPLINE$ = "X" THEN ABORT = TRUE:RETURN
  79. 770 GSPEC$ = UPLINE$
  80. 780 GOSUB 6870 '        @GETSPEC
  81. 790 IF GOTSPEC$ = "" AND INFSPEC$ = "" THEN GOTO 720 ' IF WE DONT GOT ONE
  82. 800 IF GOTEXT$ <> "" THEN INFEXT$ = GOTEXT$
  83. 810 IF GOTSPEC$ <> "" THEN INFSPEC$ = GOTSPEC$
  84. 820 INFILE$ = INFSPEC$ + INFEXT$
  85. 830 IF GOTSPEC$ <> "" THEN OUTFSPEC$ = GOTSPEC$:
  86.     OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  87. 840 ON ERROR GOTO 1750
  88. 850 OPEN "I",#1,INFILE$
  89. 860 ON ERROR GOTO 0
  90. 870 '
  91. 880 '  WE HAVE AN INFILE -- GET THE OUTFILE
  92. 890 '
  93. 900 IF OUTFILE$ = "" THEN OUTFSPEC$ = INFSPEC$:
  94.     OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  95. 910 PRINT:PRINT:PRINT "WHAT IS THE NAME OF THE OUTPUT FILE";
  96. 920 PRINT: PRINT "( <CR> FOR " + OUTFILE$ + ")";
  97. 930 PRINT "?:";
  98. 940 GOSUB 4020 '       GET UPPER CASE LINE
  99. 950 IF UPLINE$ = ESC$ THEN ABORT = FALSE: RETURN
  100. 960 IF UPLINE$ = "X" THEN ABORT = TRUE: RETURN
  101. 970 IF UPLINE$ = "" THEN GOTO 1020
  102. 980 GSPEC$ = UPLINE$: GOSUB 6870 '    @GETSPEC
  103. 990 IF GOTEXT$ <> "" THEN OUTFEXT$ = GOTEXT$
  104. 1000 IF GOTSPEC$ <> "" THEN OUTFSPEC$ = GOTSPEC$
  105. 1010 OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  106. 1020 IF OUTFILE$ = INFILE$ THEN    GOTO 1130 '    IF THEY ARE THE SAME WE KNOW
  107. 1030 '                                         THE OUTFILE ALREADY EXISTS
  108. 1040 ON ERROR GOTO 1070
  109. 1050 OPEN "I",#2,OUTFILE$ '             JUST SEE IF ITS THERE
  110. 1060 GOTO 1090 '                WE ALREADY HAVE THE OUTFILE
  111. 1070 IF ERR <> 53 THEN ON ERROR GOTO 0: RESUME
  112. 1080 RESUME 1130 'IF THERE WAS AN ERROR THERE WAS NO OLD OUTFILE SO WERE OK
  113. 1090 PRINT OUTFILE$ " ALREADY EXISTS -- OVERWRITE (Y/N)? ";
  114. 1100 GOSUB 4170: PRINT A$
  115. 1110 IF A$ = "Y" THEN KILLOLDOUT = TRUE ELSE CLOSE #2:OUTFILE$ = "":  GOTO 910
  116. 1120 '
  117. 1130 ON ERROR GOTO 0
  118. 1140 '
  119. 1150 '          WE HAVE AN OUTFILE -- FIND OUT IF WE'VE TO NUMBER
  120. 1160 '
  121. 1170 PRINT "DO YOU WANT TO ADD LINE NUMBERS? ";
  122. 1180 GOSUB 4170: PRINT A$
  123. 1190 IF A$ = "X" THEN ABORT = TRUE : RETURN
  124. 1200 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  125. 1210 IF A$ = "N" THEN DOLINUMS = FALSE ELSE DOLINUMS = TRUE
  126. 1220 PRINT "DO YOU WANT TO RESOLVE LABELS? ";
  127. 1230 GOSUB 4170: PRINT A$
  128. 1240 IF A$ = "X" THEN ABORT = TRUE : RETURN
  129. 1250 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  130. 1260 IF A$ = "N" THEN DOLABELS = FALSE ELSE DOLABELS = TRUE
  131. 1270 '
  132. 1280 IF DOLABELS = FALSE THEN GOTO 1440 '    If we don't do labels
  133. 1290 '                        we don't need a MARKER$
  134. 1300 PRINT "WHAT IS THE MARKER$ CHARACTER (<CR> FOR "   MARKER$  ")?: ";
  135. 1310 GOSUB 4170: PRINT A$
  136. 1320 IF A$ = "X" THEN ABORT = TRUE:RETURN
  137. 1330 IF A$ => "A" AND A$ <= "Z" THEN PRINT "INVALID MARKER":GOTO 1300
  138. 1340 IF A$ = ESC$ THEN ABORT = FALSE:RETURN
  139. 1350 IF A$ => "#" THEN MARKER$ = A$
  140. 1360 '
  141. 1370 PRINT "ADD COMMENTS TO END OF LINES?"
  142. 1380 PRINT "(e.g. 'TO: @LABEL1, @LABEL2...'): ";
  143. 1390 GOSUB 4170: PRINT A$
  144. 1400 IF A$ = "X" THEN ABORT = TRUE : RETURN
  145. 1410 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  146. 1420 IF A$ = "N" THEN ADDVECTS = FALSE ELSE ADDVECTS = TRUE
  147. 1430 '
  148. 1440 IF DOLINUMS = TRUE OR DOLABELS = TRUE THEN GOTO 1550 ' GO GET START, STEP
  149. 1450 '
  150. 1460 PRINT BELL$   "DO YOU WANT TO STRIP LINE NUMBERS FROM " INFILE$ "? "
  151. 1470 PRINT "(TYPE N TO CHANGE YOUR MIND, X TO CHANGE FILENAMES): ";
  152. 1480 GOSUB 4170: PRINT A$
  153. 1490 IF A$ = "X" THEN ABORT = TRUE : RETURN
  154. 1500 IF A$ = ESC$ THEN ABORT = FALSE: RETURN
  155. 1510 IF A$ = "Y" THEN RETURN ELSE GOTO 1170 '        go ask again
  156. 1520 '
  157. 1530 '  NOW -- GET A START NUMBER
  158. 1540 '
  159. 1550 PRINT "WHAT IS THE START NUMBER (<CR> FOR"   STARTNUM   ")?:";
  160. 1560 INPUT "",STARTNUM$
  161. 1570 IF STARTNUM$ = "X" OR STARTNUM$ = "x" THEN ABORT = TRUE:RETURN
  162. 1580 IF STEPSIZE$ = ESC$ THEN ABORT = FALSE:RETURN
  163. 1590  IF STARTNUM$ <> "" THEN STARTNUM = VAL(STARTNUM$)
  164. 1600 IF STARTNUM < 1 THEN STARTNUM = 10
  165. 1610 '
  166. 1620 '  WE HAVE STARTNUM -- GET STEP SIZE
  167. 1630 '
  168. 1640 PRINT "ENTER THE STEP SIZE (<CR> FOR"   STEPSIZE  ")?:";
  169. 1650 INPUT "",STEPSIZE$
  170. 1660 IF STEPSIZE$ = "X" OR STEPSIZE$ = "x" THEN ABORT = TRUE:RETURN
  171. 1670 IF STEPSIZE$ <> "" THEN STEPSIZE = VAL(STEPSIZE$)
  172. 1680 IF STEPSIZE < 1 THEN STEPSIZE = 10
  173. 1690 '
  174. 1700 '  WHEE -- WE HAVE THEM ALL
  175. 1710 '
  176. 1720 RETURN
  177. 1730 '
  178. 1740 '
  179. 1750 IF ERR <> 53 THEN ON ERROR GOTO 0:RESUME ' IF ITS NOT "FILE NOT FOUND"
  180. 1760 PRINT "COULD NOT FIND " INFILE$: INFILE$ = "": CLOSE: RESUME 720
  181. 1770 '---------------------------------------------------------------------
  182. 1780 '                          @ADLNUM
  183. 1790 '  Add line numbers (start at STARTNUM increase by STEPSIZE) to
  184. 1800 '  INFILE$ then write it out to OUTFILE$. This routine is also entered
  185. 1810 '  if we just want to strip out line numbers (with DOLINUMS = FALSE)
  186. 1820 '
  187. 1830 '  ENTRY: INFILE$ should be opened, DOLINUMS = FALSE or TRRUE
  188. 1840 '  EXIT:  ADLNUMERR is TRUE or FALSE.
  189. 1850 '---------------------------------------------------------------------
  190. 1860 '
  191. 1870 PRINT:PRINT "WRITING "  INFILE$ " TO "  OUTFILE$  " WITH";
  192. 1880 IF DOLINUMS = FALSE THEN PRINT " NO";
  193. 1890 PRINT " LINE NUMBERS ";                                    
  194. 1900 IF DOLINUMS = TRUE THEN PRINT STARTNUM  "," STEPSIZE  ".";
  195. 1910 PRINT
  196. 1920 PRESNUM = STARTNUM
  197. 1930 LNTEMP$ = OUTFSPEC$ + ".TMP"
  198. 1940 OPEN "O",#3,LNTEMP$
  199. 1950 FIRSTFND = TRUE
  200. 1960 WHILE EOF(1) = FALSE
  201. 1970    IF DOLINUMS = TRUE THEN ADD$ = MID$(STR$(PRESNUM),2) + " "
  202.     ELSE ADD$ = ""
  203. 1980    LINE INPUT #1,PRESLINE$
  204. 1990    ONECHAR$ = LEFT$(PRESLINE$,1) '         HERE, WE GET RID OF EXISTING
  205. 2000    IF ONECHAR$ < "1" OR ONECHAR$ > "9" THEN GOTO 2100 '     LINE NUMBER
  206. 2010    WHILE ONECHAR$ => "0" AND ONECHAR$ <= "9" '             BUT NOT IF IT
  207. 2020        IF FIRSTFND = TRUE THEN GOSUB 2200:
  208.             FIRSTFND = FALSE:
  209.             IF A$ <> "Y" THEN CLOSE:
  210.             RETURN
  211.         '    @WARNING, there is already numbers
  212. 2030        PRESLINE$ = RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)) ' STARTS WITH
  213. 2040        ONECHAR$ = LEFT$(PRESLINE$,1) '                   A ZERO (MIGHT
  214. 2050    WEND '                                                BE SBASIC LABEL)
  215. 2060 '          NOW GET RID OF ANY EXTRA SPACES
  216. 2070 '
  217. 2080    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  218.         ONECHAR$ = LEFT$(PRESLINE$,1)
  219. 2090    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  220.         ONECHAR$ = LEFT$(PRESLINE$,1)
  221. 2100    PRESLINE$ = ADD$ + PRESLINE$
  222. 2110    PRESNUM = PRESNUM + STEPSIZE
  223. 2120    PRINT #3,PRESLINE$
  224. 2130 WEND
  225. 2140 CLOSE
  226. 2150 IF DOLINUMS = FALSE AND FIRSTFND = TRUE THEN
  227.     PRINT BELL$: PRINT "COULD NOT FIND ANY LINE NUMBERS IN " INFILE$:
  228.     KILL LNTEMP$:
  229.     RETURN
  230. 2160 IF OUTFILE$ = INFILE$ THEN KILL INFILE$
  231. 2170 IF KILLOLDOUT = TRUE THEN KILL OUTFILE$
  232. 2180 NAME LNTEMP$ AS OUTFILE$
  233. 2190 RETURN
  234. 2200 '----------------------------------------------------------------------
  235. 2210 '                          @WARNING
  236. 2220 '          Here we have found line numbers already in the file so
  237. 2230 '          warn user and find out if he wants to proceed.
  238. 2240 '
  239. 2250 ' ENTRY: no parms.
  240. 2260 ' EXIT: A$ = "Y" if we are to proceed, else it = "X", ABORT is set or
  241. 2270 '         cleared.
  242. 2280 '-------------------------------------------------------------------------
  243. 2290 '
  244. 2300 IF HAVECL = TRUE THEN A$ = "Y":
  245.     PRINT "STRIPPING OUT OLD LINE NUMBERS":
  246.     RETURN
  247. 2310 IF DOLINUMS = FALSE AND DOLABELS = FALSE THEN
  248.     PRINT "HAVE FOUND LINE NUMBERS IN " INFILE$
  249.     NL$  "STRIPPING AND WRITING TO " OUTFILE$:
  250.     A$ = "Y": RETURN
  251. 2320 PRINT BELL$: PRINT "WARNING -- numbered lines already in the file,"
  252. 2330 PRINT INFILE$ ", starting at line number"  PRESNUM
  253. 2340 PRINT "Do you wish to proceed (strip/overwrite old numbers) ?"
  254. 2350 PRINT "(Input 'Y' to proceed -- anything else will abort): ";
  255. 2360 GOSUB 4170 : PRINT A$ '           GET THE CHAR
  256. 2370 IF A$ <> "Y" THEN A$ = "X": ABORT = TRUE: CLOSE: KILL LNTEMP$:
  257.     PRINT "PROCESS ABORTED"
  258. 2380 RETURN
  259. 2390 '
  260. 2400 '
  261. 2410 '----------------------------------------------------------------------
  262. 2420 '                               @RESOLVE
  263. 2430 '
  264. 2440 '       Find all lines starting with a label (marked by MARKER
  265. 2450 '       [usually '@']). Set them up with their line numbers in LABTABLE$()
  266. 2460 ' ENTRY: INFILE$ is opened.
  267. 2470 ' EXIT: LABTABLE$ is set up, LABTABCNT has the number of labels.
  268. 2480 '
  269. 2490 '-----------------------------------------------------------------------
  270. 2500 '
  271. 2510 LABTABCNT = 1: PRESNUM = STARTNUM
  272. 2520 PRINT "PASS ONE: RESOLVING LABELS IN " INFILE$ " MARKED BY "  MARKER$
  273. 2530 WHILE EOF(1) = FALSE
  274. 2540    POSPTR = 1
  275. 2550    LINE INPUT #1,PRESLINE$
  276. 2560    GOSUB 5380 '            TO @SPACES
  277. 2570    IF MID$(PRESLINE$,POSPTR,1) = MARKER$ THEN GOSUB 2660 ' TO @ADDLAB
  278. 2580    PRESNUM = PRESNUM + STEPSIZE
  279. 2590 WEND
  280. 2600 CLOSE #1 '                      Now we just close and open to reset
  281. 2610 OPEN "I",#1,INFILE$
  282. 2620 RETURN
  283. 2630 '
  284. 2640 ' Ye Gods!!! That was simple!
  285. 2650 '
  286. 2660 '------------------------------------------------------------------------
  287. 2670 '                               @ADDLAB
  288. 2680 '   Add a label and its line number to the LABTAB$(). Increment LABTABCNT
  289. 2690 '-------------------------------------------------------------------------
  290. 2700 GOSUB 2770 '              TO @GETWORD -- First we resolve the word.
  291. 2710 LABTAB$(1,LABTABCNT) = GOTWORD$
  292. 2720 LABTAB$(2,LABTABCNT) = MID$(STR$(PRESNUM),2)
  293. 2730 LABTABCNT = LABTABCNT + 1
  294. 2740 RETURN
  295. 2750 '
  296. 2760 '
  297. 2770 '----------------------------------------------------------------------
  298. 2780 '                               @GETWORD
  299. 2790 '       Get the syntactic word at the location in PRESLINE$ pointed to by
  300. 2800 '       POSPTR, and return it (uppercase) in GOTWORD$.POSPTR is preserved.
  301. 2810 '------------------------------------------------------------------------
  302. 2820 GETVAR = POSPTR
  303. 2830 GOTWORD$ = ""
  304. 2840 GPRESCHR$ = MID$(PRESLINE$,GETVAR,1)
  305. 2850 WHILE GETVAR <= LEN(PRESLINE$)
  306. 2860    IF GPRESCHR$ < "#" THEN GOTO 2960 '   TO @OUTLOOP
  307. 2870    IF GPRESCHR$ = CHR$(39) THEN GOTO 2960 '   TO @OUTLOOP
  308. 2880    IF GPRESCHR$ > "9" AND GPRESCHR$ < "?" THEN GOTO 2960 '   TO @OUTLOOP
  309. 2890    IF GPRESCHR$ = CHR$(96) THEN GOTO 2960 '   TO @OUTLOOP
  310. 2900    IF GPRESCHR$ > CHR$(126) THEN GOTO 2960 '   TO @OUTLOOP
  311. 2910    IF GPRESCHR$ => "a" AND GPRESCHR$ <= "z" 
  312.         THEN GPRESCHR$ = CHR$(ASC(GPRESCHR$) - 32)
  313. 2920    GOTWORD$ = GOTWORD$ + GPRESCHR$
  314. 2930    GETVAR = GETVAR + 1
  315. 2940    GPRESCHR$ = MID$(PRESLINE$,GETVAR,1)
  316. 2950    GOTO 2980 '                               TO @GLOOPEND
  317. 2960 '@OUTLOOP -- Force exit from loop
  318. 2970    GETVAR = LEN(PRESLINE$) + 1
  319. 2980 '@GLOOPEND
  320. 2990 WEND
  321. 3000 '
  322. 3010 '
  323. 3020 RETURN
  324. 3030 '
  325. 3040 '
  326. 3050 '---------------------------------------------------------------------
  327. 3060 '                          @ADLABLN
  328. 3070 '  Find and resolve all program jump LABELS, replacing them with
  329. 3080 '  line numbers (start at STARTNUM increase by STEPSIZE). Read
  330. 3090 '  INFILE$ then write it out to OUTFILE$. Optionally add numbers
  331. 3100 '  to all other lines (if DOLINUMS is true).
  332. 3110 '
  333. 3120 '  ENTRY: INFILE$ should be opened. LABTAB$ should be set up.
  334. 3130 '  EXIT:  ADLNUMERR is TRUE or FALSE.
  335. 3140 '---------------------------------------------------------------------
  336. 3150 '
  337. 3160 PRINT:PRINT "PASS TWO:"
  338. 3170 PRINT:PRINT "WRITING "  INFILE$ " TO "  OUTFILE$  " WITH";
  339. 3180 IF DOLINUMS = FALSE THEN PRINT " NO";
  340. 3190 PRINT " LINE NUMBERS ";
  341. 3200 PRINT STARTNUM  "," STEPSIZE  "."
  342. 3210 PRESNUM = STARTNUM
  343. 3220 PRINT "WITH LABEL RESOLUTION. -- MARKER = "  MARKER$
  344. 3230 PRINT "PLEASE WAIT"
  345. 3240 LNTEMP$ = OUTFSPEC$ + ".TMP"
  346. 3250 OPEN "O",#3,LNTEMP$
  347. 3260 FIRSTFND = TRUE
  348. 3270 WHILE EOF(1) = FALSE
  349. 3280    ADD$ = MID$(STR$(PRESNUM),2) + " " '    GET RID OF LEADING BLANK
  350.                         IN STR$ FUNCT.
  351. 3290    LINE INPUT #1,PRESLINE$
  352. 3300    POSPTR = 1
  353. 3310    GOSUB 5380 '                clear leading white space, and
  354. 3320    ONECHAR$ = MID$(PRESLINE$,POSPTR,1) '    see if we have a @LABEL
  355. 3330    IF ONECHAR$ = MARKER$ THEN ADD$ = ADD$ + "'": GOTO 3480
  356. 3340    ONECHAR$ = LEFT$(PRESLINE$,1) '         HERE, WE GET RID OF EXISTING
  357. 3350    IF ONECHAR$ < "1" OR ONECHAR$ > "9" THEN GOTO 3470 '     LINE NUMBER
  358. 3360    WHILE ONECHAR$ => "0" AND ONECHAR$ <= "9" '             BUT NOT IF IT
  359. 3370        IF FIRSTFND = TRUE THEN GOSUB 2290: 
  360.             FIRSTFND = FALSE:
  361.             IF A$ <> "Y" THEN CLOSE:
  362.             RETURN 
  363.         '    @WARNING, we already have line numbers
  364. 3380 '
  365. 3390        PRESLINE$ = RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)) ' STARTS WITH
  366. 3400        ONECHAR$ = LEFT$(PRESLINE$,1) '                   A ZERO (MIGHT
  367. 3410    WEND '                                                BE SBASIC LABEL)
  368. 3420 '          NOW GET RID OF ANY EXTRA SPACES
  369. 3430 '
  370. 3440    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  371.         ONECHAR$ = LEFT$(PRESLINE$,1)
  372. 3450    IF ONECHAR$ = " " THEN PRESLINE$ =RIGHT$(PRESLINE$,(LEN(PRESLINE$)-1)):
  373.         ONECHAR$ = LEFT$(PRESLINE$,1)
  374. 3460 '            AND ADD IN OUR OWN SPACE
  375. 3470    IF DOLINUMS = FALSE THEN ADD$ = "" '        We arive here only if
  376.                             we have no label
  377. 3480    PRESLINE$ = ADD$ + PRESLINE$
  378. 3490    POSPTR = LEN(ADD$): IF POSPTR = 0 THEN POSPTR = 1
  379. 3500    GOSUB 3590 ' @FINDLAB         *** Here we find the labels. ***
  380. 3510    PRESNUM = PRESNUM + STEPSIZE
  381. 3520    PRINT #3,PRESLINE$
  382. 3530 WEND
  383. 3540 CLOSE
  384. 3550 IF OUTFILE$ = INFILE$ THEN KILL INFILE$
  385. 3560 IF KILLOLDOUT = TRUE THEN KILL OUTFILE$
  386. 3570 NAME LNTEMP$ AS OUTFILE$
  387. 3580 RETURN
  388. 3590 '-------------------------------------------------------------------
  389. 3600 '                @FINDLAB
  390. 3610 ' FIND ANY LABEL REFERENCES IN PRESLINE$, RESOLVE THEM, AND REBUILD
  391. 3620 ' PRESLINE$. AT ALL TIMES POSPTR POINTS TO THE NEXT CHARACTER TO BE
  392. 3630 ' PICKED UP.
  393. 3640 '--------------------------------------------------------------------
  394. 3650 '
  395. 3660 FLOUTFLAG = FALSE
  396. 3670 LINEND$ = "": INQUOTE = FALSE: LEADSP = FALSE
  397. 3680 WHILE FLOUTFLAG = FALSE AND POSPTR <= LEN(PRESLINE$)
  398. 3690    PRESCHAR$ = MID$(PRESLINE$,POSPTR,1)
  399. 3700    IF PRESCHAR$ = QUOTES$ THEN
  400.         IF INQUOTE = FALSE THEN
  401.             INQUOTE = TRUE
  402.         ELSE
  403.             INQUOTE = FALSE
  404. 3710    IF INQUOTE = TRUE THEN GOTO 3760
  405. 3720    IF PRESCHAR$ = " " OR PRESCHAR$ = TAB$ THEN LEADSP = TRUE: GOTO 3760
  406. 3730    IF PRESCHAR$ = "'" THEN FLOUTFLAG = TRUE: GOTO 3770 '    TO @FLWEND
  407. 3740    IF LEADSP = TRUE AND PRESCHAR$ = MARKER$
  408.         THEN GOSUB 3810 '     TO @GOTALAB
  409. 3750    LEADSP = FALSE
  410. 3760    POSPTR = POSPTR + 1
  411. 3770 ' @FLWEND
  412. 3780 WEND
  413. 3790 IF ADDVECTS = TRUE THEN PRESLINE$ = PRESLINE$ + LINEND$
  414. 3800 RETURN
  415. 3810 '-------------------------------------------------------------------
  416. 3820 '                @GOTALAB
  417. 3830 '
  418. 3840 '         WE HAVE A LABEL SO PROCESS IT.
  419. 3850 '------------------------------------------------------------------
  420. 3860 GOSUB 2770 '            Get a word.
  421. 3870 IF LEN(GOTWORD$) = 1 THEN RETURN '        we do not resolve a solo @
  422. 3880 GTLN$ = "" 
  423. 3890 FOR GTI = 1 TO LABTABCNT
  424. 3900    IF GOTWORD$ = LABTAB$(1,GTI) THEN
  425.         GTLN$ = LABTAB$(2,GTI): GTI = LABTABCNT + 1
  426. 3910 NEXT GTI
  427. 3920 IF GTLN$ = "" THEN PRINT
  428.     GOTWORD$ " AT LINE " PRESNUM " -- TARGET NOT FOUND":
  429.     RETURN
  430. 3930 IF LINEND$ = "" THEN LINEND$ = " '    TO: " ELSE LINEND$ = LINEND$ + ", "
  431. 3940 LINEND$ = LINEND$ + GOTWORD$
  432. 3950 GTEMP$ = LEFT$(PRESLINE$,POSPTR-1)
  433. 3960 RGT = LEN(PRESLINE$) - POSPTR - LEN(GOTWORD$) + 1
  434. 3970 PRESLINE$ = GTEMP$ + GTLN$ + RIGHT$(PRESLINE$,RGT)
  435. 3980 POSPTR = POSPTR + LEN(GOTWORD$) - 1
  436. 3990 RETURN
  437. 4000 '
  438. 4010 '
  439. 4020 '-----------------------------------------------------------------
  440. 4030 '                          @LINEUP
  441. 4040 '  Get an upper case line from the user.
  442. 4050 '
  443. 4060 ' Exit: UPLINE$ has the line
  444. 4070 '-------------------------------------------------------------------
  445. 4080 UPLINE$ = "": INPUT "", TEMP$
  446. 4090 FOR LU = 1 TO LEN(TEMP$)
  447. 4100    ULC$ = MID$(TEMP$,LU,1)
  448. 4110    IF ULC$ => "a" AND ULC$ <= "z" THEN ULC$ = CHR$(ASC(ULC$) - 32)
  449. 4120    UPLINE$ = UPLINE$ + ULC$
  450. 4130 NEXT LU
  451. 4140 RETURN
  452. 4150 '
  453. 4160 '
  454. 4170 '----------------------------------------
  455. 4180 '  STROBE KEY -- TOUPPER
  456. 4190 '
  457. 4200 A$ = "": WHILE A$ = "": A$=INKEY$: WEND
  458. 4210 IF A$ => "a" AND A$ <= "z" THEN A$ = CHR$(ASC(A$) - 32)
  459. 4220 RETURN
  460. 4230 '
  461. 4240 '
  462. 4250 '------------------------------------------------------------
  463. 4260 '            @clearscreen (& home)
  464. 4270 '    The clear screen is machine dependant, so I isolate it
  465. 4280 '    in its own routine for easy changes.
  466. 4290 '----------------------------------------------------------
  467. 4300 PRINT CLS$;
  468. 4310 RETURN
  469. 4320 '
  470. 4330 '
  471. 4340 '--------------------------------------------------------
  472. 4350 '            @SIGNON
  473. 4360 '--------------------------------------------------------
  474. 4370 GOSUB 4250 '        @CLEARSCREEN
  475. 4380 PRINT "PREBAS -- A pre-processor for BASIC"
  476. 4390 PRINT "Copyright (c) 1985 by Greywolf"
  477. 4400 PRINT "Last revised -- "  REVDATE$
  478. 4410 PRINT:PRINT:PRINT
  479. 4420 RETURN
  480. 4430 '
  481. 4440 '-------------------------------------------------------------------
  482. 4450 '            @PARSECL
  483. 4460 '
  484. 4470 '    Parse the command line for two filespecs, and optional
  485. 4480 '    parameters proceeded by "$".
  486. 4490 '
  487. 4500 ' ENTRY: no parms
  488. 4510 ' EXIT: INFSPEC$, INFEXT$, INFILE$, OUTFSPEC$, OUTFEXT$, OUTFILE$, 
  489. 4520 '    MARKER$ all filled if present. STARTNUM, STEPSIZE initialized.
  490. 4530 '    DOLINUMS, DOLABELS, ADDVECTS set or reset. (All on CL demands.)
  491. 4540 '    HAVECL, CLERROR set TRUE or FALSE.
  492. 4550 '---------------------------------------------------------------------
  493. 4560 '@PARSECL
  494. 4570 '
  495. 4580 IF MSDOS = TRUE THEN RETURN '        I DONT KNOW WHICH SEGMENT ITS
  496. 4590 '                    GOING TO BE IN.
  497. 4600 IF COMPILE = FALSE THEN RETURN '        No comline under interpreter.
  498. 4610 PRESLINE$ = ""
  499. 4620 COMLEN = PEEK(COMBUF) '            Get the size
  500. 4630 IF COMLEN = 0 THEN RETURN
  501. 4640 POSPTR = COMBUF + 1
  502. 4650 FOR CLI = POSPTR TO POSPTR + COMLEN - 1
  503. 4660    PRESLINE$ = PRESLINE$ + CHR$(PEEK(CLI))
  504. 4670 NEXT CLI
  505. 4680 '
  506. 4690 '@PARSE3
  507. 4700 '        We have a comline, break it up
  508. 4710 '
  509. 4720 PRFLAG = FALSE '    Kludge so I can still set KILLOLDOUT when we have $ 
  510. 4730 '            following just one filename.
  511. 4740 POSPTR = 1
  512. 4750 GOSUB 5380 '            Clear initial white space TO: @SPACES
  513. 4760 IF POSPTR > COMLEN THEN RETURN
  514. 4770 '@REALINE '        We have a real command line!
  515. 4780 GOSUB 5540 '        So get the first word '    TO: @PWORD
  516. 4790 GSPEC$ = PARWORD$
  517. 4800 GOSUB 6870 '        @GETSPEC
  518. 4810 IF GOTSPEC$ = "" THEN GOSUB 6760: CLERROR = TRUE: RETURN '    TO: @SYNERR
  519. 4820 '
  520. 4830 '                WHOOPEE! We have an infile
  521. 4840 HAVECL = TRUE
  522. 4850 INFSPEC$ = GOTSPEC$
  523. 4860 IF GOTEXT$ <> "" THEN INFEXT$ = GOTEXT$
  524. 4870 INFILE$ = INFSPEC$ + INFEXT$
  525. 4880 OUTFSPEC$ = GOTSPEC$: OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  526. 4890 '
  527. 4900 ON ERROR GOTO 4940
  528. 4910 OPEN "I",#1,INFILE$
  529. 4920 ON ERROR GOTO 0 '            We have our infile, so
  530. 4930 GOTO 4960 '            proceed.
  531. 4940 IF ERR <> 53 THEN ON ERROR GOTO 0: RESUME '    Not "file not found"?
  532. 4950 PRINT "COULD NOT FIND " INFILE$: CLERROR = TRUE: RETURN
  533. 4960 GOSUB 5380 '    TO: @SPACES
  534. 4970 IF POSPTR > COMLEN THEN GOTO 5150 '     Find out if there is already
  535.                         an outfile
  536. 4980 PCHAR$ = MID$(PRESLINE$,POSPTR,1) '    No? then do we have a "$"
  537. 4990 IF PCHAR$ = "$" THEN PRFLAG = TRUE: GOTO 5150 
  538. 5000 '
  539. 5010 '        WE HAVE ANOTHER FILESPEC
  540. 5020 '
  541. 5030 GOSUB 5540 '        So get the next word '    TO: @PWORD
  542. 5040 GSPEC$ = PARWORD$
  543. 5050 GOSUB 6870 '        @GETSPEC
  544. 5060 IF GOTSPEC$ = "" THEN GOSUB 6760: CLERROR = TRUE: RETURN '    TO: @SYNERR
  545. 5070 '
  546. 5080 '                WHOOPEE! We have an outfile
  547. 5090 OUTFSPEC$ = GOTSPEC$
  548. 5100 IF GOTEXT$ <> "" THEN OUTFEXT$ = GOTEXT$
  549. 5110 OUTFILE$ = OUTFSPEC$ + OUTFEXT$
  550. 5120 '
  551. 5130 IF OUTFILE$ = INFILE$ THEN    GOTO 5240 '    IF THEY ARE THE SAME WE KNOW
  552. 5140 '                                         THE OUTFILE ALREADY EXISTS
  553. 5150 ON ERROR GOTO 5180
  554. 5160 OPEN "I",#2,OUTFILE$ '             JUST SEE IF ITS THERE
  555. 5170 GOTO 5200 '                WE ALREADY HAVE THE OUTFILE
  556. 5180 IF ERR <> 53 THEN ON ERROR GOTO 0: RESUME
  557. 5190 RESUME 5220 'IF THERE WAS AN ERROR THERE WAS NO OLD OUTFILE SO WERE OK
  558. 5200 KILLOLDOUT = TRUE 
  559. 5210 '
  560. 5220 ON ERROR GOTO 0
  561. 5230 IF PRFLAG = TRUE THEN GOSUB 5730: RETURN '    TO: @PARAMS
  562. 5240 GOSUB 5380 '    TO: @SPACES
  563. 5250 IF POSPTR > COMLEN THEN RETURN '        Was there anything else on line
  564. 5260 PCHAR$ = MID$(PRESLINE$,POSPTR,1) '    Yes? then do we have a "$"
  565. 5270 IF PCHAR$ = "$" THEN GOSUB 5730: RETURN '    TO: @PARAMS
  566. 5280 '
  567. 5290 '
  568. 5300 '
  569. 5310 '------------------------------------------------------------
  570. 5320 '            @SPACES
  571. 5330 '        Clear spaces from PRESLINE$ at POSPTR
  572. 5340 '
  573. 5350 ' ENTRY: POSPTR points to the next pos in PRESLINE$
  574. 5360 ' EXIT:  POSPTR points to the next non-white char, or is > LEN(PRESLINE$)
  575. 5370 '------------------------------------------------------------
  576. 5380 '@SPACES
  577. 5390 SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  578. 5400 WHILE (SPCHAR$ = TAB$ OR SPCHAR$ = " ") AND POSPTR <= LEN(PRESLINE$)
  579. 5410    POSPTR = POSPTR + 1
  580. 5420    SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  581. 5430 WEND
  582. 5440 RETURN
  583. 5450 '
  584. 5460 '
  585. 5470 '------------------------------------------------------------
  586. 5480 '            @PWORD
  587. 5490 '    Return the next word at POSPTR (in uppercase)
  588. 5500 ' ENTRY: POSPTR is next char.
  589. 5510 ' EXIT:     POSPTR points to next white char or "$" or is > LEN(PRESLINE$)
  590. 5520 '        PARWORD$ contains the word.
  591. 5530 '------------------------------------------------------------
  592. 5540 '@PWORD
  593. 5550 PARWORD$ = ""
  594. 5560 SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  595. 5570 WHILE SPCHAR$ <> TAB$ AND SPCHAR$ <> " " AND SPCHAR$ <> "$"
  596.         AND POSPTR <= LEN(PRESLINE$)
  597. 5580    IF SPCHAR$ => "a" AND SPCHAR$ <= "z" THEN
  598.         SPCHAR$ = CHR$(ASC(SPCHAR$) - 32) '    Covert to upper, so we
  599.                             don't get no funny
  600.                             filenames
  601. 5590    PARWORD$ = PARWORD$ + SPCHAR$
  602. 5600    POSPTR = POSPTR + 1
  603. 5610    SPCHAR$ = MID$(PRESLINE$,POSPTR,1)
  604. 5620 WEND
  605. 5630 RETURN
  606. 5640 '
  607. 5650 '
  608. 5660 '------------------------------------------------------------
  609. 5670 '            @PARAMS
  610. 5680 '    Get any CL parameters, using the CPM convention of $P1 P2...
  611. 5690 ' ENTRY: POSPTR points at a trailing "$" in PRESLINE$
  612. 5700 ' EXIT:     Any valid parm is set up. If there is a syntax error,
  613. 5710 '        we print a message and set CLERROR.
  614. 5720 '------------------------------------------------------------
  615. 5730 '@PARAMS
  616. 5740 POSPTR = POSPTR + 1 '            Step over the $
  617. 5750 GOSUB 5380 '    TO: @SPACES
  618. 5760 WHILE POSPTR <= COMLEN AND CLERROR = FALSE
  619. 5770    PLUSMIN$ = "?"
  620. 5780 '@GETPR
  621. 5790    C$ = MID$(PRESLINE$,POSPTR,1)
  622. 5800    IF C$ => "a" AND C$ <= "z" THEN C$ = CHR$(ASC(C$) - 32)
  623. 5810    IF C$ = "+" OR C$ = "-" THEN
  624.         PLUSMIN$ = C$: POSPTR = POSPTR + 1: GOTO 5780 '    TO: @GETPR
  625. 5820 '
  626. 5830 '            Here we look up what option is on the CL
  627. 5840 '
  628. 5850    IF C$ = "L" THEN GOSUB 6040: GOTO 5930 '    TO: @PRLABS, @WEOK
  629. 5860    IF C$ = "S" THEN GOSUB 6300: GOTO 5930 '    TO: @PRSNUM, @WEOK
  630. 5870    IF C$ = "P" THEN GOSUB 6400: GOTO 5930 '    TO: @PRSTEP, @WEOK
  631. 5880    IF C$ = "M" THEN GOSUB 6500: GOTO 5930 '    TO: @PRMARK, @WEOK
  632. 5890    IF C$ = "N" THEN GOSUB 6170: GOTO 5930 '    TO: @PRNUMS, @WEOK
  633. 5900    IF C$ = "C" THEN GOSUB 6620: GOTO 5930 '    TO: @PRCOMS, @WEOK
  634. 5910 '
  635. 5920    CLERROR = TRUE
  636. 5930 '@WEOK
  637. 5940    GOSUB 5380 '    TO: @SPACES
  638. 5950 WEND
  639. 5960 '
  640. 5970 IF CLERROR= TRUE THEN GOSUB 6760 '    TO: @SYNERR
  641. 5980 '
  642. 5990 RETURN
  643. 6000 '
  644. 6010 '------------------------------------------------------------
  645. 6020 '            @PRLABS
  646. 6030 '            Do we do labels?
  647. 6040 '@PRLABS
  648. 6050 POSPTR = POSPTR + 1
  649. 6060 GOSUB 5540 '    TO: @PWORD
  650. 6070 IF PARWORD$ <> "" THEN CLERROR = TRUE: RETURN
  651. 6080 IF PLUSMIN$ = "+" THEN DOLABELS = TRUE: RETURN
  652. 6090 IF PLUSMIN$ = "-" THEN DOLABELS = FALSE: RETURN
  653. 6100 CLERROR = TRUE
  654. 6110 RETURN
  655. 6120 '
  656. 6130 '
  657. 6140 '------------------------------------------------------------
  658. 6150 '            @PRNUMS
  659. 6160 '        Do we do line numbering 
  660. 6170 '@PRNUMS
  661. 6180 POSPTR = POSPTR + 1
  662. 6190 GOSUB 5540 '    TO: @PWORD
  663. 6200 IF PARWORD$ <> "" THEN CLERROR = TRUE: RETURN
  664. 6210 IF PLUSMIN$ = "+" THEN DOLINUMS = TRUE: RETURN
  665. 6220 IF PLUSMIN$ = "-" THEN DOLINUMS = FALSE: RETURN
  666. 6230 CLERROR = TRUE
  667. 6240 RETURN
  668. 6250 '
  669. 6260 '
  670. 6270 '------------------------------------------------------------
  671. 6280 '            @PRSNUM
  672. 6290 '        What is the start number?
  673. 6300 '@PRSNUM
  674. 6310 POSPTR = POSPTR + 1
  675. 6320 GOSUB 5540 '    TO: @PWORD
  676. 6330 STARTNUM = VAL(PARWORD$)
  677. 6340 RETURN
  678. 6350 '
  679. 6360 '
  680. 6370 '------------------------------------------------------------
  681. 6380 '            @PRSTEP
  682. 6390 '        What is the stepsize?
  683. 6400 '@PRSTEP
  684. 6410 POSPTR = POSPTR + 1
  685. 6420 GOSUB 5540 '    TO: @PWORD
  686. 6430 STEPSIZE = VAL(PARWORD$)
  687. 6440 RETURN
  688. 6450 '
  689. 6460 '
  690. 6470 '------------------------------------------------------------
  691. 6480 '            @PRMARK
  692. 6490 '        What is the new MARKER$ (NO ERROR CHECKING)
  693. 6500 '@PRMARK
  694. 6510 POSPTR = POSPTR + 1
  695. 6520 GOSUB 5540 '    TO: @PWORD
  696. 6530 IF LEN(PARWORD$) <> 1 THEN CLERROR = TRUE: RETURN
  697. 6540 MARKER$ = PARWORD$
  698. 6550 RETURN
  699. 6560 '
  700. 6570 '
  701. 6580 '
  702. 6590 '------------------------------------------------------------
  703. 6600 '            @PRCOMS
  704. 6610 '    Do we add vector comments to the end of lines?
  705. 6620 '@PRCOMS
  706. 6630 POSPTR = POSPTR + 1
  707. 6640 GOSUB 5540 '    TO: @PWORD
  708. 6650 IF PARWORD$ <> "" THEN CLERROR = TRUE: RETURN
  709. 6660 IF PLUSMIN$ = "+" THEN ADDVECTS = TRUE: RETURN
  710. 6670 IF PLUSMIN$ = "-" THEN ADDVECTS = FALSE: RETURN
  711. 6680 CLERROR = TRUE
  712. 6690 RETURN
  713. 6700 '
  714. 6710 '
  715. 6720 '------------------------------------------------------------
  716. 6730 '            @SYNERR
  717. 6740 '    We have a command line syntax error -- tell user
  718. 6750 '
  719. 6760 '@SYNERR
  720. 6770 PRINT
  721. 6780 PRINT "SYNTAX ERROR -- Proper syntax is:"
  722. 6790 PRINT "PREBAS INFILE[.EXT] [OUTFILE[.EXT]] "
  723. 6800 PRINT "[$[{+,-}L] [{+,-}N] [{+,-}C] [Mc] [Sxxx] [Pxxx]]"
  724. 6810 PRINT
  725. 6820 RETURN
  726. 6830 '
  727. 6840 '
  728. 6850 '
  729. 6860 '
  730. 6870 '------------------------------------------------------------
  731. 6880 '                @GETSPEC
  732. 6890 '
  733. 6900 '    Take the string in GSPEC$ and split it into a filespec, and
  734. 6910 '    a file extent (if present). Return in GOTSPEC$ and GOTEXT$
  735. 6920 '-------------------------------------------------------------
  736. 6930 GOTSPEC$ = "": GOTEXT$ = ""
  737. 6940 GSPTR = 1
  738. 6950 GSCHAR$ = MID$(GSPEC$,GSPTR,1)
  739. 6960 WHILE GSPTR <= LEN(GSPEC$) AND GSCHAR$ <> "."
  740. 6970    GOTSPEC$ = GOTSPEC$ + GSCHAR$
  741. 6980    GSPTR = GSPTR + 1
  742. 6990    GSCHAR$ = MID$(GSPEC$,GSPTR,1)
  743. 7000 WEND
  744. 7010 '
  745. 7020 '        We have the fspec, see if theres a fext.
  746. 7030 '
  747. 7040 IF GSCHAR$ <> "." THEN RETURN
  748. 7050 GOTEXT$ = "."
  749. 7060 FOR GSI = GSPTR + 1 TO GSPTR + 4
  750. 7070    GOTEXT$ = GOTEXT$ + MID$(GSPEC$,GSI,1)
  751. 7080 NEXT GSI
  752. 7090 '
  753. 7100 RETURN
  754. 7110 '
  755. 7120 CLERROR = TRUE: RETURN
  756. PTR + 4
  757. 7070    GOTEXT$ = GOTEXT$ + MID$(GSPEC$,GSI,1)