TRS-80 DOS - LDOS 5.3.1 for the Model I - SYS4/SYS Disassembled

Page Customization

Summary:

LDOS 5.3.1 SYS4/SYS Disassembly - System Error Dictionary (Model I)

SYS4/SYS is the LDOS system error dictionary. It is the overlay that services the @ERROR system call, reached through RST 28H with request code 96H in the accumulator. Its job is to turn a numeric error code into readable English text such as "Directory read error" or "File not in directory", frame that text as *** Error code = NN, message ***, and display it. If SYS4/SYS is purged from a working system disk, the resident kernel has no message text to draw on and every system error instead prints the terse fallback "SYS ERROR". Because the whole overlay occupies only a single granule it is recommended that it be kept.

To fit 46 distinct messages into one granule, LDOS does not store the messages as literal strings. Instead it stores a dictionary of 56 English words once (5088H-51AEH), a compact per-error definition table that lists each message as a short sequence of word numbers (4E03H-4EADH), and a one-byte-per-error index (505AH-5087H) that locates each definition. The display routine walks the word-number list for the requested error, copies each dictionary word into a work buffer with a separating space, and so reconstructs the full sentence on demand. Every word in the dictionary is stored with the high bit (80H) set on its final character, which marks the end of that word.

Beyond the message text, the routine optionally appends the identity of the offending object - either <Device=*XX> for a logical device or <File=NAME/EXT:D> for a disk file (read from the directory) - and a Referenced at X'NNNN' line giving the address from which the failing service was called. Option bits in the caller's accumulator select how much of this framing is produced and whether control returns to the caller or aborts to DOS. Because SYS4/SYS is a transient overlay it loads and runs at 4E00H and reaches the resident kernel (SYS0/SYS) only through fixed entry points.

Memory and Variable Map

Address RangePurpose
4E00H-4E02H
3 bytes
Overlay entry point - a single JP that skips over the definition-table data to the executable code at 4EAEH.
4E03H-4EADH
171 bytes
Error message definition table. For each of the 46 error codes, a short run of bytes: bits 0-5 of each byte are a word index into the dictionary, and bit 7 marks the last word of the message.
4EAEH-500CH
351 bytes
The @ERROR display code: option decode, prefix builder, message decompression loop, framing/display, and the device/file and referenced-at builders.
4F64H-4F65H
2 bytes
Self-modified operand of the JP M at 4F63H. Patched at 4EB2H with the caller's return address so the routine can return to the caller when bit 7 of the code is set.
5028H-5029H
2 bytes
Self-modified '*XX' field inside the Device template. Patched at 4F82H with the two-character logical-device name.
500DH-5059H
77 bytes
Message template literals: the '*** Error code =' prefix, the '&lt;Device=*XX&gt;' and '&lt;File=NNNNNNNN/EEE:D&gt;' fill-in templates, and the 'Referenced at X''NNNN''' line.
505AH-5087H
46 bytes
Error-code index table: one byte per error code (0-45) giving the offset into the 4E00H page at which that error's definition begins.
5088H-51AEH
295 bytes
Compressed word dictionary: 56 English words, each terminated by having bit 7 set on its final character.
4200H
(SYS0 buffer)
Resident shared sector/message buffer in SYS0/SYS. SYS4 assembles the finished message text here before display.

Major Routines

AddressRoutine
4E00HOverlay Entry Point
Jumps over the error-definition data table to the real entry at 4EAEH.
4EAEH@ERROR Service Entry
Masks the request code, recovers the caller's error code and option bits from the stack, factors in the resident SYS1 status byte at 4758H, and decides whether and how much of the message to build and display.
4EE4HError-Code Prefix Builder
Copies the '*** Error code =' literal into the work buffer and converts the error number to two decimal digits, producing '*** Error code =NN, '.
4F02HMessage Decompression Loop
Reads the error's word-index list, skips to each referenced word in the dictionary, and copies it into the buffer followed by a space.
4F33HFrame and Display
Capitalizes the first letter, appends the trailing '***' and a carriage return, and displays the assembled buffer through the SYS0 string-display routine at 447BH unless display is suppressed.
4F69HDevice / File Specification Builder
Builds '<Device=*XX>' from a logical-device control block or '<File=NAME/EXT:D>' from the file's directory record, then displays it.
4FF7HReferenced-At Address Line
Converts the saved caller address at 430CH to four hex digits and displays the 'Referenced at X''NNNN''' line.

Cross-Reference Notes

SYS4/SYS is invoked by the resident RST 28H supervisor dispatcher in SYS0/SYS when a caller issues the @ERROR request (code 96H). It calls the following resident SYS0/SYS entry points: 4B10H (DIRRD, read a directory record), 447BH (display a carriage-return-terminated string), 4D76H (store the value in register pair DE as four hexadecimal ASCII digits), and 4030H (@ABORT, return to DOS on the no-return path). It reads the resident variables 430AH (address of the current file/device control block), 430CH (address from which the failing service was called), 430FH (system flag byte), and 4758H (SYS1 status byte), and assembles its output in the resident shared buffer at 4200H.

Disassembly:

4E00H - Overlay Entry Point

SYS4/SYS is loaded to 4E00H and entered here. The first three bytes are a jump over the read-only error-definition table that follows, landing on the executable @ERROR code at 4EAEH.

4E00
Jump past the error-message definition data (4E03H-4EADH) to the start of the @ERROR service code at 4EAEH.

4E03H - Error Message Definition Table

Data, not code. One entry per error code. Each byte holds a dictionary word number in bits 0-5; bit 7 set marks the final word of that message. The decompression loop at 4F02H expands these lists into text. (The disassembler mis-reads these data bytes as instructions; they are shown here as DEFB data with the decoded message.)

