Making BASIC run faster is hard to automate, but there have been some attempts to do this over the years.
Carl England CRUNCH
No, it’s not that cereal you remember from Saturday morning TV ads. It’s one of the coolest utilities ever created for the CoCo. Carl England wrote quite a few of those, actually.
Carl England was the creator of my all-time favorite Disk Extended BASIC program – Super Boot. It was a superb “type DOS and auto run your program” utility that added many neat features. I have it on many of my RS-DOS disks.
Carl also created THE DEFEATER, a copy utility that could duplicate any copy protected disk. It did not crack the software – it just cloned it, making a duplicate copy protected disk.
Carl also showed off a scanner attachment at the 1990 Atlanta CoCoFest that turned a Tandy DMP printer into scanner! But that’s a story for another time…
Make BASIC small again
Today I want do discuss one of Carl’s programs called CRUNCH. It is a machine language program that will pack a BASIC program to be as small as possible. It does this by removing REMs and unnecessary spaces. It also removes other unnecessary things like “IF X THEN GOTO 100” which could be written just as “IF X THEN 100”. It will even remove trailing quotes at the end of a line (which looked weird, but saved a byte).
But the most important thing it does is pack (er, crunch?) a BASIC program into as few lines as possible. It will take a program like this:
0 REM 1 REM GUESS.BAS 2 REM 3 REM BY ALLEN HUFFMAN 4 REM 5 REM GENERATE RANDOM NUMBER 10 N=RND(100) 15 REM DISPLAY INSTRUCTIONS 20 PRINT "I AM THINKING OF A NUMBER" 30 PRINT "BETWEEN 1 AND 100." 35 REM ASK FOR A GUESS 40 PRINT "WHAT IS YOUR GUESS"; 50 INPUT G 55 REM IS GUESS TOO HIGH? 60 IF G > N THEN 100 65 REM IS GUESS TOO LOW? 70 IF G < N THEN 200 75 REM IS GUESS CORRECT? 80 IF G = N THEN 300 85 REM REPEAT 90 GOTO 35 100 REM TOO HIGH 110 PRINT "TOO HIGH!" 120 GOTO 35 200 REM TOO LOW 210 PRINT "TOO LOW!" 220 GOTO 35 300 REM CORRECT 310 PRINT "CORRECT!" 320 END
…and turn it into something like this:
10 N=RND(100):PRINT"I AM THINKING OF A NUMBER":PRINT "BETWEEN 1 AND 100. 40 PRINT"WHAT IS YOUR GUESS";:INPUTG:IFG>N THEN100 70 IFG<NTHEN200 80 IFG=NTHEN300:GOTO 40 110 PRINT"TOO HIGH!":GOTO35 210 PRINT"TOO LOW!":GOTO35 310 PRINT"CORRECT!":END
…except you generally can not list the program afterwards because CRUNCH will combine lines up to the maximum allowed (250 bytes or so?) and create lines too long to be EDITed or LISTed manually.
And, look at line 70 and 80. If you type them, you have to have a space after the variable in “IFG<N THEN…” because the tokenizer needs to know where the variable ends and the next keyword starts. CRUNCH can remove that space, which is impossible to do when typing that in by hand.
Here is what it looks like in operation on the GUESS.BAS program above:
You can select a specific operation to do, or choose 7 and do them all:
In this example, it changed a 519 byte BASIC program into 214. And, if you renumber the results by 1s starting at line zero (RENUM 0,0,1), that will save an addition 9 bytes because “GOTO30” (two digit line numbers) takes up more bytes than “GOTO9” (single digit line numbers).
CRUNCH is pretty amazing. And, you can download it today for free! It is one of the extra utilities in Carl’s DEFEATER disk copy utility package:
While that archive says CoCo 3, CRUNCH itself will work on a CoCo 1/2. At least, it seems to in my testing using the Xroar emulator.
Try CRUNCH out on some of your programs and share the results in the comments. Just keep in mind that it will destroy your ability to edit the program! Save your crunched program under a different name! You can then distribute that crunched copy, or be nice and give folks both the original (hopefully easier to read) and crunched (smaller and faster to run).
Let me know what you think!
Until next time…