This is a disassembly of TRSDOS v2.3’s SYS4/SYS file. SYS4/SYS handles errors

TRSDOS 2.3’s error handling routine is a LOT more complex than it needs to be, all in the name of saving space. Instead of having a single table with each error message, TRSDOS saves space by having a table of single words. Each error code, then, points to a list that contains a list of pointers to certain words so multiple lists must be traversed to come up with an error message.

Only a single register is passed to SYS4/SYS – Register A. Bits 0-5 contain the error number. Bit 6 flags whether or not to display “** ERRCOD = XX” as part of the message (1=display). Bit 7 flags whether to return to the caller (1=return to caller) or to return to DOS.

4E00
EX (SP),HL
Take the routine return address from (SP) and put it into Register Pair HL, Put Register Pair HL into the stack
4E01
LD (4E6EH),HL
Set the return address by loading it into memory location 4E6EH
4E04
POP HL
While this appears to Restore the stack to HL, it really just clears the stack
4E05
POP AF
Restore the error code, which is held in Register A upon entry
4E06
4E07
4E08
4E09
PUSH HL
PUSH DE
PUSH BC
PUSH AF
Preserve all of the Register Pairs
4E0A
LD B,A
Put the error code into Register B since we are going to modify Register A
4E0B
AND 3FH
Since Register A includes some flags in bits 6 and 7, we need to mask the error code against 0011 1111 to clear off those bits. This caps the number of error messages at 63).
4E0D
LD C,A
Put the masked error code into Register C
4E0E
BIT 6,B
Test bit 6 of the the unmasked error code to see if ERRCOD=XX message flag was set
4E10
LD B,00H
Set up Register Pair BC to point to the error code by loading 00H into Register B. Register C already has the (masked) error code.
4E12
JR NZ,4E2AH
If the ERRCOD=XX message flag was OFF (=0) then JUMP down to 4E2AH

If we are here, then ERRCOD=XX was set. We then need to convert the HEX to ASCII

