ROM Comparison Page (Model I)

About This Page

This page discussed the various Model I ROM’s. 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 A
ROM B
5A51
9F9A
5D0C
99C2

Level II

ROM A
ROM B
ROM C
AE5D v1.0
DA84 v1.0
4002 v1.0
AE60 v1.1, v1.2
DA45 v1.1, v1.2
3E3E v1.1
 
 
40E0 v1.1
 
 
40BA v1.2
B078 v1.3
DA45 v1.3
4006 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

ROM
Date
ROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32
Valid
Set?
v1.0
78/20
05/15/78-05/21/78
AE5D
DA84
4002
D8E9DFA7
Yes
v1.1
78/23
06/05/78-06/11/78
AE60
DA45
40E0
2DE3AFEC
Yes
v1.1
78/44
10/23/78-11/05/78
AE60
DA45
3E3E
4BE1227E
Yes
v1.2
79/12
03/19/78-03/25/79
AE60
DA45
40BA
0D8A132E
Yes
v1.3
80/02
01/07/80-01/13/80
B078
DA45
4006
A8E60D9A
Yes

BAD ROMs

ROM
ROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32
What’s Wrong?
v1.2
AD8C
DA45
40BA
B1ABA28D
FDC1F12C
D6FD9041
Patches out Delays and Memory Test
v1.3
AED7
DA45
4006
39F02E2F
Heavily Patched with Odd Changes including incorrect processing of JP/JR.

Clones

Name
System
ROM A
Cksum
ROM B
Cksum
ROM C
Cksum
CRC-32
HT-1080z v2.2
C437
DA30
40BA
48985A30
LNW-80 Rom 1
LNW-80
AB79
DA45
40BA
97B888AD
LNW-80 Rom 2
LNW-80
AB79
DA56
40BA
CFD85C89
System-80-ROM-1
Black Label
A94F
DA67
40BA
2BFEF8F7
System-80-ROM-2
Black Label
A94F
DA67
40BA
CCBDD9B8
System-80-ROM-5
Black Label
A74E
DA67
40BA
3BC7421E
  • Notes: Patched with TRS-80 Print Routines
System-80-ROM-3
Blue Label
A94F
DA67
40BA
BFF36D2F
System-80-ROM-4
Blue Label
A74E
DA67
40BA
C0B8882F
  • 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 Loc
From
To
Purpose
0683H
20 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-02E4H
23 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.
1226H
EA 34 12
JP PE,1234H
300BH
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.
124CH
N/A
B7H
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-1267H
F2 44 12
JP P,1244H
F2 43 12H
JP P,1243
Corrects a jump back into the part of the ROM that was moved down in the new ROMs.
2FFBH
00H 00H
NOP
NOP
DEH 00H
SBC 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]

226AH-226EH
3AH A9H 40H
LD A,(40A9H)
B7H
OR A
C8H
RET Z
00H 00H 00H
NOP
00H
NOP
00H
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 Loc
From
To
Purpose
2FFBH
DEH 00H
SBC 00H
00H
NOP
00H
NOP
DE C3
SBC C3H
C3 44 B2
JP B244H
Seems to be random garbage.

Changes from ROM v1.2 to ROM v1.3

Mem Loc
From
To
Purpose
0059H (89)
1AH (26)
00H (00)
Inhibit 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.
00FDH (253)
11H
LD HL,0111H
0E
LD HL,010EH
The memory location of the new Level II BASIC startup message.
0108H (264) – 021CH (540)
 
 
“ORY SIZE RADIO SHACK LEVEL II BASIC” to “SIZE R/S L2 BASIC”
0249H (585)
41H (65)
60H (96)
Lengthen the delay after the timing pulse is detected on a tape read from 65 to 96 before resetting the cassette input data latch.
0250H (592)
76H (118)
85H (133)
Lengthen the wait for the data pulse from 118 to 133.
03FBH (1019) – 03FDH (1021)
7AH 07H 07H
LD A,D
RLCA
C3H 1CH 01H
JP 011CH
Change the keyboard jump to the debounce patch routine which is now where “ACK LEVEL II BASIC” used to be. That routine pops back to 03FE.
124CH (4684) – 124DH (4685)
B7H D1H
OR A
POP DE
D1H B7H
POP DE
OR A
Swapped the 1 byte instructions. No idea why.
206CH (8300) – 20F7H (8439)
 
 
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-213B
E6 3F
E6 7F
This 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.
2167H (8551)
A0H
JP 20A0H
81H
JP 2081H
Changes a ROM jump from 20A0H to 2081H.
2C1FH (11295) – 2C42H (11330)
 
 
This is the CLOAD routine. Among the changes are the removal of the ability to address expansion interface cassette players (so no more CLOAD#-1 or CSAVE#-2). Prior ROM 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)
00H 00H 00H 00H 00H
NOP
DE C3 C3 44 B2
SBC A,0C3H
JP B244H
Seems to be random garbage.

How to Get Your CRC’s

If you do not have a DOS system, you can type in this program and get your CRC’s. 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,154,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