Just what no-one has needed since about 1979 or so â€¦
BASIC on the Apple II has no easy way to import text as a program. When you LOAD a file, it must be in Apple’s tokenized format. While Apple DOS has the EXEC facility to run script files as if they were typed from the keyboard, it’s very picky about the file format:
- There must be a carriage return character (CR, ASCII 13) before the first line
- All line numbers must have an extra space before and after them
- All tokens must be in upper case
- All tokens (keywords and functions) must have a space after them.
The right way to do this conversion would be to write a tokenizer that spits out the correct binary file. But you can (kinda) fudge it with this shell command, operating from BASIC source PROG.BAS:
sed 's/^[0-9][0-9]*/& /;s/^/ /;1s/^/\n/;s/$/ /;s/[:()]/ & /g;' PROG.BAS | tr '\n' '\r' | ac.sh -p EG.dsk PROG T
ac.sh is the command line version of AppleCommander, and the file EG.dsk referred to above is an Apple DOS 3.3 image created with
ac.sh -dos140 EG.dsk
It still needs work, as there are functions that will mess this up, and Applesoft’s parser makes a mess of code like IF A THEN â€¦, turning it into IF AT HEN â€¦.
So if I wanted to import the following futile program:
10 REM A FUTILE PROGRAM BY SCRUSS 20 HOME 30 FOR X=1 TO 20 40 PRINT SPC(X);"FUTILE" 50 NEXT X
Run through the script (but before EOL conversion) it would look like this:
10 REM A FUTILE PROGRAM BY SCRUSS 20 HOME 30 FOR X=1 TO 20 40 PRINT SPC ( X ) ;"FUTILE" 50 NEXT X
Make a disk and put the modified program text on it:
ac.sh -dos140 futile.dsk sed 's/^[0-9][0-9]*/& /;s/^/ /;1s/^/\n/;s/$/ /;s/[:()]/ & /g;' futile.bas | tr '\n' '\r' | ac.sh -p futile.dsk FUT T
Load the disk into your Apple II, clear out the init program, and import the code with
If all you get is ] cursors printed and no syntax errors, then something might be working. List it:
Disk image: futile-AppleII-dsk.zip, containing:
$ ac.sh -l futile.dsk DISK VOLUME #254 T 002 FUT A 002 FUTILE DOS 3.3 format; 134,144 bytes free; 9,216 bytes used.