ENNS0 annotated disassembly: WHY it never registers *XM-ENNS0 (2026-07-23)¶
Read-only static disassembly of the ND-100-side ENNS0 supervisor
E:\Dev\Ronny\NDInsight\Installation\Communication\Ethernet\x\encos-err-i-b01.brf
(PLANC/BRF, MAIN = ENNS0 @ octal 031655), cross-checked against the known-good
live controller trace supplied with the task.
Legend: [V] VERIFIED = decoded from the linked image bytes / read from source. [I] INFERRED = reasoned, not byte-proven. Nothing on the wire is guessed.
Tooling reused (NOT rebuilt): scratchpad brf_link.py (BRF linker), nd100dis.py
(ND-100 disassembler), mon200.py/census2.py (MON census), symdump.py.
TL;DR verdict (Task 5 answer, up front)¶
Ranking: (c) is correct. The name-registration code is NOT PRESENT in ENNS0 at all. It is neither skipped by a bad status nor gated by a version check - it does not exist in this module.
Single decisive fact [V]: the ENTIRE ENNS0 image contains exactly two MON 200B (XMSG) instructions, and they are:
030227 171000 SAT 0 ; T := 0 = XFDUM (function 0: dummy / get-config)
030230 153200 MON 200 ; XMSG XFDUM - probe: is the message system up?
030231 010607 STT -121,B ; save returned status T -> local(-121)
030232 171001 SAT 1 ; T := 1 = XFDCT (function 1: disconnect from msg system)
030233 153200 MON 200 ; XMSG XFDCT - disconnect the probe connection
030234 044607 LDA -121,B ; A := saved XFDUM status -> test it below
Per XMSG-API.md section 6.1, the MON 200B T register = XMSG function code:
0 = XFDUM (dummy / get config), 1 = XFDCT (disconnect from msg system). So ENNS0's
complete XMSG footprint is a liveness probe: "call XFDUM to confirm XMSG is running,
then XFDCT to disconnect." [V]
Name registration is a completely different sequence. Per XMSG-API.md section 6.4 the
XROUT service codes (XSNAM = 66, XSCRS = 80) are byte 1 of a message body, not a
MON operand. To register *XM-ENNS0 a program must issue XFGET(T=2, get message space)
-> XFWRI(T=7, write the XSCRS/XSNAM+name bytes) -> XFSND(T=12, send to XROUT port 0).
None of XFGET / XFWRI / XFSND / XFPRV / XFOPN exists anywhere in ENNS0 - there are only
the two MON 200B shown above (T=0 and T=1). [V, by exhaustive census]
Therefore START-NETWORK-SERVER's "Unknown name (XRUNN=2)" is correct: *XM-ENNS0 is never
created because the program that would create it (the XMSG-COMMAND Define-Network-* /
Start-Network-Server handler in xmsg-command-l03.prog) was never run by the harness,
and ENNS0 itself has no such code.
Rankings for the other candidates:
- (a) controller-reply mismatch on SUBFUNCTION=5: RULED OUT this run. [V] The card
reached READY (PRKEY posted, LANCE up, banner printed, ENNS0 returned with no error). A
controller-comm failure would also skip name registration (POSU aborts) - but it did
not fire this run, and even if the card had failed, the missing name is independently
guaranteed by (c): the registration code is absent regardless.
- (b) XMSG-version / getMagic gate: RULED OUT. [V] ENNS0 issues no XFSND to port 0,
so it cannot build an XSGMG(71) get-magic request. The " subfunction getMagic" /
" XROUT ID " strings at 021063-021072 are a trace/dump-viewer label table, not a
request builder (confirms prior finding enns0-getmagic-trace-vs-builder). The
$INCOMPATIBLE TRACE - VERSION / $INCOMPATIBLE STATISTICS - VERSION strings (023200,
025227) belong to the COSMOS trace/statistics dump utility (compares a dump-file
version), not a live XMSG-version gate.
1. Annotated STARTUP / POSU disassembly (Task 1)¶
MAIN = ENNS0 @ 031655; the linear POSU startup body it drives is at 030200-030710+.
Each PLANC stage follows the shape:
<do MON/op> ; SKP IF DB UEQ SP ; JPL I *nn (error-handler pointer) ; ... ; STF *147
(-> next-stage pointer). On a bad status a stage forks to its error handler (stores a
message index into the POSU error context) and the STF *147 chain skips the remaining
stages. PLANC caveat: the JPL I *nn / STF *147 targets are pointer words
interleaved with code; nd100dis.py cannot always separate a pointer word from an
instruction, so the exact "status N -> message M -> skip" edge is [I]; the MON opcodes,
the loop structure, and the two MON 200B decodes are [V].
1a. Stage map (VERIFIED MON opcodes, in execution order)¶
030222 153135 MON 135 ; [V] get RT/segment info (setup)
030227 171000 SAT 0 ; ---- XMSG STAGE (the only XMSG in ENNS0) ----
030230 153200 MON 200 ; [V] XFDUM (T=0) : probe message system / get config
030231 010607 STT -121,B ; save XFDUM status
030232 171001 SAT 1
030233 153200 MON 200 ; [V] XFDCT (T=1) : disconnect the probe
030234 044607 LDA -121,B ; reload XFDUM status
030236 142065 SKP IF DA LST SB ; status ok? (A <= B)
030237 124015 JMP =030254 ; yes -> continue
030240..030253 ; no -> build "XMSG unavailable" error msg (idx 0/1),
030253/030255 JPL I .. ; fork to error handler, then STF-chain skips rest
030260 030147 STF *147 =030427 ; next-stage pointer
030375 153322 MON 322 ; [V] (RT/COMMON connect-type call) ; status -> -118,B
030427 153124 MON 124 ; [V] status -> -114,B ; JAZ error fork @030432
030472 153125 MON 125 ; [V] status check @030475 ; fork on bad status
030507-030556 : controller-slot / RES_SLO staging (builds param blocks, STF *147 chain)
030562-030632 : SEGLOAD staging (LDD param, JPL wrappers, STF *147 -> 031001)
030636-030656 : START_P staging (JAF status test @030640/030645)
030657 045120 LDA I *120 =030777 ; ---- RETRY / READINESS POLL LOOP ----
030662 170404 SAA 4 ; retry count / function arg = 4
030664/030665 JPL I wrappers ; call PIOCM (SEGLOAD/START_P/status)
030674 142065 SKP IF DA LST SB ; status within limit?
030675 124004 JMP =030701 ; ok -> exit loop, advance
030700 124357 JMP *-17 =030657 ; retry -> loop back [V backward branch]
030710 135073 JPL I *73 =031003 ; post-loop stage
[V] The MON census over the whole linked image: IOX=0, IOXT=0, MON 200 x2 (030230/030233), MON 255 x10. ENNS0 never touches the Ethernet STATUS/CONTROL register directly; all controller I/O is via the ten MON 255B (PIOCM) wrappers; all XMSG is the two MON 200B above.
1b. The 10 PIOCM (MON 255B) wrappers @ 032703-033147 - VERIFIED¶
Each wrapper: load X = PIOC-LDN param ptr, SAT <fn>, MON 255, save status in T.
The function selects the kernel PISTA/PILOA/... dispatch (RP-P2-PIOC.NPL).
032703 READPIO SAT -1 (EXEL execute-instruction block / read)
032734 (2nd read block) SAT -1
033003 INT2GET (builds block, no MON)
033023 RES_SLO SAT 0 PIRES reserve slot
033035 REL_SLO SAT 5 PIUNL release
033047 SEND_KI SAT 7 PISTO
033063 REC_KIC SAT 3 PIWKI wait-for-info
033077 SEGLOAD SAT 4 PILOA load firmware segment
033113 UNLOAD SAT 5 PIUNL unload segment
033124 START_P SAT 6 PISTA START PIOC <-- controller start
033137 STOP_PI SAT 7 PISTO stop PIOC
START_P body (VERIFIED bytes):
033124 146547 START_P: SKP IF DB UEQ SP ; guard
033125 135012 JPL I *12 =033137 ; (skip if guarded)
033127 054606 LDX -122,B ; X = caller PIOC LDN
033130 044607 LDA -121,B ; A = start-address arg
033131 171006 SAT 6 ; T = 6 -> kernel PISTA
033132 153255 MON 255 ; PIOCM START
033133 004611 STA -119,B ; save returned A
033134 010613 STT -117,B ; save returned status T
The controller readiness handshake itself (poll PIOC DRAM word 1002B for
PRKEY=052163B, 3 s timeout, then write MPIOC=5 + TRIG=1 + ring doorbell 11B) is done by
the kernel PISTA on ENNS0's behalf (RP-P2-PIOC.NPL @ 114703-115103), not by ENNS0.
[V, prior finding ENNS0-PIOCM-START-FINDINGS].
2. Is the name-registration code present? (Task 2) - VERIFIED: NO¶
- [V] Exhaustive census: only two MON 200B in ENNS0, both decoded above as
XFDUM(0) +XFDCT(1). A name registration needsXFGET(2)/XFWRI(7)/XFSND(12) to port 0 with a service byteXSCRS(80)/XSNAM(66). Since there are literally no other MON 200B instructions, those functions cannot be issued by ENNS0. This is decidable statically here precisely because there are only two XMSG sites (normally the XF function is a data parameter and you cannot tell - but with a complete count of two, and both being 0 and 1, the set of functions ENNS0 can ever issue is {XFDUM, XFDCT}). - [V] Consistent with the live MON 200B trace (prior root-cause doc): during
@rt enns0only driver-port / probe traffic was seen and no XSNAM/XSCRS to port 0; only*XM-FIDOself-registered (that is XMFIDO's job, a different program). - Correction to an earlier loose attribution [V]: the runtime
XFPRV/XFOPN/XFWDF/XFDBKobserved in that window are not emitted by this ENNS0 (encos-err) image - it contains none of those opcodes. They come from SINTRAN's RT-program XMSG driver-port setup / other system code, not from ENNS0's own instructions. ENNS0's own XMSG output is just XFDUM+XFDCT.
Because the code is absent, there is no "condition/branch to satisfy" and no "earlier bad status that skips it" - Task 2's if-yes sub-questions do not apply. (The POSU staged error forks DO skip later stages on bad status, but none of those later stages is a name registration; they are MON 322/124/125 and the SEGLOAD->START_P controller bring-up.)
3. The SUBFUNCTION=5 exchange, ND-100 side (Task 3) - controller, not XMSG¶
[V]+[I] SUBFUNCTION=5 belongs to the PIOC/firmware controller path (MON 255B /
doorbell), entirely separate from XMSG naming:
- ENNS0 has zero direct I/O; it calls START_P (T=6). The kernel PISTA does the
PWCR=60B HALT+RESET, PWCR=0 INITIATE, then polls PIOC word 1002B for PRKEY, then
writes the request word MPIOC=5 (this "=5" is the REQUEST value the firmware reads as
its function/subfunction) and rings doorbell 11B. [V, RP-P2-PIOC.NPL]
- The live trace's REQUEST=1 SUBFUNCTION=5 OPCOM doorbell + monitor-postbox reply
MON_CODE=1 PARAM=0x001E(30) is the firmware acknowledging that controller-start
handshake. This run it succeeded (card READY, banner printed, ENNS0 returned OK), so
it did NOT send ENNS0 to an error/abort branch. [V, from the supplied known-good trace]
- ENNS0 does not itself read 0x40C/0x40E; the kernel PISTA consumes the readiness cell and
returns a status word in T to START_P, which ENNS0 tests in the POSU START stage
(JAF/SKP status forks at 030636-030656). This run that status was OK. [I from trace + [V]
code structure]
So the SUBFUNCTION=5 exchange is a red herring for the missing name: it concerns the controller, it passed, and even had it failed it would abort POSU before reaching... nothing, because there is no name registration downstream anyway.
4. Version / compatibility gate? (Task 4) - VERIFIED: none in ENNS0¶
- [V] No
XFSND-to-port-0 exists, so ENNS0 cannot issueXSGMG(71) getMagic, cannot read an XMSG magic/version cell over XROUT, and cannot branch on it. The only XMSG calls are XFDUM (get-config) + XFDCT. XFDUM returns config, but its status is only tested as "message system present?" (030236 SKP), not as a version comparison. [V] - [V] The
" XROUT ID "," subfunction getMagic","**SUBFUNCTION UNKNOWN**"," MONTR ID "strings @ 021063-021072 are a format/label table for the COSMOS trace-log viewer (matches prior finding).$INCOMPATIBLE TRACE - VERSION(023200) and$INCOMPATIBLE STATISTICS - VERSION(025227) are the trace/statistics dump utility version checks (dump-file format), not a runtime XMSG (M00 vs B01) gate. B01-vs-M00 is never compared in code here.
5. CONCLUSION (Task 5)¶
Most-likely reason, ranked answer = (c): the name-registration code is not present in ENNS0. Evidence, exact octal:
- [V] The complete XMSG footprint of ENNS0 is two instructions:
030230 153200 MON 200with T=0 (XFDUM, set at030227 171000 SAT 0) and030233 153200 MON 200with T=1 (XFDCT, set at030232 171001 SAT 1). That is a message-system liveness probe + disconnect, nothing more. - [V] MON census of the whole linked image: MON 200 x2 (only the two above), MON 255 x10,
IOX/IOXT = 0. No
XFGET/XFWRI/XFSND(T=2/7/12) exist, so noXSCRS(80)/XSNAM(66) message to XROUT port 0 can be built. Name creation lives in the separate XMSG-COMMANDDefine-Network-*/Start-Network-Serverhandler (xmsg-command-l03.prog), which the bring-up harness never executed. - [V] (a) ruled out this run: controller SUBFUNCTION=5 handshake succeeded (card READY).
- [V] (b) ruled out: no XFSND-to-port-0 => no getMagic/version request; the version strings are trace/dump-viewer labels.
Net: START-NETWORK-SERVER correctly returns XRUNN(2) "Unknown name" because *XM-ENNS0
was never registered, and it was never registered because neither ENNS0 nor the harness
run ever executed the XSCRS/XSNAM create-service sequence - that sequence is not in this
module. The fix is a procedure/config gap (run the COSMOS Define-Network-* /
Start-Network-Server XMSG-COMMAND that issues XSCRS *XM-ENNS0), not an ENNS0 or
emulator MON-call change.
PLANC data-in-code ambiguities (explicit, per policy)¶
Byte-exact decode is blocked where PLANC interleaves pointer/literal words with code; the
disassembler renders these as spurious STZ/BITOP/.WORD:
- 031000, 030777, 030557, 030627, 030631 and the *147/*nn targets of the
STF/JPL I staging are POINTER words, not instructions (e.g. 030700 JMP *-17 =030657
loops on a real branch, but the JPL I *120 =030777 at 030657 dereferences a pointer
cell at 030777). [ambiguous addresses: 030777, 031000, 031001, 030557, 030627]
- The exact "status code -> message index -> which later stage is skipped" edge is [I];
the MON opcode identities, the two MON 200B function decodes (T=0/T=1), the ten MON 255B
functions, START_P T=6, and the retry loop 030657-030700 are all [V].
None of these ambiguities affect the conclusion: the MON 200B count is a hard, opcode-exact census (2), and both are XFDUM/XFDCT.
Source / evidence paths¶
- Target:
E:\Dev\Ronny\NDInsight\Installation\Communication\Ethernet\x\encos-err-i-b01.brf(MAIN=ENNS0 @031655; POSU 030200-030710; PIOCM wrappers 032703-033147; START_P @033124). - XMSG convention:
E:\Dev\Ronny\NDInsight\SINTRAN\XMSG\DOC\XMSG-API.mdsec 6.1 (T=function code; 0=XFDUM,1=XFDCT,2=XFGET,7=XFWRI,10=XFOPN,12=XFSND) + sec 6.4 (XSNAM=66,XSCRS=80). - Kernel PIOCM driver (PISTA/SUBFUNCTION path):
E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\NPL\RP-P2-PIOC.NPL. - Prior findings (scratchpad): ENNS0-XROUT-UNKNOWN-NAME-ROOTCAUSE-2026-07-23.md, ENNS0-POSU-XROUT-ERROR-GATE-2026-07-23.md, ENNS0-PIOCM-START-FINDINGS-2026-07-23.md, ENNS0-PRKEY-FIRMWARE-FIXPOINT-2026-07-23.md, XMSG-XROUT-CARVE-LOCATE-AND-RECIPE-2026-07-23.md.
- Tooling (scratchpad): brf_link.py, nd100dis.py, mon200.py, census2.py, symdump.py.
- This file:
C:\Users\ronny\AppData\Local\Temp\claude\E--Dev-Ronny-NDInsight\b17a7474-33c0-4d7f-b9cb-f921c3ad419b\scratchpad\ENNS0-ANNOTATED-DISASM-WHY-NO-NAME-REG-2026-07-23.md