Skip to content

MON 242B (octal) - OldUser (RUSCN)

Switches back to the user name in effect before NewUser (MON 241B); your program continues under the old user. OldUser always resets the FIRST user name and has no function if NewUser was not executed. All users; background programs.

Status: GOTAB dispatch head byte-proven (GOTAB[242B] = 066212B), pointing at the 4-word entry stub F1727 in 025-S3IRPIT; the RUSCN worker body is real SINTRAN L bytes in the file-system segment 006-S3FS (a FILSYS-SYMBOLS symbol, the OldUser twin of SUSCN). The stub sits inside a shared stub block and does not itself reach RUSCN; the exact MON 242 -> worker link crosses an uncarved kernel bridge (see Honest caveats). All addresses/values are octal.

  • Full disassembly: 242B-OldUser.ASM - the actual code, both regions (F1727 entry stub + RUSCN worker with its link cells).
  • Bytes live once in the canonical segment layer: ../../segments-ref/.

Dispatch path

flowchart LR
    A["User program<br/>MON 242B"] --> B["ENT14 level-14<br/>T = MON number"]
    B --> C["GOTAB[242B] = 066212B<br/>(byte-proven)"]
    C --> D["F1727 entry stub<br/>025-S3IRPIT :066212B"]
    D -.uncarved CALLPROC.-> E["RUSCN switch-back worker<br/>006-S3FS :106562B"]
    E --> F["guard NewUser done; restore old<br/>name; copy friend table; re-enter"]
    class A blue
    class B,C,D teal
    class E,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 dashed hop (D -> E) is the resident CALLPROC/segment-switch - it is not present in any carved segment, so it is the one link that cannot be followed statically. The stub F1727 is a tiny 4-word compiler entry inside a shared stub block (neighbours F2130/F2131/MTOUS); it is not a self-contained named handler and the worker address 106562 does not occur anywhere inside 025-S3IRPIT.


Code location (dispatch path)

Every row is a real region you can open. Byte offset = (addr - loadbase) in octal words x 2; for 025-S3IRPIT (load base 32000B) it is (addr - 32000B) x 2, for 006-S3FS (load base 26000B) it is (addr - 26000B) x 2.

Role Segment (full disasm) Addr range (octal) Byte offset Symbol Verdict
GOTAB[242] dispatch word commoncode.asm - .hex 071475B (1 word) 59002 GOTAB+242 = 066212B VERIFIED
F1727 entry stub 025-S3IRPIT.asm - .hex 066212B-066215B (4 words) 28948 F1727 VERIFIED (GOTAB target); shared stub block
resident CALLPROC bridge - (uncarved) - - CALLPROC UNVERIFIED
RUSCN worker body 006-S3FS.asm - .hex 106562B-106701B (code) + 106702B (pad) + 106703B-106731B (link cells) 49892 RUSCN real bytes = CODE; body link MISATTRIBUTED

The worker window is bounded strictly by the next symbol FDFDI=106732B (104 words). Words 106562B-106701B are code, 106702B is a ROP NOOP pad, and 106703B-106731B are the JPL I/JMP I link-cell table (data).

Verify by hand: the GOTAB word: grep '^71475 ' ../../segments-ref/SINTRAN-DATA_commoncode/SINTRAN-DATA_commoncode.hex -> 71475 066212 154 212 59002; then dd if=../../../resident/SINTRAN-DATA_commoncode.bin bs=1 skip=59002 count=2 2>/dev/null | od -An -tx1 -> 6c 8a (the stored word = 066212B). The stub head: dd if=../../../segments/025-S3IRPIT.bin bs=1 skip=28948 count=2 2>/dev/null | od -An -tx1 -> cc 3d (= octal 146075, RADD SX DA, matching the disassembly). The RUSCN worker entry: grep '^106562 ' ../../segments-ref/006-S3FS/006-S3FS.hex -> byte offset 49892; then dd if=../../../segments/006-S3FS.bin bs=1 skip=49892 count=2 2>/dev/null | od -An -tx1 -> 22 50 (= octal 021120, STD I 120, the RUSCN entry). prove-mon.py 242 reads the same GOTAB value.


