CARVE: Who posts the MSWIN (reason-5) swapper message with an empty body?¶
CORRECTION 2026-07-21 (SUPERSEDED on the sender identity) - see CARVE-S3SM5-MSWIN-STAMP-AND-FILL-2026-07-21.md¶
This doc's BOTTOM LINE ("no ND-100 routine fills the body; the sender is ND-500-side / 030-S3SM5
monitor or ND-5800 microcode") is DISPROVEN. A reliable decode of 030-S3SM5 (see the new doc)
shows:
- 030-S3SM5 is ND-100 code, NOT byte-addressed ND-500 code (nd100-dis on the byte-swapped LE
image decodes cleanly at word base 040000B; nd500-dis gives garbage; matches the project memory's
"S3SM5 is ND-100 (compiled 5STDRIV)" note). It is the ND-100 System Monitor that manages the ND-500
swapper and emits the "> Loading Swapper" string.
- S3SM5 ITSELF (ND-100 code) stamps MICFU(off6):=3SWMESS(literal 5) and writes SWFUN(off7) + the
~15-word body - the MSWIN builder is at runtime octal 140771..141001 and the full body builder at
162155..162207. So the fill is ND-100 code and does NOT require ND-5800 microcode.
- Why this doc got it wrong [V]: its "proven negative" grep covered ONLY the resident nucleus
(s3vs-4.symb + the NPL tree). S3SM5's source is NOT in the repo (it is a paged segment,
carved as bytes only), so its stores were invisible to that grep. The negative was scope-limited,
not a true absence.
The relay/offset facts below (5ACTSWAPPER writes SWPST+HSWPI only; SWMESS fall-through; MICFU vs SWFUN both =5 as different fields; the LNEWSWAP-EMPTY genuine-no-work path) remain [V] and useful. Read the rest of this doc through the correction above.
Date: 2026-07-21 Scope: static SINTRAN III L (L-VSX-500) carve, ND-5800 image, D4 flow Method: direct reading of the carved NPL source + full build symb + carved ND-500 segment map. Every claim graded: - [V] byte/line-verified by direct reading of a cited file:line - [I] inference from that reading (reasoned, not directly stated by the bytes) - [OPEN] not established by the bytes; needs a further carve or live trace
Files read (full absolute paths):
- E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\NPL\MP-P2-N500.NPL
- E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\NPL\RP-P2-N500.NPL
- E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\NPL\CC-P2-N500.NPL
- E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\NPL\XC-P2-N500.NPL
- E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\s3vs-4.symb (full Pass-2 build listing)
- E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\SYMBOLS\L07\N500-SYMBOLS.SYMB.TXT
- E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\SYMBOLS\L07\SYMBOL-1-LIST.SYMB.TXT
- E:\Dev\Ronny\NDInsight\SINTRAN\ND500\swapper\swapper-k01-handlers.md
- E:\Dev\Ronny\NDInsight\tools\sintran-segment-carver\versions\L-VSX-500\re\030-S3SM5-routine-map.md
THE QUESTION¶
In the ND-500 D4 flow (PLACE-DOMAIN (FLOPPY-USER)LINKAGE-LOAD-H02 then RUN
under SINTRAN L on the ND-5800 image), the ND-500 swapper (SWAPPER-K01) is handed
a reason-5 (MSWIN) work message and crashes because the message BODY is empty.
WHO posts that message, and WHY is its body empty? Name the sender routine and the
exact reason the requester MESSBUFF body is never filled.
BOTTOM LINE (graded verdict)¶
-
The ND-100 routine that hands the swapper reason 5 + the requester pointer is
5ACTSWAPPER(144762B, MP-P2-N500.NPL:2857), reached for SWFUN=MSWIN=5 throughSWMESS's generic fall-through (MP-P2-N500.NPL:428/510).SWMESSspecial-cases ONLYMSWSTART(7) andMSWSWAIT(20); every other SWFUN value, includingMSWIN=5, drops toCALL 5ACTSWAPPER; GO TRACO. [V] -
5ACTSWAPPER/SWMESSare NOT the sender of the message content. They are the ND-100 relay. They copy the requester message's ownSWFUNfield intoSWMSG.SWPST(the reason the swapper reads) and the requester message's address intoSWMSG.HSWPI- they never fill the requester's 15-word body. [V] -
The actual SENDER - the code that fills
MESSBUFF.MICFU := 3SWMESS,MESSBUFF.SWFUN := MSWIN=5and the body the swapper derefs - is on the ND-500 side and is OUTSIDE the carved ND-100 NPL tree. It is the ND-500 System Monitor030-S3SM5(and/or the ND-5800 microcode) running on the ND-500. This is proven negatively: a full-tree grep of every ND-100 NPL file AND the completes3vs-4.symbbuild showsSWFUNis only ever LOADED (LDATX), never STORED, andMICFU := 3SWMESSis never written by any ND-100 routine. Both fields therefore arrive already set from the ND-500. [V] Attribution to S3SM5 specifically is [I] (S3SM5 is the ND-500 system monitor that packages the non-500B MON calls; the exact routine inside it is not disassembled). -
WHY the body is empty in the D4 flow:
5ACTSWAPPERonly converts the requester's ADDRESS intoHSWPI(CNVWADR); the body content must already have been written into that requester MESSBUFF by the ND-500-side sender BEFORE the swapper message was raised. On the ND-5800 emulation the real ND-500 placement/monitor path that would fill it never executes (the swapper is faked / functional), soHSWPIpoints at a reused, zeroed process-1 MON-200B buffer and the swapper fn-5 handler derefs zeros. The fill step is not skippable by any ND-100 code - it simply belongs to a sender that did not run. [I], resting on the [V] fact that no ND-100 code fills the body.
One-line answer: the poster of the reason-5 message content is the ND-500-side System
Monitor S3SM5 / ND-5800 microcode (uncarved at instruction level); the ND-100 relay
5ACTSWAPPER copies only the SWFUN reason and the buffer POINTER, never the body, so
when the ND-500 sender does not run on the emulated ND-5800 the body stays zero.
EVIDENCE CHAIN (file:line)¶
A. The reason value and the field offsets (symbol table)¶
SYMBOLS\L07\N500-SYMBOLS.SYMB.TXT:45953SWME=000005-> MICFU dispatch value 5....:4986SWFUN=000007-> SWFUN is field offset 0o7 in the message....:5680MSWIN=000005-> the swap-function value MSWIN = octal 5.SYMBOLS\L07\N500-SYMBOLS.SYMB.TXT:3540 SWPST=000103,3574 SWPST=000103-> SWMSG.SWPST at word offset 0o103. [V] reason 5 = MSWIN; note the two "5"s are different fields: MICFU=3SWMESS=5 (selects SWMESS) and the SWFUN payload = MSWIN=5 (selects the generic path).
B. Message arrival and dispatch on MICFU (ND-100 driver, level 14)¶
MP-P2-N500.NPL:360N500C: X:=X.MESSBUFF=:5MMESSAGE- the arriving message IS the process's MESSBUFF. [V]MP-P2-N500.NPL:388-390X:=5MMESSAGE; *MICFU@3 LDATX ... GO N5XXC- dispatch key is the message's MICFU. [V]MP-P2-N500.NPL:393-395N5XXC: A GOSW ... FAR MILLFU, SWMESS, EXAMD, DEPMD % 04-07- GOSW index 05 =
SWMESS. So a message with MICFU=3SWMESS(=5) routes toSWMESS. [V]
- GOSW index 05 =
C. SWMESS decodes SWFUN; MSWIN=5 falls through to 5ACTSWAPPER¶
MP-P2-N500.NPL:428-430SWMESS: ... *SWFUN@3 LDATX % A:=X.SWFUNC. [V]:431-463IF A=MSWSTART THEN ... FI(start-swapper branch, SWFUN=7). [V]:464-508IF A=MSWSWAIT THEN ... FI(restart-and-wait branch, SWFUN=20). [V]:509-511*IOF ; CALL 5ACTSWAPPER ; GO TRACO- the generic fall-through taken for ANY other SWFUN, including MSWIN=5. [V] (No MSWIN-specific branch exists in SWMESS.)
D. 5ACTSWAPPER = the relay: copies reason + pointer, NOT the body¶
MP-P2-N500.NPL:2857-28615ACTSWAPPER: ... X=:D=:MSGTOSW; A:=5MBBANK; CNVWADR; AD=:CMSGTOSW- takes the requester message address and converts it to a word/MPM address. [V]
:2862-2864SWPWAIT; CALL WN5STATUS ... IF A=PSWWAIT THEN- only proceeds if the swapper is free. [V]:2866AD:=CMSGTOSW; *AAX HSWPI; STDTX->SWMSG.HSWPI := address of requester msg. [V]:2867SWACTIVE; *AAX SWPFU-HSWPI; STATX. [V]:2875-2877*MICFU@3 LDATX ... IF 3SWMESS=D THEN *SWFUN@3 LDATX- if the requester message's MICFU=3SWMESS, take its SWFUN as the reason (else use the trap number). [V]:2883X:=SWMSG; *AAX SWPST; STATX % Save reason for activating swapper->SWMSG.SWPST := SWFUN(=MSWIN=5). [V]-
:2884-2887writes onlyNUMPA:=6,FUNCV:=0,KFLIP:=0,MICFU:=3MONCO; thenCALL MCCOrestarts the swapper. No copy of the requester's 15-word body into SWMSG occurs anywhere in this routine. [V]=> The swapper is told reason 5 and "the body is over there at HSWPI". It then RIOMs the body from the requester buffer itself. If that buffer is zero, the swapper reads zero. [I]
E. The swapper fn-5 handler dereferences that body¶
swapper-k01-handlers.mdsection 5, idx 5 (entry 0x0800836C, worker 1000077534): the fn-5 stub loads message-buffer word[0x240BC]and calls the working-set (re)builder.[0x240BC]is the RIOM'd copy of the requester body. Empty body -> zero id/params -> the table-build worker operates on garbage. [V] for the deref; the crash mechanism is consistent with an all-zero body [I].
F. No ND-100 code ever fills SWFUN or marks MICFU=3SWMESS (the negative proof)¶
- Full-tree grep for
SWFUNwrites across every*.NPLand acrosss3vs-4.symb: every hit is*SWFUN@3 LDATX(a LOAD). Zero stores. Sites: MP-P2-N500.NPL:430, 973, 2877; s3vs-4.symb:58736, 59279, 61183/87532. [V] - Full-tree grep for
MICFU@3 STATX(writes of MICFU): every write stores3MONCO,3START,3TRACO,3RMED,3RMICV,3WMONCO,3RPREG- i.e. ND-100-internal micro-function reclassifications.3SWMESSis NEVER stored into MICFU by any ND-100 routine;3SWMESSappears only in threeIF ... =3SWMESSTESTS (MP-P2-N500.NPL:381, 972, 2876; RP-P2-N500.NPL:369). [V] - Conclusion: a message can only ARRIVE with MICFU=3SWMESS and SWFUN=MSWIN already set. The setter is on the ND-500 side. [V]
G. MON 510B (CallSwapper / SWMC) is NOT the MSWIN sender¶
MP-P2-N500.NPL:2047-2051SWMC: MSM510 SHZ 10=:D ... *AAX TRAPN; ... STATX; CALL 5ACTSWAPPER; GO NXTMSG. SWMC setsTRAPN, not SWFUN, and does not set MICFU=3SWMESS. Its message therefore takes the trap leg of 5ACTSWAPPER (line 2879), not the3SWMESS -> SWFUNleg. So the operator-visible "CallSwapper" MON is a distinct, trap-numbered path and is not the origin of a reason-5 message. [V]
H. The genuine "no work" path proves reason-5-with-empty-body is illegitimate¶
MP-P2-N500.NPL:1060-1065EMPTY: A:=0=:D ... X:=SWMSG; *AAX HSWPI; STZTX; *AAX SWPIN-HSWPI; STZTX; ... GO NXTMSG. When the swap-fifo is empty SINTRAN ZEROES HSWPI and does NOT restart the swapper (leaves it at PSWWAIT). So legitimately there is never a "reason 5 + live HSWPI + empty body". The D4 state is an upstream anomaly: a swapper message really did arrive (HSWPI got set), but its body content was never produced by the ND-500 sender. [V] for the EMPTY path; [I] for "anomaly".
I. The sender lives in the ND-500 System Monitor S3SM5 (uncarved at instruction level)¶
030-S3SM5-routine-map.mdsec 4-5: S3SM5 is the ND-500 System Monitor that PACKAGES the non-500B MON calls and the ND-500 command set; the 500B-523B calls are serviced ND-100-side. The swapper working-set bring-up during placement is ND-500-monitor work, not a 500B GOSW call. [V] that S3SM5 is the ND-500 monitor.- Same doc sec 6: S3SM5's instruction bodies are NOT reliably disassembled (nd500-dis frames it inconsistently; only its dispatch tables are solid). So the exact S3SM5 routine that builds the MICFU=3SWMESS / SWFUN=MSWIN message body is not identified. [V]
EVIDENCE TABLE¶
| Claim | Grade | Evidence |
|---|---|---|
| reason 5 = MSWIN; MICFU=3SWMESS=5; SWFUN=offset 0o7 | [V] | N500-SYMBOLS.SYMB.TXT:4595/4986/5680 |
| Arriving message = process MESSBUFF, dispatched on MICFU | [V] | MP-P2-N500.NPL:360, 388-393 |
| MICFU=3SWMESS -> SWMESS (GOSW idx 05) | [V] | MP-P2-N500.NPL:393-395 |
| SWMESS special-cases only MSWSTART/MSWSWAIT; MSWIN falls to 5ACTSWAPPER | [V] | MP-P2-N500.NPL:431, 464, 509-511 |
| 5ACTSWAPPER writes SWMSG.SWPST:=SWFUN(=5), SWMSG.HSWPI:=addr(requester) | [V] | MP-P2-N500.NPL:2866, 2876-2883 |
| 5ACTSWAPPER never copies the requester body into SWMSG | [V] | MP-P2-N500.NPL:2857-2887 (whole routine) |
| Swapper fn-5 handler derefs the RIOM'd body word [0x240BC] | [V] | swapper-k01-handlers.md idx 5 |
| SWFUN is only ever LOADED, never STORED, in the entire ND-100 build | [V] | grep NPL + s3vs-4.symb (all hits LDATX) |
| MICFU:=3SWMESS is never written by any ND-100 routine (only tested) | [V] | grep MICFU@3 STATX vs =3SWMESS |
| MON 510B/SWMC is a trap-numbered path, not the MSWIN sender | [V] | MP-P2-N500.NPL:2047-2051 |
| EMPTY path zeroes HSWPI + does not restart swapper (so reason-5+empty is illegitimate) | [V] | MP-P2-N500.NPL:1060-1065 |
| Sender fields set by ND-500 side (not ND-100) | [V] | negative proof (rows above) |
| Sender = S3SM5 ND-500 System Monitor specifically | [I] | 030-S3SM5-routine-map.md sec 4-5 |
| Exact S3SM5 routine that builds the body | [OPEN] | S3SM5 not instruction-decoded (sec 6) |
| Body empty because ND-500 placement/swapper faked on ND-5800 | [I] | MEMORY D4-RUN-BLOCKER finding + EMPTY path |
[OPEN] - what still needs a carve or live trace¶
-
[OPEN] The exact S3SM5 (or ND-5800 microcode) routine that builds the swapper message - which routine sets
MESSBUFF.MICFU:=3SWMESS,MESSBUFF.SWFUN:=MSWINand fills the 15-word body.030-S3SM5.binis carved but not reliably disassembled (030-S3SM5-routine-map.mdsec 6). Needs a working ND-500 disassembler / SLEIGH spec or a live single-step of the ND-500 monitor during PLACE-DOMAIN. -
[OPEN] Whether MICFU=3SWMESS is stamped by the ND-500 microcode or by S3SM5 code. The ND-100 side only reads it; the split between microcode-set vs monitor-set fields for a swapper message is not established.
-
[OPEN] The intended body layout for an MSWIN=5 request - the swapper fn-5 worker (1000077534) reads
[0x240BC]; what segment-id / descriptor fields a correct MSWIN body must contain is not decoded. Needed to confirm the emulated buffer is genuinely "empty" vs "wrong shape". -
[OPEN] Confirm on a genuine classic-500 image that the body IS filled. The verdict that the body is empty because the ND-5800 swapper is faked rests on the D4-RUN-BLOCKER finding (live) plus the EMPTY-path bytes; a side-by-side trace on a real classic-500 placement (where the ND-500 monitor actually runs) would promote the [I] to [V].
-
[OPEN] Identity of the "reused process-1 MON-200B buffer" at HSWPI. The live anchor observed HSWPI = word 0x210718 (byte 0x420E30) reading all zeros; confirming statically that this address is a recycled MON-200B/XMSG buffer (vs a freshly allocated placement buffer) would nail the "never initialized" mechanism.
NOTE ON NAMESPACES (to avoid a known trap)¶
MICFU=3SWMESS=5 (the level-14 GOSW selector) and SWFUN=MSWIN=5 (the swap
sub-function inside the message) are two different fields that both happen to hold 5.
MICFU=3SWMESS selects the SWMESS handler; SWFUN=MSWIN selects, inside SWMESS, the
generic 5ACTSWAPPER path. Do not collapse them into one "5".