4E03
DEFB 01 82 01 82
Error code 0: no error
Word numbers 1, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E05
DEFB 04 02 05 06 89 04 02 05 06 89
Error code 1: parity error during header read
Word numbers 4, 2, 5, 6, 9 from the dictionary at 5088H; the final byte 89H has bit 7 set to end the message.
4E0A
DEFB 08 02 05 89 08 02 05 89
Error code 2: seek error during read
Word numbers 8, 2, 5, 9 from the dictionary at 5088H; the final byte 89H has bit 7 set to end the message.
4E0E
DEFB 0B 07 05 89 0B 07 05 89
Error code 3: lost data during read
Word numbers 11, 7, 5, 9 from the dictionary at 5088H; the final byte 89H has bit 7 set to end the message.
4E12
DEFB 04 02 05 89 04 02 05 89
Error code 4: parity error during read
Word numbers 4, 2, 5, 9 from the dictionary at 5088H; the final byte 89H has bit 7 set to end the message.
4E16
DEFB 07 1B 0C 2C 05 89 07 1B 0C 2C 05 89
Error code 5: data record not found during read
Word numbers 7, 27, 12, 44, 5, 9 from the dictionary at 5088H; the final byte 89H has bit 7 set to end the message.
4E1C
DEFB 0D 09 0F 07 9B 0D 09 0F 07 9B
Error code 6: attempted to read system data record
Word numbers 13, 9, 15, 7, 27 from the dictionary at 5088H; the final byte 9BH has bit 7 set to end the message.
4E21
DEFB 0D 09 0E 07 9B 0D 09 0E 07 9B
Error code 7: attempted to read locked/deleted data record
Word numbers 13, 9, 14, 7, 27 from the dictionary at 5088H; the final byte 9BH has bit 7 set to end the message.
4E26
DEFB 2A 0C F3 2A 0C F3
Error code 8: device not available
Word numbers 42, 12, 51 from the dictionary at 5088H; the final byte F3H has bit 7 set to end the message.
4E29
DEFB 04 02 05 06 8A 04 02 05 06 8A
Error code 9: parity error during header write
Word numbers 4, 2, 5, 6, 10 from the dictionary at 5088H; the final byte 8AH has bit 7 set to end the message.
4E2E
DEFB 08 02 05 8A 08 02 05 8A
Error code 10: seek error during write
Word numbers 8, 2, 5, 10 from the dictionary at 5088H; the final byte 8AH has bit 7 set to end the message.
4E32
DEFB 0B 07 05 8A 0B 07 05 8A
Error code 11: lost data during write
Word numbers 11, 7, 5, 10 from the dictionary at 5088H; the final byte 8AH has bit 7 set to end the message.
4E36
DEFB 04 02 05 8A 04 02 05 8A
Error code 12: parity error during write
Word numbers 4, 2, 5, 10 from the dictionary at 5088H; the final byte 8AH has bit 7 set to end the message.
4E3A
DEFB 07 1B 0C 2C 05 8A 07 1B 0C 2C 05 8A
Error code 13: data record not found during write
Word numbers 7, 27, 12, 44, 5, 10 from the dictionary at 5088H; the final byte 8AH has bit 7 set to end the message.
4E40
DEFB 0A 15 12 13 B0 0A 15 12 13 B0
Error code 14: write fault on disk drive
Word numbers 10, 21, 18, 19, 48 from the dictionary at 5088H; the final byte B0H has bit 7 set to end the message.
4E45
DEFB 0A 16 93 0A 16 93
Error code 15: write protected disk
Word numbers 10, 22, 19 from the dictionary at 5088H; the final byte 93H has bit 7 set to end the message.
4E48
DEFB 17 18 1A 99 17 18 1A 99
Error code 16: illegal logical file number
Word numbers 23, 24, 26, 25 from the dictionary at 5088H; the final byte 99H has bit 7 set to end the message.
4E4C
DEFB 10 09 82 10 09 82
Error code 17: directory read error
Word numbers 16, 9, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E4F
DEFB 10 0A 82 10 0A 82
Error code 18: directory write error
Word numbers 16, 10, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E52
DEFB 17 1A E9 17 1A E9
Error code 19: illegal file name
Word numbers 23, 26, 41 from the dictionary at 5088H; the final byte E9H has bit 7 set to end the message.
4E55
DEFB 22 09 82 22 09 82
Error code 20: GAT read error
Word numbers 34, 9, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E58
DEFB 22 0A 82 22 0A 82
Error code 21: GAT write error
Word numbers 34, 10, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E5B
DEFB 23 09 82 23 09 82
Error code 22: HIT read error
Word numbers 35, 9, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E5E
DEFB 23 0A 82 23 0A 82
Error code 23: HIT write error
Word numbers 35, 10, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E61
DEFB 1A 0C 2D D0 1A 0C 2D D0
Error code 24: file not in directory
Word numbers 26, 12, 45, 16 from the dictionary at 5088H; the final byte D0H has bit 7 set to end the message.
4E65
DEFB 1A 2E F1 1A 2E F1
Error code 25: file access denied
Word numbers 26, 46, 49 from the dictionary at 5088H; the final byte F1H has bit 7 set to end the message.
4E68
DEFB 2F 37 0A 16 D3 2F 37 0A 16 D3
Error code 26: full or write protected disk
Word numbers 47, 55, 10, 22, 19 from the dictionary at 5088H; the final byte D3H has bit 7 set to end the message.
4E6D
DEFB 13 27 AF 13 27 AF
Error code 27: disk space full
Word numbers 19, 39, 47 from the dictionary at 5088H; the final byte AFH has bit 7 set to end the message.
4E70
DEFB 1C 1D 1A A0 1C 1D 1A A0
Error code 28: end of file encountered
Word numbers 28, 29, 26, 32 from the dictionary at 5088H; the final byte A0H has bit 7 set to end the message.
4E74
DEFB 1B 19 1E 1D 9F 1B 19 1E 1D 9F
Error code 29: record number out of range
Word numbers 27, 25, 30, 29, 31 from the dictionary at 5088H; the final byte 9FH has bit 7 set to end the message.
4E79
DEFB 10 2F 34 9A 10 2F 34 9A
Error code 30: directory full - can't extend file
Word numbers 16, 47, 52, 26 from the dictionary at 5088H; the final byte 9AH has bit 7 set to end the message.
4E7D
DEFB 32 0C EC 32 0C EC
Error code 31: program not found
Word numbers 50, 12, 44 from the dictionary at 5088H; the final byte ECH has bit 7 set to end the message.
4E80
DEFB 17 30 D9 17 30 D9
Error code 32: illegal drive number
Word numbers 23, 48, 25 from the dictionary at 5088H; the final byte D9H has bit 7 set to end the message.
4E83
DEFB 01 2A 27 F3 01 2A 27 F3
Error code 33: no device space available
Word numbers 1, 42, 39, 51 from the dictionary at 5088H; the final byte F3H has bit 7 set to end the message.
4E87
DEFB 26 1A 2B 82 26 1A 2B 82
Error code 34: load file format error
Word numbers 38, 26, 43, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4E8B
DEFB 11 95 11 95
Error code 35: memory fault
Word numbers 17, 21 from the dictionary at 5088H; the final byte 95H has bit 7 set to end the message.
4E8D
DEFB 0D 26 09 28 91 0D 26 09 28 91
Error code 36: attempted to load read only memory
Word numbers 13, 38, 9, 40, 17 from the dictionary at 5088H; the final byte 91H has bit 7 set to end the message.
4E92
DEFB 17 2E 0D 16 9A 17 2E 0D 16 9A
Error code 37: illegal access attempted to protected file
Word numbers 23, 46, 13, 22, 26 from the dictionary at 5088H; the final byte 9AH has bit 7 set to end the message.
4E97
DEFB 1A 0C F5 1A 0C F5
Error code 38: file not open
Word numbers 26, 12, 53 from the dictionary at 5088H; the final byte F5H has bit 7 set to end the message.
4E9A
DEFB 2A 2D B6 2A 2D B6
Error code 39: device in use
Word numbers 42, 45, 54 from the dictionary at 5088H; the final byte B6H has bit 7 set to end the message.
4E9D
DEFB 16 0F AA 16 0F AA
Error code 40: protected system device
Word numbers 22, 15, 42 from the dictionary at 5088H; the final byte AAH has bit 7 set to end the message.
4EA0
DEFB 25 02 A1 25 02 A1
Error code 41: unknown error code
Word numbers 37, 2, 33 from the dictionary at 5088H; the final byte A1H has bit 7 set to end the message.
4EA3
DEFB 25 02 A1 25 02 A1
Error code 42: unknown error code
Word numbers 37, 2, 33 from the dictionary at 5088H; the final byte A1H has bit 7 set to end the message.
4EA6
DEFB 25 02 A1 25 02 A1
Error code 43: unknown error code
Word numbers 37, 2, 33 from the dictionary at 5088H; the final byte A1H has bit 7 set to end the message.
4EA9
DEFB 14 82 14 82
Error code 44: parameter error
Word numbers 20, 2 from the dictionary at 5088H; the final byte 82H has bit 7 set to end the message.
4EAB
DEFB 25 02 A1 25 02 A1
Error code 45: unknown error code
Word numbers 37, 2, 33 from the dictionary at 5088H; the final byte A1H has bit 7 set to end the message.