4E14
LD E,’0′
Put an ASCII “0” into Register E
4E16
SUB 0AH
Start of loop. Subtract 0AH (=Decimal 10) from Register A
4E18
If that subtraction caused the CARRY flag to set then we are done with the conversion
4E1A
INC E
Dump Register E (the ASCII value) by 1
4E1B
JR 4E16H
LOOP back to 4E16H until the ASCII equivalent of the hex number has been computed
4E1D
ADD A,3AH
Make the MSB of the hex ASCII value positive
4E1F
LD D,A
Put that positive value into Register D, so Register Pair DE will have the ASCII error code
4E20
LD (4F42H),DE
Put the ASCII error code into 4F42H which holds the ERRCOD=XX message
4E24
LD HL,4F36H
Put the address of the ERRCOD message into Register pair HL
4E27
CALL 4467H
GOSUB to 4467H to display the error message
4E2A
LD HL,4F84H
Put the address of the error code index list into Register Pair HL
4E2D
ADD HL,BC
Add the error code to the error code list index to get the address of the phrase indices for the error
4E2E
LD L,(HL)
Put the LSB of the phrase index address for the error code into Register L
4E2F
LD H,51H
Put 51H as the MSB into Register H
4E31
LD A,(HL)
Load the word index pointed to by Register Pair HL into Register A. Note: This instruction will be jumped to for the processing of each word.
4E32
AND 3FH
AND Register A against 3FH to clear the terminator
4E34
ADD A,A
Double Register A, so it points to the index * 2
4E35
PUSH HL
Save the current word index address held in Register Pair HL to the stack
4E36
LD C,A
Put index * 2 into Register C
4E37
LD B,00H
Set up Register Pair BC to point to the index by loading Register B with 00H
4E38
LD HL,4FC2H
Set Register pair HL to point to 4FC2H which is the origin of the word address list minus 2
4E3C
ADD HL,BC
Move down the word address list (held in HL) to index * 2 (held in BC)
4E3D
LD E,(HL)
Put the LSB of the address for the required phrase into Register E
4E3E
INC HL
Bump Register Pair HL to point to the MSB of the address
4E3F
LD D,(HL)
Put the MSB of the address for the required phrase into Register D
4E40
INC HL
Bump Register Pair HL to point to the LSB of the address for the next phrase in the error message
4E41
LD A,(HL)
Put the LSB of the address for the next phrase in the error message into Register A
4E42
INC HL
Bump Register Pair HL to point to the MSB of the address for the next phrase in the error message
4E43
LD H,(HL)
Put the MSB of the address for the next phrase in the error message into Register H
4E44
LD L,A
Move A into Register L so now Register Pair HL will point to the text address for the following phrase
4E45
OR A
Clear the carry flag, since we are about to do a SBC
4E46
SBC HL,DE
Subtract DE and the carry flag from HL. This will put the address of the next phrase into HL
4E48
LD B,L
Register L is now holding the number of characters in the next phrase. Put that into Register B for an upcoming DJNZ loop
4E49
EX DE,HL
Swap Register Pair DE and Register Pair HL, so that Register Pair HL now points to the text address for the next phrase
4E4A
LD A,(HL)
Start of a DJNZ Loop. Get a character from the next phrase and put it into Register A
4E4B
INC HL
Bump Register Pair HL to point to the next character in the next phrase
4E4C
CALL 0033H
GOSUB to 0033H in the ROM to display that character
4E4F
DJNZ 4E4AH
LOOP back to 4E4AH until all the characters have been displayed
4E51
LD A,’ ‘
Put a space into Register A and …
4E53
CALL 0033H
GOSUB to 0033H to display it
4E56
POP HL
Restore the phrase index address from the stack into Register Pair HL
4E57
LD A,(HL)
Get the index and put it into Register A
4E58
INC HL
Bump Register Pair HL to the next index
4E59
RLCA
Rotate Register A so that the terminator bit is in the CARRY flag
4E5A
If NC is set, then we are not at the end (there was no terminator), so JUMP back to 4E31H to deal with the next phrase.
4E5C
POP AF
If we are here, then the entire error message has been displayed and we have a terminator, so restore the error code from the stack into Register A.
4E5D
PUSH AF
Save the error code back to the stack
4E5E
BIT 6,A
Test Bit 6 of register A (which has the error code) to see if a filename is associated with the error
4E60
If there is a filename associated with the error, JUMP forward to 4E73H to display that
4E63
LD A,0DH
If we are here then there is no filename associated with the error, so we are done. First, put a blank line (0DH) into Register A
4E65
CALL 0033H
GOSUB to 0033H in the ROM to display the 0DH
4E68
4E69
4E6A
4E6B
POP AF
POP BC
POP DE
POP HL
Restore all the Register Pairs from the stack
4E6C
OR A
Cleae the status flag for the return.
4E6D
JP M,0000H
JP M means to jump if the sign flag is set. If the sign flag is set, put 00H into the PC to return to caller
4E70
JP 4030H
If the sign flag was not set, then JUMP to 4030H to return to DOS.

4E73H – If the error requires display of a filename, this routine is jumped to.

4E73
PUSH HL
Store the last phrase index address into the stack
4E74
LD HL,4F47H
Put the address of the *** message into Register Pair HL
4E77
CALL 4467H
GOSUB to 4467H to display the closing *** message
4E7A
POP HL
Restore the last phrase index address from the stack into HL
4E7B
PUSH IX
Save the current system DCB address to the stack
4E7D
LD IX,(430AH)
Put the contents of Memory Location 430AH into the IX Register. This memory location stores the DCB address for the file with the error
4E81
DEC HL
Decrement HL by 1 so as to point to the terminating character in the phrase index list
4E82
BIT 6,(HL)
Test Bit 6 of the contents of (HL) to see if the filename is in the DCB
4E84
If the filename is in the DCB, then JUMP down to 4EA0H to process
4E86
LD C,(IX+06H)
IX+06H points to the drive number. Store that into Register C
4E89
LD B,(IX+07H)
IX+07H points to the directory sector number. Store that into Register B
4E8C
BIT 7,(IX+00H)
IX+00H points to the special DCB code area. Check Bit 7 to see if the file is open or not
4E90
If Bit 7 is not ZERO, then JUMP to 4EC4H to read the directory and copy the filename with extension
4E92
POP IX
If Bit 7 is zero, and the file is not open, clear the stack.
4E94
LD (4F55H),BC
Put Register Pair BC (the DEVICE CODE) into the address for a DEVICE = XX error message.
4E98
LD HL,4F4BH
Put the address of the DEVICE=XX message into Register Pair HL
4E9B
CALL 4467H
GOSUB to 4467H to display the message
4E9E
JR 4F06H
JUMP to 4F06H to display the REFERENCED AT message and then return to the caller

