Home » CEEFAX disks » telesoftware8.adl » 08-07-88/LISTER3

08-07-88/LISTER3

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » CEEFAX disks » telesoftware8.adl
Filename: 08-07-88/LISTER3
Read OK:
File size: 27DA bytes
Load address: FFFF1B00
Exec address: FFFF8023
Duplicates

There is 1 duplicate copy of this file in the archive:

File contents
   10REM BASIC PROGRAM LISTER
   20REM This program will list any
   30REM BASIC program from disc/net to
   40REM screen or printer.   It will
   50REM properly indent program lines,
   60REM split multiple statements,
   70REM split and indent IF statements
   80REM and emphasise the DEFinitions
   90REM of all procedures and
  100REM functions.
  110 
  120REM     (c) Derek Grainge
  130REM     18th April , 1987
  140REM Loretto School, Musselburgh
  150 
  160 
  170REM set up section
  171REM Lines 190,200,240,300
  172REM are NET/ADFS - specific.
  173REM Get rid of them if using disc.
  174REM Line 200 refers to a program
  175REM called PUTGET available
  176REM through MUSE or SJ research.
  180ON ERROR GOTO 1910
  190*NET
  200*PUTGET2
  210MODE7
  220PRINT"SETTING UP. PLEASE WAIT ..."
  230DIM A% 40 ,NAME$(127),linebuffer 256
  240*DIR $
  241REM The file called "FILE"
  242REM contains a list of all the
  243REM BASIC keywords.   This avoids
  244REM problems with differences
  245REM between BASIC versions 1,2 etc
  246REM However, In BASIC1 you will
  247REM find that OPENIN appears as
  248REM OPENUP.   If this is a problem
  249REM remove the REM on line 301.
  250X=OPENUP("FILE")
  260FOR I=0 TO 127
  270INPUT#X,NAME$(I)
  280NEXT
  290CLOSE#X
  300*NET
  301REM IF ?&8015=49 THEN NAME$(45)="OPENIN"
  310indent=0:margin=6:fornext=0:repuntil=0:space=32:return=13:remark=&F4:quote=34:comma=44:for=&E3:repeat=&F5:until=&FD:next=&ED:lineno=141:define=221:printable=127:colon=58:then=&8C:else=&8B
  320if=&E7:test1$=CHR$(quote)+CHR$(remark)+CHR$(for)+CHR$(else)+CHR$(repeat)+CHR$(next)+CHR$(until)
  330test2$=CHR$(then)+CHR$(if)+CHR$(else)+CHR$(colon)
  340single=1:double=2
  350 
  360 
  370REM THE MAIN PROGRAM REPEATS ITSELF
  380REPEAT
  390REM CHOOSE A DIRECTORY
  391REM To select a different directory
  392REM just type in its name.  If you
  393REM are happy with the current one,
  394REM press return.
  395REM If you are using the DFS there's
  396REM is no point in doing all this,
  397REM so delete lines 400 to 450.
  400*DIR
  410REPEAT
  420*CAT
  430INPUT"WHICH DIRECTORY",A$
  440IF A$<>"" THEN PROCoscli("DIR "+A$)
  450UNTIL A$=""
  460REM CHOOSE A PROGRAM
  470CLS:*CAT
  480INPUT"NAME OF PROGRAM",P$:P%=linebuffer
  490REM CHOOSE OUTPUT PARAMETERS
  491REM 1. You can start from any line
  492REM    in the program by typing a
  493REM    line number.
  494REM 2. I have arbitrarily limited
  495REM    the printing width to lie
  496REM    between 20 and 78.   Change
  497REM    these if you wish.
  498REM 3. Any word starting with Y
  499REM    will switch the printer on.
  500INPUT"STARTING AT LINE NO",startno
  510INPUT''"WIDTH OF LISTING ON SCREEN OR PAPER",R%
  520IF R%<20 OR R%>78 THEN GOTO 510
  530INPUT ''"PRINTER ON (Y/N) ",Y1$
  540IF LEFT$(Y1$,1)="Y" THEN INPUT"ECONET PRINTER (Y/N)",Y2$ ELSE Y2$="N"
  550*FX 5,1
  560IF LEFT$(Y2$,1)="Y" THEN *FX 5,4
  570PRINT'''''
  580IF LEFT$(Y1$,1)="Y" THEN VDU 2,1,27,1,40
  581REM The VDU sequence 1,27,1,40
  582REM selects NLQ printing on my
  583REM CANON.   Stick in your own
  584REM code to select your
  585REM preferred printing style.
  590REM IF R%<40 THEN MODE 7 ELSE MODE 3
  591REM If you remove all the REM state-
  592REM ments there will probably be
  593REM enough room for the program
  594REM to run in a mode with 80
  595REM characters to the line.   In 
  596REM which case, remove the REM from
  597REM line 590, but leave the IF
  598REM statement behind!
  600 
  610REM THE MAIN PROGRAM ITSELF
  611REM Open the file, and process each
  612REM line until we reach the end.
  614margin=6:fornext=0:repuntil=0
  615decode=TRUE:mode=single
  620PRINT'P$'
  630theend=FALSE
  640X=OPENUP(P$)
  650REPEAT
  660PROCloadline(linebuffer)
  670PROCcheck(linebuffer)
  680IF (NOT theend) AND highenough THEN PROClistline(linebuffer+4)
  690UNTIL theend
  700CLOSE#X
  710PRINT''
  720IF Y2$="N" THEN VDU 1,12
  730VDU 3
  740 
  750REM ANOTHER GO ?
  751REM The program repeats until you
  752REM reply with a word starting with
  753REM N.
  760INPUT''"ANOTHER GO",Y$
  770UNTIL LEFT$(Y$,1)="N"
  780END
  790REM END OF MAIN PROGRAM
  800 
  810 
  820REM CHECK A LINE FOR LEGALITY
  821REM The 1st char must be 13, and
  822REM the 2nd less than 128. Check
  823REM if within range for listing.
  824REM Calculate the correct margin
  825REM and print the line number.
  830 
  840DEFPROCcheck(A%)
  850IF ?A%<>13 THEN theend=TRUE:VDU 3:PRINT"ILLEGAL BASIC STORAGE":ENDPROC
  860IF A%?1>127 THEN theend=TRUE:ENDPROC
  870highenough=TRUE
  880IF (A%?1)*256+A%?2<startno THEN highenough=FALSE:ENDPROC
  890@%=5:margin=6+2*fornext+2*repuntil:IF margin<6 THEN margin=6
  900PRINT(A%?1)*256 + (A%?2) ;STRING$(margin-5," ");:@%=0:Q%=margin
  910mode=single
  920ENDPROC
  930 
  940 
  950REM PRINT A PROGRAM LINE
  951REM B% points the the line's text.
  952REM Reset indent because IF state-
  953REM ments are only indented while
  954REM on the current line.
  955REM calculate the line length.
  956REM Calculate the margin and
  957REM print each statement until
  958REM finished.
  960 
  970DEFPROClistline(B%)
  980indent=0
  990L%=?(B%-1)-4
 1000K%=-1
 1010margin=6+2*fornext+2*repuntil:IF margin<6 THEN margin=6
 1020Q%=margin
 1030REPEAT
 1040PROCstatement
 1050UNTIL K%>=L%-1
 1060PRINT
 1070ENDPROC
 1080 
 1090 
 1100REM PRINT ONE PROGRAM STATEMENT
 1101REM Deal with each program state-
 1102REM ment.   BASIC doesn't have a
 1103REM CASE statement , so ON .. GOTO
 1104REM is the most efficient way of
 1105REM selecting options.
 1110 
 1120DEF PROCstatement
 1130PROCstripspaces
 1150REPEAT
 1160PROCnextchar
 1170a=INSTR(test1$,CHR$(char))
 1180ON a+1 GOTO 1260,1190,1200,1210,1220,1230,1240,1250
 1181REM line 1190 deals with a quote,
 1182REM 1200 with REM, 1210 with FOR
 1183REM 1220 with THEN, 1230 with
 1184REM REPEAT, 1240 with NEXT, and
 1185REM 1150 with UNTIL.
 1190PROCtext:GOTO 1320
 1200PROCrem:GOTO 1320
 1210fornext=fornext+1:PROCprint(space,decode):PROCprint(space,decode):GOTO 1260
 1220indent=indent-2:PROCstartline:GOTO 1260
 1230repuntil=repuntil+1:PROCprint(space,decode):PROCprint(space,decode):GOTO 1260
 1240PROCcheck_commas:GOTO 1260
 1250repuntil=repuntil-1:IF repuntil<0 THEN repuntil=0
 1260IF char=lineno THEN PROClineno(B%+K%+1) ELSE PROCprint(char,decode)
 1270a=INSTR(test2$,CHR$(char))
 1280ON a+1 GOTO 1320,1310,1290,1300,1305
 1281REM 1290 deals with IF, 1300 with
 1282REM ELSE, 1310 THEN, 1305 colon
 1290indent=indent+2:GOTO 1320
 1300indent=indent+2
 1305IF a=4 THEN PROCstripspaces:IF K%>=L%-1 THEN 1320
 1310PROCstartline
 1320UNTIL K%>=L%-1 OR char=colon
 1330ENDPROC
 1340 
 1350 
 1360REM EXECUTE A * INSTRUCTION
 1361REM A% point to a small text
 1362REM buffer where the * command
 1363REM is placed.
 1370 
 1380DEFPROCoscli(A$)
 1390$A%=A$
 1400X%=A% MOD 256
 1410Y%=A% DIV 256
 1420CALL &FFF7
 1430ENDPROC
 1440 
 1450 
 1460REM DECODE A LINE NUMBER
 1461REM Line numbers used by GOTO
 1462REM GOSUB are stored in a
 1463REM special format of a line
 1464REM number flag followed by three
 1465REM bytes.   This is to avoid each
 1466REM byte being >127 or <32 and
 1467REM hence possibly being decoded
 1468REM by BASIC as a control code or
 1469REM a BASIC keyword!
 1470 
 1480DEFPROClineno(A%)
 1490LOCAL D1%,D2%,D3%,L
 1500D1%= ((A%?1)AND &3F)
 1510D2%= ((A%?2)AND &3F)
 1520D3%= (?A%) EOR &54
 1530L= D2%*256+D1%+(D3%AND 4)*256*16 +(D3% AND 48)*4
 1540IF Q%+LEN(STR$(L))*mode>R% THEN PROCstartline
 1550PRINT L;
 1560K%=K%+3
 1570Q%=Q%+LEN(STR$(L))*mode
 1580ENDPROC
 1590 
 1600 
 1610REM CHECK A NEXT STATEMENT FOR COMMAS
 1611REM A next statement may be
 1612REM followed by one or more
 1613REM variables, separated by commas.
 1614REM By counting forwards through
 1615REM the commas we know how many
 1616REM NEXTs have beeen implied.
 1617REM PS take care to avoid
 1618REM 'outdenting' !
 1620 
 1630DEF PROCcheck_commas
 1640fornext=fornext-1
 1650pos=K%
 1660REPEAT
 1670pos=pos+1
 1680IF B%?pos=comma THEN fornext=fornext-1
 1690UNTIL B%?pos=colon OR pos=L%-1 OR B%?pos=return
 1700IF fornext<0 THEN fornext=0
 1710ENDPROC
 1720 
 1730 
 1740REM INDENT THE MARGIN THE CORRECT # OF SPACES
 1741REM Used to split multiple state-
 1742REM ments or long lines.
 1743REM FOR/NEXT REPEAT/UNTIL and 
 1744REM IF/THEN/ELSE statements
 1745REM are all indented by two spaces.
 1746REM The effects of indenting an
 1747REM IF statement are only effective
 1748REM for the current program line.
 1750 
 1760DEF PROCstartline
 1770PRINT
 1780IF indent<0 THEN indent=0
 1790margin=6+2*fornext+2*repuntil+indent
 1800IF margin<6 THEN margin=6
 1810PRINT STRING$(margin," ");
 1820Q%=margin
 1830PROCstripspaces
 1850mode=single
 1860ENDPROC
 1870 
 1880 
 1890REM ERROR SECTION
 1891REM Escape will cause an exit to 
 1892REM this section, as will an error
 1893REM in the program - which will be
 1894REM reported.   You are asked if
 1895REM you wish another go.   Because
 1896REM an error might happen while
 1897REM setting things up, the program
 1898REM will have to be RUN again if
 1899REM the error happened there.
 1900 
 1910CLOSE#0
 1920VDU 12,3
 1930IF ERR<>17 THEN REPORT:PRINT" at line ";ERL
 1940INPUT''"ANOTHER GO ?",Y$
 1950IF LEFT$(Y$,1)="N" THEN END
 1960IF ERL<370 THEN RUN
 1970GOTO 380
 1980 
 1990 
 2000REM GET A LINE FROM THE FILE
 2001REM The line format is char. 13
 2002REM followed by line no (hi byte)
 2003REM If the hi byte is >127 that
 2004REM marks the end of the program.
 2005REM If all is well, the line no
 2006REM (lo byte) and line length
 2007REM follow, and then the code for
 2008REM that line of program.
 2010 
 2020DEFPROCloadline(buf)
 2030LOCAL a,b
 2040a=BGET#X
 2050?buf=a
 2060b=BGET#X
 2070buf?1=b
 2080IF a<>13 THEN ENDPROC
 2090IF b>127 THEN ENDPROC
 2100buf?2=BGET#X
 2110a=BGET#X
 2120buf?3=a
 2130FOR b=4 TO a-1
 2140buf?b=BGET#X
 2150NEXT b
 2160buf?a=13
 2170ENDPROC
 2180 
 2190 
 2200REM IGNORE ANY LEADING SPACES
 2210REM AT THE START OF A LINE
 2211REM The program organises its own
 2212REM indentation so it ignores yours
 2220 
 2230DEF PROCstripspaces
 2235IF Q%>margin THEN ENDPROC
 2240REPEAT
 2250K%=K%+1
 2260UNTIL K%>=L%-1 OR B%?K%>space
 2265K%=K%-1
 2270ENDPROC
 2280 
 2290 
 2300REM GET THE NEXT CHARACTER
 2301REM Return a space if off the end
 2302REM of the line, or if the char.
 2303REM was a control code. Thus many
 2304REM unlistable programs are now
 2305REM listable!
 2310 
 2320DEF PROCnextchar
 2330K%=K%+1
 2340IF K%>L%-1 THEN char=space ELSE char=B%?K%
 2350IF char<space THEN char=space
 2360ENDPROC
 2370 
 2380 
 2390REM DEAL WITH A REM STATEMENT
 2391REM The rest of the line will be
 2392REM treated as text, but it may
 2393REM include BASIC keywords, which
 2394REM have to be decoded.
 2400 
 2410DEF PROCrem
 2420PROCprint(char,decode)
 2430REPEAT
 2440PROCnextchar
 2450IF char=quote THEN PROCtext ELSE PROCprint(char,decode)
 2460UNTIL K%>=L%-1
 2470ENDPROC
 2480 
 2490 
 2500REM DEAL WITH TEXT BETWEEN QUOTES
 2501REM print the first quote, then 
 2502REM keep on printing until the
 2503REM end of the string is found.
 2504REM Guard against missing quotes
 2505REM at the end of line!
 2506REM Double quotes are no problem -
 2507REM we toggle out and in to text
 2508REM mode again.   Codes >128 are
 2509REM teletext control - ignore them.
 2510 
 2520DEF PROCtext
 2530PROCprint(char,NOT decode)
 2540REPEAT
 2550PROCnextchar
 2560PROCprint(char,NOT decode)
 2570UNTIL K%>=L%-1 OR char=quote
 2580ENDPROC
 2590 
 2600 
 2610REM PRINT A CHARACTER OR
 2620REM COMPRESSED CODE
 2621REM Logical variable decode
 2622REM indicates whether in program
 2623REM or text mode - teletext codes
 2624REM >128 can clog up the printer,
 2625REM so for neatness' sake, replace
 2626REM them by spaces.
 2627REM DEF PROC and FN statements are
 2628REM printed double width, so be
 2629REM careful about the line length.
 2630 
 2640DEF PROCprint(char,decode)
 2650LOCAL l,A$
 2660A$=CHR$(char)
 2670l=1
 2680IF decode THEN IF char>printable THEN A$=NAME$(char-128):l=LEN(A$)
 2690IF NOT decode THEN IF (char MOD 128)<space THEN A$=" "
 2700IF Q%+l*mode>R% THEN PROCstartline
 2710IF char=define THEN VDU 8,129:IF LEFT$(Y1$,1)="Y" THEN mode=double:VDU 1,32,1,14
 2720PRINT A$;
 2730Q%=Q%+l*mode
 2740ENDPROC
 2750 
 2760 

� BASIC PROGRAM LISTER
 � This program will list any
$� BASIC program from disc/net to
("� screen or printer.   It will
2$� properly indent program lines,
< � split multiple statements,
F$� split and indent IF statements
P#� and emphasise the DEFinitions
Z� of all procedures and
d� functions.
n 
x�     (c) Derek Grainge
��     18th April , 1987
�!� Loretto School, Musselburgh
� 
� 
�� set up section
�� Lines 190,200,240,300
�� are NET/ADFS - specific.
�$� Get rid of them if using disc.
�"� Line 200 refers to a program
�� called PUTGET available
�"� through MUSE or SJ research.
�� � � �DvG
�*NET
�*PUTGET2
��7
�"�"SETTING UP. PLEASE WAIT ..."
�&� A% 40 ,NAME$(127),linebuffer 256
�
*DIR $
�� The file called "FILE"
� � contains a list of all the
�#� BASIC keywords.   This avoids
�� problems with differences
�$� between BASIC versions 1,2 etc
�!� However, In BASIC1 you will
�!� find that OPENIN appears as
�$� OPENUP.   If this is a problem
�!� remove the REM on line 301.
�X=�("FILE")
� I=0 � 127
�#X,NAME$(I)
�
"�#X
,*NET
-*� IF ?&8015=49 THEN NAME$(45)="OPENIN"
6�indent=0:margin=6:fornext=0:repuntil=0:space=32:return=13:remark=&F4:quote=34:comma=44:for=&E3:repeat=&F5:until=&FD:next=&ED:lineno=141:define=221:printable=127:colon=58:then=&8C:else=&8B
@Nif=&E7:test1$=�(quote)+�(remark)+�(for)+�(else)+�(repeat)+�(next)+�(until)
J)test2$=�(then)+�(if)+�(else)+�(colon)
Tsingle=1:double=2
^ 
h 
r%� THE MAIN PROGRAM REPEATS ITSELF
|�
�� CHOOSE A DIRECTORY
�%� To select a different directory
�$� just type in its name.  If you
�%� are happy with the current one,
�� press return.
�&� If you are using the DFS there's
�$� is no point in doing all this,
�!� so delete lines 400 to 450.
�*DIR
��
�*CAT
��"WHICH DIRECTORY",A$
� � A$<>"" � �oscli("DIR "+A$)
�� A$=""
�� CHOOSE A PROGRAM
�
�:*CAT
�'�"NAME OF PROGRAM",P$:P%=linebuffer
�� CHOOSE OUTPUT PARAMETERS
�$� 1. You can start from any line
�#�    in the program by typing a
��    line number.
�#� 2. I have arbitrarily limited
�"�    the printing width to lie
�$�    between 20 and 78.   Change
��    these if you wish.
�!� 3. Any word starting with Y
�$�    will switch the printer on.
�"�"STARTING AT LINE NO",startno
�/�''"WIDTH OF LISTING ON SCREEN OR PAPER",R%
� R%<20 � R%>78 � � �d~A
� ''"PRINTER ON (Y/N) ",Y1$
9� �Y1$,1)="Y" � �"ECONET PRINTER (Y/N)",Y2$ � Y2$="N"
&*FX 5,1
0� �Y2$,1)="Y" � *FX 5,4
:
�'''''
D!� �Y1$,1)="Y" � � 2,1,27,1,40
E � The VDU sequence 1,27,1,40
F � selects NLQ printing on my
G � CANON.   Stick in your own
H� code to select your
I� preferred printing style.
N&� IF R%<40 THEN MODE 7 ELSE MODE 3
O&� If you remove all the REM state-
P"� ments there will probably be
Q!� enough room for the program
R� to run in a mode with 80
S#� characters to the line.   In 
T%� which case, remove the REM from
U � line 590, but leave the IF
V� statement behind!
X 
b� THE MAIN PROGRAM ITSELF
c%� Open the file, and process each
d"� line until we reach the end.
f!margin=6:fornext=0:repuntil=0
gdecode=�:mode=single
l	�'P$'
vtheend=�
�X=�(P$)
��
��loadline(linebuffer)
��check(linebuffer)
�7� (� theend) � highenough � �listline(linebuffer+4)
�� theend
��#X
��''
�� Y2$="N" � � 1,12
�� 3
� 
�� ANOTHER GO ?
�#� The program repeats until you
�%� reply with a word starting with
�� N.
��''"ANOTHER GO",Y$
� �Y$,1)="N"
�
� END OF MAIN PROGRAM
  
