XMSG + XROUT Reverse-Engineering: LOCATE + PLAN (2026-07-23)¶
Read-only LOCATE+PLAN. Goal: be able to carve/trace the SINTRAN XMSG+XROUT internals
and the XMSG-COMMAND program to prove WHICH call creates the *XM-ENNS0 name and WHEN,
and whether DEFINE-NETWORK-CONNECTION is what creates it.
Every item tagged VERIFIED (file opened / bytes or strings seen) or INFERRED (reasoned). Nothing on the wire is guessed.
TL;DR verdict¶
The shortest path is NOT to carve anything first. Three artifacts already answer most of the question and were opened during this task:
XMSG-VALUES-L.SYMBgives the exact XROUT service codes WITH descriptions (VERIFIED, see section 3):XSNAM=66"Give name to this port",XSCRS=80"Create service (name, init no of SP's)",XSNET=85"Start/stop gateway (network server)",XSGMG=71"Get magic number from name",XRUNN/XRUNMunknown-name/magic.xmsg-command-l03.prog(the XMSG-COMMAND program image) literally contains the command stringsDefine-Network-Connection,Define-Network-Local-Endpoint,Define-Network-Remote-Endpoint,Define-Network-Direct-Connection,Define-Network-Remote-Groupnumber,Start-Network-Server, plus 20xXROUTandmagic(VERIFIED via string scan). This is the DEFINE-NETWORK-* handler binary.- A prior-session root-cause doc already proved (from the live MON 200B trace) that
*XM-ENNS0is never registered:@rt enns0issues only driver-port calls (XFOPN/XFWDF/XFDBK), no XSNAM/XSCRS to port 0, and only*XM-FIDOself-registers. SeeENNS0-XROUT-UNKNOWN-NAME-ROOTCAUSE-2026-07-23.md(scratchpad).
So the disassembly/carve is confirmatory: prove that Define-Network-Connection
(or another Define-Network-*) is the handler that issues XSCRS/XSNAM for
*XM-ENNS0, which the ENNS0 bring-up harness never ran.
1. Inventory of XMSG/XROUT sources + binaries (Task 1) - VERIFIED (paths opened)¶
1a. Repo: E:\Dev\Ronny\NDInsight\SINTRAN\XMSG\¶
DOC\- large doc set (wire protocol, MON 200B API, operator cmds). Directly relevant:DOC\XMSG-COMMAND-REFERENCE.md- operator command family incl. the Define-Network-* list.DOC\XMSG-API.md- MON 200B function/service map.DOC\XMSG-PROTOCOL.md(132 KB) - envelope/XROUT dispatch.DOC\ENNS0-XROUT-DISASSEMBLY-HANDOFF.md- prior handoff naming the exact RE targets (ENCOSE0-DUMP.BPUN, encos-mon-*.prog) and Ghidra state.DOC\ENNS0-XROUT-GETMAGIC-FINDINGS-2026-07-07.md.
SRC\- C# XMSG protocol library + tests (Xmsg.Protocol/Node/Live/Servers/...). This is the emulator-side reimplementation, NOT the ND binary; the "magic stub" lives inSRC\Xmsg.Live\XmsgNode.csand is the SEPARATE HDLC multi-node path, not the local ENNS0 path.XMSG-PL-VALUES-M.INCL,XMSG-VALUES-M.SYMB,xmsg-constants.json- version M symbol material (matches the running guest, see version note). VERIFIED present.
1b. NPL source for the XMSG/XROUT kernel - NOT PRESENT (VERIFIED)¶
SINTRAN\NPL-SOURCE\NPL\is the resident SINTRAN III kernel only (SCSI, HDLC, TAD, N500, terminal, perf...). There is no XMSG/XROUT kernel NPL file. The two grep hits (IP-P2-1.NPL,PH-P2-OPPSTART.NPL) are incidental references, not the XROUT source.- XMSG is a separately-loaded product (loaded onto segments at install, see 1d), so its
source is not in the OS NPL tree. What we DO have is the linker symbol lists:
SINTRAN\NPL-SOURCE\SYMBOLS\L07\XMSG-SYMBOL-LIST.SYMB.TXT(VERIFIED: hasXSNAM=000102(=66d),XSCRS=000120(=80d),XSNET=000125(=85d),XRUNN=000002).SINTRAN\NPL-SOURCE\SYMBOLS\M06\XMSG-SYMBOL-LIST.SYMB.TXT(version M).
1c. The XMSG distribution binaries - PRESENT on F: (VERIFIED, directory listed)¶
Full XMSG L03 kit at F:\ND\SINTRAN-K05-XMSG-2026\FLOPPY\xmsg\:
| File | Size | What it is |
|------|------|-----------|
| xmsg-command-l03.prog | 90112 | XMSG-COMMAND program (DEFINE-NETWORK- / START-NETWORK-SERVER handler). Primary carve target. |
| xmsg-xrou-cx-l03.bpun | 80450 | XROUT kernel* (CX build) - the routing/naming server BPUN. |
| xmsg-xrou-nx-l03.bpun | 80076 | XROUT kernel (NX build). |
| xmsg-kern-cx-l03.bpun | 47666 | XMSG kernel (CX). |
| xmsg-kern-nx-l03.bpun | 25136 | XMSG kernel (NX). |
| xmsg-fido-l03.prog | 290816 | XMFIDO (the thing that self-registers *XM-FIDO). |
| xmsg-in-l03.prog | 180372 | XMSG install program. |
| xmsg-library-l03.brf | 31710 | XMSG relocatable library (BRF) - has ENTR symbols. |
| xmsg-01-l03.xcom | 66798 | XMSG :XCOM. |
| xmsg-load-cx/nx-l03.mode, xmsg-startex-l03.{mode,batc} | - | load/startup MODE scripts. |
Symbol tables (VERIFIED present, opened one):
- ...\FLOPPY\xmsg\xmsg-values-l.symb (== repo XMSG-VALUES-L) - service codes with comments.
- xmsg-symb-cx-l03.symb, xmsg-symb-nx-l03.symb, xmsg-poftabs-l03.symb,
xmsg-systabs-l03.symb, xmsg-pl-values-l.incl.
- Copies also at F:\ND\SINTRAN-K05-XMSG-2026\XMSG-Symb\.
1d. How XROUT is loaded (VERIFIED from xmsg-load-nx-l03.mode)¶
The MODE script does LOAD-BINARY (USER)XMSG-KERN..:BPUN / XMSG-XROUT / XMSG-FIDO
each onto its own SEGMENT (segment 33x range), then defines the RT programs. So in a running
image the XROUT code lives in a loaded segment, not resident SINTRAN. => carvable from the
running image, but the standalone BPUN above is cleaner.
1e. Version note (IMPORTANT caveat) - VERIFIED/INFERRED¶
- Running guest banners:
XROUT: XMSG version M00 (88.03.25),XMSG command program (210373M) of 88.08.18=> version M. - The BINARIES on F: are L03 (
210373L03). M-version symbols exist (SYMBOLS\M06\, repoXMSG-VALUES-M.SYMB) but no M-version .prog/.bpun was found on F:. - INFERRED: L03 vs M service-code layout is stable for the codes we care about (XSNAM/XSCRS/ XSNET are architectural), so L03 binaries are a valid oracle for the FLOW. But for byte-exact addresses in the running guest, carve the running M image (option C).
2. XROUT service codes (the answer key) - VERIFIED from xmsg-values-l.symb¶
XSNAM=66 % Give name to this port
XSGMG=71 % Get magic number from name (privileged)
XSCRS=80 % Create service (name, init no of SP's)
XSNET=85 % Start/stop gateway (network server) (privileged)
XSCMG=2 % Check magic number
XFM2P=22 % Magic number to system number and port id
XFP2M=23 % Port to magic number
XEIMA=-19 % Invalid magic number
XRUNM=7 % Unknown magic number
XRUNN=2 % Unknown name (this is the error we get)
*XM-ENNS0 is XSCRS(80)
and/or XSNAM(66) sent to XROUT port 0. START-NETWORK-SERVER is XSNET(85), which
first resolves the name (XSGMG/lookup) and returns XRUNN(2) because no XSCRS ever ran.
3. Carvability assessment (Task 2 + 3)¶
3a. XMSG-COMMAND .prog - CARVABLE, .prog loader is the gap - INFERRED¶
xmsg-command-l03.prog= 90112 bytes.scanprog.py(BE) already finds device/structure words, i.e. it is a normal ND-100 :PROG: ~256-word BE header then raw 16-bit BE words (same shape asencos-in-b01.progper the task note; a dedicated .prog loader is still TODO).- The command strings are in cleartext in the image (VERIFIED string scan). Each
operator-command dispatch entry in a :PROG points its handler at the routine that
builds the MON 200B message. So the recipe (below) is: locate
Define-Network-Connectionstring offset -> find the command-table entry referencing it -> disassemble the handler -> look for theXSCRS(80o=0120)/XSNAM(66o=0102) literal loaded before the MON 200B (153 200=0153200)XFSND-to-port-0 sequence.
3b. XROUT kernel .bpun - CARVABLE - INFERRED¶
xmsg-xrou-cx/nx-l03.bpunare BPUN (bootable/absolute). The XROUT SERVER side (the code that RECEIVESXSCRS/XSNAMand returnsXRUNN) lives here. Disassemble to see the service dispatch on the first message byte and the name-table insert/lookup.- Symbols to anchor from:
xmsg-symb-cx-l03.symb/xmsg-poftabs-l03.symb.
3c. Running SINTRAN image carve - POSSIBLE but not needed first - VERIFIED tooling exists¶
E:\Dev\Ronny\NDInsight\tools\sintran-segment-carver\(carve.py, EXTRACTING-SEGMENTS.md, EXTRACTING-RESIDENT-CODE.md, per-versionversions\*\inputs\list-segment.txt) + thesintran-carvingskill can extract loaded segments from aLIST-SEGMENT/dump.- XROUT is a LOADED SEGMENT (33x), NOT resident SINTRAN (VERIFIED from the load MODE). So it is carvable from the running M image, and this is the ONLY way to get the exact version-M bytes/addresses. But since we already have the L03 standalone BPUN and the flow is what matters, carve the running image only if L03-vs-M divergence is suspected.
3d. Existing scratchpad tooling (Task 2)¶
C:\Users\ronny\AppData\Local\Temp\claude\...\scratchpad\:
- brf_link.py - BRF linker (for xmsg-library-l03.brf -> symbols/addresses).
- nd100dis.py - ND-100 disassembler (feed it the .prog/.bpun word image).
- m68kdis.py - 68K (controller side, not needed here).
- scanprog.py - endian/format probe (already run on the .prog).
- .prog loader is TODO: strip the ~256-word BE header, then emit raw BE words; the
encos-in-b01.prog format note applies. For a first pass you can skip precise header
parsing and just disassemble from candidate offsets near the command-string references.
4. The RECIPE (concrete steps)¶
Step 0 - already done (read existing artifacts) - fastest, do first¶
- Read
xmsg-values-l.symb(service codes, section 2 - DONE). - Read
SINTRAN\XMSG\DOC\XMSG-COMMAND-REFERENCE.mdfor the Define-Network-* semantics. - Read
ENNS0-XROUT-UNKNOWN-NAME-ROOTCAUSE-2026-07-23.md(proves*XM-ENNS0never registered; only driver-port calls during@rt enns0).
Step 1 - carve XMSG-COMMAND to pin the DEFINE-NETWORK-CONNECTION handler (confirmatory)¶
python scanprog.py xmsg-command-l03.prog(done: BE, normal :PROG).- Find byte offsets of the strings
Define-Network-ConnectionandStart-Network-Server(grep -abo). ND :PROG strings are typically packed 2 chars/word. - Search the word image for the command TABLE entry that points at each string offset (the offset/2 as a word address, or a pointer near it).
- Disassemble the referenced handler with
nd100dis.py. In the handler look for:- a literal
0120(XSCRS=80) or0102(XSNAM=66) or0125(XSNET=85) being loaded, - the message build (XFWRI) and the
MON 200(0153200)XFSNDwith receiving port 0.
- a literal
- RESULT: proves which Define-Network-* command issues
XSCRS/XSNAM *XM-ENNS0*-> answers "what call creates*XM-ENNS0and when".
Step 2 - (optional) carve XROUT kernel to see the server side¶
- Disassemble
xmsg-xrou-cx-l03.bpunwithnd100dis.py, anchor withxmsg-symb-cx-l03.symb, find the service dispatch that returnsXRUNN(2) on name-not-found and the insert path forXSCRS/XSNAM.
Step 3 - (only if L03 != guest M matters) carve the running image¶
- Use
sintran-segment-carver+sintran-carvingskill on the running M image'sLIST-SEGMENTto pull the XROUT segment (33x) and compare.
Step 4 - definitive live confirmation (grounded oracle)¶
- DAP/cpu-trace the MON 200B calls during
Define-Network-Connection(if run) andSTART-NETWORK-SERVER; at eachXFSNDto port 0 decode the first message byte (service code) + name string + reply error byte. ConfirmsXSCRS *XM-ENNS0*presence/absence with certainty. (The MON_200_XMSG_TRACE decoder already prints the buffers.)
5. Ranked recommendation for "what call creates *XM-ENNS0 and when"¶
- (a) Read existing NPL/DOC + symbols - HIGHEST, near-zero cost.
xmsg-values-l.symbXMSG-COMMAND-REFERENCE.mdalready name the mechanism (XSCRS/XSNAMcreate the named service). Combined with the root-cause doc it is 90% answered: the harness ran@rt enns0+START-NETWORK-SERVERbut none of the Define-Network-* commands, and ENNS0 self-registered nothing.
- (b) Carve
xmsg-command-l03.prog(Step 1) - RECOMMENDED confirmatory. Cheapest carve (standalone :PROG, strings in clear, tooling ready) that positively identifies the handler emittingXSCRS *XM-ENNS0*. Do this to prove DEFINE-NETWORK-CONNECTION is the creator. - (d) Live MON 200B service-byte trace (Step 4) - best ground truth, run whenever the harness is up; disambiguates "handler exists but wasn't invoked" vs "invoked but failed".
- (c) Carve the resident XROUT segment - LAST, only if version-M byte-exactness is needed; more work than the standalone BPUN for the same information.
Bottom line: you do not need to fix any emulator MON stub. The name *XM-ENNS0 is created
by an XSCRS(80)/XSNAM(66) message to XROUT port 0, issued by the XMSG-COMMAND
Define-Network-* handler (INFERRED: Define-Network-Connection), which the ENNS0 bring-up
sequence never executed. Step 1 (carve xmsg-command-l03.prog) proves the exact command;
Step 4 (live trace) proves it at runtime.
Full paths referenced¶
- Repo XMSG:
E:\Dev\Ronny\NDInsight\SINTRAN\XMSG\(DOC\, SRC\, XMSG-VALUES-M.SYMB, xmsg-constants.json) - Symbol lists:
E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\SYMBOLS\{L07,M06}\XMSG-SYMBOL-LIST.SYMB.TXT - XMSG L03 kit:
F:\ND\SINTRAN-K05-XMSG-2026\FLOPPY\xmsg\(xmsg-command-l03.prog, xmsg-xrou-cx/nx-l03.bpun, xmsg-kern-cx/nx-l03.bpun, xmsg-fido-l03.prog, xmsg-library-l03.brf, xmsg-values-l.symb, xmsg-symb-cx/nx-l03.symb, xmsg-poftabs/systabs, xmsg-load-nx-l03.mode) - Symbols dir:
F:\ND\SINTRAN-K05-XMSG-2026\XMSG-Symb\XMSG-VALUES-L.SYMB - Carver:
E:\Dev\Ronny\NDInsight\tools\sintran-segment-carver\(carve.py, EXTRACTING-SEGMENTS.md) - Scratchpad tooling:
C:\Users\ronny\AppData\Local\Temp\claude\E--Dev-Ronny-NDInsight\b17a7474-33c0-4d7f-b9cb-f921c3ad419b\scratchpad\(brf_link.py, nd100dis.py, scanprog.py, m68kdis.py) - Prior root cause:
...\scratchpad\ENNS0-XROUT-UNKNOWN-NAME-ROOTCAUSE-2026-07-23.md - Disassembly handoff:
E:\Dev\Ronny\NDInsight\SINTRAN\XMSG\DOC\ENNS0-XROUT-DISASSEMBLY-HANDOFF.md