MON 64B (octal) - WarningMessage (ERMSG)¶
Outputs a file-system error message for the input error code (appendix A lists the message for
each code) and then returns - the program continues. The message is written to the terminal;
for batch jobs, mode jobs, and RT programs it is written to the error device (normally the console).
Error code 0 is illegal. This is an ND-100 monitor call.
Status: GOTAB dispatch head byte-proven as fall-through (GOTAB[64B] = 000000, no per-call
stub); the ERMSG worker body is real SINTRAN L bytes (executable code, body 16714B-17020B
closing at EXIT) with two entry points - ERMSG=16714B (T:=0) and QERMS=16716B (T:=1) - and the
exact MON 64 -> worker link crosses an uncarved kernel bridge (see
Honest caveats). All addresses/values are octal.
- Full disassembly:
64B-WarningMessage.ASM- the actual code (the ERMSG worker body; there is no entry stub because the GOTAB slot is zero). - Bytes live once in the canonical segment layer:
../../segments-ref/.
Dispatch path¶
flowchart LR
A["User program<br/>MON 64B"] --> B["ENT14 level-14<br/>T = MON number"]
B --> C["GOTAB[64B] = 000000<br/>(byte-proven: fall-through)"]
C -.uncarved MFELL / CALLPROC.-> E["ERMSG error-message worker<br/>commoncode :16714B (real code)"]
E --> F["format message for ErrCode<br/>-> terminal / error device"]
class A blue
class B,C blue
class E green
class F green
classDef blue fill:#E3F2FD,stroke:#0D47A1,color:#0D47A1
classDef teal fill:#E0F7FA,stroke:#00838F,color:#00838F
classDef green fill:#E8F5E9,stroke:#2E7D32,color:#2E7D32
The GOTAB slot is zero, so there is no per-call entry stub. The dashed hop (C ⇢ E) is the
resident MFELL/CALLPROC fall-through second-level dispatch - it is not present in any carved
segment, so it is the one link that cannot be followed statically. ERMSG (E) is the named
commoncode worker for this call and is real executable code.
Code location (dispatch path)¶
Every row is a real region you can open. Byte offset = (addr - loadbase) in octal words x 2; for
commoncode (load base 0) the byte offset is simply octal-addr x 2 (decimal).
| Role | Segment (full disasm) | Addr range (octal) | Byte offset | Symbol | Verdict |
|---|---|---|---|---|---|
| GOTAB[64] dispatch word | commoncode.asm · .hex | 71317B (1 word) |
58782 | GOTAB+64 = 000000 |
VERIFIED (fall-through) |
| resident MFELL/CALLPROC bridge | - (uncarved) | - | - | CALLPROC |
UNVERIFIED |
| ERMSG worker body | commoncode.asm · .hex | 16714B-17037B (body 16714-17020 + link cells) |
15256 | ERMSG / QERMS |
real bytes = CODE; body link MISATTRIBUTED |
Verify by hand: the GOTAB slot:
grep '^71317 ' ../../segments-ref/SINTRAN-DATA_commoncode/SINTRAN-DATA_commoncode.hex
-> 71317 000000 000 000 58782 (the GOTAB word = 000000, fall-through); then
dd if=../../../resident/SINTRAN-DATA_commoncode.bin bs=1 skip=58782 count=2 2>/dev/null | od -An -tx1
-> 00 00 (= 000000, fall-through). For the ERMSG worker first word:
grep '^16714 ' ../../segments-ref/SINTRAN-DATA_commoncode/SINTRAN-DATA_commoncode.hex
-> 16714 146106 314 106 15256; then
dd if=../../../resident/SINTRAN-DATA_commoncode.bin bs=1 skip=15256 count=2 2>/dev/null | od -An -tx1
-> cc 46 (= octal 146106, ERMSG's first word - a real RADD instruction, confirming the region
is code). prove-mon.py 64 reports the same GOTAB[64]=000000 fall-through.
Instruction walkthrough¶
Full listing: 64B-WarningMessage.ASM. The functional body is the ERMSG
worker; there is no entry stub because GOTAB[64] = 0.
Dual entry (16714-16717) - ERMSG=16714B sets T:=0 (RADD CLD 0 DT) and jumps to the merge
point 16717; the secondary entry QERMS=16716B sets T:=1 (SAT 1) and falls into the same merge
point. The two entries select a message flavour (warning vs alternate), both continuing through one
shared body.
Store parameters + select source (16717-16746) - the flag and the caller error code are stored
through the worker's pointer cells (16717 STT I 102, 16722 STT I 101, 16723 STA I 101). A pair
of JAF/JAZ tests then chooses the message source and format path, calling the format/lookup
workers via indirect JPL I through the trailing link cells (16731 JPL I 76 -> 17027,
16737 JPL I 72 -> 17031, 16742 JPL I 70 -> 17032).
Format + output + return (16747-17020) - 16750 JPL I 63 -> 17033 and 16753 JPL I 62 -> 17035
format the message text; the 16766-17011 block (JAZ tests, STATX) routes the output to the
correct device, and the routine restores context and returns at 17020 EXIT. Every branch target
lands inside the region, which closes cleanly at the EXIT. Words 17021-17037 are pointer/constant
cells (link cells), not code.
Parameter / register contract¶
Manual-side names/types are from 64B_WarningMessage.yaml.
| Reg / field | Dir | Meaning | Verdict |
|---|---|---|---|
A (ErrCode) |
in | error code number of the message to print; 0 is illegal (MAC example LDA ERRNO) |
inferred (manual); stored by 16723 STA I 101 (VERIFIED as a copy) |
T (flavour) |
internal | 0 at ERMSG, 1 at QERMS - selects the message variant |
VERIFIED (bytes: 16714 RADD CLD 0 DT / 16716 SAT 1) |
| output device | out | terminal (interactive) or error device (batch / mode / RT) | inferred (manual) |
| return | out | none - the program continues (17020 EXIT) |
VERIFIED (bytes: EXIT, no program-terminate) |
The worker's register staging (the dual-entry flag, the pointer-cell parameter stores, the EXIT
return) is VERIFIED from bytes, but the mapping onto the user-visible error-code-in contract and the
device-routing policy lives in the caller-side MON 64 wrapper and the uncarved CALLPROC frame, so
that part of the contract is inferred, not byte-proven here.
Pseudo-code (for an emulator)¶
See 64B-WarningMessage.pseudo.c - a pseudo-C model of the
handler for emulator authors. The ERMSG worker body (dual entry, parameter stores, format/output,
EXIT) is byte-verified; the output-routing policy and the appendix-A message table are inferred
from the manual. The fall-through -> ERMSG bridge is modelled but not proven. Every ND-100
instruction in the model is translated per the canonical
ND100-INSTRUCTION-SEMANTICS.md.
Honest caveats¶
What is byte-proven: GOTAB[64B] = 000000 (level-14 dispatch, a fall-through with no per-call
vector; prove-mon.py 64 reads commoncode file byte 0xe59e = 00 00). The ERMSG worker body at
16714B is real code - its first word 146106B is a genuine RADD instruction, the body
(16714-17020, bounded by SEGTX=17040B) has clean, in-region control flow and returns via EXIT,
and it carries two entry points ERMSG (T=0) / QERMS=16716B (T=1).
What is NOT proven: the link from the zero GOTAB slot to the ERMSG worker. Because the vector
is zero there is no stub to disassemble and no pointer to dereference; dispatch drops into the
resident MFELL/CALLPROC second-level path, which lives in an uncarved overlay. So the
MON 64 -> ERMSG attribution rests on the ERMSG symbol name (= ERror MeSsaGe, matching the 64B
short name in the manual) + the dual-entry ERMSG/QERMS shape + the format/output behaviour, not a
followed pointer - hence MISATTRIBUTED in the strict sense (a fall-through worker attached by
name). Confirming the link needs a live trace: issue a real MON 64, single-step the level-14
fall-through into the resident CALLPROC dispatch, and confirm P lands on ERMSG=16714.
This reconciles into one story: the dispatch head (GOTAB[64]=0, fall-through) is solid; there is no
stub; and ERMSG is a real, self-contained worker whose attribution to MON 64 is by name +
behaviour, not by a followed link.
Method: ../../../../../EXTRACTING-RESIDENT-CODE.md · dispatch reality: ../../TASK-05-mismatches.md · master map: ../../MON-CALL-INDEX.md.