4E73H – If the error requires display of a filename or a device code, this routine is jumped to.

4EA0
LD A,(IX+00H)
IX+00H points to the special DCB code area. Put into Register A for testing.
4EA3
CP ‘*’
Test for a “*” since that is what the first character has to be
4EA5
If the first character is not a “*”, then JUMP down to 4EAFH to display a filename instead of a DEVICE code.
4EA7
LD C,(IX+01H)
IX+01H points to the special DCB
4EAA
LD B,(IX+02H)
IX+02H and IX+03H point to the device code
4EAD
JR 4E92H
JUMP to 4E92H to print the DEVICE=XX message.

4EAFH – The error code really does require display of a filename

4EAF
PUSH IX
Save the DCB address belonging to the file with the error
4EB1
POP HL
Restore the DCB address belonging to the file with the error to Register Pair HL
4EB2
LD DE,4F60H
Put the address of the filename in the <FILE=NNNNNNNN/EEE:D> message into Register Pair DE
4EB5
LD BC,0018H
Set Register Pair BC to the maximum number of characers in FILENAME/EXT:D aka 24
4EB8
LD A,(HL)
This is the start of a DJNZ loop. Get a character from the filename
4EB9
CP 03H
Test against a 03H terminating delimeter
4EBB
If a terminating delimeter was found, JUMP to 4EF9H
4EBD
INC HL
If no terminating delimeter was found then BUMP HL to point to the next character in the filename
4EBE
LD (DE),A
Put the character from the filename into the memory location pointed to by (DE) (which is the address of the filename in the error message)
4EBF
INC DE
Bump DE to point to the next location where a letter would go in the filename slot of the error message
4EC0
DJNZ 4EB8H
LOOP back to 4EB8H until 24 characters have populated the <FILE=NNNNNNNN/EEE:D> message OR an 03H delimeter is found
4EC2
JR 4EF9H
If we are here, the filename has been set up, so JUMP to 4EF9H to display <FILE=NNNNNNNN/EEE:D> message

4EC4H – Read the directory and copy the filename with extension