4EAEH - @ERROR Service Entry, Option Decode and Display Gating

Entry from the JP at 4E00H. On entry the accumulator holds the RST 28H request code (96H). The caller's own accumulator - the error number in bits 0-5, with option bits 6 and 7 - was saved on the stack by the resident dispatcher and is recovered here. The resident SYS1 status byte at 4758H can force message-only mode or suppress the display entirely.

4EAE
AND 70H E6 70
Isolate bits 6-4 of the request code (96H) in register A, selecting the @ERROR sub-function. The result is 10H, which is non-zero.
4EB0
RET Z C8
If bits 6-4 of the request code are all zero there is nothing for this overlay to do, so return to the resident dispatcher. For code 96H the result is 10H (non-zero), so execution continues.
4EB1
EX (SP),HL E3
Exchange register pair HL with the word on top of the stack. HL now holds the caller's return address; the caller's original HL is left on the stack.
4EB2
LD (4F64H),HL 22 64 4F
Self-Modifying Code
Store the caller's return address (register pair HL) into the two operand bytes of the JP M instruction at 4F63H (operand at 4F64H-4F65H). On the return-to-caller path the JP M will jump here.
4EB5
POP HL E1
Restore the caller's original HL (the value left on the stack by the exchange at 4EB1H) back into register pair HL.
4EB6
POP AF F1
Pop the caller's saved AF from the stack. Register A now holds the caller's error code: bits 0-5 are the error number, bit 6 requests message-only output, and bit 7 (tested at 4F62H) selects return-to-caller versus abort-to-DOS.
4EB7
PUSH HL E5
Save the caller's HL on the stack so all caller registers can be restored on exit.
4EB8
PUSH DE D5
Save the caller's DE on the stack.
4EB9
PUSH BC C5
Save the caller's BC on the stack.
4EBA
LD B,A 47
Copy the caller's error code (register A) into register B for the flag manipulation that follows.
4EBB
LD A,(430FH) 3A 0F 43
Load register A with the resident system flag byte at 430FH.
4EBE
AND 40H E6 40
Keep only bit 6 of the system flag byte in register A - the system's message-only control bit.
4EC0
XOR B A8
Exclusive-OR with the caller's error code in register B.
4EC1
AND B A0
AND with the caller's error code in register B. Together with the preceding XOR, this clears bit 6 of the caller's code when the system flag bit 6 is set, and leaves the caller's code otherwise; the result is the effective code.
4EC2
LD B,A 47
Store the effective code back into register B.
4EC3
PUSH AF F5
Save the effective code (register A) and flags on the stack for later reuse when framing and displaying the message.
4EC4
AND 3FH E6 3F
Mask register A to bits 0-5, leaving just the error number (0-63).
4EC6
LD C,A 4F
Copy the error number into register C, where the decompression code expects it.
4EC7
LD HL,4758H 21 58 47
Point register pair HL at the resident SYS1 status byte at 4758H, which gates error display.
4ECA
BIT 6,(HL) CB 76
Test bit 6 of the SYS1 status byte at 4758H (the whole error display is disabled when set).
4ECC
If bit 6 of the SYS1 status byte at 4758H is set, skip building and displaying the message entirely and jump to the exit path at 4F5EH.
4ECF
BIT 7,(HL) CB 7E
Test bit 7 of the SYS1 status byte at 4758H (message built but not displayed when set).
4ED1
If bit 7 of the SYS1 status byte at 4758H is set, jump to 4ED8H to force message-only mode.
4ED3
LD DE,4200H 11 00 42
Point register pair DE at the resident shared buffer at 4200H, where the message text will be assembled.
4ED6
Skip the message-only forcing and continue at 4EDEH.
4ED8
SET 6,B CB F0
Message-Only Path
Set bit 6 of the effective code in register B, forcing message-only mode (suppresses the 'Error code =NN' prefix and the device/file and referenced-at lines).
4EDA
POP AF F1
Recover the saved effective code (register A) from the stack so its bit 6 can be set to match register B.
4EDB
SET 6,A CB F7
Set bit 6 of the effective code in register A.
4EDD
PUSH AF F5
Save the updated effective code and flags back on the stack.
4EDE
BIT 6,B CB 70
Test bit 6 of the effective code in register B - the message-only flag.
4EE0
LD B,00H 06 00
Set register B to 0 so it forms the high byte of BC when BC is used as an index (register C holds the error number).
4EE2
If message-only mode is selected (bit 6 of the effective code set), skip the 'Error code =NN' prefix and jump straight to the decompression loop at 4F02H.

