ROM Checksums for TRS-80 Model I

About This Page

This page discusses the various Model I ROMs. It is broken into 5 sections

  • A chart showing the valid ROM Checksums, found either by running TEST1A on a TRSDOS v2.3 disk OR by running the program that appears at the bottom of the page
  • A discussion of what ROM Checksum corresponds to what ROM version and date
  • A discussion of what actually changed in the TRS-80 ROM Versions
  • A program which you can type in to get your ROM Checksums if you do not have TRSDOS v2.3 (written by Dean Bear)
  • A program which you can type in to dump your ROM

Valid ROM Checksums for the Model I

Level I

ROM AROM B
5A519F9A
5D0C99C2

Level II

ROM AROM BROM C
AE5D v1.0DA84 v1.04002 v1.0
AE60 v1.1, v1.2DA45 v1.1, v1.23E3E v1.1
  40E0 v1.1
  40BA v1.2
B078 v1.3DA45 v1.34006 v1.3

TEST1A/CMD, found on later versions of TRSDOS v2.3, also added the v1.3 ROM checksums.

Special thanks to Matthew Reed who took the time to analyze the Radio Shack ROMs below and who then wrote up a wonderful explanation of the differences, and also to those who have found and dumped some previously missing ROMs including Kurt Baumgardner, Katz, and John Benson.

v1.3 was also called Level II Rev. A by Radio Shack and has the R/S L2 BASIC Message.

Model I ROMs

Good ROMs

ROMDateROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32
v1.078/20
05/15/78-05/21/78
AE5DDA844002D8E9DFA7
v1.178/23
06/05/78-06/11/78
AE60DA4540E02DE3AFEC
v1.178/44
10/23/78-11/05/78
AE60DA453E3E4BE1227E
v1.279/12
03/19/79-03/25/79
AE60DA4540BA0D8A132E
v1.380/02
01/07/80-01/13/80
B078DA454006A8E60D9A

BAD ROMs

ROMROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32What's Wrong?
v1.2AD8CDA4540BAB1ABA28D
FDC1F12C
D6FD9041
Patches out Delays and Memory Test
v1.3AED7DA45400639F02E2FHeavily patched with odd changes including incorrect processing of JP/JR.

Model I Clone ROMs

HT-1080z

ROMROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32
HT-1080z v2.2C437DA3040BA48985A30

LNW-80

ROMROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32
Rom 1AB79DA4540BA97B888AD
Rom 2AB79DA5640BACFD85C89

SYSTEM-80

ROMROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32
Rom 1 - Black LabelA94FDA6740BA2BFEF8F7
Rom 2 - Black LabelA94FDA6740BACCBDD9B8
Rom 5 - Black LabelA74EDA6740BA3BC7421E
  • Notes: Patched with TRS-80 Print Routines
Rom 3 - Blue LabelA94FDA6740BABFF36D2F
Rom 4 - Blue LabelA74EDA6740BAC0B8882F
  • Notes: Patched with TRS-80 Print Routines

Actual Differences between Model I ROMs

Changes from ROM v1.0 to v1.1 Date 78-23 [Checksum AE60 DA45 40E0]

Mem LocFromToPurpose
0683H20 EF
JR NZ,0674H
20 F1
JR NZ,0676H
This is part of the power-up sequence. Some initialization data is copied from ROM into reserved RAM 128 times, in order to make sure that the memory chips are stable enough to receive and store the data properly. Unfortunately, on the earliest ROMs this jump (which was executed 128 times) went back one instruction too far, to an OUT (0FFH),A instruction at 0674H. This caused the cassette relay to buzz during power-up. This changes the jump to 0676H below the buzz routine.
02E2H-02E4H23 20 EC
INC HL
JR NZ,02D1H
20 ED 23
JR NZ,02D1H
INC HL
This is a change in the routine that reads a filename from a SYSTEM tape.
1226HEA 34 12
JP PE,1234H
30 0B
JR NC,1233H
An invalid test for a double precision number was corrected by this fix. Most instructions are the same, but are just moved down one address in the new ROMs. This change fixes a bug in double precision. It is to jump if the value in Register 1 is double precision. Since this fix is 1 byte shorter, the ROM renumbers for a while.
124CHN/AB7
OR A
Still in the double precision routine. This addition restores the memory locations back to what they were in v1.0 for the remainder of the ROM
1265H-1267HF2 44 12
JP P,1244H
F2 43 12
JP P,1243H
Corrects a jump back into the part of the ROM that was moved down in the new ROMs.
2FFBH00 00
NOP
NOP
DE 00
SBC A,00H
Seems to be random garbage.

Changes from ROM v1.1 Date 78-23 to ROM v1.1 Date 78-44 [Checksum AE60 DA45 3E3E]

Mem LocFromToPurpose
226AH-226EH3A A9 40
LD A,(40A9H)
B7
OR A
C8
RET Z
00 00 00
NOP
00
NOP
00
NOP
A bug in v1.0 caused the DATA pointer to RESTORE if memory location 40A9H didn't contain a ZERO. This removes that test.

Changes from ROM v1.1 to ROM v1.2

Mem LocFromToPurpose
2FFBHDE 00
SBC A,00H
00
NOP
00
NOP
DE C3
SBC A,C3H
C3 44 B2
JP B244H
Seems to be random garbage.

Changes from ROM v1.2 to ROM v1.3