4EC4
CALL 4AC1H
GOSUB to 4AC1H to read the directory entry for the file with the error
4EC7
LD BC,0005H
Put a 5 into BC to represent the offset needed to get the applicable address
4ECA
ADD HL,BC
Add the offset to HL to get the address of the filename in the directory
4ECB
LD DE,4F60H
Put the address of the file name in the file=… msg into DE
4ECE
LD B,08H
Put an 8 into Register B, representing the maximum number of characters in a filename to copy from the directory
4ED0
LD A,(HL)
Beginning of a loop. Put the character pointed to by (HL) into Register A. This will be the filename
4ED1
CP ‘ ‘
Check to see if the character is a ” “
4ED3
If the character is a ” ” then we have read all we are going to read, so JUMP to 4EDAH to move to the extention
4ED5
INC L
If the character was not a ” ” then we have more to read, so Bump Register L to point to the next character
4ED6
LD (DE),A
Put the character which was read into the memory location for the filename in the <FILE=NNNNNNNN/EEE:D> message
4ED7
INC DE
Bump DE to point to the memory location where the next character in the filename will go
4ED8
DJNZ 4ED0H
LOOP back to 4ED0H until 8 characters are read or a ” ” was read
4EDA
4EDC
4EDD
LD A,’/’
LD (DE),A
INC DE
If we are here, then we have all the filename we are going to have. The next character HAS to be a “/” so just put one in and move all pointers accordingly.
4EDE
LD C,B
Register B is holding the number of characters remaining in the name field, so put that into Register C
4EDF
LD B,00H
Reset Register B
4EE1
ADD HL,BC
Add HL and BC together to point to the extension
4EE2
LD B,03H
Put an 3 into Register B, representing the maximum number of characters in an extension to copy from the directory
4EE4
LD A,(HL)
Beginning of a loop. Put the character pointed to by (HL) into Register A. This will be the extension
4EE5
INC L
Bump Register L to point to the next character in the extension
4EE6
CP ‘ ‘
Check to see if the character is a ” “
4EE8
If the character is a ” ” then we have read all we are going to read, so JUMP to 4EEEH
4EEA
LD (DE),A
Put the character which was read into the memory location for the filename in the <FILE=NNNNNNNN/EEE:D> message
4EEB
INC DE
Bump DE to point to the memory location where the next character in the filename will go
4EEC
DJNZ 4EE4H
LOOP back to 4EE4H until 8 characters are read or a ” ” was read
4EEE
EX DE,HL
If we are here, we have read all the extension we are going to read. Swap HL and DE so that HL will now hold the address of the drive number in the <FILE=NNNNNNNN/EEE:D> message
4EEF
LD (HL),’:’
Since the next character MUST be a “:” then put that into the memory location of the <FILE=NNNNNNNN/EEE:D> message
4EF1
INC HL
Bump HL to the next letter of the <FILE=NNNNNNNN/EEE:D> message
4EF2
LD A,(IX+06H)
IX+06H points to the drive number. Store that into Register A
4EF5
ADD A,30H
Add 30H to the drive number to turn it into ASCII
4EF7
LD (HL),A
Put the ASCII drive number into the next letter of the <FILE=NNNNNNNN/EEE:D> message
4EF8
INC HL
Bump HL to the next letter of the <FILE=NNNNNNNN/EEE:D> message
4EF9
LD (HL),’>’
Put a “>” as the next letter of the <FILE=NNNNNNNN/EEE:D> message
4EFB
INC HL
Bump HL to the next letter of the <FILE=NNNNNNNN/EEE:D> message
4EFC
LD (HL),0DH
Put an 0DH (new line) as the next letter of the <FILE=NNNNNNNN/EEE:D> message
4EFE
POP IX
Restore the current DCB from the stack into Register IX
4F00
LD HL,4F59H
Put the address of the <FILE=NNNNNNNN/EEE:D> message into HL
4F03
CALL 4467H
GOSUB to 4467H to display the message
4F06
LD HL,4F70H
Put the address of the REFERENCED AT message into HL
4F09
CALL 4467H
GOSUB to 4467H to display the message
4F0C
LD HL,(430CH)
Put the sector buffer address associated with the file at issue (held in 430CH) into Register Pair HL
4F0F
4F10
4F11
DEC HL
DEC HL
DEC HL
Decrement the sector buffer address associated with the file at issue by 3
4F12
CALL 4F1BH
GOSUB to 4F1BH to convert that address to ASCII and display it
4F15
LD HL,4F82H
Put the address of the “‘” string into Register Pair HL. This is the character that terminates the buffer address display
4F18
JP 4467H
JUMP to 4467H to display the “‘” and return to caller.

4F1BH – Convert the message pointed to to ASCII and display it.

4F1B
LD A,H
First we want to convert the MSB of the buffer address, so put Register H into Register A
4F1C
CALL 4F20H
GOSUB to 4F20H to convert and display the value held in Register A
4F1F
LD A,L
Next we want to convert the LSB of the buffer address, so put Register H into Register A
4F20
PUSH AF
Save value to be converted to the stack
4F21
4F22
4F23
4F24
RRA
RRA
RRA
RRA
Right shift the hex value 4 times, which is the same as dividing it by 16
4F25
CALL 4F29H
GOSUB to 4F29H to convert the binary hex value to ASCII and display it
4F28
POP AF
Restore the original value from the stack
4F29
AND 0FH
Mask Register A against 0FH (Binary 0000 1111) to isolate the binary field to convert
4F2B
ADD A,30H
Add 30H to the value to make it ASCII
4F2D
CP ‘:’
Compare it to “:” as a way to see if it exceeds 9
4F2F
If the CARRY FLAG is set then it does NOT exceed 9, so the value is less than 10 — JUMP to 4F33H
4F31
ADD A,07H
If we are here, then the value exceeds 9, so we need the A-F characters. Add 07H to do that.
4F33
JP 0033H
GOSUB to 0033H in the ROM to display the character held in Register A

