Produce formatted listings of BBC BASIC programs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bbc-lst2/README.md

58 lines
2.9 KiB

This program provides a formatted listing of a BBC BASIC program, by splitting multiple statements out onto separate lines, indenting loops, etc. Assembly language also gets nicely formatted.
I was doing a lot of work on the BBC Micro in the late 80's, and recently managed to retrieve a lot of it from floppy discs. The discs were in relatively good condition, given that they were nearly 40 years old (!), but it was still a challenge reading them (they were shedding so much oxide, we had to clean the disk heads after each use :-)).
This program was incredibly useful, but we were only able to get a binary executable off the floppies, not the source code, so I disassembled it, annotated it, and have made it available here.
Working on the BBC Micro was not easy, since you only had, at best, 24¾KB of memory (!) (5¾KB if you were using hi-res graphics), so saving every byte of memory possible was really important. Since BASIC is an interpreted language, and each line had a 3-byte overhead, you could save quite a few bytes by cramming as many statements onto each line as possible, separated by a colon, thus saving 2 bytes for each statement.
Of course, this made the code very difficult to read, so I wrote this listing formatter, which converts something like this:
```
807DEFPROCsp LOCALT%,I%,P%,S$:PROCblip(100):REPEATUNTILNOTINKEY-99:REPEAT:PRINTTAB(0,24)SPC10f$B$bk$Y$"Press SPACE "bb$SPC10;:PROCfx21:T%=INKEY500:IFT%=esc T%=FNesc(T%):GOTO810:ELSEIFT%=32ORT%<>-1ORRND(500)>1GOTO810
809P%=msgs+1:FORI%=1TORND(?msgs):S$=$P%:P%=P%+LENS$+1:NEXT:prvb=prvb+1:PRINTTAB(0,24)CHR$(128+RND(7))SPC38;:I%=1:REPEAT:PRINTTAB(1,24)MID$(STRING$(39," ")+"Ancient proverb #"+STR$prvb+": "+S$+STRING$(50," "),I%,38);:I%=I%+1:UNTILI%=70+LENS$ORNOTINKEY20
810UNTILT%=32:PRINTTAB(0,24)SPC39;:ENDPROC
```
into this:
```
807 DEFPROCsp LOCALT%,I%,P%,S$
:PROCblip(100)
:REPEATUNTILNOTINKEY-99
:REPEAT
: PRINTTAB(0,24)SPC10f$B$bk$Y$"Press SPACE "bb$SPC10;
: PROCfx21
: T%=INKEY500
: IFT%=esc T%=FNesc(T%)
: GOTO810
: ELSEIFT%=32ORT%<>-1ORRND(500)>1GOTO810
809 P%=msgs+1
: FORI%=1TORND(?msgs)
: S$=$P%
: P%=P%+LENS$+1
: NEXT
: prvb=prvb+1
: PRINTTAB(0,24)CHR$(128+RND(7))SPC38;
: I%=1
: REPEAT
: PRINTTAB(1,24)MID$(STRING$(39," ")+"Ancient proverb #"+STR$prvb+": "+S$+STRING$(50," "),I%,38);
: I%=I%+1
: UNTILI%=70+LENS$ORNOTINKEY20
810 UNTILT%=32
:PRINTTAB(0,24)SPC39;
:ENDPROC
```
To get the fully authentic Beeb experience, you can type the program in from the listing :-), but as a convenience, a `.ssd` file is provided with the source code, together with a binary executable.
Load the program into memory like this:
```
*LST2
```
And then enter LIST commands as normal, but with a trailing period e.g.
```
LIST 100,200.
LIST ,200.
LIST 100,.
LIST.
```