Instruction walkthrough

Full listing: 242B-OldUser.ASM. Two regions.

Region A - F1727 stub (066212-066215) is the 4-word GOTAB target in 025-S3IRPIT. It sits inside a shared stub block and its head (RADD SX DA / AAA -1 / RADD CLD SA DD / LDA 51) is not a self-contained per-call handler; the real transfer to the worker is the resident CALLPROC, which a static decode cannot follow.

Region B - RUSCN worker (106562-106731) is the functional body. 106562 STD I 120 saves the incoming pair; 106566 JPL I 115 -> [106703] is the prologue. 106567-106575 guard on the saved-name slots being -1 (no NewUser done -> no-op tail). 106601-106617 rebuild the old coded name (SHA ZIN SHR 10 = logical right shift 8, AND mask) and clear the saved-name flag; 106620 JPL I 100 -> [106720] re-enters the old user. 106646-106660 is an 8-word friend-table copy loop (SKP IF DT GRE SX bounds it, AAX 1 increments). The tails converge on 106671 SAA -12 / 106672 JMP I 37 -> [106731].


Parameter / register contract

Manual-side names/types are from 242B_OldUser.yaml.

Reg / field Dir Meaning Verdict
(none) in OldUser takes no input parameters (MAC MON 242) inferred (manual)
saved-name slots internal -1 sentinel = no NewUser done (SAT -1 / SKP IF DA UEQ ST at 106567-106575) VERIFIED (bytes); meaning inferred
B+11 internal descriptor pointer for the release path (STX ,B 11, LDX ,B 11) VERIFIED (bytes); meaning inferred
friend table (8 words) internal copied back into the user datafield (loop 106652-106660) VERIFIED (bytes); meaning inferred
error return out standard error code in A (106671 SAA -12) VERIFIED (bytes); code value inferred

Pseudo-code (for an emulator)

See 242B-OldUser.pseudo.c - a pseudo-C model for emulator authors. The control flow (the "was NewUser done?" guard, the saved-name restore, the friend-table copy loop and the error tails) is byte-verified; the register/field semantics are inferred from the code shape and the NewUser twin.

Every instruction in the pseudo-code is translated against the canonical ND-100 instruction semantics reference (RADD CLD copy idiom, RADD SB/SX/SD DA adds, SHA ZIN SHR 10 logical right shift, SKP IF DA UEQ ST unsigned compare, SKP IF DT GRE SX signed compare, AAA/AAX add-constant, MIN ,B increment and skip, JPL I/JMP I indirect call/return).


Honest caveats

What is byte-proven: GOTAB[242B] = 066212B (prove-mon.py 242 reads commoncode file byte 0xe67a = 6c 8a); that value read as a 025-S3IRPIT address is the F1727 stub, whose bytes decode cleanly (146075B = RADD SX DA). The RUSCN worker at 106562B in 006-S3FS is real code (first word 021120B = STD I 120) and it is a switch-back routine (no-NewUser guard, old-name restore, friend-table copy), consistent with OldUser.

What is NOT proven: the F1727 stub is only 4 words and lands inside a shared stub block, not a dedicated per-call handler; it branches within its own head and the actual transfer to RUSCN is the resident CALLPROC in an uncarved overlay. So the MON 242 -> RUSCN attribution rests on the RUSCN symbol name (Reset USer, Change Name) + the matching behaviour + the SUSCN twin, not a followed pointer - hence MISATTRIBUTED in the strict sense. The worker's JPL I/JMP I link cells (106703..106731) are a pointer table whose runtime targets are not resolved here. Confirming the dispatch link needs a live trace: issue a real MON 242, single-step through the stub and the resident CALLPROC, and confirm P lands on RUSCN = 106562.

Method: ../../../../../EXTRACTING-RESIDENT-CODE.md - dispatch reality: ../../TASK-05-mismatches.md - master map: ../../MON-CALL-INDEX.md.