* 
4� CHECK A LINE FOR LEGALITY
5"� The 1st char must be 13, and
6"� the 2nd less than 128. Check
7"� if within range for listing.
8"� Calculate the correct margin
9 � and print the line number.
> 
H��check(A%)
R7� ?A%<>13 � theend=�:� 3:�"ILLEGAL BASIC STORAGE":�
\� A%?1>127 � theend=�:�
fhighenough=�
p.� (A%?1)*256+A%?2<startno � highenough=�:�
z<@%=5:margin=6+2*fornext+2*repuntil:� margin<6 � margin=6
�8�(A%?1)*256 + (A%?2) ;�margin-5," ");:@%=0:Q%=margin
�mode=single
��
� 
� 
�� PRINT A PROGRAM LINE
�$� B% points the the line's text.
�$� Reset indent because IF state-
�#� ments are only indented while
�� on the current line.
� � calculate the line length.
�� Calculate the margin and
� � print each statement until
�� finished.
� 
���listline(B%)
�indent=0
�L%=?(B%-1)-4
�	K%=-1
�7margin=6+2*fornext+2*repuntil:� margin<6 � margin=6
�
Q%=margin
�
�statement
� K%>=L%-1
$�
.�
8 
B 
L!� PRINT ONE PROGRAM STATEMENT
M#� Deal with each program state-
N"� ment.   BASIC doesn't have a
O$� CASE statement , so ON .. GOTO
P"� is the most efficient way of
Q� selecting options.
V 
`� �statement
j�stripspaces
~�
�
�nextchar
�a=�test1$,�(char))
�3� a+1 � �dlD,�tfD,�tpD,�tzD,�dDD,�dND,�dXD,�dbD
�#� line 1190 deals with a quote,
�"� 1200 with REM, 1210 with FOR
�� 1220 with THEN, 1230 with
�!� REPEAT, 1240 with NEXT, and
�� 1150 with UNTIL.
��text:� �ThE
��rem:� �ThE
�Ffornext=fornext+1:�print(space,decode):�print(space,decode):� �dlD
�%indent=indent-2:�startline:� �dlD
�Hrepuntil=repuntil+1:�print(space,decode):�print(space,decode):� �dlD
��check_commas:� �dlD
�1repuntil=repuntil-1:� repuntil<0 � repuntil=0
�:� char=lineno � �lineno(B%+K%+1) � �print(char,decode)
�a=�test2$,�(char))
$� a+1 � �ThE,�T^E,�TJE,�TTE,�TYE
#� 1290 deals with IF, 1300 with
!� ELSE, 1310 THEN, 1305 colon

indent=indent+2:� �ThE
indent=indent+2
*� a=4 � �stripspaces:� K%>=L%-1 � �ThE
�startline
(� K%>=L%-1 � char=colon
2�
< 
F 
P� EXECUTE A * INSTRUCTION
Q� A% point to a small text
R � buffer where the * command
S� is placed.
Z 
d��oscli(A$)
n
$A%=A$
xX%=A% � 256
�Y%=A% � 256
�� &FFF7
��
� 
� 
�� DECODE A LINE NUMBER
�� Line numbers used by GOTO
�� GOSUB are stored in a
�� special format of a line
�#� number flag followed by three
�$� bytes.   This is to avoid each
� � byte being >127 or <32 and
�"� hence possibly being decoded
�#� by BASIC as a control code or
�� a BASIC keyword!
� 
���lineno(A%)
�� D1%,D2%,D3%,L
�D1%= ((A%?1)� &3F)
�D2%= ((A%?2)� &3F)
�D3%= (?A%) � &54
�0L= D2%*256+D1%+(D3%� 4)*256*16 +(D3% � 48)*4
%� Q%+�(�(L))*mode>R% � �startline
� L;
K%=K%+3
"Q%=Q%+�(�(L))*mode
,�
6 
@ 
J'� CHECK A NEXT STATEMENT FOR COMMAS
K� A next statement may be
L� followed by one or more
M%� variables, separated by commas.
N"� By counting forwards through
O!� the commas we know how many
P� NEXTs have beeen implied.
Q� PS take care to avoid
R� 'outdenting' !
T 
^� �check_commas
hfornext=fornext-1
r
pos=K%
|�
�
pos=pos+1
�&� B%?pos=comma � fornext=fornext-1
�-� B%?pos=colon � pos=L%-1 � B%?pos=return
�� fornext<0 � fornext=0
��
� 
� 
�/� INDENT THE MARGIN THE CORRECT # OF SPACES
�#� Used to split multiple state-
�� ments or long lines.
� � FOR/NEXT REPEAT/UNTIL and 
�� IF/THEN/ELSE statements
�%� are all indented by two spaces.
�!� The effects of indenting an
�%� IF statement are only effective
�#� for the current program line.
� 
�� �startline
��
�� indent<0 � indent=0
�(margin=6+2*fornext+2*repuntil+indent
� margin<6 � margin=6
� �margin," ");

Q%=margin
&�stripspaces
:mode=single
D�
N 
X 
b� ERROR SECTION
c#� Escape will cause an exit to 
d$� this section, as will an error
e$� in the program - which will be
f"� reported.   You are asked if
g$� you wish another go.   Because
h!� an error might happen while
i$� setting things up, the program
j"� will have to be RUN again if
k� the error happened there.
l 
v�#0
�
� 12,3
�� �<>17 � �:�" at line ";�
��''"ANOTHER GO ?",Y$
�� �Y$,1)="N" � �
�� �<370 � �
�
� �D|A
� 
� 
�� GET A LINE FROM THE FILE
�!� The line format is char. 13
�#� followed by line no (hi byte)
�!� If the hi byte is >127 that
�#� marks the end of the program.
�!� If all is well, the line no
�� (lo byte) and line length
�#� follow, and then the code for
�� that line of program.
� 
���loadline(buf)
�	� a,b
�	a=�#X

?buf=a
	b=�#X
buf?1=b
 � a<>13 � �
*� b>127 � �
4
buf?2=�#X
>	a=�#X
Hbuf?3=a
R� b=4 � a-1
\
buf?b=�#X
f� b
pbuf?a=13
z�
� 
� 
�� IGNORE ANY LEADING SPACES
�� AT THE START OF A LINE
�#� The program organises its own
�%� indentation so it ignores yours
� 
�� �stripspaces
�� Q%>margin � �
��
�K%=K%+1
�� K%>=L%-1 � B%?K%>space
�K%=K%-1
��
� 
� 
�� GET THE NEXT CHARACTER
�#� Return a space if off the end
�"� of the line, or if the char.
�#� was a control code. Thus many
	!� unlistable programs are now
	� listable!
	 
	� �nextchar
	K%=K%+1
	$'� K%>L%-1 � char=space � char=B%?K%
	.� char<space � char=space
	8�
	B 
	L 
	V� DEAL WITH A REM STATEMENT
	W"� The rest of the line will be
	X!� treated as text, but it may
	Y#� include BASIC keywords, which
	Z� have to be decoded.
	` 
	j
