ROM Checksums for TRS-80 Model I
Page Index
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 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
Good ROMs
| ROM | Date | ROM A Cksum | ROM B Cksum | ROM C Cksum | CRC-32 |
|---|---|---|---|---|---|
| v1.0 | 78/20 05/15/78-05/21/78 | AE5D | DA84 | 4002 | D8E9DFA7 |
| v1.1 | 78/23 06/05/78-06/11/78 | AE60 | DA45 | 40E0 | 2DE3AFEC |
| v1.1 | 78/44 10/23/78-11/05/78 | AE60 | DA45 | 3E3E | 4BE1227E |
| v1.2 | 79/12 03/19/79-03/25/79 | AE60 | DA45 | 40BA | 0D8A132E |
| v1.3 | 80/02 01/07/80-01/13/80 | B078 | DA45 | 4006 | A8E60D9A |
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. |
Model I Clone ROMs
HT-1080z
| ROM | ROM A Cksum | ROM B Cksum | ROM C Cksum | CRC-32 |
|---|---|---|---|---|
| HT-1080z v2.2 | C437 | DA30 | 40BA | 48985A30 |
LNW-80
| ROM | ROM A Cksum | ROM B Cksum | ROM C Cksum | CRC-32 |
|---|---|---|---|---|
| Rom 1 | AB79 | DA45 | 40BA | 97B888AD |
| Rom 2 | AB79 | DA56 | 40BA | CFD85C89 |
SYSTEM-80
| ROM | ROM A Cksum | ROM B Cksum | ROM C Cksum | CRC-32 |
|---|---|---|---|---|
| Rom 1 - Black Label | A94F | DA67 | 40BA | 2BFEF8F7 |
| Rom 2 - Black Label | A94F | DA67 | 40BA | CCBDD9B8 |
| Rom 5 - Black Label | A74E | DA67 | 40BA | 3BC7421E |
| ||||
| Rom 3 - Blue Label | A94F | DA67 | 40BA | BFF36D2F |
| Rom 4 - Blue Label | A74E | DA67 | 40BA | C0B8882F |
| ||||
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 | 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. |
| 124CH | N/A | B7 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 12 JP P,1243H | Corrects a jump back into the part of the ROM that was moved down in the new ROMs. |
| 2FFBH | 00 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 Loc | From | To | Purpose |
| 226AH-226EH | 3A 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 Loc | From | To | Purpose |
| 2FFBH | DE 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 Loc | From | To | Purpose |
| 0059H | 1A | 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 | 11 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" | ||
| 0249H | 41 | 60 | 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 | 76 | 85 | Lengthen the wait for the data pulse from 118 to 133. |
| 03FBH - 03FDH | 7A 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 - 124DH | B7 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-213BH | 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 | A0 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