Model I Level II BASIC ROM Versions

written by Matthew Reed

The original TRS-80 Microcomputer System, later known as the TRS-80 Model I, shipped with Level I BASIC when it was introduced on August 3, 1977. An improved Level II BASIC written by Microsoft was announced at the time but was released some time later.

Radio Shack used four different versions of the Level II ROM over the lifetime of the Model I, even though the part number (26-1120) remained the same. Radio Shack never officially named the ROM versions, or even acknowledged the existence of any version other than the last, so all names used were created by users.

Version 1.0

The original Level II ROM shipped around March 1978, some time after the introduction of the Model I. Although much delayed, the ROM is remarkably bug free. The next three versions of the Level II BASIC ROM corrected most of the remaining bugs without adversely affecting compatibility.

Version 1.1

There are very few contemporaneous mentions of this ROM and it is unclear when it was released. There are a number of important changes:

  • The version 1.0 ROM generates a buzzing sound during the memory test at startup due to a two byte address calculation error. That bug is fixed in this version.
  • An error in the routine to compare double-precision numbers is fixed.
  • An improvement is made in the parsing of the SYSTEM command.
  • Due to a bug in the original ROM, the DATA pointer is often reset to the start of data for no reason. This renders the DATA command useless unless POKE 16553, 255 is used to prevent the pointer from resetting. (You will often see that POKE command scattered through old Model I programs.) That serious error is fixed in this version.

Version 1.2

This is the most common version of the Model I ROM, although it is debatable whether it qualifies as a distinct version. Released sometime before July 1979, version 1.2 differs from version 1.1 in only one way: the five unused bytes at the end of the ROM are different. There doesn’t seem to have been any reason for this change (the bytes are never referenced by the ROM), so they are probably just random bytes or leftover bytes from other code.

Version 1.3, sometimes called the R/S L2 BASIC ROM

Released around July 1980, this was the biggest revision of the Model I ROM, and the only version Radio Shack officially acknowledged. There are two very obvious changes from the previous ROM:

  • The “MEMORY SIZE?” startup message is shortened to “MEM SIZE?”
  • The “RADIO SHACK LEVEL II BASIC” message is shortened to “R/S L2 BASIC”

There are several new features:

  • A keyboard debounce routine is incorporated into the ROM, eliminating the need for the KBFIX program.
  • The keyboard driver is changed to permit control characters to be output using SHIFT+DOWN plus a key.
  • The PRINT command is enhanced to allow multiple @ specifiers, such as: PRINT@10,“A”,@74,“B”,@138,“C”
  • A longstanding timing error in the cassette routines is fixed, greatly improving the reliability of cassette transfers.
  • The maximum value for the TAB function is increased to 127 from 64.
  • The CLOAD command can specify a filename when used under Disk BASIC.

There are also a few minor limitations:

  • The CLOAD command is limited to only one cassette drive, rather than the two allowed in previous versions.
  • Free memory is reduced by two bytes.

The changes to the cassette timing mean that some older cassette tapes from Radio Shack can no longer be read with the new ROM. These include:

The official Radio Shack recommendation for owners of those cassettes was to either request replacements from their local Radio Shack store or have a friend with an older ROM Model I make copies(!!!).

Categories: General


Terry Stewart says:

Very interesting Matthew,

What suprises me is that CLOAD function was changed in version 1.3. Did that mean people with an expansion unit couldn’t use CLOAD to load/save from the second port thereby making it completely useless? Or does it mean they couldn’t use CLOAD#1, and CLOAD#2, but had to initialise the port using some POKE or other before CLOAD so the machine knew which cassette desk to use?

Incidently given the info on cassette timing, does the version of ROM used in your emulator affect the WAVE file generated from a virtual tape save? If so, are we best to use the 1.3 ROM?


Matthew Reed ( says:

Radio Shack must have decided that allowing CLOAD to use a filename was better than being able to CLOAD from a second recorder. The 1.3 ROM was only used late in the life of the Model I, so probably not many people were using two cassette recorders by that time. The other tape commands (including CSAVE) still worked with the second recorder.

My emulator modifies the cassette timing to match that of the 1.3 ROM, so any ROM will work the same with it.

David Sutherland says:

Another great article Matthew. Thanks.

I am very curious how the Model III ROMs in different countries compare–the German, Belgium, etc. Also very fascinating would be how the Japanese TEAC/TANDY Model I unit’s ROM compares.

And lastly, although not directly related to the TRS-80, it is directly related it would be fascinating to see a analyzed comparison of the various licensed MS ROMs that EACA used and then that others used including the Radionics, and Brazilian clones of the world. I imagine that these ROMs are actually not much different, but would be intrigued to know otherwise and to learn even if they aren’t much different, how they are different. The code would explain a lot about the hardware differences I imagine.

Terry Stewart says:


I have got a comparison of the EACA Level II ROM from my Black Label System 80 and the version 1.2 ROM as shown by Eddy Paay’s book. See…

If I remember rightly I went through and compared the two ROMs with a binary editor just to ensure these WERE the only changes. This proved to be the case, at least in the versions I had.

I doubt if EACA would have changed Microsoft licensed ROM between versions of their clone. They relied on the custom EPROM to do that. However, I can’t say for certain.

Ken Gregg says:

Thanks for this post. Very interesting. I’m pretty sure that my original Model I had the 1.0 version, because I remember the buzzing sound during startup.

Anyone know of an easy way to programmatically detect which version of Level II ROM is installed (e.g., a short series of PEEKs perhaps)? I know that the “MEM SIZE?” message gives away that it’s the 1.3 version, but I was wondering if there’s a simple way to check a machine to see whether it’s 1.0, 1.1, or 1.2.