4F36H – This is the message storage area

4F36
DEFB 0AH
LINE FEED character
4F37
DEFM ‘*** ERRCOD = XX, ‘
*** ERRCOD = XX,
4F46
DEFB 03H
Message terminator
4F47
DEFM ‘***’
***
4F4A
DEFB 0DH
Carriage Return / Terminator
4F4B
DEFM ‘<DEVICE = *XX>’
<DEVICE = *XX>
4F58
DEFB 0DH
Carriage Return / Terminator
4F59
DEFM ‘<FILE=NNNNNNNN/EEE:D>
<FILE=NNNNNNNN/EEE:D>
4F6F
DEFB 0DH
Carriage Return / Terminator
4F70
DEFM ‘REFERENCED AT X’
4F80
DEFB 27H
Hex Value for Message terminator
4F81
DEFB 03H
Message terminator
4F82
DEFB 27H
Hex Value for Message terminator
4F83
DEFB 0DH
Carriage Return / Terminator

This is the error number message address list.

4F84
DEFB 58H
Error Code: 00 – Address: 5158
4F85
DEFB 5DH
Error Code: 01 – Address: 515D
4F86
DEFB 62H
Error Code: 02 – Address: 5162
4F87
DEFB 66H
Error Code: 03 – Address: 5166
4F88
DEFB 6AH
Error Code: 04 – Address: 516A
4F89
DEFB 6EH
Error Code: 05 – Address: 516E
4F8A
DEFB 74H
Error Code: 06 – Address: 5174
4F8B
DEFB 79H
Error Code: 07 – Address: 5179
4F8C
DEFB 7EH
Error Code: 08 – Address: 517E
4F8D
DEFB 8lH
Error Code: 09 – Address: 5181
4F8E
DEFB 86H
Error Code: 10 – Address: 5186
4F8F
DEFB 8AH
Error Code: 11 – Address: 5l8A
4F90
DEFB 8EH
Error Code: 12 – Address: 518E
4F91
DEFB 92H
Error Code: 13 – Address: 5192
4F92
DEFB 9BH
Error Code: 14 – Address: 5198
4F93
DEFB 9DH
Error Code: 15 – Address: 5190
4F94
DEFB A0H
Error Code: 16 – Address: 51A0
4F95
DEFB A4H
Error Code: 17 – Address: 51A4
4F96
DEFB A7H
Error Code: 18 – Address: 51A7
4F97
DEFB AAH
Error Code: 19 – Address: 51AA
4F98
DEFB ADH
Error Code: 20 – Address: 51AD
4F99
DEFB B0H
Error Code: 21 – Address: 5180
4F9A
DEFB B3H
Error Code: 22 – Address: 5183
4F9C
DEFB 89H
Error Code: 24 – Address: 5189
4F9D
DEFB 8DH
Error Code: 25 – Address: 518D
4F9E
DEFB C0H
Error Code: 26 – Address: 51C0
4F9F
DEFB C3H
Error Code: 27 – Address: 51C3
4FA0
DEFB C6H
Error Code: 28 – Address: 51C6
4FA1
DEFB CAH
Error Code: 29 – Address: 5ICA
4FA2
DEFB CFH
Error Code: 30 – Address: 51CF
4FA2
DEFB F0H
Error Code: 30 – Address: 51F0
4FA3
DEFB D3H
Error Code: 31 – Address: 5103
4FA4
DEFB D6H
Error Code: 32 – Address: 51D6
4FA5
DEFB D9H
Error Code: 33 – Address: 5109
4FA6
DEFB D0H
Error Code: 34 – Address: 51DD
4FA7
DEFB E1H
Error Code: 35 – Address: 51E1
4FA8
DEFB E3H
Error Code: 36 – Address: 51E3
4FA9
DEFB EBH
Error Code: 37 – Address: 51E8
4FAA
DEFB EDH
Error Code: 30 – Address: 51ED
4FAB
DEFB F0H
Error Code: 30 – Address: 51F0
4FAB
DEFB F0H
Error Code: 30 – Address: 51F0
4FAC
DEFB F0H
Error Code: 30 – Address: 51F0
4FAD
DEFB F0H
Error Code: 30 – Address: 51F0
4FAE
DEFB F0H
Error Code: 30 – Address: 51F0
4FAF
DEFB F0H
Error Code: 30 – Address: 51F0
4FB0
DEFB F0H
Error Code: 30 – Address: 51F0
4FB1
DEFB F0H
Error Code: 30 – Address: 51F0
4FB3
DEFB F0H
Error Code: 30 – Address: 51F0
4FB4
DEFB F0H
Error Code: 30 – Address: 51F0
4FB6
DEFB F0H
Error Code: 30 – Address: 51F0
4FB7
DEFB F0H
Error Code: 30 – Address: 51F0
4FB8
DEFB F0H
Error Code: 30 – Address: 51F0
4FB9
DEFB F0H
Error Code: 30 – Address: 51F0
4FBA
DEFB F0H
Error Code: 30 – Address: 51F0
4FBC
DEFB F0H
Error Code: 30 – Address: 51F0
4FBD
DEFB F0H
Error Code: 30 – Address: 51F0
4FBE
DEFB F0H
Error Code: 30 – Address: 51F0
4FBF
DEFB F0H
Error Code: 30 – Address: 51F0
4FB5
DEFB F0H
Error Code: 30 – Address: 51F0
4FC0
DEFB F0H
Error Code: 30 – Address: 51F0
4FC1
DEFB F0H
Error Code: 30 – Address: 51F0
4FC2
DEFB F0H
Error Code: 30 – Address: 51F0
4FC3
DEFB F0H
Error Code: 30 – Address: 51F0

