Percom DoubleDOS 4.24 for the Model I - SYS7/SYS Disassembled

Page Customization

Introduction/Summary

Percom DoubleDOS 4.24 SYS7/SYS Disassembly (Model I)

SYS7/SYS is the overlay of DoubleDOS (DBLDOS in Percom's manual) that gives Disk BASIC its error messages in words. Where Level II BASIC shows ?SN ERROR, DoubleDOS's BASIC shows Syntax error. It is overlay 9 (directory record 21H), the only overlay that runs at 4D00H; the others run at 4E00H (SYS1/SYS to SYS5/SYS) or 5200H (SYS6/SYS).

The file is 777 bytes: six load blocks of 128 bytes and one of 109 bytes, 4D00H-4FECH (749 bytes), then the transfer address 4D00H. Unlike every other SYS file of DoubleDOS it has no name record and no copyright record. Every loaded byte is on exactly one row below: 33 bytes of code and 716 bytes of messages. SYS7/SYS is the same in DoubleDOS 4.20, 4.23 (all three sets) and 4.24.

Load Map

AddressesContents
4D00H-4D20HTurn the error code into a message number, find the message, hand it to the ROM (4D00H)
4D21H-4FECHA 00H, then the 44 messages, each ended by 00H, and a last 00H (4D21H)

How SYS7/SYS Is Reached

StepWhat happens
1When BASIC/CMD starts, it copies its table of vectors at 4D00H-4D92H to the Disk BASIC vectors at 4152H-41E4H (BASIC/CMD 5C44H). The bytes at 4D54H, LD A,89H and RST 28H, land at 41A6H, the vector the ROM calls when it reports an error; JP 5679H after them lands at 41A9H. That table was loaded at 4D00H with BASIC/CMD, and the place is free once it has been copied.
2The ROM's error routine (19A2H) resets the stack, starts a new line and calls 41A6H at 19ECH with Register E the error code and Register Pair HL 18C9H, the table of two letter codes.
3RST 28H takes request code 89H to the overlay dispatcher of SYS0/SYS (4BA2H). When the code last used is not 89H, it reads directory record 21H and loads SYS7/SYS; Register Pair DE is saved around the load (4BB6H, 4BECH). Then it calls 4D00H.
4SYS7/SYS counts the 00H bytes of its table to the message and jumps to 1A01H in the ROM, which shows the message and the line number. The question mark, the two letter code and the word ERROR (19F0H-19FEH, after the call at 19ECH) are passed over. The program ends at BASIC's READY as with any error.

SYS7/SYS never returns. The dispatcher's return address 4BFEH and the ROM's 19EFH are left on the stack until the next error, RUN or CLEAR resets the Stack Pointer (1B9AH). The dispatcher's restore of the BREAK flag 4315H after the overlay (4BFEH-4C01H) is passed over too, but nothing is lost: the dispatcher had set it to 00H, and BASIC/CMD keeps it at 00H while it runs (5C32H). It sets 4315H to C3H only when it returns to DOS (5B59H).

Error Numbers and Messages

Error number
Register E
Message
1-23
00H-2CH
Messages 1-23, those of the ROM's two letter codes NF, SN, RG, OD, FC, OV, OM, UL, BS, DD, /0, ID, TM, OS, LS, ST, CN, NR, RW, UE, MO, FD, L3 (4D22H to 4E95H)
24
2EH
Message 24, Undefined USER function (4EA8H)
25-50
30H-62H
Message 20, Unprintable error (4D0DH)
51-70
64H-8AH
Messages 25-44: FIELD overflow, Internal error, Bad file #, File not found, Bad file mode, File already open, ? (57), Disk I/O error. Use E-CMD for specific, File already exists, ? (60), ? (61), Disk full, Input past end, Bad record #, Bad file name, Mode mismatch, Direct statement in file, Too many files, Disk write protected, File access denied (4EC0H to 4FD9H)
71-128
8CH-FEH
Message 20, Unprintable error (4D0DH)

The messages are in capitals and small letters, as Level II BASIC's are not. Two begin with a small letter: string Formula too complex and can't continue. The message of error 58 tells the user to type CMD"E", which shows the DOS's own message for the last disk error. Error numbers 57, 60 and 61 have only a question mark, and the last 00H at 4FECH, an empty 45th message, is never reached.

SYS0/SYS's Test for an Overlay at 4D00H

SYS7/SYS runs at 4D00H, where SYS0/SYS also reads the GAT of a drive (4AF0H). One case matters: SYS0/SYS reads the GAT there by itself, with no overlay loaded, when it gives a file more granules as it grows (4A07H). The GAT then covers 4D00H-4DFFH, the code and the first messages of SYS7/SYS, while the request code 89H stays at 430EH. A second BASIC error then finds code 89H there, takes SYS7/SYS as still in memory, and calls 4D00H, which now holds the GAT. This can happen when a file opened for output is written further after an error in the immediate mode, with no OPEN or CLOSE in between (those load SYS2/SYS or SYS3/SYS and change 430EH).

SYS0/SYS has code for this case in the path of every sector transfer, at 45E3H-45EDH. When the overlay last called runs at 4Dxx (the high byte of its transfer address at 4BFDH is 4DH), it would store 00H at 430EH, so that the next RST 28H reads the overlay again. But the store is made only when 4DH minus Register B is 00H. Register B holds the tries left there (0AH or 05H at the most), while Register H holds the page of the buffer (pushed at 468EH), which is 4DH for the GAT. So the store never runs, and the case is not caught. This is bug B2 of SYS0/SYS; its effect is the one described above.

Bugs

No bug was found in SYS7/SYS itself. The bug that concerns it is B2 of SYS0/SYS (45E3H), described above.

Every bug found in DoubleDOS is listed, with what a user would do to set it off, on the DoubleDOS reference page.

Differences From the Manual

Percom's manual says nothing of SYS7/SYS or of the error messages of BASIC; for BASIC it refers to the Radio Shack TRSDOS and Disk BASIC Reference Manual. The DOS's directory gives SYS7/SYS the place of overlay 9, which only BASIC/CMD calls (request code 89H, from its vector table at 4D54H).

Variables

Places in SYS7/SYS

SYS7/SYS has no variables of its own: no byte of it is written while it runs.

Places Outside SYS7/SYS

Address
Size
Contents
41A6H-41A8H
3 bytes
The Error Vector of Disk BASIC
LD A,89H and RST 28H, copied from BASIC/CMD's 4D54H when BASIC starts; the ROM calls it at 19ECH.
430EH
1 byte
The Request Code of the Overlay in Memory
89H while SYS7/SYS is the overlay last loaded; SYS0/SYS's dispatcher compares the low four bits.
4BFCH-4BFDH
2 bytes
The Transfer Address of the Last Overlay
4D00H after SYS7/SYS; 45E3H tests its high byte, 4DH.

Outside Routines

AddressUse
1A01HROM: The End of the Error Routine
Shows the text at Register Pair HL through 28A7H and then the line number, and goes on to READY.

Disassembly

4D00H - Choose the Long Error Message

The transfer address of SYS7/SYS, overlay 9 (directory record 21H), loaded at 4D00H by the overlay dispatcher of SYS0/SYS for request code 89H. BASIC/CMD copies LD A,89H and RST 28H into the Disk BASIC vector at 41A6H (from its table at 4D54H), and the ROM's error routine calls 41A6H at 19ECH with Register E the error code (two times the error number less one) and Register Pair HL 18C9H, its table of two letter codes. The dispatcher keeps Register Pair DE while it loads the overlay, so Register E comes here as the ROM left it. Error numbers 1-24 pick messages 1-24, 51-70 pick messages 25-44, and every other number picks message 20, Unprintable error.

4D00
LD A,E 7B
Copy Register E, the error code that the ROM's error routine passed to 41A6H (two times the error number less one), into Register A for the range tests.
4D01
CP 8BH FE 8B
Compare Register A, the error code, with 8BH, the code of error number 70 plus one; the NC FLAG is set when the number is 71 or more.
4D03
If the NC FLAG is set (error number 71 or more), jump to 4D0DH, which makes the number that of message 20, Unprintable error.
4D05
CP 63H FE 63
Compare Register A, the error code, with 63H; the NC FLAG is set for codes 64H-8AH, the Disk BASIC error numbers 51-70.
4D07
If the NC FLAG is set (error number 51-70), jump to 4D0FH to subtract 34H, which turns the codes 64H-8AH into 30H-56H, the places of messages 25-44.
4D09
CP 2FH FE 2F
Compare Register A, the error code, with 2FH; the C FLAG is set for codes 00H-2EH, the error numbers 1-24 that have messages of their own.
4D0B
If the C FLAG is set (error number 1-24), jump to 4D11H with the code in Register A unchanged.
4D0D
LD A,5AH 3E 5A
Load Register A with 5AH for an error number of 25-50 or 71 and above: after 4D0FH it is 26H, the place of message 20, Unprintable error.
4D0F
SUB 34H D6 34
Subtract 34H from Register A: codes 64H-8AH become 30H-56H, and the 5AH loaded at 4D0DH becomes 26H.
4D11
RRCA 0F
Rotate Register A right by one bit: the even code becomes the message number less one (bit 0 of the code is 0, so nothing is carried into bit 7).
4D12
INC A 3C
Increment Register A to the message number, 1-44, counted from the first message at 4D22H.
4D13
LD B,A 47
Copy Register A, the message number, into Register B, the count of 00H bytes for the search loop at 4D17H.
4D14
LD HL,4D21H 21 21 4D
Load Register Pair HL with 4D21H, the 00H byte in front of the first message: each 00H counted ends the message before it.
4D17
LD A,(HL) 7E
Load Register A with the byte of the message table at Register Pair HL.
4D18
INC HL 23
Increment Register Pair HL to the next byte of the message table.
4D19
OR A B7
Set the flags from Register A, the byte just read: the Z FLAG is set by the 00H that ends a message.
4D1A
If the NZ FLAG is set (a letter of a message), jump back to 4D17H for the next byte.
4D1C
Decrement Register B, the count of 00H bytes still to pass, and jump back to 4D17H while it is not zero; then Register Pair HL points at the message wanted.
4D1E
Jump to 1A01H in the ROM's error routine, which shows the text at Register Pair HL up to its 00H through 28A7H and then the line number, in place of the question mark, the two letter code and the word ERROR of 19F0H-19FEH. The return address 19EFH of the call of 41A6H and the dispatcher's 4BFEH stay on the stack; the ROM's next error, RUN or CLEAR resets the Stack Pointer at 1B9AH, and BASIC/CMD keeps the BREAK flag 4315H at 00H while it runs, so the dispatcher's restore of 4315H at 4BFEH-4C01H is not missed.

4D21H - The Long Error Messages

Forty-four messages, each ended by a 00H byte, after a 00H at 4D21H that the search counts first. Messages 1-24 belong to the error numbers 1-24 (the ROM's two letter codes NF to L3, and error number 24, Undefined USER function, of Disk BASIC); messages 25-44 belong to the Disk BASIC error numbers 51-70. The texts are in capitals and small letters. Messages 31, 34 and 35 are a question mark: error numbers 57, 60 and 61 have no message. A last 00H at 4FECH is never reached.

4D21
DEFB 00H 00
The 00H at 4D21H in front of the first message, the first byte that the search at 4D17H-4D1CH reads and counts, so that a count of one in Register B stops at 4D22H.
4D22-4D32
DEFM "NEXT without FOR" / DEFB 00H 4E 45 58 54 20 77 69 74 68 6F 75 74 20 46 4F 52 00
Message 1 at 4D22H, shown for error number 1 (Register E 00H, the ROM's code NF): NEXT without FOR, ended by the 00H at 4D32H.
4D33-4D3F
DEFM "Syntax error" / DEFB 00H 53 79 6E 74 61 78 20 65 72 72 6F 72 00
Message 2 at 4D33H, shown for error number 2 (Register E 02H, the ROM's code SN): Syntax error, ended by the 00H at 4D3FH.
4D40-4D54
DEFM "RETURN without GOSUB" / DEFB 00H 52 45 54 55 52 4E 20 77 69 74 68 6F 75 74 20 47 4F 53 55 42 00
Message 3 at 4D40H, shown for error number 3 (Register E 04H, the ROM's code RG): RETURN without GOSUB, ended by the 00H at 4D54H.
4D55-4D60
DEFM "Out of data" / DEFB 00H 4F 75 74 20 6F 66 20 64 61 74 61 00
Message 4 at 4D55H, shown for error number 4 (Register E 06H, the ROM's code OD): Out of data, ended by the 00H at 4D60H.
4D61-4D76
DEFM "Illegal function call" / DEFB 00H 49 6C 6C 65 67 61 6C 20 66 75 6E 63 74 69 6F 6E 20 63 61 6C 6C 00
Message 5 at 4D61H, shown for error number 5 (Register E 08H, the ROM's code FC): Illegal function call, ended by the 00H at 4D76H.
4D77-4D7F
DEFM "Overflow" / DEFB 00H 4F 76 65 72 66 6C 6F 77 00
Message 6 at 4D77H, shown for error number 6 (Register E 0AH, the ROM's code OV): Overflow, ended by the 00H at 4D7FH.
4D80-4D8D
DEFM "Out of memory" / DEFB 00H 4F 75 74 20 6F 66 20 6D 65 6D 6F 72 79 00
Message 7 at 4D80H, shown for error number 7 (Register E 0CH, the ROM's code OM): Out of memory, ended by the 00H at 4D8DH.
4D8E-4D9E
DEFM "Undefined line #" / DEFB 00H 55 6E 64 65 66 69 6E 65 64 20 6C 69 6E 65 20 23 00
Message 8 at 4D8EH, shown for error number 8 (Register E 0EH, the ROM's code UL): Undefined line #, ended by the 00H at 4D9EH.
4D9F-4DB5
DEFM "Subscript out of range" / DEFB 00H 53 75 62 73 63 72 69 70 74 20 6F 75 74 20 6F 66 20 72 61 6E 67 65 00
Message 9 at 4D9FH, shown for error number 9 (Register E 10H, the ROM's code BS): Subscript out of range, ended by the 00H at 4DB5H.
4DB6-4DC9
DEFM "Redimensioned array" / DEFB 00H 52 65 64 69 6D 65 6E 73 69 6F 6E 65 64 20 61 72 72 61 79 00
Message 10 at 4DB6H, shown for error number 10 (Register E 12H, the ROM's code DD): Redimensioned array, ended by the 00H at 4DC9H.
4DCA-4DDA
DEFM "Division by zero" / DEFB 00H 44 69 76 69 73 69 6F 6E 20 62 79 20 7A 65 72 6F 00
Message 11 at 4DCAH, shown for error number 11 (Register E 14H, the ROM's code /0): Division by zero, ended by the 00H at 4DDAH.
4DDB-4DE9
DEFM "Illegal direct" / DEFB 00H 49 6C 6C 65 67 61 6C 20 64 69 72 65 63 74 00
Message 12 at 4DDBH, shown for error number 12 (Register E 16H, the ROM's code ID): Illegal direct, ended by the 00H at 4DE9H.
4DEA-4DF7
DEFM "Type mismatch" / DEFB 00H 54 79 70 65 20 6D 69 73 6D 61 74 63 68 00
Message 13 at 4DEAH, shown for error number 13 (Register E 18H, the ROM's code TM): Type mismatch, ended by the 00H at 4DF7H.
4DF8-4E0B
DEFM "Out of string space" / DEFB 00H 4F 75 74 20 6F 66 20 73 74 72 69 6E 67 20 73 70 61 63 65 00
Message 14 at 4DF8H, shown for error number 14 (Register E 1AH, the ROM's code OS): Out of string space, ended by the 00H at 4E0BH.
4E0C-4E1B
DEFM "String too long" / DEFB 00H 53 74 72 69 6E 67 20 74 6F 6F 20 6C 6F 6E 67 00
Message 15 at 4E0CH, shown for error number 15 (Register E 1CH, the ROM's code LS): String too long, ended by the 00H at 4E1BH.
4E1C-4E36
DEFM "string Formula too complex" / DEFB 00H 73 74 72 69 6E 67 20 46 6F 72 6D 75 6C 61 20 74 6F 6F 20 63 6F 6D 70 6C 65 78 00
Message 16 at 4E1CH, shown for error number 16 (Register E 1EH, the ROM's code ST): string Formula too complex, ended by the 00H at 4E36H. The text begins with a small s.
4E37-4E45
DEFM "can't continue" / DEFB 00H 63 61 6E 27 74 20 63 6F 6E 74 69 6E 75 65 00
Message 17 at 4E37H, shown for error number 17 (Register E 20H, the ROM's code CN): can't continue, ended by the 00H at 4E45H. The text begins with a small c.
4E46-4E4F
DEFM "No RESUME" / DEFB 00H 4E 6F 20 52 45 53 55 4D 45 00
Message 18 at 4E46H, shown for error number 18 (Register E 22H, the ROM's code NR): No RESUME, ended by the 00H at 4E4FH.
4E50-4E64
DEFM "RESUME without error" / DEFB 00H 52 45 53 55 4D 45 20 77 69 74 68 6F 75 74 20 65 72 72 6F 72 00
Message 19 at 4E50H, shown for error number 19 (Register E 24H, the ROM's code RW): RESUME without error, ended by the 00H at 4E64H.
4E65-4E76
DEFM "Unprintable error" / DEFB 00H 55 6E 70 72 69 6E 74 61 62 6C 65 20 65 72 72 6F 72 00
Message 20 at 4E65H, shown for error number 20 (Register E 26H, the ROM's code UE): Unprintable error, ended by the 00H at 4E76H. It is also shown for every error number from 25 to 50 and from 71 up (4D0DH).
4E77-4E86
DEFM "Missing operand" / DEFB 00H 4D 69 73 73 69 6E 67 20 6F 70 65 72 61 6E 64 00
Message 21 at 4E77H, shown for error number 21 (Register E 28H, the ROM's code MO): Missing operand, ended by the 00H at 4E86H.
4E87-4E94
DEFM "Bad file data" / DEFB 00H 42 61 64 20 66 69 6C 65 20 64 61 74 61 00
Message 22 at 4E87H, shown for error number 22 (Register E 2AH, the ROM's code FD): Bad file data, ended by the 00H at 4E94H.
4E95-4EA7
DEFM "Disk BASIC feature" / DEFB 00H 44 69 73 6B 20 42 41 53 49 43 20 66 65 61 74 75 72 65 00
Message 23 at 4E95H, shown for error number 23 (Register E 2CH, the ROM's code L3): Disk BASIC feature, ended by the 00H at 4EA7H.
4EA8-4EBF
DEFM "Undefined USER function" / DEFB 00H 55 6E 64 65 66 69 6E 65 64 20 55 53 45 52 20 66 75 6E 63 74 69 6F 6E 00
Message 24 at 4EA8H, shown for error number 24 (Register E 2EH), a Disk BASIC error number with no two letter code in the ROM's table at 18C9H: Undefined USER function, ended by the 00H at 4EBFH.
4EC0-4ECE
DEFM "FIELD overflow" / DEFB 00H 46 49 45 4C 44 20 6F 76 65 72 66 6C 6F 77 00
Message 25 at 4EC0H, shown for Disk BASIC error number 51 (Register E 64H): FIELD overflow, ended by the 00H at 4ECEH.
4ECF-4EDD
DEFM "Internal error" / DEFB 00H 49 6E 74 65 72 6E 61 6C 20 65 72 72 6F 72 00
Message 26 at 4ECFH, shown for Disk BASIC error number 52 (Register E 66H): Internal error, ended by the 00H at 4EDDH.
4EDE-4EE8
DEFM "Bad file #" / DEFB 00H 42 61 64 20 66 69 6C 65 20 23 00
Message 27 at 4EDEH, shown for Disk BASIC error number 53 (Register E 68H): Bad file #, ended by the 00H at 4EE8H.
4EE9-4EF7
DEFM "File not found" / DEFB 00H 46 69 6C 65 20 6E 6F 74 20 66 6F 75 6E 64 00
Message 28 at 4EE9H, shown for Disk BASIC error number 54 (Register E 6AH): File not found, ended by the 00H at 4EF7H.
4EF8-4F05
DEFM "Bad file mode" / DEFB 00H 42 61 64 20 66 69 6C 65 20 6D 6F 64 65 00
Message 29 at 4EF8H, shown for Disk BASIC error number 55 (Register E 6CH): Bad file mode, ended by the 00H at 4F05H.
4F06-4F17
DEFM "File already open" / DEFB 00H 46 69 6C 65 20 61 6C 72 65 61 64 79 20 6F 70 65 6E 00
Message 30 at 4F06H, shown for Disk BASIC error number 56 (Register E 6EH): File already open, ended by the 00H at 4F17H.
4F18-4F19
DEFM "?" / DEFB 00H 3F 00
Message 31 at 4F18H, shown for Disk BASIC error number 57 (Register E 70H): ?, ended by the 00H at 4F19H. The question mark stands where the error number has no message of its own.
4F1A-4F41
DEFM "Disk I/O error. Use E-CMD for specific" / DEFB 00H 44 69 73 6B 20 49 2F 4F 20 65 72 72 6F 72 2E 20 20 55 73 65 20 45 2D 43 4D 44 20 66 6F 72 20 73 70 65 63 69 66 69 63 00
Message 32 at 4F1AH, shown for Disk BASIC error number 58 (Register E 72H): Disk I/O error. Use E-CMD for specific, ended by the 00H at 4F41H. E-CMD stands for the command CMD"E" of Disk BASIC, which shows the DOS error of the last disk operation.
4F42-4F55
DEFM "File already exists" / DEFB 00H 46 69 6C 65 20 61 6C 72 65 61 64 79 20 65 78 69 73 74 73 00
Message 33 at 4F42H, shown for Disk BASIC error number 59 (Register E 74H): File already exists, ended by the 00H at 4F55H.
4F56-4F57
DEFM "?" / DEFB 00H 3F 00
Message 34 at 4F56H, shown for Disk BASIC error number 60 (Register E 76H): ?, ended by the 00H at 4F57H. The question mark stands where the error number has no message of its own.
4F58-4F59
DEFM "?" / DEFB 00H 3F 00
Message 35 at 4F58H, shown for Disk BASIC error number 61 (Register E 78H): ?, ended by the 00H at 4F59H. The question mark stands where the error number has no message of its own.
4F5A-4F63
DEFM "Disk full" / DEFB 00H 44 69 73 6B 20 66 75 6C 6C 00
Message 36 at 4F5AH, shown for Disk BASIC error number 62 (Register E 7AH): Disk full, ended by the 00H at 4F63H.
4F64-4F72
DEFM "Input past end" / DEFB 00H 49 6E 70 75 74 20 70 61 73 74 20 65 6E 64 00
Message 37 at 4F64H, shown for Disk BASIC error number 63 (Register E 7CH): Input past end, ended by the 00H at 4F72H.
4F73-4F7F
DEFM "Bad record #" / DEFB 00H 42 61 64 20 72 65 63 6F 72 64 20 23 00
Message 38 at 4F73H, shown for Disk BASIC error number 64 (Register E 7EH): Bad record #, ended by the 00H at 4F7FH.
4F80-4F8D
DEFM "Bad file name" / DEFB 00H 42 61 64 20 66 69 6C 65 20 6E 61 6D 65 00
Message 39 at 4F80H, shown for Disk BASIC error number 65 (Register E 80H): Bad file name, ended by the 00H at 4F8DH.
4F8E-4F9B
DEFM "Mode mismatch" / DEFB 00H 4D 6F 64 65 20 6D 69 73 6D 61 74 63 68 00
Message 40 at 4F8EH, shown for Disk BASIC error number 66 (Register E 82H): Mode mismatch, ended by the 00H at 4F9BH.
4F9C-4FB4
DEFM "Direct statement in file" / DEFB 00H 44 69 72 65 63 74 20 73 74 61 74 65 6D 65 6E 74 20 69 6E 20 66 69 6C 65 00
Message 41 at 4F9CH, shown for Disk BASIC error number 67 (Register E 84H): Direct statement in file, ended by the 00H at 4FB4H.
4FB5-4FC3
DEFM "Too many files" / DEFB 00H 54 6F 6F 20 6D 61 6E 79 20 66 69 6C 65 73 00
Message 42 at 4FB5H, shown for Disk BASIC error number 68 (Register E 86H): Too many files, ended by the 00H at 4FC3H.
4FC4-4FD8
DEFM "Disk write protected" / DEFB 00H 44 69 73 6B 20 77 72 69 74 65 20 70 72 6F 74 65 63 74 65 64 00
Message 43 at 4FC4H, shown for Disk BASIC error number 69 (Register E 88H): Disk write protected, ended by the 00H at 4FD8H.
4FD9-4FEB
DEFM "File access denied" / DEFB 00H 46 69 6C 65 20 61 63 63 65 73 73 20 64 65 6E 69 65 64 00
Message 44 at 4FD9H, shown for Disk BASIC error number 70 (Register E 8AH): File access denied, ended by the 00H at 4FEBH.
4FEC
DEFB 00H 00
The last byte of SYS7/SYS at 4FECH, a 00H after the 00H that ends message 44 at 4FEBH: an empty message 45 that no error code reaches, since every number above 70 picks message 20.