Mem LocFromToPurpose
0059H1A00Inhibit a CHR$(26) from being returned when SHIFT-DOWN-ARROW is pressed; allowing those to function as a control key, and passing a third key as a control equivalent.
00FDH11
LD HL,0111H
0E
LD HL,010EH
The memory location of the new Level II BASIC startup message.
0108H - 021CH  "MEMORY SIZE RADIO SHACK LEVEL II BASIC" to "MEMORY SIZE R/S L2 BASIC"
0249H4160Lengthen the delay after the timing pulse is detected on a tape read from 65 to 96 before resetting the cassette input data latch.
0250H7685Lengthen the wait for the data pulse from 118 to 133.
03FBH - 03FDH7A 07 07
LD A,D
RLCA
RLCA
C3 1C 01
JP 011CH
Change the keyboard jump to the debounce patch routine which is now where "RADIO SHACK LEVEL II BASIC" used to be. That routine pops back to 03FEH.
124CH - 124DHB7 D1
OR A
POP DE
D1 B7
POP DE
OR A
Swapped the 1 byte instructions. No idea why.
206CH - 20F7H  Permits an "@" in the PRINT anywhere instead of only first. This was a problem if you wanted to use multiple PRINT@'s on a line.
213AH-213BHE6 3FE6 7FThis is how high a number you can TAB to. Previously you could only TAB to the 63rd position on the current line. Now you can TAB to the 63rd position on the NEXT line.
2167HA0
JP 20A0H
81
JP 2081H
Changes a ROM jump from 20A0H to 2081H.
2C1FH - 2C42H  This is the CLOAD routine. Among the changes are the removal of the ability to address expansion interface cassette players. Prior ROMs addressed these in the following order: start the motor, find the sync byte, get the CLOAD command line parameters, and then execute a NEW. Now, they are addressed as follows: get the CLOAD command line parameters, execute a NEW, start the motor, and find the sync byte. Possibly to prevent losing data if determining the command line parameters took too long.
2FFBH (12283) - 2FFFH (12287)00 00 00 00 00
NOP
DE C3 C3 44 B2
SBC A,0C3H
JP B244H
Seems to be random garbage.

How to Get Your CRCs

If you do not have a DOS system, you can type in this program and get your CRCs. If you have a CRC different than any above, please contact me. These programs were written by Dean Bear.

Longer Version (Runs Fast):

1 FOR I = 0 TO 23 : READ P : POKE 28656+I,P : NEXT I
2 DATA 17,0,0,62,16,237,71,33,0,0
3 DATA 69,26,79,9,19,237,87,186,32,247
4 DATA 195,194,10,201
5 POKE 16526, 240 : POKE 16527, 111
6 DIM ROM(3) : ? "M1 ROM CRCS FOR 3 CHIP SET"
7 FOR I = 0 TO 2
8 B = 16*I : C = 16*(I+1)
9 POKE 28658,B
10 POKE 28660,C
11 D = USR(0)
12 IF D<0 THEN D=D+65536
13 ROM(I) = D
14 A$ = "ROM "+CHR$(65+I)+" = "
15 GOSUB 22
16 NEXT I
17 ? "CRCS FOR 2 CHIP SET, USE A/B AND C VALUES"
18 D = ROM(0)+ROM(1)
19 A$ = "ROM A/B = "
20 GOSUB 22
21 END
22 S=16:X=2
23 IF S<D THEN X=X+1:S=S*16:GOTO 23
24 PRINT A$;
25 T=D
26 FOR L=X TO 1 STEP -1
27 N=INT(T/S)
28 A=0
29 IF N>9 THEN A=1
30 IF L<5 THEN PRINT CHR$(48+N+7*A);
31 T=T-N*S:S=S/16
32 NEXT L
33 PRINT
34 RETURN

Shorter Version (Runs MUCH Slower):

1 FOR I = 0 TO 4095 : D=D+PEEK(I) : NEXT
2 A$ = "ROM A = "
3 GOSUB 11 : D = 0
4 FOR I = 4096 TO 8191 : D=D+PEEK(I) :NEXT
5 A$ = "ROM B = "
6 GOSUB 11 : D =0
7 FOR I = 8192 TO 12287 : D=D+PEEK(I) :NEXT
8 A$ = "ROM C = "
9 GOSUB 11
10 END
11 S=16 : X=2
12 IF S<D THEN X=X+1 : S=S*16 : GOTO 12
13 PRINT A$;
14 FOR L=X TO 1 STEP -1
15 N=INT(D/S)
16 A=0
17 IF N>9 THEN A=1
18 IF L<5 THEN PRINT CHR$(48+N+7*A);
19 D=D-N*S : S=S/16
20 NEXT L
21 PRINT
22 RETURN

Quick and Dirty Way to Find Version Number

If you have a Model I and want to see which ROM version you are running, try this program written by Amardeep Chana:

10 REM V1.0 SHOULD PRINT 249
20 REM V1.1 SHOULD PRINT 215
30 REM V1.2 SHOULD PRINT 33
40 REM V1.3 SHOULD PRINT 237
50 DEFINT A-Z
60 CLS
70 PRINT "THIS WILL TAKE A FEW MINUTES."
80 FOR I=0 TO (12*1024)-1
90 Q=PEEK(I)
100 P=(Q OR P)-(Q AND P)
110 NEXT I
120 PRINT "ROM XOR SUM: "; P
130 END

How to Dump Your Model I ROM

If you have a Model I and want to dump your ROM for analysis, you can use the following program. Note, it takes about 30 minutes to run on a Model I, which is why the counters/screen updates are present. If you do not wish to key all that in, and don't mind staring at a blank screen for 30 minutes, just don't type in the italicized lines. Remember to use a disk with at least 13K free (and to adjust line 10 to point to that drive) or you will run out of space and have to start all over.

10 OPEN "O",1,"NEWROM/ROM"
20 FOR X = 0 TO &H2FFF
30 PRINT #1,CHR$(PEEK(X));
40 IR=IR+1 : IF IR = 614 THEN IR = 0: PC=PC+5: PRINT PC"% ...";
50 NEXT X
60 PRINT "DONE!":PRINT
70 CLOSE