This is the phrase address list.

4FC4
DEFW 5030H
Error Word: “NO”
4FC6
DEFW 5032H
Error Word: “ERROR”
4FC8
DEFW 5037H
Error Word: “FORMAT”
4FCA
DEFW 503DH
Error Word: “PARITY”
4FCC
DEFW 5043H
Error Word: “DURING”
4FCE
DEFW 5049H
Error Word: “HEADER”
4FD0
DEFW 504FH
Error Word: “DATA”
4FD2
DEFW 5053H
Error Word: “SEEK”
4FD4
DEFW 5057H
Error Word: “READ”
4FD6
DEFW 505BH
Error Word: “WRITE”
4FD8
DEFW 5060H
Error Word: “WST”
4FDA
DEFW 5064H
Error Word: “NOT”
4FDC
DEFW 5067H
Error Word: “ATTEMPTED TO”
4FDE
DEFW 5073H
Error Word: “LOCKED/DELETED”
4FE0
DEFW 5081H
Error Word: “SYSTEM”
4FE2
DEFW 5087H
Error Word: “DIRECTORY”
4FE4
DEFW 5090H
Error Word: “MEMORY”
4FE6
DEFW 5096H
Error Word: “ON”
4FE8
DEFW 5098H
Error Word: “DISK”
4FEA
DEFW 509CH
Error Word: “DISKETTE”
4FEC
DEFW 50A4H
Error Word: “FAULT”
4FEE
DEFW 50A9H
Error Word: “PROTECTED”
4FF0
DEFW 50B2H
Error Word: “ILLEGAL”
4FF2
DEFW 50B9H
Error Word: “LOGICAL”
4FF4
DEFW 50C0H
Error Word: “NUMBER”
4FF6
DEFW 50C6H
Error Word: “FIOE”
4FF8
DEFW 50CAH
Error Word: “RECORD”
4FFA
DEFW 50D0H
Error Word: “END”
4FFC
DEFW 50D3H
Error Word: “OF”
4FFE
DEFW 50D5H
Error Word: “OUT”
5000
DEFW 50DBH
Error Word: “RANGE”
5002
DEFW 50DDH
Error Word: “ENCOUNTERED”
5004
DEFW 50EBH
Error Word: “CODE”
5006
DeFW 50ECH
Error Word: “GAT”
5008
DEFW 50EFH
Error Word: “HIT”
500A
DEFW 50F2H
Error Word: “OVERLAY”
500C
DEFW 50F9H
Error Word: “UNKNOWN”
500E
DEFW 5100H
Error Word: “LOD”
5010
DEFW 5104H
Error Word: “SPACE”
5012
DEFW 5109H
Error Word: “ONLY”
5014
DEFW 510DH
Error Word: “NAME”
5016
DEFW 5111H
Error Word: “DEVICE”
5018
DEFW 5117H
Error Word: “FORMAT”
501A
DEFW S11DH
Error Word: “FOUND”
501C
DEFW 5122H
Error Word: “IN”
501E
DEFW 5124H
Error Word: “ACCESS”
5020
DEFW 512AH
Error Word: “FULL”
5022
DEFW 512EH
Error Word: “DRIVE”
5024
DEFW 5133H
Error Word: “DENIED”
5026
DEFW 5139H
Error Word: “PROGRAM”
5028
DEFW 5140H
Error Word: “AVAILABLE”
502A
DEFW 5149H
Error Word: “-CAN’T EXTEND”
502C
DEFW 5157H
Error Word: “OPEN”
502E
DEFW 5158H
Error Word: “WRITE”