� �rem
	t�print(char,decode)
	~�
	�
�nextchar
	�.� char=quote � �text � �print(char,decode)
	�� K%>=L%-1
	��
	� 
	� 
	�#� DEAL WITH TEXT BETWEEN QUOTES
	�"� print the first quote, then 
	� � keep on printing until the
	�!� end of the string is found.
	�"� Guard against missing quotes
	�� at the end of line!
	�$� Double quotes are no problem -
	�"� we toggle out and in to text
	�"� mode again.   Codes >128 are
	�%� teletext control - ignore them.
	� 
	�� �text
	��print(char,� decode)
	��
	�
�nextchar
�print(char,� decode)

� K%>=L%-1 � char=quote
�
 
( 
2� PRINT A CHARACTER OR
<� COMPRESSED CODE
=� Logical variable decode
>"� indicates whether in program
?#� or text mode - teletext codes
@#� >128 can clog up the printer,
A$� so for neatness' sake, replace
B� them by spaces.
C$� DEF PROC and FN statements are
D!� printed double width, so be
E$� careful about the line length.
F 
P� �print(char,decode)
Z
� l,A$
dA$=�(char)
nl=1
x<� decode � � char>printable � A$=NAME$(char-128):l=�(A$)
�.� � decode � � (char � 128)<space � A$=" "
�� Q%+l*mode>R% � �startline
�C� char=define � � 8,129:� �Y1$,1)="Y" � mode=double:� 1,32,1,14
�	� A$;
�Q%=Q%+l*mode
��
� 
� 
�
00000000  0d 00 0a 1a f4 20 42 41  53 49 43 20 50 52 4f 47  |..... BASIC PROG|
00000010  52 41 4d 20 4c 49 53 54  45 52 0d 00 14 20 f4 20  |RAM LISTER... . |
00000020  54 68 69 73 20 70 72 6f  67 72 61 6d 20 77 69 6c  |This program wil|
00000030  6c 20 6c 69 73 74 20 61  6e 79 0d 00 1e 24 f4 20  |l list any...$. |
00000040  42 41 53 49 43 20 70 72  6f 67 72 61 6d 20 66 72  |BASIC program fr|
00000050  6f 6d 20 64 69 73 63 2f  6e 65 74 20 74 6f 0d 00  |om disc/net to..|
00000060  28 22 f4 20 73 63 72 65  65 6e 20 6f 72 20 70 72  |(". screen or pr|
00000070  69 6e 74 65 72 2e 20 20  20 49 74 20 77 69 6c 6c  |inter.   It will|
00000080  0d 00 32 24 f4 20 70 72  6f 70 65 72 6c 79 20 69  |..2$. properly i|
00000090  6e 64 65 6e 74 20 70 72  6f 67 72 61 6d 20 6c 69  |ndent program li|
000000a0  6e 65 73 2c 0d 00 3c 20  f4 20 73 70 6c 69 74 20  |nes,..< . split |
000000b0  6d 75 6c 74 69 70 6c 65  20 73 74 61 74 65 6d 65  |multiple stateme|
000000c0  6e 74 73 2c 0d 00 46 24  f4 20 73 70 6c 69 74 20  |nts,..F$. split |
000000d0  61 6e 64 20 69 6e 64 65  6e 74 20 49 46 20 73 74  |and indent IF st|
000000e0  61 74 65 6d 65 6e 74 73  0d 00 50 23 f4 20 61 6e  |atements..P#. an|
000000f0  64 20 65 6d 70 68 61 73  69 73 65 20 74 68 65 20  |d emphasise the |
00000100  44 45 46 69 6e 69 74 69  6f 6e 73 0d 00 5a 1b f4  |DEFinitions..Z..|
00000110  20 6f 66 20 61 6c 6c 20  70 72 6f 63 65 64 75 72  | of all procedur|
00000120  65 73 20 61 6e 64 0d 00  64 10 f4 20 66 75 6e 63  |es and..d.. func|
00000130  74 69 6f 6e 73 2e 0d 00  6e 05 20 0d 00 78 1b f4  |tions...n. ..x..|
00000140  20 20 20 20 20 28 63 29  20 44 65 72 65 6b 20 47  |     (c) Derek G|
00000150  72 61 69 6e 67 65 0d 00  82 1b f4 20 20 20 20 20  |rainge.....     |
00000160  31 38 74 68 20 41 70 72  69 6c 20 2c 20 31 39 38  |18th April , 198|
00000170  37 0d 00 8c 21 f4 20 4c  6f 72 65 74 74 6f 20 53  |7...!. Loretto S|
00000180  63 68 6f 6f 6c 2c 20 4d  75 73 73 65 6c 62 75 72  |chool, Musselbur|
00000190  67 68 0d 00 96 05 20 0d  00 a0 05 20 0d 00 aa 14  |gh.... .... ....|
000001a0  f4 20 73 65 74 20 75 70  20 73 65 63 74 69 6f 6e  |. set up section|
000001b0  0d 00 ab 1b f4 20 4c 69  6e 65 73 20 31 39 30 2c  |..... Lines 190,|
000001c0  32 30 30 2c 32 34 30 2c  33 30 30 0d 00 ac 1e f4  |200,240,300.....|
000001d0  20 61 72 65 20 4e 45 54  2f 41 44 46 53 20 2d 20  | are NET/ADFS - |
000001e0  73 70 65 63 69 66 69 63  2e 0d 00 ad 24 f4 20 47  |specific....$. G|
000001f0  65 74 20 72 69 64 20 6f  66 20 74 68 65 6d 20 69  |et rid of them i|
00000200  66 20 75 73 69 6e 67 20  64 69 73 63 2e 0d 00 ae  |f using disc....|
00000210  22 f4 20 4c 69 6e 65 20  32 30 30 20 72 65 66 65  |". Line 200 refe|
00000220  72 73 20 74 6f 20 61 20  70 72 6f 67 72 61 6d 0d  |rs to a program.|
00000230  00 af 1d f4 20 63 61 6c  6c 65 64 20 50 55 54 47  |.... called PUTG|
00000240  45 54 20 61 76 61 69 6c  61 62 6c 65 0d 00 b0 22  |ET available..."|
00000250  f4 20 74 68 72 6f 75 67  68 20 4d 55 53 45 20 6f  |. through MUSE o|
00000260  72 20 53 4a 20 72 65 73  65 61 72 63 68 2e 0d 00  |r SJ research...|
00000270  b4 0e ee 20 85 20 e5 20  8d 44 76 47 0d 00 be 08  |... . . .DvG....|
00000280  2a 4e 45 54 0d 00 c8 0c  2a 50 55 54 47 45 54 32  |*NET....*PUTGET2|
00000290  0d 00 d2 06 eb 37 0d 00  dc 22 f1 22 53 45 54 54  |.....7..."."SETT|
000002a0  49 4e 47 20 55 50 2e 20  50 4c 45 41 53 45 20 57  |ING UP. PLEASE W|
000002b0  41 49 54 20 2e 2e 2e 22  0d 00 e6 26 de 20 41 25  |AIT ..."...&. A%|
000002c0  20 34 30 20 2c 4e 41 4d  45 24 28 31 32 37 29 2c  | 40 ,NAME$(127),|
000002d0  6c 69 6e 65 62 75 66 66  65 72 20 32 35 36 0d 00  |linebuffer 256..|
000002e0  f0 0a 2a 44 49 52 20 24  0d 00 f1 1c f4 20 54 68  |..*DIR $..... Th|
000002f0  65 20 66 69 6c 65 20 63  61 6c 6c 65 64 20 22 46  |e file called "F|
00000300  49 4c 45 22 0d 00 f2 20  f4 20 63 6f 6e 74 61 69  |ILE"... . contai|
00000310  6e 73 20 61 20 6c 69 73  74 20 6f 66 20 61 6c 6c  |ns a list of all|
00000320  20 74 68 65 0d 00 f3 23  f4 20 42 41 53 49 43 20  | the...#. BASIC |
00000330  6b 65 79 77 6f 72 64 73  2e 20 20 20 54 68 69 73  |keywords.   This|
00000340  20 61 76 6f 69 64 73 0d  00 f4 1f f4 20 70 72 6f  | avoids..... pro|
00000350  62 6c 65 6d 73 20 77 69  74 68 20 64 69 66 66 65  |blems with diffe|
00000360  72 65 6e 63 65 73 0d 00  f5 24 f4 20 62 65 74 77  |rences...$. betw|
00000370  65 65 6e 20 42 41 53 49  43 20 76 65 72 73 69 6f  |een BASIC versio|
00000380  6e 73 20 31 2c 32 20 65  74 63 0d 00 f6 21 f4 20  |ns 1,2 etc...!. |
00000390  48 6f 77 65 76 65 72 2c  20 49 6e 20 42 41 53 49  |However, In BASI|
000003a0  43 31 20 79 6f 75 20 77  69 6c 6c 0d 00 f7 21 f4  |C1 you will...!.|
000003b0  20 66 69 6e 64 20 74 68  61 74 20 4f 50 45 4e 49  | find that OPENI|
000003c0  4e 20 61 70 70 65 61 72  73 20 61 73 0d 00 f8 24  |N appears as...$|
000003d0  f4 20 4f 50 45 4e 55 50  2e 20 20 20 49 66 20 74  |. OPENUP.   If t|
000003e0  68 69 73 20 69 73 20 61  20 70 72 6f 62 6c 65 6d  |his is a problem|
000003f0  0d 00 f9 21 f4 20 72 65  6d 6f 76 65 20 74 68 65  |...!. remove the|
00000400  20 52 45 4d 20 6f 6e 20  6c 69 6e 65 20 33 30 31  | REM on line 301|
00000410  2e 0d 00 fa 0f 58 3d ad  28 22 46 49 4c 45 22 29  |.....X=.("FILE")|
00000420  0d 01 04 0f e3 20 49 3d  30 20 b8 20 31 32 37 0d  |..... I=0 . 127.|
00000430  01 0e 10 e8 23 58 2c 4e  41 4d 45 24 28 49 29 0d  |....#X,NAME$(I).|
00000440  01 18 05 ed 0d 01 22 07  d9 23 58 0d 01 2c 08 2a  |......"..#X..,.*|
00000450  4e 45 54 0d 01 2d 2a f4  20 49 46 20 3f 26 38 30  |NET..-*. IF ?&80|
00000460  31 35 3d 34 39 20 54 48  45 4e 20 4e 41 4d 45 24  |15=49 THEN NAME$|
00000470  28 34 35 29 3d 22 4f 50  45 4e 49 4e 22 0d 01 36  |(45)="OPENIN"..6|
00000480  bf 69 6e 64 65 6e 74 3d  30 3a 6d 61 72 67 69 6e  |.indent=0:margin|
00000490  3d 36 3a 66 6f 72 6e 65  78 74 3d 30 3a 72 65 70  |=6:fornext=0:rep|
000004a0  75 6e 74 69 6c 3d 30 3a  73 70 61 63 65 3d 33 32  |until=0:space=32|
000004b0  3a 72 65 74 75 72 6e 3d  31 33 3a 72 65 6d 61 72  |:return=13:remar|
000004c0  6b 3d 26 46 34 3a 71 75  6f 74 65 3d 33 34 3a 63  |k=&F4:quote=34:c|
000004d0  6f 6d 6d 61 3d 34 34 3a  66 6f 72 3d 26 45 33 3a  |omma=44:for=&E3:|
000004e0  72 65 70 65 61 74 3d 26  46 35 3a 75 6e 74 69 6c  |repeat=&F5:until|
000004f0  3d 26 46 44 3a 6e 65 78  74 3d 26 45 44 3a 6c 69  |=&FD:next=&ED:li|
00000500  6e 65 6e 6f 3d 31 34 31  3a 64 65 66 69 6e 65 3d  |neno=141:define=|
00000510  32 32 31 3a 70 72 69 6e  74 61 62 6c 65 3d 31 32  |221:printable=12|
00000520  37 3a 63 6f 6c 6f 6e 3d  35 38 3a 74 68 65 6e 3d  |7:colon=58:then=|
00000530  26 38 43 3a 65 6c 73 65  3d 26 38 42 0d 01 40 4e  |&8C:else=&8B..@N|
00000540  69 66 3d 26 45 37 3a 74  65 73 74 31 24 3d bd 28  |if=&E7:test1$=.(|
00000550  71 75 6f 74 65 29 2b bd  28 72 65 6d 61 72 6b 29  |quote)+.(remark)|
00000560  2b bd 28 66 6f 72 29 2b  bd 28 65 6c 73 65 29 2b  |+.(for)+.(else)+|
00000570  bd 28 72 65 70 65 61 74  29 2b bd 28 6e 65 78 74  |.(repeat)+.(next|
00000580  29 2b bd 28 75 6e 74 69  6c 29 0d 01 4a 29 74 65  |)+.(until)..J)te|
00000590  73 74 32 24 3d bd 28 74  68 65 6e 29 2b bd 28 69  |st2$=.(then)+.(i|
000005a0  66 29 2b bd 28 65 6c 73  65 29 2b bd 28 63 6f 6c  |f)+.(else)+.(col|
000005b0  6f 6e 29 0d 01 54 15 73  69 6e 67 6c 65 3d 31 3a  |on)..T.single=1:|
000005c0  64 6f 75 62 6c 65 3d 32  0d 01 5e 05 20 0d 01 68  |double=2..^. ..h|
000005d0  05 20 0d 01 72 25 f4 20  54 48 45 20 4d 41 49 4e  |. ..r%. THE MAIN|
000005e0  20 50 52 4f 47 52 41 4d  20 52 45 50 45 41 54 53  | PROGRAM REPEATS|
000005f0  20 49 54 53 45 4c 46 0d  01 7c 05 f5 0d 01 86 18  | ITSELF..|......|
00000600  f4 20 43 48 4f 4f 53 45  20 41 20 44 49 52 45 43  |. CHOOSE A DIREC|
00000610  54 4f 52 59 0d 01 87 25  f4 20 54 6f 20 73 65 6c  |TORY...%. To sel|
00000620  65 63 74 20 61 20 64 69  66 66 65 72 65 6e 74 20  |ect a different |
00000630  64 69 72 65 63 74 6f 72  79 0d 01 88 24 f4 20 6a  |directory...$. j|
00000640  75 73 74 20 74 79 70 65  20 69 6e 20 69 74 73 20  |ust type in its |
00000650  6e 61 6d 65 2e 20 20 49  66 20 79 6f 75 0d 01 89  |name.  If you...|
00000660  25 f4 20 61 72 65 20 68  61 70 70 79 20 77 69 74  |%. are happy wit|
00000670  68 20 74 68 65 20 63 75  72 72 65 6e 74 20 6f 6e  |h the current on|
00000680  65 2c 0d 01 8a 13 f4 20  70 72 65 73 73 20 72 65  |e,..... press re|
00000690  74 75 72 6e 2e 0d 01 8b  26 f4 20 49 66 20 79 6f  |turn....&. If yo|
000006a0  75 20 61 72 65 20 75 73  69 6e 67 20 74 68 65 20  |u are using the |
000006b0  44 46 53 20 74 68 65 72  65 27 73 0d 01 8c 24 f4  |DFS there's...$.|
000006c0  20 69 73 20 6e 6f 20 70  6f 69 6e 74 20 69 6e 20  | is no point in |
000006d0  64 6f 69 6e 67 20 61 6c  6c 20 74 68 69 73 2c 0d  |doing all this,.|
000006e0  01 8d 21 f4 20 73 6f 20  64 65 6c 65 74 65 20 6c  |..!. so delete l|
000006f0  69 6e 65 73 20 34 30 30  20 74 6f 20 34 35 30 2e  |ines 400 to 450.|
00000700  0d 01 90 08 2a 44 49 52  0d 01 9a 05 f5 0d 01 a4  |....*DIR........|
00000710  08 2a 43 41 54 0d 01 ae  19 e8 22 57 48 49 43 48  |.*CAT....."WHICH|
00000720  20 44 49 52 45 43 54 4f  52 59 22 2c 41 24 0d 01  | DIRECTORY",A$..|
00000730  b8 20 e7 20 41 24 3c 3e  22 22 20 8c 20 f2 6f 73  |. . A$<>"" . .os|
00000740  63 6c 69 28 22 44 49 52  20 22 2b 41 24 29 0d 01  |cli("DIR "+A$)..|
00000750  c2 0b fd 20 41 24 3d 22  22 0d 01 cc 16 f4 20 43  |... A$=""..... C|
00000760  48 4f 4f 53 45 20 41 20  50 52 4f 47 52 41 4d 0d  |HOOSE A PROGRAM.|
00000770  01 d6 0a db 3a 2a 43 41  54 0d 01 e0 27 e8 22 4e  |....:*CAT...'."N|
00000780  41 4d 45 20 4f 46 20 50  52 4f 47 52 41 4d 22 2c  |AME OF PROGRAM",|
00000790  50 24 3a 50 25 3d 6c 69  6e 65 62 75 66 66 65 72  |P$:P%=linebuffer|
000007a0  0d 01 ea 1e f4 20 43 48  4f 4f 53 45 20 4f 55 54  |..... CHOOSE OUT|
000007b0  50 55 54 20 50 41 52 41  4d 45 54 45 52 53 0d 01  |PUT PARAMETERS..|
000007c0  eb 24 f4 20 31 2e 20 59  6f 75 20 63 61 6e 20 73  |.$. 1. You can s|
000007d0  74 61 72 74 20 66 72 6f  6d 20 61 6e 79 20 6c 69  |tart from any li|
000007e0  6e 65 0d 01 ec 23 f4 20  20 20 20 69 6e 20 74 68  |ne...#.    in th|
000007f0  65 20 70 72 6f 67 72 61  6d 20 62 79 20 74 79 70  |e program by typ|
00000800  69 6e 67 20 61 0d 01 ed  15 f4 20 20 20 20 6c 69  |ing a.....    li|
00000810  6e 65 20 6e 75 6d 62 65  72 2e 0d 01 ee 23 f4 20  |ne number....#. |
00000820  32 2e 20 49 20 68 61 76  65 20 61 72 62 69 74 72  |2. I have arbitr|
00000830  61 72 69 6c 79 20 6c 69  6d 69 74 65 64 0d 01 ef  |arily limited...|
00000840  22 f4 20 20 20 20 74 68  65 20 70 72 69 6e 74 69  |".    the printi|
00000850  6e 67 20 77 69 64 74 68  20 74 6f 20 6c 69 65 0d  |ng width to lie.|
00000860  01 f0 24 f4 20 20 20 20  62 65 74 77 65 65 6e 20  |..$.    between |
00000870  32 30 20 61 6e 64 20 37  38 2e 20 20 20 43 68 61  |20 and 78.   Cha|
00000880  6e 67 65 0d 01 f1 1b f4  20 20 20 20 74 68 65 73  |nge.....    thes|
00000890  65 20 69 66 20 79 6f 75  20 77 69 73 68 2e 0d 01  |e if you wish...|
000008a0  f2 21 f4 20 33 2e 20 41  6e 79 20 77 6f 72 64 20  |.!. 3. Any word |
000008b0  73 74 61 72 74 69 6e 67  20 77 69 74 68 20 59 0d  |starting with Y.|
000008c0  01 f3 24 f4 20 20 20 20  77 69 6c 6c 20 73 77 69  |..$.    will swi|
000008d0  74 63 68 20 74 68 65 20  70 72 69 6e 74 65 72 20  |tch the printer |
000008e0  6f 6e 2e 0d 01 f4 22 e8  22 53 54 41 52 54 49 4e  |on...."."STARTIN|
000008f0  47 20 41 54 20 4c 49 4e  45 20 4e 4f 22 2c 73 74  |G AT LINE NO",st|
00000900  61 72 74 6e 6f 0d 01 fe  2f e8 27 27 22 57 49 44  |artno.../.''"WID|
00000910  54 48 20 4f 46 20 4c 49  53 54 49 4e 47 20 4f 4e  |TH OF LISTING ON|
00000920  20 53 43 52 45 45 4e 20  4f 52 20 50 41 50 45 52  | SCREEN OR PAPER|
00000930  22 2c 52 25 0d 02 08 1c  e7 20 52 25 3c 32 30 20  |",R%..... R%<20 |
00000940  84 20 52 25 3e 37 38 20  8c 20 e5 20 8d 64 7e 41  |. R%>78 . . .d~A|
00000950  0d 02 12 1f e8 20 27 27  22 50 52 49 4e 54 45 52  |..... ''"PRINTER|
00000960  20 4f 4e 20 28 59 2f 4e  29 20 22 2c 59 31 24 0d  | ON (Y/N) ",Y1$.|
00000970  02 1c 39 e7 20 c0 59 31  24 2c 31 29 3d 22 59 22  |..9. .Y1$,1)="Y"|
00000980  20 8c 20 e8 22 45 43 4f  4e 45 54 20 50 52 49 4e  | . ."ECONET PRIN|
00000990  54 45 52 20 28 59 2f 4e  29 22 2c 59 32 24 20 8b  |TER (Y/N)",Y2$ .|
000009a0  20 59 32 24 3d 22 4e 22  0d 02 26 0b 2a 46 58 20  | Y2$="N"..&.*FX |
000009b0  35 2c 31 0d 02 30 1b e7  20 c0 59 32 24 2c 31 29  |5,1..0.. .Y2$,1)|
000009c0  3d 22 59 22 20 8c 20 2a  46 58 20 35 2c 34 0d 02  |="Y" . *FX 5,4..|
000009d0  3a 0a f1 27 27 27 27 27  0d 02 44 21 e7 20 c0 59  |:..'''''..D!. .Y|
000009e0  31 24 2c 31 29 3d 22 59  22 20 8c 20 ef 20 32 2c  |1$,1)="Y" . . 2,|
000009f0  31 2c 32 37 2c 31 2c 34  30 0d 02 45 20 f4 20 54  |1,27,1,40..E . T|
00000a00  68 65 20 56 44 55 20 73  65 71 75 65 6e 63 65 20  |he VDU sequence |
00000a10  31 2c 32 37 2c 31 2c 34  30 0d 02 46 20 f4 20 73  |1,27,1,40..F . s|
00000a20  65 6c 65 63 74 73 20 4e  4c 51 20 70 72 69 6e 74  |elects NLQ print|
00000a30  69 6e 67 20 6f 6e 20 6d  79 0d 02 47 20 f4 20 43  |ing on my..G . C|
00000a40  41 4e 4f 4e 2e 20 20 20  53 74 69 63 6b 20 69 6e  |ANON.   Stick in|
00000a50  20 79 6f 75 72 20 6f 77  6e 0d 02 48 19 f4 20 63  | your own..H.. c|
00000a60  6f 64 65 20 74 6f 20 73  65 6c 65 63 74 20 79 6f  |ode to select yo|
00000a70  75 72 0d 02 49 1f f4 20  70 72 65 66 65 72 72 65  |ur..I.. preferre|
00000a80  64 20 70 72 69 6e 74 69  6e 67 20 73 74 79 6c 65  |d printing style|
00000a90  2e 0d 02 4e 26 f4 20 49  46 20 52 25 3c 34 30 20  |...N&. IF R%<40 |
00000aa0  54 48 45 4e 20 4d 4f 44  45 20 37 20 45 4c 53 45  |THEN MODE 7 ELSE|
00000ab0  20 4d 4f 44 45 20 33 0d  02 4f 26 f4 20 49 66 20  | MODE 3..O&. If |
00000ac0  79 6f 75 20 72 65 6d 6f  76 65 20 61 6c 6c 20 74  |you remove all t|
00000ad0  68 65 20 52 45 4d 20 73  74 61 74 65 2d 0d 02 50  |he REM state-..P|
00000ae0  22 f4 20 6d 65 6e 74 73  20 74 68 65 72 65 20 77  |". ments there w|
00000af0  69 6c 6c 20 70 72 6f 62  61 62 6c 79 20 62 65 0d  |ill probably be.|
00000b00  02 51 21 f4 20 65 6e 6f  75 67 68 20 72 6f 6f 6d  |.Q!. enough room|
00000b10  20 66 6f 72 20 74 68 65  20 70 72 6f 67 72 61 6d  | for the program|
00000b20  0d 02 52 1e f4 20 74 6f  20 72 75 6e 20 69 6e 20  |..R.. to run in |
00000b30  61 20 6d 6f 64 65 20 77  69 74 68 20 38 30 0d 02  |a mode with 80..|
00000b40  53 23 f4 20 63 68 61 72  61 63 74 65 72 73 20 74  |S#. characters t|
00000b50  6f 20 74 68 65 20 6c 69  6e 65 2e 20 20 20 49 6e  |o the line.   In|
00000b60  20 0d 02 54 25 f4 20 77  68 69 63 68 20 63 61 73  | ..T%. which cas|
00000b70  65 2c 20 72 65 6d 6f 76  65 20 74 68 65 20 52 45  |e, remove the RE|
00000b80  4d 20 66 72 6f 6d 0d 02  55 20 f4 20 6c 69 6e 65  |M from..U . line|
00000b90  20 35 39 30 2c 20 62 75  74 20 6c 65 61 76 65 20  | 590, but leave |
00000ba0  74 68 65 20 49 46 0d 02  56 17 f4 20 73 74 61 74  |the IF..V.. stat|
00000bb0  65 6d 65 6e 74 20 62 65  68 69 6e 64 21 0d 02 58  |ement behind!..X|
00000bc0  05 20 0d 02 62 1d f4 20  54 48 45 20 4d 41 49 4e  |. ..b.. THE MAIN|
00000bd0  20 50 52 4f 47 52 41 4d  20 49 54 53 45 4c 46 0d  | PROGRAM ITSELF.|
00000be0  02 63 25 f4 20 4f 70 65  6e 20 74 68 65 20 66 69  |.c%. Open the fi|
00000bf0  6c 65 2c 20 61 6e 64 20  70 72 6f 63 65 73 73 20  |le, and process |
00000c00  65 61 63 68 0d 02 64 22  f4 20 6c 69 6e 65 20 75  |each..d". line u|
00000c10  6e 74 69 6c 20 77 65 20  72 65 61 63 68 20 74 68  |ntil we reach th|
00000c20  65 20 65 6e 64 2e 0d 02  66 21 6d 61 72 67 69 6e  |e end...f!margin|
00000c30  3d 36 3a 66 6f 72 6e 65  78 74 3d 30 3a 72 65 70  |=6:fornext=0:rep|
00000c40  75 6e 74 69 6c 3d 30 0d  02 67 18 64 65 63 6f 64  |until=0..g.decod|
00000c50  65 3d b9 3a 6d 6f 64 65  3d 73 69 6e 67 6c 65 0d  |e=.:mode=single.|
00000c60  02 6c 09 f1 27 50 24 27  0d 02 76 0c 74 68 65 65  |.l..'P$'..v.thee|
00000c70  6e 64 3d a3 0d 02 80 0b  58 3d ad 28 50 24 29 0d  |nd=.....X=.(P$).|
00000c80  02 8a 05 f5 0d 02 94 19  f2 6c 6f 61 64 6c 69 6e  |.........loadlin|
00000c90  65 28 6c 69 6e 65 62 75  66 66 65 72 29 0d 02 9e  |e(linebuffer)...|
00000ca0  16 f2 63 68 65 63 6b 28  6c 69 6e 65 62 75 66 66  |..check(linebuff|
00000cb0  65 72 29 0d 02 a8 37 e7  20 28 ac 20 74 68 65 65  |er)...7. (. thee|
00000cc0  6e 64 29 20 80 20 68 69  67 68 65 6e 6f 75 67 68  |nd) . highenough|
00000cd0  20 8c 20 f2 6c 69 73 74  6c 69 6e 65 28 6c 69 6e  | . .listline(lin|
00000ce0  65 62 75 66 66 65 72 2b  34 29 0d 02 b2 0c fd 20  |ebuffer+4)..... |
00000cf0  74 68 65 65 6e 64 0d 02  bc 07 d9 23 58 0d 02 c6  |theend.....#X...|
00000d00  07 f1 27 27 0d 02 d0 16  e7 20 59 32 24 3d 22 4e  |..''..... Y2$="N|
00000d10  22 20 8c 20 ef 20 31 2c  31 32 0d 02 da 07 ef 20  |" . . 1,12..... |
00000d20  33 0d 02 e4 05 20 0d 02  ee 12 f4 20 41 4e 4f 54  |3.... ..... ANOT|
00000d30  48 45 52 20 47 4f 20 3f  0d 02 ef 23 f4 20 54 68  |HER GO ?...#. Th|
00000d40  65 20 70 72 6f 67 72 61  6d 20 72 65 70 65 61 74  |e program repeat|
00000d50  73 20 75 6e 74 69 6c 20  79 6f 75 0d 02 f0 25 f4  |s until you...%.|
00000d60  20 72 65 70 6c 79 20 77  69 74 68 20 61 20 77 6f  | reply with a wo|
00000d70  72 64 20 73 74 61 72 74  69 6e 67 20 77 69 74 68  |rd starting with|
00000d80  0d 02 f1 08 f4 20 4e 2e  0d 02 f8 16 e8 27 27 22  |..... N......''"|
00000d90  41 4e 4f 54 48 45 52 20  47 4f 22 2c 59 24 0d 03  |ANOTHER GO",Y$..|
00000da0  02 10 fd 20 c0 59 24 2c  31 29 3d 22 4e 22 0d 03  |... .Y$,1)="N"..|
00000db0  0c 05 e0 0d 03 16 19 f4  20 45 4e 44 20 4f 46 20  |........ END OF |
00000dc0  4d 41 49 4e 20 50 52 4f  47 52 41 4d 0d 03 20 05  |MAIN PROGRAM.. .|
00000dd0  20 0d 03 2a 05 20 0d 03  34 1f f4 20 43 48 45 43  | ..*. ..4.. CHEC|
00000de0  4b 20 41 20 4c 49 4e 45  20 46 4f 52 20 4c 45 47  |K A LINE FOR LEG|
00000df0  41 4c 49 54 59 0d 03 35  22 f4 20 54 68 65 20 31  |ALITY..5". The 1|
00000e00  73 74 20 63 68 61 72 20  6d 75 73 74 20 62 65 20  |st char must be |
00000e10  31 33 2c 20 61 6e 64 0d  03 36 22 f4 20 74 68 65  |13, and..6". the|
00000e20  20 32 6e 64 20 6c 65 73  73 20 74 68 61 6e 20 31  | 2nd less than 1|
00000e30  32 38 2e 20 43 68 65 63  6b 0d 03 37 22 f4 20 69  |28. Check..7". i|
00000e40  66 20 77 69 74 68 69 6e  20 72 61 6e 67 65 20 66  |f within range f|
00000e50  6f 72 20 6c 69 73 74 69  6e 67 2e 0d 03 38 22 f4  |or listing...8".|
00000e60  20 43 61 6c 63 75 6c 61  74 65 20 74 68 65 20 63  | Calculate the c|
00000e70  6f 72 72 65 63 74 20 6d  61 72 67 69 6e 0d 03 39  |orrect margin..9|
00000e80  20 f4 20 61 6e 64 20 70  72 69 6e 74 20 74 68 65  | . and print the|
00000e90  20 6c 69 6e 65 20 6e 75  6d 62 65 72 2e 0d 03 3e  | line number...>|
00000ea0  05 20 0d 03 48 0f dd f2  63 68 65 63 6b 28 41 25  |. ..H...check(A%|
00000eb0  29 0d 03 52 37 e7 20 3f  41 25 3c 3e 31 33 20 8c  |)..R7. ?A%<>13 .|
00000ec0  20 74 68 65 65 6e 64 3d  b9 3a ef 20 33 3a f1 22  | theend=.:. 3:."|
00000ed0  49 4c 4c 45 47 41 4c 20  42 41 53 49 43 20 53 54  |ILLEGAL BASIC ST|
00000ee0  4f 52 41 47 45 22 3a e1  0d 03 5c 1b e7 20 41 25  |ORAGE":...\.. A%|
00000ef0  3f 31 3e 31 32 37 20 8c  20 74 68 65 65 6e 64 3d  |?1>127 . theend=|
00000f00  b9 3a e1 0d 03 66 10 68  69 67 68 65 6e 6f 75 67  |.:...f.highenoug|
00000f10  68 3d b9 0d 03 70 2e e7  20 28 41 25 3f 31 29 2a  |h=...p.. (A%?1)*|
00000f20  32 35 36 2b 41 25 3f 32  3c 73 74 61 72 74 6e 6f  |256+A%?2<startno|
00000f30  20 8c 20 68 69 67 68 65  6e 6f 75 67 68 3d a3 3a  | . highenough=.:|
00000f40  e1 0d 03 7a 3c 40 25 3d  35 3a 6d 61 72 67 69 6e  |...z<@%=5:margin|
00000f50  3d 36 2b 32 2a 66 6f 72  6e 65 78 74 2b 32 2a 72  |=6+2*fornext+2*r|
00000f60  65 70 75 6e 74 69 6c 3a  e7 20 6d 61 72 67 69 6e  |epuntil:. margin|
00000f70  3c 36 20 8c 20 6d 61 72  67 69 6e 3d 36 0d 03 84  |<6 . margin=6...|
00000f80  38 f1 28 41 25 3f 31 29  2a 32 35 36 20 2b 20 28  |8.(A%?1)*256 + (|
00000f90  41 25 3f 32 29 20 3b c4  6d 61 72 67 69 6e 2d 35  |A%?2) ;.margin-5|
00000fa0  2c 22 20 22 29 3b 3a 40  25 3d 30 3a 51 25 3d 6d  |," ");:@%=0:Q%=m|
00000fb0  61 72 67 69 6e 0d 03 8e  0f 6d 6f 64 65 3d 73 69  |argin....mode=si|
00000fc0  6e 67 6c 65 0d 03 98 05  e1 0d 03 a2 05 20 0d 03  |ngle......... ..|
00000fd0  ac 05 20 0d 03 b6 1a f4  20 50 52 49 4e 54 20 41  |.. ..... PRINT A|
00000fe0  20 50 52 4f 47 52 41 4d  20 4c 49 4e 45 0d 03 b7  | PROGRAM LINE...|
00000ff0  24 f4 20 42 25 20 70 6f  69 6e 74 73 20 74 68 65  |$. B% points the|
00001000  20 74 68 65 20 6c 69 6e  65 27 73 20 74 65 78 74  | the line's text|
00001010  2e 0d 03 b8 24 f4 20 52  65 73 65 74 20 69 6e 64  |....$. Reset ind|
00001020  65 6e 74 20 62 65 63 61  75 73 65 20 49 46 20 73  |ent because IF s|
00001030  74 61 74 65 2d 0d 03 b9  23 f4 20 6d 65 6e 74 73  |tate-...#. ments|
00001040  20 61 72 65 20 6f 6e 6c  79 20 69 6e 64 65 6e 74  | are only indent|
00001050  65 64 20 77 68 69 6c 65  0d 03 ba 1a f4 20 6f 6e  |ed while..... on|
00001060  20 74 68 65 20 63 75 72  72 65 6e 74 20 6c 69 6e  | the current lin|
00001070  65 2e 0d 03 bb 20 f4 20  63 61 6c 63 75 6c 61 74  |e.... . calculat|
00001080  65 20 74 68 65 20 6c 69  6e 65 20 6c 65 6e 67 74  |e the line lengt|
00001090  68 2e 0d 03 bc 1e f4 20  43 61 6c 63 75 6c 61 74  |h...... Calculat|
000010a0  65 20 74 68 65 20 6d 61  72 67 69 6e 20 61 6e 64  |e the margin and|
000010b0  0d 03 bd 20 f4 20 70 72  69 6e 74 20 65 61 63 68  |... . print each|
000010c0  20 73 74 61 74 65 6d 65  6e 74 20 75 6e 74 69 6c  | statement until|
000010d0  0d 03 be 0f f4 20 66 69  6e 69 73 68 65 64 2e 0d  |..... finished..|
000010e0  03 c0 05 20 0d 03 ca 12  dd f2 6c 69 73 74 6c 69  |... ......listli|
000010f0  6e 65 28 42 25 29 0d 03  d4 0c 69 6e 64 65 6e 74  |ne(B%)....indent|
00001100  3d 30 0d 03 de 10 4c 25  3d 3f 28 42 25 2d 31 29  |=0....L%=?(B%-1)|
00001110  2d 34 0d 03 e8 09 4b 25  3d 2d 31 0d 03 f2 37 6d  |-4....K%=-1...7m|
00001120  61 72 67 69 6e 3d 36 2b  32 2a 66 6f 72 6e 65 78  |argin=6+2*fornex|
00001130  74 2b 32 2a 72 65 70 75  6e 74 69 6c 3a e7 20 6d  |t+2*repuntil:. m|
00001140  61 72 67 69 6e 3c 36 20  8c 20 6d 61 72 67 69 6e  |argin<6 . margin|
00001150  3d 36 0d 03 fc 0d 51 25  3d 6d 61 72 67 69 6e 0d  |=6....Q%=margin.|
00001160  04 06 05 f5 0d 04 10 0e  f2 73 74 61 74 65 6d 65  |.........stateme|
00001170  6e 74 0d 04 1a 0e fd 20  4b 25 3e 3d 4c 25 2d 31  |nt..... K%>=L%-1|
00001180  0d 04 24 05 f1 0d 04 2e  05 e1 0d 04 38 05 20 0d  |..$.........8. .|
00001190  04 42 05 20 0d 04 4c 21  f4 20 50 52 49 4e 54 20  |.B. ..L!. PRINT |
000011a0  4f 4e 45 20 50 52 4f 47  52 41 4d 20 53 54 41 54  |ONE PROGRAM STAT|
000011b0  45 4d 45 4e 54 0d 04 4d  23 f4 20 44 65 61 6c 20  |EMENT..M#. Deal |
000011c0  77 69 74 68 20 65 61 63  68 20 70 72 6f 67 72 61  |with each progra|
000011d0  6d 20 73 74 61 74 65 2d  0d 04 4e 22 f4 20 6d 65  |m state-..N". me|
000011e0  6e 74 2e 20 20 20 42 41  53 49 43 20 64 6f 65 73  |nt.   BASIC does|
000011f0  6e 27 74 20 68 61 76 65  20 61 0d 04 4f 24 f4 20  |n't have a..O$. |
00001200  43 41 53 45 20 73 74 61  74 65 6d 65 6e 74 20 2c  |CASE statement ,|
00001210  20 73 6f 20 4f 4e 20 2e  2e 20 47 4f 54 4f 0d 04  | so ON .. GOTO..|
00001220  50 22 f4 20 69 73 20 74  68 65 20 6d 6f 73 74 20  |P". is the most |
00001230  65 66 66 69 63 69 65 6e  74 20 77 61 79 20 6f 66  |efficient way of|
00001240  0d 04 51 18 f4 20 73 65  6c 65 63 74 69 6e 67 20  |..Q.. selecting |
00001250  6f 70 74 69 6f 6e 73 2e  0d 04 56 05 20 0d 04 60  |options...V. ..`|
00001260  10 dd 20 f2 73 74 61 74  65 6d 65 6e 74 0d 04 6a  |.. .statement..j|
00001270  10 f2 73 74 72 69 70 73  70 61 63 65 73 0d 04 7e  |..stripspaces..~|
00001280  05 f5 0d 04 88 0d f2 6e  65 78 74 63 68 61 72 0d  |.......nextchar.|
00001290  04 92 16 61 3d a7 74 65  73 74 31 24 2c bd 28 63  |...a=.test1$,.(c|
000012a0  68 61 72 29 29 0d 04 9c  33 ee 20 61 2b 31 20 e5  |har))...3. a+1 .|
000012b0  20 8d 64 6c 44 2c 8d 74  66 44 2c 8d 74 70 44 2c  | .dlD,.tfD,.tpD,|
000012c0  8d 74 7a 44 2c 8d 64 44  44 2c 8d 64 4e 44 2c 8d  |.tzD,.dDD,.dND,.|
000012d0  64 58 44 2c 8d 64 62 44  0d 04 9d 23 f4 20 6c 69  |dXD,.dbD...#. li|
000012e0  6e 65 20 31 31 39 30 20  64 65 61 6c 73 20 77 69  |ne 1190 deals wi|
000012f0  74 68 20 61 20 71 75 6f  74 65 2c 0d 04 9e 22 f4  |th a quote,...".|
00001300  20 31 32 30 30 20 77 69  74 68 20 52 45 4d 2c 20  | 1200 with REM, |
00001310  31 32 31 30 20 77 69 74  68 20 46 4f 52 0d 04 9f  |1210 with FOR...|
00001320  1f f4 20 31 32 32 30 20  77 69 74 68 20 54 48 45  |.. 1220 with THE|
00001330  4e 2c 20 31 32 33 30 20  77 69 74 68 0d 04 a0 21  |N, 1230 with...!|
00001340  f4 20 52 45 50 45 41 54  2c 20 31 32 34 30 20 77  |. REPEAT, 1240 w|
00001350  69 74 68 20 4e 45 58 54  2c 20 61 6e 64 0d 04 a1  |ith NEXT, and...|
00001360  16 f4 20 31 31 35 30 20  77 69 74 68 20 55 4e 54  |.. 1150 with UNT|
00001370  49 4c 2e 0d 04 a6 10 f2  74 65 78 74 3a e5 20 8d  |IL......text:. .|
00001380  54 68 45 0d 04 b0 0f f2  72 65 6d 3a e5 20 8d 54  |ThE.....rem:. .T|
00001390  68 45 0d 04 ba 46 66 6f  72 6e 65 78 74 3d 66 6f  |hE...Ffornext=fo|
000013a0  72 6e 65 78 74 2b 31 3a  f2 70 72 69 6e 74 28 73  |rnext+1:.print(s|
000013b0  70 61 63 65 2c 64 65 63  6f 64 65 29 3a f2 70 72  |pace,decode):.pr|
000013c0  69 6e 74 28 73 70 61 63  65 2c 64 65 63 6f 64 65  |int(space,decode|
000013d0  29 3a e5 20 8d 64 6c 44  0d 04 c4 25 69 6e 64 65  |):. .dlD...%inde|
000013e0  6e 74 3d 69 6e 64 65 6e  74 2d 32 3a f2 73 74 61  |nt=indent-2:.sta|
000013f0  72 74 6c 69 6e 65 3a e5  20 8d 64 6c 44 0d 04 ce  |rtline:. .dlD...|
00001400  48 72 65 70 75 6e 74 69  6c 3d 72 65 70 75 6e 74  |Hrepuntil=repunt|
00001410  69 6c 2b 31 3a f2 70 72  69 6e 74 28 73 70 61 63  |il+1:.print(spac|
00001420  65 2c 64 65 63 6f 64 65  29 3a f2 70 72 69 6e 74  |e,decode):.print|
00001430  28 73 70 61 63 65 2c 64  65 63 6f 64 65 29 3a e5  |(space,decode):.|
00001440  20 8d 64 6c 44 0d 04 d8  18 f2 63 68 65 63 6b 5f  | .dlD.....check_|
00001450  63 6f 6d 6d 61 73 3a e5  20 8d 64 6c 44 0d 04 e2  |commas:. .dlD...|
00001460  31 72 65 70 75 6e 74 69  6c 3d 72 65 70 75 6e 74  |1repuntil=repunt|
00001470  69 6c 2d 31 3a e7 20 72  65 70 75 6e 74 69 6c 3c  |il-1:. repuntil<|
00001480  30 20 8c 20 72 65 70 75  6e 74 69 6c 3d 30 0d 04  |0 . repuntil=0..|
00001490  ec 3a e7 20 63 68 61 72  3d 6c 69 6e 65 6e 6f 20  |.:. char=lineno |
000014a0  8c 20 f2 6c 69 6e 65 6e  6f 28 42 25 2b 4b 25 2b  |. .lineno(B%+K%+|
000014b0  31 29 20 8b 20 f2 70 72  69 6e 74 28 63 68 61 72  |1) . .print(char|
000014c0  2c 64 65 63 6f 64 65 29  0d 04 f6 16 61 3d a7 74  |,decode)....a=.t|
000014d0  65 73 74 32 24 2c bd 28  63 68 61 72 29 29 0d 05  |est2$,.(char))..|
000014e0  00 24 ee 20 61 2b 31 20  e5 20 8d 54 68 45 2c 8d  |.$. a+1 . .ThE,.|
000014f0  54 5e 45 2c 8d 54 4a 45  2c 8d 54 54 45 2c 8d 54  |T^E,.TJE,.TTE,.T|
00001500  59 45 0d 05 01 23 f4 20  31 32 39 30 20 64 65 61  |YE...#. 1290 dea|
00001510  6c 73 20 77 69 74 68 20  49 46 2c 20 31 33 30 30  |ls with IF, 1300|
00001520  20 77 69 74 68 0d 05 02  21 f4 20 45 4c 53 45 2c  | with...!. ELSE,|
00001530  20 31 33 31 30 20 54 48  45 4e 2c 20 31 33 30 35  | 1310 THEN, 1305|
00001540  20 63 6f 6c 6f 6e 0d 05  0a 1a 69 6e 64 65 6e 74  | colon....indent|
00001550  3d 69 6e 64 65 6e 74 2b  32 3a e5 20 8d 54 68 45  |=indent+2:. .ThE|
00001560  0d 05 14 13 69 6e 64 65  6e 74 3d 69 6e 64 65 6e  |....indent=inden|
00001570  74 2b 32 0d 05 19 2a e7  20 61 3d 34 20 8c 20 f2  |t+2...*. a=4 . .|
00001580  73 74 72 69 70 73 70 61  63 65 73 3a e7 20 4b 25  |stripspaces:. K%|
00001590  3e 3d 4c 25 2d 31 20 8c  20 8d 54 68 45 0d 05 1e  |>=L%-1 . .ThE...|
000015a0  0e f2 73 74 61 72 74 6c  69 6e 65 0d 05 28 1b fd  |..startline..(..|
000015b0  20 4b 25 3e 3d 4c 25 2d  31 20 84 20 63 68 61 72  | K%>=L%-1 . char|
000015c0  3d 63 6f 6c 6f 6e 0d 05  32 05 e1 0d 05 3c 05 20  |=colon..2....<. |
000015d0  0d 05 46 05 20 0d 05 50  1d f4 20 45 58 45 43 55  |..F. ..P.. EXECU|
000015e0  54 45 20 41 20 2a 20 49  4e 53 54 52 55 43 54 49  |TE A * INSTRUCTI|
000015f0  4f 4e 0d 05 51 1e f4 20  41 25 20 70 6f 69 6e 74  |ON..Q.. A% point|
00001600  20 74 6f 20 61 20 73 6d  61 6c 6c 20 74 65 78 74  | to a small text|
00001610  0d 05 52 20 f4 20 62 75  66 66 65 72 20 77 68 65  |..R . buffer whe|
00001620  72 65 20 74 68 65 20 2a  20 63 6f 6d 6d 61 6e 64  |re the * command|
00001630  0d 05 53 10 f4 20 69 73  20 70 6c 61 63 65 64 2e  |..S.. is placed.|
00001640  0d 05 5a 05 20 0d 05 64  0f dd f2 6f 73 63 6c 69  |..Z. ..d...oscli|
00001650  28 41 24 29 0d 05 6e 0a  24 41 25 3d 41 24 0d 05  |(A$)..n.$A%=A$..|
00001660  78 0f 58 25 3d 41 25 20  83 20 32 35 36 0d 05 82  |x.X%=A% . 256...|
00001670  0f 59 25 3d 41 25 20 81  20 32 35 36 0d 05 8c 0b  |.Y%=A% . 256....|
00001680  d6 20 26 46 46 46 37 0d  05 96 05 e1 0d 05 a0 05  |. &FFF7.........|
00001690  20 0d 05 aa 05 20 0d 05  b4 1a f4 20 44 45 43 4f  | .... ..... DECO|
000016a0  44 45 20 41 20 4c 49 4e  45 20 4e 55 4d 42 45 52  |DE A LINE NUMBER|
000016b0  0d 05 b5 1f f4 20 4c 69  6e 65 20 6e 75 6d 62 65  |..... Line numbe|
000016c0  72 73 20 75 73 65 64 20  62 79 20 47 4f 54 4f 0d  |rs used by GOTO.|
000016d0  05 b6 1b f4 20 47 4f 53  55 42 20 61 72 65 20 73  |.... GOSUB are s|
000016e0  74 6f 72 65 64 20 69 6e  20 61 0d 05 b7 1e f4 20  |tored in a..... |
000016f0  73 70 65 63 69 61 6c 20  66 6f 72 6d 61 74 20 6f  |special format o|
00001700  66 20 61 20 6c 69 6e 65  0d 05 b8 23 f4 20 6e 75  |f a line...#. nu|
00001710  6d 62 65 72 20 66 6c 61  67 20 66 6f 6c 6c 6f 77  |mber flag follow|
00001720  65 64 20 62 79 20 74 68  72 65 65 0d 05 b9 24 f4  |ed by three...$.|
00001730  20 62 79 74 65 73 2e 20  20 20 54 68 69 73 20 69  | bytes.   This i|
00001740  73 20 74 6f 20 61 76 6f  69 64 20 65 61 63 68 0d  |s to avoid each.|
00001750  05 ba 20 f4 20 62 79 74  65 20 62 65 69 6e 67 20  |.. . byte being |
00001760  3e 31 32 37 20 6f 72 20  3c 33 32 20 61 6e 64 0d  |>127 or <32 and.|
00001770  05 bb 22 f4 20 68 65 6e  63 65 20 70 6f 73 73 69  |..". hence possi|
00001780  62 6c 79 20 62 65 69 6e  67 20 64 65 63 6f 64 65  |bly being decode|
00001790  64 0d 05 bc 23 f4 20 62  79 20 42 41 53 49 43 20  |d...#. by BASIC |
000017a0  61 73 20 61 20 63 6f 6e  74 72 6f 6c 20 63 6f 64  |as a control cod|
000017b0  65 20 6f 72 0d 05 bd 16  f4 20 61 20 42 41 53 49  |e or..... a BASI|
000017c0  43 20 6b 65 79 77 6f 72  64 21 0d 05 be 05 20 0d  |C keyword!.... .|
000017d0  05 c8 10 dd f2 6c 69 6e  65 6e 6f 28 41 25 29 0d  |.....lineno(A%).|
000017e0  05 d2 13 ea 20 44 31 25  2c 44 32 25 2c 44 33 25  |.... D1%,D2%,D3%|
000017f0  2c 4c 0d 05 dc 16 44 31  25 3d 20 28 28 41 25 3f  |,L....D1%= ((A%?|
00001800  31 29 80 20 26 33 46 29  0d 05 e6 16 44 32 25 3d  |1). &3F)....D2%=|
00001810  20 28 28 41 25 3f 32 29  80 20 26 33 46 29 0d 05  | ((A%?2). &3F)..|
00001820  f0 14 44 33 25 3d 20 28  3f 41 25 29 20 82 20 26  |..D3%= (?A%) . &|
00001830  35 34 0d 05 fa 30 4c 3d  20 44 32 25 2a 32 35 36  |54...0L= D2%*256|
00001840  2b 44 31 25 2b 28 44 33  25 80 20 34 29 2a 32 35  |+D1%+(D3%. 4)*25|
00001850  36 2a 31 36 20 2b 28 44  33 25 20 80 20 34 38 29  |6*16 +(D3% . 48)|
00001860  2a 34 0d 06 04 25 e7 20  51 25 2b a9 28 c3 28 4c  |*4...%. Q%+.(.(L|
00001870  29 29 2a 6d 6f 64 65 3e  52 25 20 8c 20 f2 73 74  |))*mode>R% . .st|
00001880  61 72 74 6c 69 6e 65 0d  06 0e 08 f1 20 4c 3b 0d  |artline..... L;.|
00001890  06 18 0b 4b 25 3d 4b 25  2b 33 0d 06 22 16 51 25  |...K%=K%+3..".Q%|
000018a0  3d 51 25 2b a9 28 c3 28  4c 29 29 2a 6d 6f 64 65  |=Q%+.(.(L))*mode|
000018b0  0d 06 2c 05 e1 0d 06 36  05 20 0d 06 40 05 20 0d  |..,....6. ..@. .|
000018c0  06 4a 27 f4 20 43 48 45  43 4b 20 41 20 4e 45 58  |.J'. CHECK A NEX|
000018d0  54 20 53 54 41 54 45 4d  45 4e 54 20 46 4f 52 20  |T STATEMENT FOR |
000018e0  43 4f 4d 4d 41 53 0d 06  4b 1d f4 20 41 20 6e 65  |COMMAS..K.. A ne|
000018f0  78 74 20 73 74 61 74 65  6d 65 6e 74 20 6d 61 79  |xt statement may|
00001900  20 62 65 0d 06 4c 1d f4  20 66 6f 6c 6c 6f 77 65  | be..L.. followe|
00001910  64 20 62 79 20 6f 6e 65  20 6f 72 20 6d 6f 72 65  |d by one or more|
00001920  0d 06 4d 25 f4 20 76 61  72 69 61 62 6c 65 73 2c  |..M%. variables,|
00001930  20 73 65 70 61 72 61 74  65 64 20 62 79 20 63 6f  | separated by co|
00001940  6d 6d 61 73 2e 0d 06 4e  22 f4 20 42 79 20 63 6f  |mmas...N". By co|
00001950  75 6e 74 69 6e 67 20 66  6f 72 77 61 72 64 73 20  |unting forwards |
00001960  74 68 72 6f 75 67 68 0d  06 4f 21 f4 20 74 68 65  |through..O!. the|
00001970  20 63 6f 6d 6d 61 73 20  77 65 20 6b 6e 6f 77 20  | commas we know |
00001980  68 6f 77 20 6d 61 6e 79  0d 06 50 1f f4 20 4e 45  |how many..P.. NE|
00001990  58 54 73 20 68 61 76 65  20 62 65 65 65 6e 20 69  |XTs have beeen i|
000019a0  6d 70 6c 69 65 64 2e 0d  06 51 1b f4 20 50 53 20  |mplied...Q.. PS |
000019b0  74 61 6b 65 20 63 61 72  65 20 74 6f 20 61 76 6f  |take care to avo|
000019c0  69 64 0d 06 52 14 f4 20  27 6f 75 74 64 65 6e 74  |id..R.. 'outdent|
000019d0  69 6e 67 27 20 21 0d 06  54 05 20 0d 06 5e 13 dd  |ing' !..T. ..^..|
000019e0  20 f2 63 68 65 63 6b 5f  63 6f 6d 6d 61 73 0d 06  | .check_commas..|
000019f0  68 15 66 6f 72 6e 65 78  74 3d 66 6f 72 6e 65 78  |h.fornext=fornex|
00001a00  74 2d 31 0d 06 72 0a 70  6f 73 3d 4b 25 0d 06 7c  |t-1..r.pos=K%..||
00001a10  05 f5 0d 06 86 0d 70 6f  73 3d 70 6f 73 2b 31 0d  |......pos=pos+1.|
00001a20  06 90 26 e7 20 42 25 3f  70 6f 73 3d 63 6f 6d 6d  |..&. B%?pos=comm|
00001a30  61 20 8c 20 66 6f 72 6e  65 78 74 3d 66 6f 72 6e  |a . fornext=forn|
00001a40  65 78 74 2d 31 0d 06 9a  2d fd 20 42 25 3f 70 6f  |ext-1...-. B%?po|
00001a50  73 3d 63 6f 6c 6f 6e 20  84 20 70 6f 73 3d 4c 25  |s=colon . pos=L%|
00001a60  2d 31 20 84 20 42 25 3f  70 6f 73 3d 72 65 74 75  |-1 . B%?pos=retu|
00001a70  72 6e 0d 06 a4 1b e7 20  66 6f 72 6e 65 78 74 3c  |rn..... fornext<|
00001a80  30 20 8c 20 66 6f 72 6e  65 78 74 3d 30 0d 06 ae  |0 . fornext=0...|
00001a90  05 e1 0d 06 b8 05 20 0d  06 c2 05 20 0d 06 cc 2f  |...... .... .../|
00001aa0  f4 20 49 4e 44 45 4e 54  20 54 48 45 20 4d 41 52  |. INDENT THE MAR|
00001ab0  47 49 4e 20 54 48 45 20  43 4f 52 52 45 43 54 20  |GIN THE CORRECT |
00001ac0  23 20 4f 46 20 53 50 41  43 45 53 0d 06 cd 23 f4  |# OF SPACES...#.|
00001ad0  20 55 73 65 64 20 74 6f  20 73 70 6c 69 74 20 6d  | Used to split m|
00001ae0  75 6c 74 69 70 6c 65 20  73 74 61 74 65 2d 0d 06  |ultiple state-..|
00001af0  ce 1a f4 20 6d 65 6e 74  73 20 6f 72 20 6c 6f 6e  |... ments or lon|
00001b00  67 20 6c 69 6e 65 73 2e  0d 06 cf 20 f4 20 46 4f  |g lines.... . FO|
00001b10  52 2f 4e 45 58 54 20 52  45 50 45 41 54 2f 55 4e  |R/NEXT REPEAT/UN|
00001b20  54 49 4c 20 61 6e 64 20  0d 06 d0 1d f4 20 49 46  |TIL and ..... IF|
00001b30  2f 54 48 45 4e 2f 45 4c  53 45 20 73 74 61 74 65  |/THEN/ELSE state|
00001b40  6d 65 6e 74 73 0d 06 d1  25 f4 20 61 72 65 20 61  |ments...%. are a|
00001b50  6c 6c 20 69 6e 64 65 6e  74 65 64 20 62 79 20 74  |ll indented by t|
00001b60  77 6f 20 73 70 61 63 65  73 2e 0d 06 d2 21 f4 20  |wo spaces....!. |
00001b70  54 68 65 20 65 66 66 65  63 74 73 20 6f 66 20 69  |The effects of i|
00001b80  6e 64 65 6e 74 69 6e 67  20 61 6e 0d 06 d3 25 f4  |ndenting an...%.|
00001b90  20 49 46 20 73 74 61 74  65 6d 65 6e 74 20 61 72  | IF statement ar|
00001ba0  65 20 6f 6e 6c 79 20 65  66 66 65 63 74 69 76 65  |e only effective|
00001bb0  0d 06 d4 23 f4 20 66 6f  72 20 74 68 65 20 63 75  |...#. for the cu|
00001bc0  72 72 65 6e 74 20 70 72  6f 67 72 61 6d 20 6c 69  |rrent program li|
00001bd0  6e 65 2e 0d 06 d6 05 20  0d 06 e0 10 dd 20 f2 73  |ne..... ..... .s|
00001be0  74 61 72 74 6c 69 6e 65  0d 06 ea 05 f1 0d 06 f4  |tartline........|
00001bf0  19 e7 20 69 6e 64 65 6e  74 3c 30 20 8c 20 69 6e  |.. indent<0 . in|
00001c00  64 65 6e 74 3d 30 0d 06  fe 28 6d 61 72 67 69 6e  |dent=0...(margin|
00001c10  3d 36 2b 32 2a 66 6f 72  6e 65 78 74 2b 32 2a 72  |=6+2*fornext+2*r|
00001c20  65 70 75 6e 74 69 6c 2b  69 6e 64 65 6e 74 0d 07  |epuntil+indent..|
00001c30  08 19 e7 20 6d 61 72 67  69 6e 3c 36 20 8c 20 6d  |... margin<6 . m|
00001c40  61 72 67 69 6e 3d 36 0d  07 12 13 f1 20 c4 6d 61  |argin=6..... .ma|
00001c50  72 67 69 6e 2c 22 20 22  29 3b 0d 07 1c 0d 51 25  |rgin," ");....Q%|
00001c60  3d 6d 61 72 67 69 6e 0d  07 26 10 f2 73 74 72 69  |=margin..&..stri|
00001c70  70 73 70 61 63 65 73 0d  07 3a 0f 6d 6f 64 65 3d  |pspaces..:.mode=|
00001c80  73 69 6e 67 6c 65 0d 07  44 05 e1 0d 07 4e 05 20  |single..D....N. |
00001c90  0d 07 58 05 20 0d 07 62  13 f4 20 45 52 52 4f 52  |..X. ..b.. ERROR|
00001ca0  20 53 45 43 54 49 4f 4e  0d 07 63 23 f4 20 45 73  | SECTION..c#. Es|
00001cb0  63 61 70 65 20 77 69 6c  6c 20 63 61 75 73 65 20  |cape will cause |
00001cc0  61 6e 20 65 78 69 74 20  74 6f 20 0d 07 64 24 f4  |an exit to ..d$.|
00001cd0  20 74 68 69 73 20 73 65  63 74 69 6f 6e 2c 20 61  | this section, a|
00001ce0  73 20 77 69 6c 6c 20 61  6e 20 65 72 72 6f 72 0d  |s will an error.|
00001cf0  07 65 24 f4 20 69 6e 20  74 68 65 20 70 72 6f 67  |.e$. in the prog|
00001d00  72 61 6d 20 2d 20 77 68  69 63 68 20 77 69 6c 6c  |ram - which will|
00001d10  20 62 65 0d 07 66 22 f4  20 72 65 70 6f 72 74 65  | be..f". reporte|
00001d20  64 2e 20 20 20 59 6f 75  20 61 72 65 20 61 73 6b  |d.   You are ask|
00001d30  65 64 20 69 66 0d 07 67  24 f4 20 79 6f 75 20 77  |ed if..g$. you w|
00001d40  69 73 68 20 61 6e 6f 74  68 65 72 20 67 6f 2e 20  |ish another go. |
00001d50  20 20 42 65 63 61 75 73  65 0d 07 68 21 f4 20 61  |  Because..h!. a|
00001d60  6e 20 65 72 72 6f 72 20  6d 69 67 68 74 20 68 61  |n error might ha|
00001d70  70 70 65 6e 20 77 68 69  6c 65 0d 07 69 24 f4 20  |ppen while..i$. |
00001d80  73 65 74 74 69 6e 67 20  74 68 69 6e 67 73 20 75  |setting things u|
00001d90  70 2c 20 74 68 65 20 70  72 6f 67 72 61 6d 0d 07  |p, the program..|
00001da0  6a 22 f4 20 77 69 6c 6c  20 68 61 76 65 20 74 6f  |j". will have to|
00001db0  20 62 65 20 52 55 4e 20  61 67 61 69 6e 20 69 66  | be RUN again if|
00001dc0  0d 07 6b 1f f4 20 74 68  65 20 65 72 72 6f 72 20  |..k.. the error |
00001dd0  68 61 70 70 65 6e 65 64  20 74 68 65 72 65 2e 0d  |happened there..|
00001de0  07 6c 05 20 0d 07 76 07  d9 23 30 0d 07 80 0a ef  |.l. ..v..#0.....|
00001df0  20 31 32 2c 33 0d 07 8a  1e e7 20 9f 3c 3e 31 37  | 12,3..... .<>17|
00001e00  20 8c 20 f6 3a f1 22 20  61 74 20 6c 69 6e 65 20  | . .:." at line |
00001e10  22 3b 9e 0d 07 94 18 e8  27 27 22 41 4e 4f 54 48  |";......''"ANOTH|
00001e20  45 52 20 47 4f 20 3f 22  2c 59 24 0d 07 9e 14 e7  |ER GO ?",Y$.....|
00001e30  20 c0 59 24 2c 31 29 3d  22 4e 22 20 8c 20 e0 0d  | .Y$,1)="N" . ..|
00001e40  07 a8 0f e7 20 9e 3c 33  37 30 20 8c 20 f9 0d 07  |.... .<370 . ...|
00001e50  b2 0a e5 20 8d 44 7c 41  0d 07 bc 05 20 0d 07 c6  |... .D|A.... ...|
00001e60  05 20 0d 07 d0 1e f4 20  47 45 54 20 41 20 4c 49  |. ..... GET A LI|
00001e70  4e 45 20 46 52 4f 4d 20  54 48 45 20 46 49 4c 45  |NE FROM THE FILE|
00001e80  0d 07 d1 21 f4 20 54 68  65 20 6c 69 6e 65 20 66  |...!. The line f|
00001e90  6f 72 6d 61 74 20 69 73  20 63 68 61 72 2e 20 31  |ormat is char. 1|
00001ea0  33 0d 07 d2 23 f4 20 66  6f 6c 6c 6f 77 65 64 20  |3...#. followed |
00001eb0  62 79 20 6c 69 6e 65 20  6e 6f 20 28 68 69 20 62  |by line no (hi b|
00001ec0  79 74 65 29 0d 07 d3 21  f4 20 49 66 20 74 68 65  |yte)...!. If the|
00001ed0  20 68 69 20 62 79 74 65  20 69 73 20 3e 31 32 37  | hi byte is >127|
00001ee0  20 74 68 61 74 0d 07 d4  23 f4 20 6d 61 72 6b 73  | that...#. marks|
00001ef0  20 74 68 65 20 65 6e 64  20 6f 66 20 74 68 65 20  | the end of the |
00001f00  70 72 6f 67 72 61 6d 2e  0d 07 d5 21 f4 20 49 66  |program....!. If|
00001f10  20 61 6c 6c 20 69 73 20  77 65 6c 6c 2c 20 74 68  | all is well, th|
00001f20  65 20 6c 69 6e 65 20 6e  6f 0d 07 d6 1f f4 20 28  |e line no..... (|
00001f30  6c 6f 20 62 79 74 65 29  20 61 6e 64 20 6c 69 6e  |lo byte) and lin|
00001f40  65 20 6c 65 6e 67 74 68  0d 07 d7 23 f4 20 66 6f  |e length...#. fo|
00001f50  6c 6c 6f 77 2c 20 61 6e  64 20 74 68 65 6e 20 74  |llow, and then t|
00001f60  68 65 20 63 6f 64 65 20  66 6f 72 0d 07 d8 1b f4  |he code for.....|
00001f70  20 74 68 61 74 20 6c 69  6e 65 20 6f 66 20 70 72  | that line of pr|
00001f80  6f 67 72 61 6d 2e 0d 07  da 05 20 0d 07 e4 13 dd  |ogram..... .....|
00001f90  f2 6c 6f 61 64 6c 69 6e  65 28 62 75 66 29 0d 07  |.loadline(buf)..|
00001fa0  ee 09 ea 20 61 2c 62 0d  07 f8 09 61 3d 9a 23 58  |... a,b....a=.#X|
00001fb0  0d 08 02 0a 3f 62 75 66  3d 61 0d 08 0c 09 62 3d  |....?buf=a....b=|
00001fc0  9a 23 58 0d 08 16 0b 62  75 66 3f 31 3d 62 0d 08  |.#X....buf?1=b..|
00001fd0  20 0f e7 20 61 3c 3e 31  33 20 8c 20 e1 0d 08 2a  | .. a<>13 . ...*|
00001fe0  0f e7 20 62 3e 31 32 37  20 8c 20 e1 0d 08 34 0d  |.. b>127 . ...4.|
00001ff0  62 75 66 3f 32 3d 9a 23  58 0d 08 3e 09 61 3d 9a  |buf?2=.#X..>.a=.|
00002000  23 58 0d 08 48 0b 62 75  66 3f 33 3d 61 0d 08 52  |#X..H.buf?3=a..R|
00002010  0f e3 20 62 3d 34 20 b8  20 61 2d 31 0d 08 5c 0d  |.. b=4 . a-1..\.|
00002020  62 75 66 3f 62 3d 9a 23  58 0d 08 66 07 ed 20 62  |buf?b=.#X..f.. b|
00002030  0d 08 70 0c 62 75 66 3f  61 3d 31 33 0d 08 7a 05  |..p.buf?a=13..z.|
00002040  e1 0d 08 84 05 20 0d 08  8e 05 20 0d 08 98 1f f4  |..... .... .....|
00002050  20 49 47 4e 4f 52 45 20  41 4e 59 20 4c 45 41 44  | IGNORE ANY LEAD|
00002060  49 4e 47 20 53 50 41 43  45 53 0d 08 a2 1c f4 20  |ING SPACES..... |
00002070  41 54 20 54 48 45 20 53  54 41 52 54 20 4f 46 20  |AT THE START OF |
00002080  41 20 4c 49 4e 45 0d 08  a3 23 f4 20 54 68 65 20  |A LINE...#. The |
00002090  70 72 6f 67 72 61 6d 20  6f 72 67 61 6e 69 73 65  |program organise|
000020a0  73 20 69 74 73 20 6f 77  6e 0d 08 a4 25 f4 20 69  |s its own...%. i|
000020b0  6e 64 65 6e 74 61 74 69  6f 6e 20 73 6f 20 69 74  |ndentation so it|
000020c0  20 69 67 6e 6f 72 65 73  20 79 6f 75 72 73 0d 08  | ignores yours..|
000020d0  ac 05 20 0d 08 b6 12 dd  20 f2 73 74 72 69 70 73  |.. ..... .strips|
000020e0  70 61 63 65 73 0d 08 bb  13 e7 20 51 25 3e 6d 61  |paces..... Q%>ma|
000020f0  72 67 69 6e 20 8c 20 e1  0d 08 c0 05 f5 0d 08 ca  |rgin . .........|
00002100  0b 4b 25 3d 4b 25 2b 31  0d 08 d4 1c fd 20 4b 25  |.K%=K%+1..... K%|
00002110  3e 3d 4c 25 2d 31 20 84  20 42 25 3f 4b 25 3e 73  |>=L%-1 . B%?K%>s|
00002120  70 61 63 65 0d 08 d9 0b  4b 25 3d 4b 25 2d 31 0d  |pace....K%=K%-1.|
00002130  08 de 05 e1 0d 08 e8 05  20 0d 08 f2 05 20 0d 08  |........ .... ..|
00002140  fc 1c f4 20 47 45 54 20  54 48 45 20 4e 45 58 54  |... GET THE NEXT|
00002150  20 43 48 41 52 41 43 54  45 52 0d 08 fd 23 f4 20  | CHARACTER...#. |
00002160  52 65 74 75 72 6e 20 61  20 73 70 61 63 65 20 69  |Return a space i|
00002170  66 20 6f 66 66 20 74 68  65 20 65 6e 64 0d 08 fe  |f off the end...|
00002180  22 f4 20 6f 66 20 74 68  65 20 6c 69 6e 65 2c 20  |". of the line, |
00002190  6f 72 20 69 66 20 74 68  65 20 63 68 61 72 2e 0d  |or if the char..|
000021a0  08 ff 23 f4 20 77 61 73  20 61 20 63 6f 6e 74 72  |..#. was a contr|
000021b0  6f 6c 20 63 6f 64 65 2e  20 54 68 75 73 20 6d 61  |ol code. Thus ma|
000021c0  6e 79 0d 09 00 21 f4 20  75 6e 6c 69 73 74 61 62  |ny...!. unlistab|
000021d0  6c 65 20 70 72 6f 67 72  61 6d 73 20 61 72 65 20  |le programs are |
000021e0  6e 6f 77 0d 09 01 0f f4  20 6c 69 73 74 61 62 6c  |now..... listabl|
000021f0  65 21 0d 09 06 05 20 0d  09 10 0f dd 20 f2 6e 65  |e!.... ..... .ne|
00002200  78 74 63 68 61 72 0d 09  1a 0b 4b 25 3d 4b 25 2b  |xtchar....K%=K%+|
00002210  31 0d 09 24 27 e7 20 4b  25 3e 4c 25 2d 31 20 8c  |1..$'. K%>L%-1 .|
00002220  20 63 68 61 72 3d 73 70  61 63 65 20 8b 20 63 68  | char=space . ch|
00002230  61 72 3d 42 25 3f 4b 25  0d 09 2e 1d e7 20 63 68  |ar=B%?K%..... ch|
00002240  61 72 3c 73 70 61 63 65  20 8c 20 63 68 61 72 3d  |ar<space . char=|
00002250  73 70 61 63 65 0d 09 38  05 e1 0d 09 42 05 20 0d  |space..8....B. .|
00002260  09 4c 05 20 0d 09 56 1f  f4 20 44 45 41 4c 20 57  |.L. ..V.. DEAL W|
00002270  49 54 48 20 41 20 52 45  4d 20 53 54 41 54 45 4d  |ITH A REM STATEM|
00002280  45 4e 54 0d 09 57 22 f4  20 54 68 65 20 72 65 73  |ENT..W". The res|
00002290  74 20 6f 66 20 74 68 65  20 6c 69 6e 65 20 77 69  |t of the line wi|
000022a0  6c 6c 20 62 65 0d 09 58  21 f4 20 74 72 65 61 74  |ll be..X!. treat|
000022b0  65 64 20 61 73 20 74 65  78 74 2c 20 62 75 74 20  |ed as text, but |
000022c0  69 74 20 6d 61 79 0d 09  59 23 f4 20 69 6e 63 6c  |it may..Y#. incl|
000022d0  75 64 65 20 42 41 53 49  43 20 6b 65 79 77 6f 72  |ude BASIC keywor|
000022e0  64 73 2c 20 77 68 69 63  68 0d 09 5a 19 f4 20 68  |ds, which..Z.. h|
000022f0  61 76 65 20 74 6f 20 62  65 20 64 65 63 6f 64 65  |ave to be decode|
00002300  64 2e 0d 09 60 05 20 0d  09 6a 0a dd 20 f2 72 65  |d...`. ..j.. .re|
00002310  6d 0d 09 74 17 f2 70 72  69 6e 74 28 63 68 61 72  |m..t..print(char|
00002320  2c 64 65 63 6f 64 65 29  0d 09 7e 05 f5 0d 09 88  |,decode)..~.....|
00002330  0d f2 6e 65 78 74 63 68  61 72 0d 09 92 2e e7 20  |..nextchar..... |
00002340  63 68 61 72 3d 71 75 6f  74 65 20 8c 20 f2 74 65  |char=quote . .te|
00002350  78 74 20 8b 20 f2 70 72  69 6e 74 28 63 68 61 72  |xt . .print(char|
00002360  2c 64 65 63 6f 64 65 29  0d 09 9c 0e fd 20 4b 25  |,decode)..... K%|
00002370  3e 3d 4c 25 2d 31 0d 09  a6 05 e1 0d 09 b0 05 20  |>=L%-1......... |
00002380  0d 09 ba 05 20 0d 09 c4  23 f4 20 44 45 41 4c 20  |.... ...#. DEAL |
00002390  57 49 54 48 20 54 45 58  54 20 42 45 54 57 45 45  |WITH TEXT BETWEE|
000023a0  4e 20 51 55 4f 54 45 53  0d 09 c5 22 f4 20 70 72  |N QUOTES...". pr|
000023b0  69 6e 74 20 74 68 65 20  66 69 72 73 74 20 71 75  |int the first qu|
000023c0  6f 74 65 2c 20 74 68 65  6e 20 0d 09 c6 20 f4 20  |ote, then ... . |
000023d0  6b 65 65 70 20 6f 6e 20  70 72 69 6e 74 69 6e 67  |keep on printing|
000023e0  20 75 6e 74 69 6c 20 74  68 65 0d 09 c7 21 f4 20  | until the...!. |
000023f0  65 6e 64 20 6f 66 20 74  68 65 20 73 74 72 69 6e  |end of the strin|
00002400  67 20 69 73 20 66 6f 75  6e 64 2e 0d 09 c8 22 f4  |g is found....".|
00002410  20 47 75 61 72 64 20 61  67 61 69 6e 73 74 20 6d  | Guard against m|
00002420  69 73 73 69 6e 67 20 71  75 6f 74 65 73 0d 09 c9  |issing quotes...|
00002430  19 f4 20 61 74 20 74 68  65 20 65 6e 64 20 6f 66  |.. at the end of|
00002440  20 6c 69 6e 65 21 0d 09  ca 24 f4 20 44 6f 75 62  | line!...$. Doub|
00002450  6c 65 20 71 75 6f 74 65  73 20 61 72 65 20 6e 6f  |le quotes are no|
00002460  20 70 72 6f 62 6c 65 6d  20 2d 0d 09 cb 22 f4 20  | problem -...". |
00002470  77 65 20 74 6f 67 67 6c  65 20 6f 75 74 20 61 6e  |we toggle out an|
00002480  64 20 69 6e 20 74 6f 20  74 65 78 74 0d 09 cc 22  |d in to text..."|
00002490  f4 20 6d 6f 64 65 20 61  67 61 69 6e 2e 20 20 20  |. mode again.   |
000024a0  43 6f 64 65 73 20 3e 31  32 38 20 61 72 65 0d 09  |Codes >128 are..|
000024b0  cd 25 f4 20 74 65 6c 65  74 65 78 74 20 63 6f 6e  |.%. teletext con|
000024c0  74 72 6f 6c 20 2d 20 69  67 6e 6f 72 65 20 74 68  |trol - ignore th|
000024d0  65 6d 2e 0d 09 ce 05 20  0d 09 d8 0b dd 20 f2 74  |em..... ..... .t|
000024e0  65 78 74 0d 09 e2 19 f2  70 72 69 6e 74 28 63 68  |ext.....print(ch|
000024f0  61 72 2c ac 20 64 65 63  6f 64 65 29 0d 09 ec 05  |ar,. decode)....|
00002500  f5 0d 09 f6 0d f2 6e 65  78 74 63 68 61 72 0d 0a  |......nextchar..|
00002510  00 19 f2 70 72 69 6e 74  28 63 68 61 72 2c ac 20  |...print(char,. |
00002520  64 65 63 6f 64 65 29 0d  0a 0a 1b fd 20 4b 25 3e  |decode)..... K%>|
00002530  3d 4c 25 2d 31 20 84 20  63 68 61 72 3d 71 75 6f  |=L%-1 . char=quo|
00002540  74 65 0d 0a 14 05 e1 0d  0a 1e 05 20 0d 0a 28 05  |te......... ..(.|
00002550  20 0d 0a 32 1a f4 20 50  52 49 4e 54 20 41 20 43  | ..2.. PRINT A C|
00002560  48 41 52 41 43 54 45 52  20 4f 52 0d 0a 3c 15 f4  |HARACTER OR..<..|
00002570  20 43 4f 4d 50 52 45 53  53 45 44 20 43 4f 44 45  | COMPRESSED CODE|
00002580  0d 0a 3d 1d f4 20 4c 6f  67 69 63 61 6c 20 76 61  |..=.. Logical va|
00002590  72 69 61 62 6c 65 20 64  65 63 6f 64 65 0d 0a 3e  |riable decode..>|
000025a0  22 f4 20 69 6e 64 69 63  61 74 65 73 20 77 68 65  |". indicates whe|
000025b0  74 68 65 72 20 69 6e 20  70 72 6f 67 72 61 6d 0d  |ther in program.|
000025c0  0a 3f 23 f4 20 6f 72 20  74 65 78 74 20 6d 6f 64  |.?#. or text mod|
000025d0  65 20 2d 20 74 65 6c 65  74 65 78 74 20 63 6f 64  |e - teletext cod|
000025e0  65 73 0d 0a 40 23 f4 20  3e 31 32 38 20 63 61 6e  |es..@#. >128 can|
000025f0  20 63 6c 6f 67 20 75 70  20 74 68 65 20 70 72 69  | clog up the pri|
00002600  6e 74 65 72 2c 0d 0a 41  24 f4 20 73 6f 20 66 6f  |nter,..A$. so fo|
00002610  72 20 6e 65 61 74 6e 65  73 73 27 20 73 61 6b 65  |r neatness' sake|
00002620  2c 20 72 65 70 6c 61 63  65 0d 0a 42 15 f4 20 74  |, replace..B.. t|
00002630  68 65 6d 20 62 79 20 73  70 61 63 65 73 2e 0d 0a  |hem by spaces...|
00002640  43 24 f4 20 44 45 46 20  50 52 4f 43 20 61 6e 64  |C$. DEF PROC and|
00002650  20 46 4e 20 73 74 61 74  65 6d 65 6e 74 73 20 61  | FN statements a|
00002660  72 65 0d 0a 44 21 f4 20  70 72 69 6e 74 65 64 20  |re..D!. printed |
00002670  64 6f 75 62 6c 65 20 77  69 64 74 68 2c 20 73 6f  |double width, so|
00002680  20 62 65 0d 0a 45 24 f4  20 63 61 72 65 66 75 6c  | be..E$. careful|
00002690  20 61 62 6f 75 74 20 74  68 65 20 6c 69 6e 65 20  | about the line |
000026a0  6c 65 6e 67 74 68 2e 0d  0a 46 05 20 0d 0a 50 19  |length...F. ..P.|
000026b0  dd 20 f2 70 72 69 6e 74  28 63 68 61 72 2c 64 65  |. .print(char,de|
000026c0  63 6f 64 65 29 0d 0a 5a  0a ea 20 6c 2c 41 24 0d  |code)..Z.. l,A$.|
000026d0  0a 64 0e 41 24 3d bd 28  63 68 61 72 29 0d 0a 6e  |.d.A$=.(char)..n|
000026e0  07 6c 3d 31 0d 0a 78 3c  e7 20 64 65 63 6f 64 65  |.l=1..x<. decode|
000026f0  20 8c 20 e7 20 63 68 61  72 3e 70 72 69 6e 74 61  | . . char>printa|
00002700  62 6c 65 20 8c 20 41 24  3d 4e 41 4d 45 24 28 63  |ble . A$=NAME$(c|
00002710  68 61 72 2d 31 32 38 29  3a 6c 3d a9 28 41 24 29  |har-128):l=.(A$)|
00002720  0d 0a 82 2e e7 20 ac 20  64 65 63 6f 64 65 20 8c  |..... . decode .|
00002730  20 e7 20 28 63 68 61 72  20 83 20 31 32 38 29 3c  | . (char . 128)<|
00002740  73 70 61 63 65 20 8c 20  41 24 3d 22 20 22 0d 0a  |space . A$=" "..|
00002750  8c 1f e7 20 51 25 2b 6c  2a 6d 6f 64 65 3e 52 25  |... Q%+l*mode>R%|
00002760  20 8c 20 f2 73 74 61 72  74 6c 69 6e 65 0d 0a 96  | . .startline...|
00002770  43 e7 20 63 68 61 72 3d  64 65 66 69 6e 65 20 8c  |C. char=define .|
00002780  20 ef 20 38 2c 31 32 39  3a e7 20 c0 59 31 24 2c  | . 8,129:. .Y1$,|
00002790  31 29 3d 22 59 22 20 8c  20 6d 6f 64 65 3d 64 6f  |1)="Y" . mode=do|
000027a0  75 62 6c 65 3a ef 20 31  2c 33 32 2c 31 2c 31 34  |uble:. 1,32,1,14|
000027b0  0d 0a a0 09 f1 20 41 24  3b 0d 0a aa 10 51 25 3d  |..... A$;....Q%=|
000027c0  51 25 2b 6c 2a 6d 6f 64  65 0d 0a b4 05 e1 0d 0a  |Q%+l*mode.......|
000027d0  be 05 20 0d 0a c8 05 20  0d ff                    |.. .... ..|
000027da
08-07-88/LISTER3.m0
08-07-88/LISTER3.m1
08-07-88/LISTER3.m2
08-07-88/LISTER3.m4
08-07-88/LISTER3.m5