4EE4H - Error-Code Prefix Builder

Reached only when message-only mode is off. Copies the '*** Error code =' literal into the work buffer, then converts the error number to two decimal digits followed by a comma and a space, producing '*** Error code =NN, '.

4EE4
PUSH BC C5
Save BC (register C holds the error number) across the block copy that follows.
4EE5
LD HL,500DH 21 0D 50
Point register pair HL at the message prefix literal at 500DH ('*** Error code =').
4EE8
LD C,11H 0E 11
Load register C with 17, the length of the prefix literal to copy.
4EEA
LDIR ED B0
Block-copy the 17-byte prefix literal from (HL)=500DH into the work buffer at (DE), advancing both pointers; register pair DE ends just past the '=' character.
4EEC
POP BC C1
Restore BC; register C again holds the error number.
4EED
EX DE,HL EB
Exchange DE and HL so register pair HL points at the current end of the buffer (just past '=') for writing the decimal digits.
4EEE
LD C,A 4F
(Register A currently holds the error number from the AND 3FH.) Not used further here; register C already holds the error number for the count logic below.
4EEF
LD (HL),2FH 36 2F
Initialize the tens-digit position in the buffer to 2FH ('/'), one below ASCII '0', so the increment loop can build the tens digit.
4EF1
INC (HL) 34
Tens-Digit Loop
Increment the tens-digit character in the buffer. Each pass raises it toward the correct ASCII digit as ten is repeatedly subtracted from register A.
4EF2
SUB 0AH D6 0A
Subtract 10 from the error number in register A.
4EF4
While the subtraction did not borrow (register A still >= 0), loop back to 4EF1H to bump the tens digit again.
4EF6
INC L 2C
Advance the buffer pointer (register L) to the units-digit position.
4EF7
ADD A,3AH C6 3A
Register A holds the remainder minus 10 (a negative value from the final subtraction); adding 3AH converts it to the ASCII units digit ('0'-'9').
4EF9
LD (HL),A 77
Store the ASCII units digit (register A) into the buffer.
4EFA
INC L 2C
Advance the buffer pointer (register L) past the units digit.
4EFB
LD (HL),2CH 36 2C
Store a comma (2CH) after the number in the buffer.
4EFD
INC L 2C
Advance the buffer pointer (register L).
4EFE
LD (HL),20H 36 20
Store a space (20H) after the comma in the buffer, giving '*** Error code =NN, '.
4F00
INC L 2C
Advance the buffer pointer (register L) past the space.
4F01
EX DE,HL EB
Exchange DE and HL so register pair DE again points at the current buffer end, ready for the decompressed message text.

4F02H - Message Decompression Loop

Reached with register C holding the error number and register pair DE pointing at the buffer position for the message text. Looks up the error's definition, then for each word number copies the matching dictionary word into the buffer followed by a space.

4F02
LD A,2DH 3E 2D
Load register A with 45 (2DH), the highest valid error number, to clamp the request.
4F04
CP C B9
Compare 45 (register A) against the error number in register C.
4F05
PUSH DE D5
Save the buffer write pointer (register pair DE) on the stack; it is recovered at 4F33H to locate the start of the message for capitalization.
4F06
If 45 >= the error number (register C is in range), keep it and jump to 4F09H.
4F08
LD C,A 4F
Otherwise clamp an out-of-range error number to 45 (register A) in register C.
4F09
LD HL,505AH 21 5A 50
Point register pair HL at the error-code index table at 505AH.
4F0C
ADD HL,BC 09
Add the error number (register pair BC, B=0) to the table base, so HL points at this error's index byte.
4F0D
LD L,(HL) 6E
Load register L with the index byte - the offset within the 4E00H page at which this error's definition begins.
4F0E
LD H,4EH 26 4E
Set register H to 4EH so register pair HL now points at the error's definition bytes in the 4E00H page (base 4E00H plus the offset).
4F10
LD A,(HL) 7E
Per-Word Loop
Load register A with the current definition byte (bits 0-5 = word number, bit 7 = last word).
4F11
AND 3FH E6 3F
Mask register A to bits 0-5, leaving the dictionary word number (0-55).
4F13
LD B,A 47
Copy the word number into register B as the count of words to skip over in the dictionary.
4F14
PUSH HL E5
Save the definition pointer (register pair HL) while the dictionary is scanned.
4F15
LD HL,5088H 21 88 50
Point register pair HL at the start of the word dictionary at 5088H.
4F18
LD A,(HL) 7E
Skip-Words Loop
Load register A with a dictionary byte to test for the end-of-word marker.
4F19
RLCA 07
Rotate register A left so its old bit 7 (the end-of-word marker) lands in the carry flag.
4F1A
INC HL 23
Advance the dictionary pointer (register pair HL) to the next character.
4F1B
If the carry is clear the character was not the end of a word, so continue scanning at 4F18H.
4F1D
DEC B 05
One whole word has been skipped; decrement the word-skip count in register B.
4F1E
If more words remain to be skipped (register B non-zero), continue the skip loop at 4F18H. When it reaches zero, register pair HL points at the first character of the requested word.
4F20
LD A,(HL) 7E
Copy-Word Loop
Load register A with the next character of the requested dictionary word.
4F21
RLCA 07
Rotate register A left so its bit 7 (end-of-word marker) lands in the carry flag.
4F22
SRL A CB 3F
Shift register A right, discarding the marker bit and restoring the plain 7-bit ASCII character.
4F24
LD (DE),A 12
Store the character (register A) into the message buffer at (DE).
4F25
INC HL 23
Advance the dictionary pointer (register pair HL).
4F26
INC DE 13
Advance the buffer write pointer (register pair DE).
4F27
If this was not the last character of the word (carry clear), copy the next character at 4F20H.
4F29
LD A,20H 3E 20
Load register A with a space (20H) to separate this word from the next.
4F2B
LD (DE),A 12
Store the separating space into the buffer at (DE).
4F2C
INC DE 13
Advance the buffer write pointer (register pair DE) past the space.
4F2D
POP HL E1
Restore the definition pointer (register pair HL) saved at 4F14H.
4F2E
LD A,(HL) 7E
Re-load the definition byte just processed (register A) to test its last-word marker.
4F2F
INC HL 23
Advance the definition pointer (register pair HL) to the next word number.
4F30
RLCA 07
Rotate register A left so bit 7 (the last-word marker) lands in the carry flag.
4F31
If this was not the last word of the message (carry clear), loop back to 4F10H for the next word number.

