Over in the CoCo Facebook group, Diego Barzio just posted a note about discovering some BASIC program line comments that had left out the REM keyword at the start. Because those lines were never the target of a GOTO, there was no error. This had the side effect of saving a byte (or two, since most do “REM ” at the start) for comment lines.
This made me think about what was going on. BASIC will allow you to type in anything, and will try to parse it (to tokenize the line) and produce an error (?SN ERROR, etc.) if there is a problem. But, when you are typing in a line, this BASIC doesn’t check anything until that line is actually ran in the program. (Other versions of BASIC will check when you hit enter. Didn’t the Apple 2 do that?)
In an earlier article, I mentioned that “REM” tokenized into one byte, and the apostrophe (‘) turned into two bytes because it was “:REM(space)” allowing you do do something like this:
10 REM This is a comment. 20 'This is a comment
Since most folks type “REM(space)”, using the apostrophe without a space after it takes the same room. But if you include the space:
10 REM This is a comment 20 ' This is a comment
…that would make line 10 take one byte less (REM + space is two bytes, versus ‘ + space which is three bytes).
Now, if you do not include REM or apostrophe, you can save a byte or two for each comment. If you program has 50 lines of comments, that’s 50-100 bytes.
However, this made me realize that leaving out the REM would cause it to try to tokenize the line, and turn any BASIC keyword into a token, saving even more memory. If your comment included words like PRINT, OR, ELSE, etc., you’d save even more room!
As you can see, because this comment uses the word PRINT (five characters), the version without the REM appears to save six bytes — it saves the apostrophe (two bytes, or would save “REM(space)” for two bytes) plus tokenizes the PRINT keyword down from five bytes to one (saving four more bytes).
Interesting BASIC interpreter abuse, isn’t it? As long as you never run this line, you might save memory by leaving our REM (depending on if you use any keywords). I could imaging comments saying “SHOW THE USER NAME” changed to “PRINT THE USR NAME” to tokenize two words (PRINT and USR).
You would still need REM at the start of the code for any initial comments, and during the code, but for subroutines you could do this:
10 REM THIS IS MY PROGRAM 20 A$="HELLO, WORLD!":GOSUB 1010 999 END 1000 PRINT THE MESSAGE 1010 PRINT A$:RETURN
The GOSUB jumps to 1010 and can find it, and since the program would END before reaching 1000, that would work.
With great power comes great responsibility. Use this wisely :) and thanks, Diego, for noticing this.
Until next time…