This is the phrase list pointed to by the preceding list.

5030
DEFM ‘NO’
(01)
5032
DEFM ‘ERROR’
(02)
5037
DEFM ‘FORMAT’
(03)
5030
DEFM ‘PARITY’
(04)
5043
DEFM ‘DURING’
(05)
5049
DEFM ‘HEADER’
(06)
504F
DEFM ‘DATA’
(07)
5053
DEFM ‘SEEK’
(08)
5057
DEFM ‘READ’
(09)
505B
DEFM ‘WRITE’
(10)
5060
DEFM ‘LOST’
(11)
5064
DEFM ‘NOT’
(12)
5067
DEFM ‘ATTEMPTED TO’
(13)
5073
DEFM ‘LOCKED’
(14)
5079
DEFM ‘/DELETED’
(15)
5081
DEFM ‘SYSTEM’
(16)
5087
DEFM ‘DIRECTORY’
(17)
5090
DEFM ‘MEMORY’
(18)
5096
DEFM ‘ON’
5098
DEFM ‘DISK’
(19)
509C
DEFM ‘DISKETTE’
(20)
50A4
DEFM ‘FAULT’
(21)
50A9
DEFM ‘PROTOCTED’
(22)
50B2
DEFM ‘ILLEGAL’
(23)
50B9
DEFM ‘LOGICAL’
(24)
50C0
DEFM ‘NUMBER’
(25)
50C6
DEFM ‘FILE’
(26)
50CA
DEFM ‘RECORD’
(27)
50D0
DEFM ‘END’
(28)
5003
DEFM ‘OF’
(29)
5005
DEFM ‘OUT’
(30)
5008
DEFM ‘RANGE’
(31)
50DD
DEFM ‘ENCOUNTERED’
(32)
50E8
DEFM ‘CODE’
(33)
50EC
DEFM ‘GAT’
(34)
50EF
DEFM ‘HIT’
(35)
50F2
DEFM ‘OVERLAY’
(36)
50F9
DEFM ‘UNKNOWN’
(37)
50FF
DEFM ‘LOAD’
(38)
5104
DEFM ‘SPACE’
(39)
5109
DEFM ‘ONLY’
(40)
510D
DEFM ‘NAME’
(41)
5111
DEFM ‘DEVICE’
(42)
5117
DEFM ‘FORMAT’
(43)
511D
DEFM ‘FOUND’
(44)
5122
DEFM ‘IN’
(45)
5124
DEFM ‘ACCESS’
(46)
512A
DEFM ‘FULL’
(47)
512E
DEFM ‘DRIVE’
(48)
5133
DEFM ‘DENIED’
(49)
5139
dEFM ‘PROGRAM’
(50)
5140
DEFM ‘AVAILABLE’
(51)
5149
DEFM ‘- CAN’T EXTEND’
(52)
5157
DEFM ‘OPEN’
(53)

