2025-07-14 - OCC FreeBASIC, QBASIC.EXE, and WM Tweaks

Alpine Linux does not include a GUI mixer applet with XFCE. I fussed around with various options and finally settled on launching alsamixer like so:

Now i have a speaker icon in my tray that i can click to open alsamixer. While i was at it, i set up XFCE key bindings to adjust the audio volume. I would have used multimedia buttons, but my keyboard doesn't have any.

That creates the following key bindings:


audacious with the winamp / refugee theme looks exactly like xmms. Yet another refugee from blackbox and xmms. :)


I noticed that gnumeric on this old hardware is considerably snappier than libreoffice on my new hardware. I might want to consider switching to gnumeric on my main machine.


I decided to go on a nostalgia trip and type in some BASIC listings. I installed QBASIC.EXE and FreeBASIC in DOSBox-staging. I selected Programming Tricks And Skills [1] to type listings from.

This book discusses various programming tips and tricks relevant to 8-bit computers when they all shipped with BASIC built-in. The book concludes with a BASIC listing for a simple CRUD application [2] that will run on all the major 8-bit computers, including models with only 32KB RAM. It can save the database to file, floppy, or tape. Quite an accomplishment back in the day.

Specific lines in the main listing are marked by platform. After the listing, each platform has a section of replacement lines. I selected the TRS-80 variant and ported the code to QBASIC.EXE, then FreeBASIC.

Pages 33 and 34 discusses micro-optimizations in program layout that were relevant to the limitations of 8-bit computers. This helps explain the horrendous formatting of some old BASIC code. See the following excerpt for wisdom from a more innocent era.

    More about memory
    =================
    
    Most home computers have between about 32K and 48K of RAM and
    this is [massive] for even quite long programs.  Some of the
    RAM, though, is always used by the computer for housekeeping
    tasks, that is, for storing information it needs while it
    carries out the program.  This can take up to 3K and reduces the
    space available for the program itself.
    
    Also, in high resolution graphics modes, most computers need
    much more RAM space for storing graphics information.  In the
    highest resolution mode this can be up to 20K, which might only
    leave you about 10K for the program.
    
    The largest memory an eight-bit computer ... can have, is
    64K ROM and RAM combined.  This is because each location in the
    memory has to have a number as its address.  Each address is
    represented by two bytes of computer code and the highest number
    that can be made with two bytes (16 bits) is 65536.  This allows
    65536 locations numbered 0 through 65536, which is 64K
    (65536 / 1024).
    
    It is possible, though, to use more memory on an eight-bit
    computer by switching in different blocks of memory at different
    times.  You can buy memory expansion units to do this.

I discovered a corner case with QBASIC.EXE line number support.

For example, the original code has:

    1280 DIM C$(MX*CL)

I translated this to:

    1280 DIM C(MX*CL) AS STRING

QBASIC.EXE throws the following error:

AS clause required on first declaration A variable that has not been delcared using an AS clause is referred to with an AS clause.

The same error happens if i use the REDIM statement. This took a little detective work to decipher. If i change the line to:

    1280 CLS:PRINT UBOUND(C$):END

Then it prints that a 10 item array already exists. But i never declared or used it before line 1280. My theory is that this is an internal compiler artifact. I think QBASIC.EXE implicitly declares C$ as a 10 item array here:

    10 GOSUB 1260: REM INITIALIZATION

I worked around it by copying lines 1270, 80, and 90 to lines 7, 8, and 9. Then i commented out the original lines.

In other words, make sure DIM statements come *before* any GOSUB.

After adapting the code to run in QBASIC.EXE, i didn't need to change much for FreeBASIC. I commented out line 6 CLEAR and added a third parameter ",0" to my LOCATE statements to hide the cursor. Then i can compile with `fbc -lang qb FLIP.BAS`

Source code is below [3].

Footnotes

[1] Programming Tricks And Skills
[2] CRUD (wikipedia)
[3] FLIP.BAS

[4] Reference materials

More TRS-80 BASIC
Personal Computer BASIC Reference Manual (TRS-80)
FreeBASIC
QBASIC.EXE (See help section)

Tags

occ2025
retrocomputing