CARVE ANSWER (V7) - V6 RETRACTED; the object-OPEN subtree is DISJOINT from the error-52 parser¶
Answers the "DEABF dot-form disproven" follow-up (relayed 2026-07-18). Builds on and retracts part
of CARVE-ANSWER-LINKER-LOAD-ERROR52-V6.md.
Binary: D:\ND\500\nd-linker\linker-b01.dom.asm. All addresses ND-500 VAs (hex).
Tags: [V] = read from these disasm bytes; [I] = inferred; [OPEN] = not proven.
0. RETRACTION (poisoned prior)¶
V6's NET claim - "the fix is in what the resolution returns; DEABF's dot-form B.NRF becomes
B0040C3C's input" - is WRONG. You disproved it live (DEABF OUT='B.NRF', error 52 unchanged, byte
identical), and the bytes agree: B0040C3C parses its window at B0040C4F before its internal
DEABF at B0040D5C, so DEABF's output cannot feed that parse; and the B003DDCD resolve subroutine
(selector 0x28) is never reached on the no-dot branch (B003DD82 -> B003DE13 skips
B003DDB0-B003DDFF). I accept both. The dot-form idea is dead. [confirmed by your test + parse order]
Your redirected hypothesis 2 is the right one, and the call graph supports it: the object-OPEN subtree and the error-52 B0040C3C subtree are disjoint.
1. Where the object 50B OPEN actually is - and which is which [V]¶
There are two MON 50B OPEN (call $0xF8000028) sites; they are NOT equivalent:
B004E874= the USER-OBJECT opener. Its name argb.0xECis built dynamically just before the call, wrapping the name in'quote chars (B004E85E by move $0x27,...), args(b.0xEC, b.0x2C, b.0x34, b.0x3C). Dynamic quoted name = the file you typed. RoutineB004E80F. [V, lines 94036-94048]B004CABC= a FIXED-name work/scratch file, NOT your object. Name arg is the constant$0xB0054314, access modeb.0x2C = 3set literally atB004CAB9. RoutineB004C9C1. [V, lines 91355-91363] Treat this as the linker's own temp/output file, not the LOAD target.
Intended object-open chain (backward from B004E874):
B004E874 (MON 50B OPEN, object) <- B004E80F <- B004AEBC (command-loop-adjacent, entd @B004AEBC)
<- B004DC33
B004AEBC sits immediately after the command-read loop and its keyword matcher
(section 2); it reaches the object OPEN without calling B0040C3C or B003CFDA (checked
B004AEBC body B004AEBC-B004B0xx: no call to either). [V for the window checked; full-routine
[I].]
2. The command dispatch (where LOAD is routed) [V structure]¶
B004ACBF call $0xF8000149 ; MON 511B - read a command line
B004ACD9 ents $0x30 ; keyword MATCHER: walks a command-name table at 0xB00530BC
(r:= $0xB00530BC ; laddr r.0xC ; index by char ; AND $0x7F ; compare ; ...)
0xB00530BC, which
yields the handler. I did not decode that table, so I cannot yet name the exact static handler
LOAD maps to - that is the missing link and the highest-value next step (section 4). [OPEN]
3. The error-52 subtree is a SEPARATE name subsystem [V]¶
B0040C3C is reached during your run via B003D0E2, which lives in B003CFDA. B003CFDA is part of
a mutually-recursive name-processing cluster (B003CFDA, B003D19E, B003D337, B003D442) -
every call among them is internal recursion. This cluster + B0040C3C form a distinct subsystem from
the object-open subtree in section 1. [V - caller maps all internal]
Note also B0040C3C's stage grammar (;->2, )->3, .->4; : is only a flag) is not a plain
file-name grammar - ;/)/. are linker symbol/address/spec delimiters. That is consistent with
B0040C3C being a symbol/spec resolver, not the file opener. So handing it the file name B:NRF
and demanding stage 4 is what produces error 52. [I - grammar shape + the disjoint subtree.]
4. Net (honest) and the decisive next step¶
- What I can prove: the object is opened at
B004E874(B004E80F<-B004AEBC/B004DC33), a subtree that does not pass throughB0040C3C. Your LOAD dies earlier, inside the separateB003CFDA/B0040C3Cname subsystem. So your hypothesis 2 (mis-route / wrong resolver) is the live lead, not any dot-form fix. [V for the subtrees; [I] that yours is mis-routed vs. a legit pre-open validation that should have passed.] - What I cannot yet prove: the exact intended
LOAD -> handler -> B004E80Fpath, because the command keyword table at0xB00530BCis not decoded. Also unproven: whether real HW's LOAD callsB003CFDA/B0040C3Cat all, or only your run does.
Decisive probes (yours to run, or point me and I'll keep carving the static side):
1. On a KNOWN-GOOD real-HW LOAD B:NRF, break at B004E874 (and B004CABC) and capture the
full call stack. That is the intended chain, ground-truth. Diff it against your run's stack at the
error - the first frame that differs is the fork.
2. Trace your run from B004ACBF (you offered) and log the FIRST entry into the B003CFxx
cluster (B003CFDA/B003D19E/B003D337/B003D442) or into B0040C3C. Whatever calls into that
cluster is your fork point.
3. If you want the static handler: I can decode the command-name table at 0xB00530BC (matcher
B004ACD9) to find which handler LOAD dispatches to, and whether it reaches B004E80F or the
B003CFxx cluster. Say the word and I will carve it.
Evidence register (linker-b01.dom.asm, PSEG VAs)¶
- Object OPEN
B004E874dynamic quoted name buildB004E85C-B004E872; routineB004E80F. - Scratch OPEN
B004CABCfixed name$0xB0054314, mode 3B004CAB9; routineB004C9C1. - Object-open callers:
B004E80F<-B004AEBC(89448),B004DC33;B004C9C1<-B004C95B<-B0035C96<-B0035ED3(the 0x35xxx param subsystem). - Command read
B004ACBF(MON 511B); matcherB004ACD9over table0xB00530BC. - Error subtree
B003CFDA/B003D19E/B003D337/B003D442(mutually recursive) ->B0040C3C. - (Retracted) V6 dot-form chain: disproven live + by parse-order (
B0040C4Fparse precedesB0040D5CDEABF;B003DDCDresolve unreached).