ENNS0 POSU startup: where "Error ... XROUT" comes from and what gates it (2026-07-23)¶
Read-only static analysis of the ND-100-side ENNS0 supervisor
(encos-err-i-b01.brf) plus the sibling message/error files and the kernel
PIOCM driver. Every claim tagged [V]=VERIFIED (decoded bytes / read source)
or [I]=INFERRED (reasoned, not byte-proven). Nothing on the wire is guessed.
Tooling: scratchpad brf_link.py (BRF linker), nd100dis.py (ND-100 disasm),
dumpstrings.py, census2.py, dumpwords.py.
TL;DR verdict (Task 5 up front)¶
The user's mechanism is structurally CORRECT: ENNS0's POSU startup drives the Ethernet controller through the kernel PIOCM driver BEFORE it registers the network-server name, and if that controller step returns a bad status, POSU aborts to its error path and never reaches the name registration. So a controller-communication failure does gate the "startup error / never-registered name" outcome.
But two important corrections to the hypothesis:
-
The gating controller step is NOT an INT12 / IDENT interrupt wait. [V] It is the kernel
PISTA(MON 255B fn 6) memory-mapped PRKEY readiness poll on PIOC DRAM word 1002B (value must becomePRKEY=052163B), 3-second timeout. The INT12/IDENT/RFT/RIE interrupt path is used for later kick/mailbox traffic (PIKIC/PIWKI), not the START readiness gate. So the emulator's "level-12 IDENT clearsinterruptEnabled(RIE)" bug is not the START gate. The relevant emulator fix point isPWCR=60B(HALT+RESET) not re-running the 68K reset vector, so PRKEY is never reposted (seeENNS0-PRKEY-FIRMWARE-FIXPOINT-2026-07-23.md). -
The literal banner "Error in communicating with XROUT" does not exist as a verbatim string in ANY of these files. [V] It is a paraphrase/composite of the real catalog strings (see section 1). The real POSU top-level is
"Error during startup."and the interface-status hints ("No answer from interface.","Interface not started.","Check if RTCOMMON is in interface memory.").
Which gate is "current" depends on run-state: the latest run
(ENNS0-XROUT-UNKNOWN-NAME-ROOTCAUSE-2026-07-23.md, 13:47) reports the card
reaching READY yet ENNS0 STILL issuing only XFOPN/XFWDF/XFDBK and no XSCRS -> a
second, downstream name-registration gate also exists. Earlier runs (PRKEY
never posted) failed at the controller-comm gate. Both are real.
1. Where the messages actually live (Task 1)¶
1a. encos-err-i-b01.brf POSU / PIOC message catalog [V]¶
dumpstrings.py over the linked image. The catalog begins at 014642 with the
POSU banner root and runs a packed sequence of PIOCM (MON 255B) status texts:
014642 ENNS0-POSU ... ENCOSS0 (banner root)
014675 Undefined MON PIOC error.
014712 No answer from interface.
014727 Insufficient priviledge. / Interface not started. / Illegal function code.
/ Slot already occupied. / Illegal slot number. / Slot is not reserved.
015031 Mailbox is not empty.
015044 Mailbox is empty.
015055 Illegal LDN. Order new SINTRAN with PIOC/Ethernet.
/ Interface not initiated. / Complete interface memory not fixed. Change size.
015153 Check if RTCOMMON is in interface memory.
015200 Illegal segment. / Check list-file from loading.
015227 Segment not loaded.
015241 Attempt to fix demand segment. / ...
[V] POSUERR (ENTR @ 001756) is a data label (a zeroed COMMON/BSS cell,
disassembly = all STZ/zero words), i.e. the POSU error-code variable, not a
routine. The formatting is done by the UEIxMSG/UEERxMSG UE-library routines
(symbols UEIDMSG/UEIFMSG/UEIOMSG/... @ 033323+).
1b. The UE catalog ue-ermsg-en-b03.err [V]¶
strings | grep:
@A Error during startup. <- the POSU top-level line
@A Unexpected status from XMSG.
@A Unexpected status from PIOCOS. Contact ND.
Error in communication with XMSG. @A
Unknown msg form XROUTE.
XROUT or File Server
+The User Environment system is not running.
?Data communication (XMSG) error in the User Environment system.
"Error in communication with XMSG.", "Unknown msg form XROUTE.",
"XROUT or File Server". The banner as quoted is a paraphrase; treat the actual
runtime line as one of these + "Error during startup.".
1c. The getMagic / XROUT ID strings are a TRACE-LOG table, not the builder¶
[V] At 021063 (" XROUT ID ", " subfunction getMagic", "**SUBFUNCTION
UNKNOWN**", " MONTR ID ") - this is a message/format label table for the
COSMOS server trace viewer (consistent with the prior finding
enns0-getmagic-trace-vs-builder, 2026-07-07). It is NOT the code that builds an
XROUT request. Do not treat "getMagic" as the failing call.
2. The POSU startup sequence and where the error path forks (Task 2)¶
[V] census2.py: the whole linked ENNS0 image has IOX=0, IOXT=0 and exactly
MON 200 x2 and MON 255 x10. So:
- ENNS0 never touches the controller status/control register directly.
- All XMSG goes through two MON 200 sites (030230 SAT 0;MON 200, 030233
SAT 1;MON 200) = a shared XMSG wrapper; the XMSG subfunction (XFOPN, XFWDF,
XSCRS, XSNAM, ...) is a runtime parameter, not encoded in the MON operand.
=> You cannot tell statically whether XSCRS is issued; the "no XSCRS"
conclusion is from the RUNTIME MON-200 trace, not the code.
- All controller I/O goes through the 10 MON 255B PIOCM wrappers (READPIO,
SEGLOAD(T=4), UNLOAD, START_P(T=6), STOP_PI(T=7), RES_SLO, REL_SLO, SEND_KI(T=7),
REC_KIC(T=3), INT2GET) @ 032703-033147 (decoded in
ENNS0-PIOCM-START-FINDINGS-2026-07-23.md).
[V] The POSU startup body is a linear staged sequence at 030200-030710+.
Decoded MON calls in order: MON 135 (030222), MON 200x2 (030230/030233,
XMSG open/setup), MON 322 (030375), MON 124 (030427), MON 125 (030472),
then a retry/poll loop @ 030657-030700 (JMP *-17 backward, retry count staged
via SAA 4), then continues toward the SEGLOAD -> START_P controller-start
substeps and finally the XSCRS name registration.
[V] Each stage follows the PLANC pattern
<do op> ; SKP IF DB UEQ SP ; JPL I *nn (error handler) ; ... ; STF *147 (next-stage).
On a bad status a stage branches to an error handler that stores into the POSU
error context and skips the remaining stages - including the later XSCRS name
registration. [I] Therefore any earlier stage failing (XMSG setup, MON 322/124/125,
or the controller SEGLOAD/START) aborts POSU before the server name is created.
[LIMITATION - PLANC indirect calls] Byte-exact tracing of which stage forks
to which message index, and the exact branch that skips XSCRS, is not reliably
decodable with the minimal disassembler: the staging uses JPL I *nn through
literal/pointer cells interleaved with code (e.g. 030777->030416, 031000->030277),
and the disassembler cannot separate those pointer words from instructions. So the
stage ordering above is [V] from the MON opcodes and the loop structure, but the
precise "status code N -> message index M -> skip XSCRS" edge is [I].
3. Is there a controller-interrupt / kick wait that times out? (Task 3)¶
[V] The START readiness gate is a memory-mapped poll, not an interrupt wait.
From the kernel driver RP-P2-PIOC.NPL PISTA (MON 255B fn 6), byte-decoded in
ENNS0-PIOCM-START-FINDINGS-2026-07-23.md:
114715 PWCR := 60B (IOXT HDEV+3) ; HALT AND RESET the controller
114721 PWCR := 0 (IOXT) ; INITIATE (the one doorbell)
114724 -3 =: TMR ; arm 3-SECOND timeout
DO spin ; X:=1002; CALL PREAD ; poll PIOC DRAM word 1002B
WHILE A = 0 OD
114737 IF A >< PRKEY THEN error; GO PIRET FI ; must == 052163B
... only THEN write MPIOC/TRIG and ring start doorbell 11B ...
PISTA busy-polling word 1002B for
PRKEY=052163B, 3-second timeout. It is done by the kernel on ENNS0's
behalf (ENNS0 just calls START_P, T=6, and reads back status). It does not
wait on INT12 / STATUS bit 2 / IDENT for the START.
[I] The INT12/IDENT/RFT/RIE interrupt feedback is the notification path for the
later PIKIC/PIWKI kick/mailbox traffic, not the START gate. So chasing the
emulator "IDENT clears RIE / STATUS bit 2 never set" bug for the startup hang
is a red herring; the startup gate is the PRKEY memory cell.
[V] "wait 10 sec" is not present in encos-err-i. The only verified
controller-wait timeout is PISTA's 3 seconds. There is an ENNS0-side retry loop
@ 030657-030700, but its exact iteration count/duration could not be byte-resolved
(PLANC indirect, see section 2 limitation). Do not cite a 10-second ENNS0 wait as
fact.
How a controller-comm failure surfaces to the user: [I, well-grounded] PISTA
returns a non-OK status (e.g. "interface not started / not initiated / no answer")
-> START_P returns that status in T -> the POSU stage that called it forks to the
error path -> POSU prints "Error during startup." + the matching PIOC-status
text from the section-1a catalog (one of "No answer from interface.",
"Interface not started.", "Interface not initiated.",
"Check if RTCOMMON is in interface memory.") and skips XSCRS. That is exactly the
"POSU error / RTCOMMON / can't talk to server" banner shape the user reported.
4. The RTCOMMON branch (Task 4)¶
[V] "Check if RTCOMMON is in interface memory." (015153) is not an active
runtime check ENNS0 performs. It is a diagnostic hint string sitting in the
PIOCM status-message catalog, immediately after
"Complete interface memory not fixed. Change size." and
"Interface not initiated.". [I] It is the operator hint printed when the kernel
interface driver returns an interface-memory-fault status (the interface DRAM the
banks/RTCOMMON live in is not fixed/initialised). So the RTCOMMON line is a
consequence of a PIOCM interface-memory status, not a separate ENNS0 gate that
aborts on RTCOMMON's presence.
5. Conclusion (Task 5)¶
- (a) YES - a controller-communication step gates POSU before name registration.
[V] mechanism: ENNS0 has zero direct I/O; it drives the controller only through
the kernel PIOCM wrappers (MON 255B), and the POSU sequence runs the controller
start (
SEGLOAD->START_P) as a staged step whose bad status forks to the POSU error path and skips the later XSCRS name registration. - The specific gating feedback is the
PISTAPRKEY readiness handshake (memory-mapped poll of PIOC word 1002B for052163B, 3 s), driven by thePWCR=60BHALT+RESET /PWCR=0INITIATE doorbell - NOT the INT12/IDENT/RIE interrupt latch. [V] - Therefore the emulator fix that unblocks the controller-comm gate is
PWCR=60Bmust trigger a real 68K reset-vector restart (so the firmware reposts PRKEY), perENNS0-PRKEY-FIRMWARE-FIXPOINT-2026-07-23.md- not the IDENT/RIE change (that regressed TPE and is unrelated to the START gate). - (b) the RTCOMMON line is a status hint, not an active abort check.
- (c) additionally, per the latest run the card reached READY yet ENNS0 still
did not issue XSCRS -> a second downstream gate (name registration / missing
COSMOS
Define-Network-*/DEFINE-LOCAL-SYSTEMconfig, or an ENNS0 self-register path that defers to configured state) also exists and must be pinned separately.
Exact evidence anchors (octal):
- POSU staged sequence with the error forks: 030200-030710 (encos-err-i,
MON 135/200/200/322/124/125 + retry loop 030657-030700). [V structure]
- START_P wrapper (T=6 -> PISTA): 033124-033136. [V]
- PIOCM status message catalog incl. RTCOMMON: 014642-015250. [V]
- Kernel PISTA PRKEY poll: RP-P2-PIOC.NPL @ 114703-115103, TMR=-3, PRKEY=052163B.
[V]
Concrete next lead (to make the [I] edges [V])¶
DAP-trace the live run (breakpoint the shared MON 200 wrapper @ 030230/030233 and
START_P @ 033124), and after each POSU stage log the returned T status and
watch whether execution reaches an XSCRS-parameter MON 200 or diverts into the POSU
error store (POSUERR @ 001756). Specifically: does START_P/PISTA return OK
(PRKEY read) in the current build, or time out? That single trace disambiguates
"controller-comm gate still failing" vs "controller OK, downstream name gate" with
certainty - the static PLANC indirect staging cannot.
Findings file:
C:\Users\ronny\AppData\Local\Temp\claude\E--Dev-Ronny-NDInsight\b17a7474-33c0-4d7f-b9cb-f921c3ad419b\scratchpad\ENNS0-POSU-XROUT-ERROR-GATE-2026-07-23.md