This is the word list to build phrases from words.

5156
DEFB 01H, 82H, 06H, 89H
NO ERROR
515E
DEFB 04H, 02H, 05H, 06H, 89H
PARITY ERROR DURING HEADER READ
5162
DEFB 08H, 02H, 0SH, B9H
SEEK ERROR DURING READ
5166
DEFB 0BH, 07H, 05H, B9H
LOST DATA DURING READ
516A
DEFB 04H, 02H, 05H, 89H
PARITY ERROR DURING READ
516E
DEFB 07H, 1BH, 0CH, 2CH, 05H, 89H
DATA RECORD NOT FOUND DURING READ
5174
DEFB 0DH, 09H, 0EH, 07H, 9BH
ATTEMPTED TO READ 1OCKED RECORD
5179
DEFB 0DH, 09H, 0FH, 07H, 9BH
ATTEMPTED TO READ DE1ETED RECORD
517E
DEFB 2AH, 0CH, F3H
DEVICE NOT AVAILABLE
5181
DEFB 04H, 02H, 05H, 06H, BAH
PARITY ERROR DURING HEADER WRITE
5184
DEFB 08H, 02H, 05H, BAH
SEEK ERROR DURING WRITE
518A
DEFB 0BH, 07H, 05H, 8AH
LOST DATA DURING WRITE
518E
DEFB 04H, 02H, 05H, 8AH
PARITY ERROR DURING WRITE
5192
DEFB 07H, 1BH, 0CH, 2CH, 05H, 8AH
DATA RECORD NOT FOUND DURING WRITE
5198
DEFB 0AH, 15H, 12H, 13H, B0H
WRITE FAULT MEMORY DISK DRIVE
519D
DEFB 0AH, 16H, 94H
WRITE PROTECTED DISKETTE
51A0
DEFB 17H, 18H, 1AH, 99H
ILLEGAL LOGICAL FILE NUMBER
51A4
DEFB 10H, 09H, 82H
SYSTEM READ ERROR
51A7
DEFB 10H, 0AH, 82H
SYSTEM WRITE ERROR
51AA
DEFB 17H, 1AH, E9H
ILLEGAL FILE NAME
51AD
DEFB 22H, 09H, 82H
GAT READ ERROR
5180
DEFB 22H, 0AH, 82H
GAT WRITE ERROR
5183
DEFB 23H, 09H, 82H
HIT READ ERROR
5186
DEFB 23H, 0AH, 82H
HIT WRITE ERROR
5189
DEFB 1AH, 0CH, 2DH, D0H
FILE NOT IN SYSTEM
518D
DEFB 1AH, 2EH, F1H
FILE ACCESS DENIED
51C0
DEFB 10H, 27H, EFH
SYSTEM SPACE FULL
51C3
DEFB 13H, 27H, AFH
DISK SPACE FULL
51C6
DEFB 1CH, 1DH, 1AH, A0H
END OF FILE ENCOuNTERED
51CA
DEFB 1BH, 19H, 1EH, 1DH, 9FH
RECORD NUMBER OUT OF RANGE
51CF
DEFB 10H, 2FH, 34H, 9AH
SYSTEM FULL CAN’T EXTEND FILE
5106
DEFB 17H, 30H, D9H
ILLEGAL DRIVE NUMBER
51D9
DEFB 01H, 2AH, 27H, F3H
NO DEVICE SPACE AVAILA0LE
51DD
DEFB 26H, 1AH, 2BH, 82H
LOAD FILE FORMAT ERROR
51E1
DEFB 11H, 95H
DIRECTORY FAULT
51E4
DEFB 0DH, 26H, 09H, 28H, 91H
ATTEMPTED TO READ DIRECTORY
51EB
DEFB 17H, 2EH, 0DH, 16H, 9AH
ILLEGAL ACCESS ATTEMPTED TO PROTECTED FILE
S1ED
DEFB 1AH, 0CH, F5H
FILE NOT OPEN
51F0
DEFB 25H, 02H, A1H
UNKNOWN ERROR CODE