4F33H - Frame and Display the Message

The message text is now in the buffer with a trailing space. This block capitalizes the first letter, optionally appends the trailing '***', terminates with a carriage return, and displays the buffer through the resident string routine at 447BH - unless SYS1 status bit 7 suppressed the display.

4F33
EX (SP),HL E3
Exchange register pair HL with the buffer start pointer saved at 4F05H, so HL points at the first character of the message text.
4F34
RES 5,(HL) CB AE
Clear bit 5 of the first character in the buffer, converting a lowercase initial letter to uppercase (capitalizing the message).
4F36
POP HL E1
Discard the exchanged value from the stack, restoring the stack pointer.
4F37
POP AF F1
Recover the effective code (register A) and flags saved at 4EC3H/4EDDH.
4F38
PUSH AF F5
Save the effective code again for the device/file decision that follows.
4F39
PUSH HL E5
Save the buffer start pointer (register pair HL) on the stack across the display so it can be recovered at 4F56H.
4F3A
BIT 6,A CB 77
Test bit 6 of the effective code in register A - the message-only flag.
4F3C
If message-only mode is selected, skip appending the trailing '***' and jump to 4F46H.
4F3E
LD HL,500EH 21 0E 50
Point register pair HL at the three '*' characters at 500EH.
4F41
LD BC,0003H 01 03 00
Load register pair BC with 3, the number of '*' characters to append.
4F44
LDIR ED B0
Block-copy the three '*' characters from (HL)=500EH into the buffer at (DE); combined with the trailing space from the last word this yields ' ***'.
4F46
LD A,0DH 3E 0D
Load register A with a carriage return (0DH) to terminate the assembled message.
4F48
LD (DE),A 12
Store the carriage return into the buffer at (DE), ending the message string.
4F49
LD HL,4758H 21 58 47
Point register pair HL at the resident SYS1 status byte at 4758H.
4F4C
BIT 7,(HL) CB 7E
Test bit 7 of the SYS1 status byte at 4758H - the display-suppress flag - which sets the zero flag when clear.
4F4E
RES 7,(HL) CB BE
Clear bit 7 of the SYS1 status byte at 4758H so the one-shot display-suppress request does not persist.
4F50
LD HL,4200H 21 00 42
Point register pair HL at the assembled message in the resident buffer at 4200H, as the argument for the display routine.
4F53
If bit 7 of the SYS1 status byte was clear (zero flag set), call the resident SYS0 routine at 447BH to display the carriage-return-terminated message at 4200H. If display was suppressed, skip the call.
4F56
POP HL E1
Recover the buffer start pointer saved earlier from the stack.
4F57
POP AF F1
Recover the effective code (register A) and flags for the device/file decision.
4F58
PUSH AF F5
Save the effective code again for the final return/abort test at 4F62H.
4F59
BIT 6,A CB 77
Test bit 6 of the effective code in register A - the message-only flag.
4F5B
If message-only mode is off (bit 6 clear), call 4F69H to build and display the '<Device=...>' or '<File=...>' line and the 'Referenced at' line.
4F5E
POP AF F1
Exit Path
Recover the effective code (register A) whose bit 7 decides return versus abort. Also reached from 4ECCH when display was disabled.
4F5F
POP BC C1
Restore the caller's BC from the stack.
4F60
POP DE D1
Restore the caller's DE from the stack.
4F61
POP HL E1
Restore the caller's HL from the stack.
4F62
OR A B7
Set the flags from the effective code in register A without changing it, so its bit 7 (return flag) sets the sign flag.
4F63
JP M,0000H FA 00 00
Self-Modifying Code
If bit 7 of the code is set (sign flag minus), jump to the caller's return address. The 0000H operand shown here is a placeholder; it was overwritten at 4EB2H with the caller's actual return address.
4F66
Otherwise (bit 7 clear), the error is fatal to the request: jump to the resident @ABORT entry at 4030H to return control to DOS.

4F69H - Device / File Specification Builder

Called when the full framing is wanted. Uses the resident pointer at 430AH to the control block of the object that failed. For a logical device it patches the '*XX' name into the Device template; for an open disk file it reads the directory record and builds NAME/EXT:D into the File template. Then it appends the 'Referenced at' line.

4F69
PUSH IX DD E5
Save register IX (the caller's index register) on the stack.
4F6B
LD IX,(430AH) DD 2A 0A 43
Load register IX from the resident variable at 430AH - the address of the file/device control block that the failing service was operating on.
4F6F
DEC HL 2B
(HL points just past the displayed message.) Decrement register pair HL to re-address the last flag byte for the bit test that follows.
4F70
BIT 6,(HL) CB 76
Test bit 6 at (HL) to distinguish a device control block from a file control block.
4F72
If bit 6 indicates a device-style control block, jump to 4F8BH to handle a logical device.
4F74
LD C,(IX+06H) DD 4E 06
Load register C with the byte at offset 06H of the control block (register IX) - the drive number for a disk file, or the first name character for a device.
4F77
LD B,(IX+07H) DD 46 07
Load register B with the byte at offset 07H of the control block (register IX) - the directory record number for a disk file.
4F7A
BIT 7,(IX+00H) DD CB 00 7E
Test bit 7 of the control-block type byte at offset 00H (register IX); set indicates an open disk file.
4F7E
If the control block is an open disk file, jump to 4FB0H to build the File specification from the directory.
4F80
POP IX DD E1
Device Name Path
Restore the caller's register IX from the stack.
4F82
LD (5028H),BC ED 43 28 50
Self-Modifying Code
Store the two-character device name (registers B and C) into the '*XX' field of the Device template at 5028H-5029H.
4F86
LD HL,501EH 21 1E 50
Point register pair HL at the ' <Device=*XX>' template at 501EH.
4F89
Jump to 4FF7H to display the completed device line and then the 'Referenced at' line.
4F8B
LD C,(IX+01H) DD 4E 01
Device Control Block
Load register C with the byte at offset 01H of the control block (register IX) - the first character of a logical-device name.
4F8E
LD B,(IX+02H) DD 46 02
Load register B with the byte at offset 02H of the control block (register IX) - the second character of the device name.
4F91
LD A,(IX+00H) DD 7E 00
Load register A with the control-block type byte at offset 00H (register IX).
4F94
CP 2AH FE 2A
Compare the type byte (register A) with 2AH ('*'), the marker of a closed logical-device specification.
4F96
If the block is a '*'-style device specification, jump back to 4F80H to emit its name into the Device template.
4F98
PUSH IX DD E5
Otherwise treat the control block itself as a text device name: save register IX.
4F9A
POP HL E1
Pop that saved IX value into register pair HL, so HL points at the control block as a source string.
4F9B
LD DE,5033H 11 33 50
Point register pair DE at the name field (5033H) inside the File template, used here as scratch for the device text.
4F9E
LD B,18H 06 18
Load register B with 24 (18H) as the maximum number of characters to copy.
4FA0
LD A,(HL) 7E
Device-Text Copy Loop
Load register A with the next character of the device-name text at (HL).
4FA1
CP 03H FE 03
Compare the character (register A) with 03H, an end-of-text terminator.
4FA3
If the terminator (03H) is reached, jump to 4FEBH to finish the specification.
4FA5
CP 0DH FE 0D
Compare the character (register A) with 0DH, a carriage-return terminator.
4FA7
If a carriage return terminates the name, jump to 4FEBH to finish the specification.
4FA9
INC HL 23
Advance the source pointer (register pair HL).
4FAA
LD (DE),A 12
Store the character (register A) into the template scratch area at (DE).
4FAB
INC DE 13
Advance the destination pointer (register pair DE).
4FAC
Decrement register B and, if characters remain, loop back to 4FA0H.
4FAE
When the 24-character limit is reached, jump to 4FEBH to finish the specification.
4FB0
LD C,(IX+06H) DD 4E 06
Disk File Path
Load register C with the drive number at offset 06H of the file control block (register IX).
4FB3
LD B,(IX+07H) DD 46 07
Load register B with the directory record number at offset 07H of the file control block (register IX).
4FB6
Call the resident SYS0 routine DIRRD at 4B10H to read the directory record for record number B on drive C; on return register pair HL points at the 32-byte directory record.
4FB9
LD BC,0005H 01 05 00
Load register pair BC with 5 - the offset of the 8-character file name within the directory record.
4FBC
ADD HL,BC 09
Advance register pair HL by 5 so it points at the file name inside the directory record.
4FBD
LD DE,5033H 11 33 50
Point register pair DE at the name field (5033H) of the '<File=NNNNNNNN/EEE:D>' template.
4FC0
LD B,08H 06 08
Load register B with 8 - the length of the file-name field.
4FC2
LD A,(HL) 7E
Name Copy Loop
Load register A with the next file-name character from the directory record at (HL).
4FC3
CP 20H FE 20
Compare the character (register A) with a space (20H), which pads the fixed-length name.
4FC5
If a space (padding) is reached, stop copying the name and jump to 4FCCH.
4FC7
INC L 2C
Advance the directory pointer (register L).
4FC8
LD (DE),A 12
Store the name character (register A) into the template at (DE).
4FC9
INC DE 13
Advance the template pointer (register pair DE).
4FCA
Decrement register B and, if name characters remain, loop back to 4FC2H.
4FCC
LD A,2FH 3E 2F
Load register A with '/' (2FH) to separate the name from the extension.
4FCE
LD (DE),A 12
Store '/' into the template at (DE).
4FCF
INC DE 13
Advance the template pointer (register pair DE).
4FD0
LD C,B 48
Copy the remaining name count (register B) into register C to skip any unused name bytes.
4FD1
LD B,00H 06 00
Clear register B so BC is a byte count.
4FD3
ADD HL,BC 09
Advance register pair HL past any unused name bytes so it points at the 3-character extension field.
4FD4
LD B,03H 06 03
Load register B with 3 - the length of the extension field.
4FD6
LD A,(HL) 7E
Extension Copy Loop
Load register A with the next extension character from the directory record at (HL).
4FD7
INC L 2C
Advance the directory pointer (register L) to the next extension character.
4FD8
CP 20H FE 20
Compare the character (register A) with a space (20H), which pads the extension.
4FDA
If a padding space is reached, stop copying the extension and jump to 4FE0H.
4FDC
LD (DE),A 12
Store the extension character (register A) into the template at (DE).
4FDD
INC DE 13
Advance the template pointer (register pair DE).
4FDE
Decrement register B and, if extension characters remain, loop back to 4FD6H.
4FE0
LD A,3AH 3E 3A
Load register A with ':' (3AH) to separate the extension from the drive digit.
4FE2
LD (DE),A 12
Store ':' into the template at (DE).
4FE3
INC DE 13
Advance the template pointer (register pair DE).
4FE4
LD A,(IX+06H) DD 7E 06
Load register A with the drive number at offset 06H of the file control block (register IX).
4FE7
ADD A,30H C6 30
Add 30H to the drive number to convert it to an ASCII digit.
4FE9
LD (DE),A 12
Store the ASCII drive digit into the template at (DE).
4FEA
INC DE 13
Advance the template pointer (register pair DE).
4FEB
LD A,3EH 3E 3E
Close the Specification
Load register A with '>' (3EH) to close the '<Device=...>' or '<File=...>' field.
4FED
LD (DE),A 12
Store '>' into the template at (DE).
4FEE
INC DE 13
Advance the template pointer (register pair DE).
4FEF
LD A,0DH 3E 0D
Load register A with a carriage return (0DH) to terminate the specification string.
4FF1
LD (DE),A 12
Store the carriage return into the template at (DE).
4FF2
POP IX DD E1
Restore the caller's register IX from the stack.
4FF4
LD HL,502CH 21 2C 50
Point register pair HL at the ' <File=NNNNNNNN/EEE:D>' template at 502CH for display.

4FF7H - Referenced-At Address Line

Displays the device or file specification, then converts the saved caller address at 430CH to four hex digits and displays the 'Referenced at X'NNNN'' line before returning.

4FF7
Call the resident SYS0 routine at 447BH to display the carriage-return-terminated device or file specification pointed to by register pair HL. (Also entered from 4F89H for the device path.)
4FFA
LD DE,(430CH) ED 5B 0C 43
Load register pair DE from the resident variable at 430CH - the address recorded by the supervisor as the point from which the failing service was called.
4FFE
DEC DE 1B
Decrement register pair DE to step back over the RST 28H call so it points at the calling instruction.
4FFF
DEC DE 1B
Decrement register pair DE again.
5000
DEC DE 1B
Decrement register pair DE a third time, leaving the address of the instruction that made the failing call in DE.
5001
LD HL,5054H 21 54 50
Point register pair HL at the four-character 'NNNN' field within the 'Referenced at X''NNNN''' template at 5054H.
5004
Call the resident SYS0 routine at 4D76H to convert the address in register pair DE to four hexadecimal ASCII digits and store them at (HL)=5054H, filling in the 'NNNN' field.
5007
LD HL,5043H 21 43 50
Point register pair HL at the start of the ' Referenced at X''NNNN''' line at 5043H.
500A
Jump to the resident SYS0 routine at 447BH to display the completed 'Referenced at' line; that routine's RET returns to the caller of this builder.

500DH - Message Template Literals

Data. The fixed text fragments the display code copies or fills in. Bytes shown are the raw literal; the 'NN', '*XX', 'NNNNNNNN/EEE:D' and 'NNNN' fields are overwritten at run time. (The disassembler mis-reads these as instructions.)

500D
DEFM "\n*** Error code =" 0A 2A 2A 2A 20 45 72 72 6F 72 20 63 6F 64 65 20 3D
'\n*** Error code =' - the prefix copied into the work buffer at 4EE5H (the error number is appended after the '=').
501E
DEFM " <Device=*XX>\r" 20 3C 44 65 76 69 63 65 3D 2A 58 58 3E 0D
' <Device=*XX>' plus a carriage return - the logical-device template; the '*XX' at 5028H is overwritten with the device name.
502C
DEFM " <File=NNNNNNNN/EEE:D>\r" 20 3C 46 69 6C 65 3D 4E 4E 4E 4E 4E 4E 4E 4E 2F 45 45 45 3A 44 3E 0D
' <File=NNNNNNNN/EEE:D>' plus a carriage return - the disk-file template; the name, extension and drive digit are filled from the directory record.
5043
DEFM " Referenced at X'NNNN'\r" 20 52 65 66 65 72 65 6E 63 65 64 20 61 74 20 58 27 4E 4E 4E 4E 27 0D
' Referenced at X''NNNN''' plus a carriage return - the caller-address line; the 'NNNN' at 5054H is overwritten with the hexadecimal call address.

505AH - Error-Code Index Table

Data. One byte per error code (0 through 45). Each byte is the offset within the 4E00H page at which that error's definition begins (base 4E00H). The decompression loop indexes this table with the error number at 4F09H.

505A
DEFB 03 05 0A 0E 12 16 1C 21 26 29 03 05 0A 0E 12 16 1C 21 26 29
Definition offsets for error codes 0 through 9 (each value is added to 4E00H to locate the message definition).
5064
DEFB 2E 32 36 3A 40 45 48 4C 4F 52 2E 32 36 3A 40 45 48 4C 4F 52
Definition offsets for error codes 10 through 19 (each value is added to 4E00H to locate the message definition).
506E
DEFB 55 58 5B 5E 61 65 68 6D 70 74 55 58 5B 5E 61 65 68 6D 70 74
Definition offsets for error codes 20 through 29 (each value is added to 4E00H to locate the message definition).
5078
DEFB 79 7D 80 83 87 8B 8D 92 97 9A 79 7D 80 83 87 8B 8D 92 97 9A
Definition offsets for error codes 30 through 39 (each value is added to 4E00H to locate the message definition).
5082
DEFB 9D A0 A3 A6 A9 AB 9D A0 A3 A6 A9 AB
Definition offsets for error codes 40 through 45 (each value is added to 4E00H to locate the message definition).

5088H - Compressed Word Dictionary

Data. The 56 English words shared by all messages. Each word's final character carries bit 7 (80H) set to mark the end of the word; the decompression loop uses that marker to count and copy words. (The disassembler mis-reads these as instructions.)

5088
DEFM "R" D2
Word 0: R
The final byte D2H is the character 'R' with bit 7 set to mark the end of the word.
5089
DEFM "no" 6E EF
Word 1: no
The final byte EFH is the character 'o' with bit 7 set to mark the end of the word.
508B
DEFM "error" 65 72 72 6F F2
Word 2: error
The final byte F2H is the character 'r' with bit 7 set to mark the end of the word.
5090
DEFM "o" EF
Word 3: o
The final byte EFH is the character 'o' with bit 7 set to mark the end of the word.
5091
DEFM "parity" 70 61 72 69 74 F9
Word 4: parity
The final byte F9H is the character 'y' with bit 7 set to mark the end of the word.
5097
DEFM "during" 64 75 72 69 6E E7
Word 5: during
The final byte E7H is the character 'g' with bit 7 set to mark the end of the word.
509D
DEFM "header" 68 65 61 64 65 F2
Word 6: header
The final byte F2H is the character 'r' with bit 7 set to mark the end of the word.
50A3
DEFM "data" 64 61 74 E1
Word 7: data
The final byte E1H is the character 'a' with bit 7 set to mark the end of the word.
50A7
DEFM "seek" 73 65 65 EB
Word 8: seek
The final byte EBH is the character 'k' with bit 7 set to mark the end of the word.
50AB
DEFM "read" 72 65 61 E4
Word 9: read
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
50AF
DEFM "write" 77 72 69 74 E5
Word 10: write
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
50B4
DEFM "lost" 6C 6F 73 F4
Word 11: lost
The final byte F4H is the character 't' with bit 7 set to mark the end of the word.
50B8
DEFM "not" 6E 6F F4
Word 12: not
The final byte F4H is the character 't' with bit 7 set to mark the end of the word.
50BB
DEFM "attempted to" 61 74 74 65 6D 70 74 65 64 20 74 EF
Word 13: attempted to
The final byte EFH is the character 'o' with bit 7 set to mark the end of the word.
50C7
DEFM "locked/deleted" 6C 6F 63 6B 65 64 2F 64 65 6C 65 74 65 E4
Word 14: locked/deleted
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
50D5
DEFM "system" 73 79 73 74 65 ED
Word 15: system
The final byte EDH is the character 'm' with bit 7 set to mark the end of the word.
50DB
DEFM "directory" 64 69 72 65 63 74 6F 72 F9
Word 16: directory
The final byte F9H is the character 'y' with bit 7 set to mark the end of the word.
50E4
DEFM "memory" 6D 65 6D 6F 72 F9
Word 17: memory
The final byte F9H is the character 'y' with bit 7 set to mark the end of the word.
50EA
DEFM "on" 6F EE
Word 18: on
The final byte EEH is the character 'n' with bit 7 set to mark the end of the word.
50EC
DEFM "disk" 64 69 73 EB
Word 19: disk
The final byte EBH is the character 'k' with bit 7 set to mark the end of the word.
50F0
DEFM "parameter" 70 61 72 61 6D 65 74 65 F2
Word 20: parameter
The final byte F2H is the character 'r' with bit 7 set to mark the end of the word.
50F9
DEFM "fault" 66 61 75 6C F4
Word 21: fault
The final byte F4H is the character 't' with bit 7 set to mark the end of the word.
50FE
DEFM "protected" 70 72 6F 74 65 63 74 65 E4
Word 22: protected
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
5107
DEFM "illegal" 69 6C 6C 65 67 61 EC
Word 23: illegal
The final byte ECH is the character 'l' with bit 7 set to mark the end of the word.
510E
DEFM "logical" 6C 6F 67 69 63 61 EC
Word 24: logical
The final byte ECH is the character 'l' with bit 7 set to mark the end of the word.
5115
DEFM "number" 6E 75 6D 62 65 F2
Word 25: number
The final byte F2H is the character 'r' with bit 7 set to mark the end of the word.
511B
DEFM "file" 66 69 6C E5
Word 26: file
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
511F
DEFM "record" 72 65 63 6F 72 E4
Word 27: record
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
5125
DEFM "end" 65 6E E4
Word 28: end
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
5128
DEFM "of" 6F E6
Word 29: of
The final byte E6H is the character 'f' with bit 7 set to mark the end of the word.
512A
DEFM "out" 6F 75 F4
Word 30: out
The final byte F4H is the character 't' with bit 7 set to mark the end of the word.
512D
DEFM "range" 72 61 6E 67 E5
Word 31: range
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
5132
DEFM "encountered" 65 6E 63 6F 75 6E 74 65 72 65 E4
Word 32: encountered
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
513D
DEFM "code" 63 6F 64 E5
Word 33: code
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
5141
DEFM "GAT" 47 41 D4
Word 34: GAT
The final byte D4H is the character 'T' with bit 7 set to mark the end of the word.
5144
DEFM "HIT" 48 49 D4
Word 35: HIT
The final byte D4H is the character 'T' with bit 7 set to mark the end of the word.
5147
DEFM "y" F9
Word 36: y
The final byte F9H is the character 'y' with bit 7 set to mark the end of the word.
5148
DEFM "unknown" 75 6E 6B 6E 6F 77 EE
Word 37: unknown
The final byte EEH is the character 'n' with bit 7 set to mark the end of the word.
514F
DEFM "load" 6C 6F 61 E4
Word 38: load
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
5153
DEFM "space" 73 70 61 63 E5
Word 39: space
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
5158
DEFM "only" 6F 6E 6C F9
Word 40: only
The final byte F9H is the character 'y' with bit 7 set to mark the end of the word.
515C
DEFM "name" 6E 61 6D E5
Word 41: name
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
5160
DEFM "device" 64 65 76 69 63 E5
Word 42: device
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
5166
DEFM "format" 66 6F 72 6D 61 F4
Word 43: format
The final byte F4H is the character 't' with bit 7 set to mark the end of the word.
516C
DEFM "found" 66 6F 75 6E E4
Word 44: found
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
5171
DEFM "in" 69 EE
Word 45: in
The final byte EEH is the character 'n' with bit 7 set to mark the end of the word.
5173
DEFM "access" 61 63 63 65 73 F3
Word 46: access
The final byte F3H is the character 's' with bit 7 set to mark the end of the word.
5179
DEFM "full" 66 75 6C EC
Word 47: full
The final byte ECH is the character 'l' with bit 7 set to mark the end of the word.
517D
DEFM "drive" 64 72 69 76 E5
Word 48: drive
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
5182
DEFM "denied" 64 65 6E 69 65 E4
Word 49: denied
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
5188
DEFM "program" 70 72 6F 67 72 61 ED
Word 50: program
The final byte EDH is the character 'm' with bit 7 set to mark the end of the word.
518F
DEFM "available" 61 76 61 69 6C 61 62 6C E5
Word 51: available
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
5198
DEFM "- can't extend" 2D 20 63 61 6E 27 74 20 65 78 74 65 6E E4
Word 52: - can't extend
The final byte E4H is the character 'd' with bit 7 set to mark the end of the word.
51A6
DEFM "open" 6F 70 65 EE
Word 53: open
The final byte EEH is the character 'n' with bit 7 set to mark the end of the word.
51AA
DEFM "use" 75 73 E5
Word 54: use
The final byte E5H is the character 'e' with bit 7 set to mark the end of the word.
51AD
DEFM "or" 6F F2
Word 55: or
The final byte F2H is the character 'r' with bit 7 set to mark the end of the word.