Carve answer: ACCP control-store-load → microprogram-start protocol over the octobus (2026-07-18)¶
Full path: E:\Dev\Ronny\NDInsight\SINTRAN\ND5000\CARVE-ANSWER-OCTOBUS-CSLOAD-MICROSTART-2026-07-18.md
Answers: E:\Dev\Ronny\ND5000UC\CARVER-REQUEST-OCTOBUS-CSLOAD-PARAMPTR-MICROSTART-2026-07-18.md
Builds on (do not re-derive):
- CARVE-ANSWER-OCTOBUS-CPU-PRESENCE-2026-07-18.md (5ALIVE / CMSYSPAR ack)
- CARVE-ANSWER-OCTOBUS-ACCP-SELFTEST-CSLOAD-2026-07-18.md (RTEST poll, terminate, CS-load family)
Evidence grade: [V] byte/manual/symbol-cited · [I] inferred · [OPEN] not carved.
VERDICT¶
The two new failures are not CS-load bugs — they are two ACCP commands that read back state, which the blind canned Messack answers wrongly:
-
"Verification of ACCP parameter pointer failed" — command VPARP (022B / 0x12, §5.3.16) must return, in its Messack, the 32-bit test word that SINTRAN just wrote into the MFbus parameter area at the pointer given by the preceding LPARP (021B / 0x11, §5.3.15). A canned zero-length/zero Messack returns the wrong word → SINTRAN's compare fails. The emulator must read the word back out of MPM shared memory and echo it. This is the ONE place on the whole load path where a canned answer cannot work. [V]
-
"ACCP was terminated; Microprogram is running" — command CMALI / ALIVE CHECK (037B / 0x1F, §5.3.26) encodes running-state by Messack = microprogram IS running, Messnak error 7 = NOT running. After the
244BTERMINATE, SINTRAN expects the microprogram to be stopped, i.e. it expects Messnak-7. Our canned Messack told it "still running" → the timeout message. This reverses the advice in the prior selftest carve (which said "Messack is the clean answer to ALIVE"): that is correct only while the microprogram is actually running. The emulator must track amicroprogram-runningflag and answer CMALI from it. [V]
Downstream ("Loading Control Store / Error when loading Control Store") is a consequence: because VPARP fails, the parameter pointer is never accepted, so LOCSM (load control store via memory) never runs, and the monitor reports the CS as not loaded. Fix VPARP + CMALI and the load/start sequence can proceed. [V/I]
1. Frame decode of the live trace (sintran-octobus-frames-octobus-fullflow.txt)¶
Wire envelope (byte-verified, OCTOBUS-ND100-ND5000-REFERENCE.md §3 + SINTRAN-OCTOBUS-MESSAGE-CATALOG.md §1):
SOMB = C-frame, info = 0x30 | OMD (0x8133 → OMD 3, the ACCP command OMD)
srcOMD= data byte (reply-to OMD; 0x30-family replies go here)
count = data byte (body length in bytes)
body = count data bytes (byte[0] = command code, then params, MS byte first)
EOMB = C-frame, info = 0x20 | OMD (0x8123 → OMD 3)
data byte on the wire = 0x01xx (C=0 data frame, low byte = value)
emergency = C+E frame, info = 2xxB (0x81A1=241B, 0x81A2=242B, 0x81A4=244B)
Decoded command stream (in order):
| # | cpos | Frame(s) | Meaning |
|---|---|---|---|
| 1 | 0 | 81A1 |
Emergency 241B CMMACLE — master clear (ACCP+CPU, starts selftest) |
| 2 | 0 | 81A2 |
Emergency 242B CMACONT — continue ACCP |
| 3 | 546 | SOMB, 03 07 0E 01 03 00 00 00 00, EOMB |
CMSYSPAR 016B (LSYSPAR), srcOMD=3, N100IDENT=1, 5OMDNO=3 — the alive handshake (CON5IDENT) |
| 4 | 546 | SOMB, 04 01 30, EOMB |
RTEST 060B / CMRSE, srcOMD=4 — read self-test status (poll) |
| 5 | 546 | SOMB, 04 07 0E 01 03 00 00 00 00, EOMB |
CMSYSPAR 016B again, srcOMD=4 |
| 6 | 546 | 81A4 |
Emergency 244B CMATE — TERMINATE ACCP |
| 7 | 546 | SOMB, 04 01 1F, EOMB |
CMALI 037B / ALIVE CHECK, srcOMD=4 — "did terminate stop the microprogram?" |
| 8 | 714 | SOMB, 04 01 32, EOMB |
DISKICK 062B / CMDIS — disable kicks (so ACCP cmds work) |
| 9 | 714 | SOMB, 04 01 1C, EOMB |
STOPMIC 034B / CMSTO — stop microprogram |
| 10 | 714 | SOMB, 04 01 39, EOMB |
CPURES 071B / CMCPU(RES) — reset the ND-5000 CPU |
| 11 | 714 | SOMB, 04 01 32, EOMB |
DISKICK 062B again |
| 12 | 714 | SOMB, 04 01 1C, EOMB |
STOPMIC 034B again |
| 13 | 714 | SOMB, 04 05 11 00 01 80 00, EOMB |
LPARP 021B / CMLPA — Load Parameter Pointer = 0x00018000 (4 bytes, MS first) |
| 14 | 714 | SOMB, 04 01 12, EOMB |
VPARP 022B / CMVER — Verify Parameter Pointer ← fails |
| 15 | 873 | (steps 8-14 repeat) | SINTRAN retries the whole init prologue because VPARP failed |
So the observed "0x30,0x1F,0x39,0x1C,0x12,0x11,0x32,0x05,0x07,0x0E" from the request are: 0E=CMSYSPAR command,
05/07=body-length bytes, and the real distinct command codes are
30,1F,32,1C,39,11,12 = 060B, 037B, 062B, 034B, 071B, 021B, 022B. [V]
2. Full ACCP command table for the load/start path¶
Codes from N500-SYMBOLS.SYMB.TXT (CM* symbols, 5-char truncated) cross-checked with ND-05.020.01 §5.3.
The "Description" column in OCTOBUS-PROTOCOL-REFERENCE.md §3 is a set of unverified guesses — the manual
command name governs.
| Cmd (§) | Octal / hex | Symbol | Dir params | Reply (Messack) | Messnak codes | Grade |
|---|---|---|---|---|---|---|
| CMSYSPAR / LSYSPAR (§5.3.13) | 016B / 0x0E | CMSYS | 6 bytes sys-params (err St/OMD, host St/OMD, opt) | ack, none | — | [V] |
| LPARP Load Parameter Pointer (§5.3.15) | 021B / 0x11 | CMLPA | 4-byte MFbus pointer | ack, none | — | [V] |
| VPARP Verify Parameter Pointer (§5.3.16) | 022B / 0x12 | CMVER | none (SINTRAN pre-writes a 32-bit word at pointer) | ack + 4-byte test pattern (word read back from param area) | −1 running, 1 no-pointer | [V] |
| LOCSD Load CS Directly (§5.3.17) | [OPEN] | — | CS addr(2) + µinstr(16) + cksum addend(2) | ack, none | −1 running, 4 checksum | [V spec] |
| LOCSM Load CS Via Memory (§5.3.18) | 052B / 0x2A (CMLDC/CMLDM cluster) [I] | CMLDC/CMLDM | none; block in MFbus mem (N, CS addr, N×128b, addend) | ack, none | −1 running, 1 no-pointer, 4 checksum | [I code] |
| STARTMIC Start Microprogram (§5.3.23) | 033B / 0x1B | CMRUN | CS start address (2 bytes) | ack, none → micro now RUNNING | −1 running, 9 CS-not-init | [I strong] |
| STOPMIC Stop Microprogram (§5.3.24) | 034B / 0x1C | CMSTO | none | ack → micro NOT running | −2 kicks-on, 0 not-started | [V code] |
| CONTMIC Continue Microprogram (§5.3.25) | 035B / 0x1D | CMCON | none | ack → micro RUNNING | 0 not-started | [I strong] |
| ALIVE / CMALI (§5.3.26) | 037B / 0x1F | CMALI | none | ack = RUNNING | 7 = NOT alive (stopped) | [V] |
| ENKICK Enable Kicks (§5.3.47) | 061B / 0x31 | CMENK | none | ack | — | [V code] |
| DISKICK Disable Kicks (§5.3.48) | 062B / 0x32 | CMDIS | none | ack | — | [I strong] |
| CPURES Reset CPU (§5.3.49) | 071B / 0x39 | CMCPU | none | ack | — | [V code, XRS5CPU] |
| RESTMIC Restart Microprogram (§5.3.46) | 036B / 0x1E | CMRES | [OPEN] | ack → micro RUNNING | — | [I] |
| TERMINATE (§5.3.50) | emergency 244B | CMATE=044B | — (hardware-decoded) | no reply → micro STOPPED, ACCP idle loop | — | [V] |
| RTEST Read Self-test (§5.3.54) | 060B / 0x30 | CMRSE | none | ack + 2-byte selftest status (0=OK) | — | [V] |
| Master clear | emergency 241B | CMMAC=041B | — | no reply | — | [V] |
| Continue ACCP | emergency 242B | CMACO=042B | — | no reply | — | [V] |
Messnak global error codes (§5.3.11:4240-4256) [V]:
−2 illegal-when-kicks-enabled · −1 illegal-when-micro-running · 0 micro-not-started · 1 no-parameter-pointer ·
2 illegal-word-count · 3 illegal-address · 4 checksum-error · 5 CS/CC HW-error · 6 undefined-command ·
7 not-alive · 8 memory-error · 9 CS-not-initialized.
Messnak wire body (§5.3.11:4228-4232) [V]: [byte0 = error code][byte1 = ASTS low][byte2 = ASTS high].
Messack wire body (§5.3.11:4218-4226) [V]: single ack byte, then any return params, in the SAME multibyte
message ("Messack is sent as a multibyte message even if there are no return parameters").
3. Ordered protocol sequence: selftest → running swapper (with SINTRAN's check at each step)¶
STAGE A PRESENCE / SELFTEST (solved in the two prior carves)
241B master-clear ─┐ 242B continue-ACCP ─┘ (boot / @nd-500 entry) no reply
CMSYSPAR 016B (alive) → ACCP must ACK → 5OMBREAD sets 5ALIVE [CPU-presence carve]
RTEST 060B (poll ~1 min) → Messack + status 0x0000 [selftest carve]
STAGE B TERMINATE / STATE PROBE ← NEW failure #2
244B TERMINATE (hardware-decoded, no reply) → micro-running := FALSE
CMALI 037B ALIVE CHECK → SINTRAN expects micro STOPPED
correct answer = Messnak 7 (Not alive). Messack here = "Microprogram is running" timeout.
STAGE C ACCP INIT PROLOGUE (get to a clean, stopped, kicks-off state)
DISKICK 062B → Messack (enable ACCP hw commands: while kicks on they are refused)
STOPMIC 034B → Messack (micro-running := FALSE)
CPURES 071B → Messack (reset ND-5000 CPU)
DISKICK 062B → Messack (repeated; monitor re-asserts stopped/kicks-off)
STOPMIC 034B → Messack
STAGE D PARAMETER POINTER HANDSHAKE ← NEW failure #1
(SINTRAN writes a 32-bit test word into MFbus memory at the pointer)
LPARP 021B ptr=0x00018000 → Messack (STORE the 4-byte pointer)
VPARP 022B → Messack + the 32-bit word READ BACK from param area
SINTRAN compares echoed word to what it wrote. Mismatch = "Verification ... failed".
STAGE E CONTROL-STORE LOAD (only reached once VPARP passes) [selftest carve §Q2]
LOCSM (block in MFbus mem: N words, CS addr, N×128-bit µwords, checksum addend) → Messack
(or per-word LOCSD 052B/0x2A). Messnak 4/5/−1 or missing ack → EILOCS 2103B
"Error in loading Control Store" (5P-P2-MON60.NPL:107).
STAGE F MICROPROGRAM START
STARTMIC 033B, CS start addr → Messack → micro-running := TRUE
(CMALI 037B now correctly returns Messack "running")
STAGE G START SWAPPER (nd-500-mon: LOAD-SWAPPER SWLOD 7B, START-SWAPPER STSWP 54B)
Activate process 0 (the swapper): mailbox message + octobus kick N100KICK(1).
Answered by the activate/answer engine (Nd500MicrocodeServicer), NOT the ACCP command library.
[OPEN in detail — this is the 3WREG/LOAD-SWAPPER path noted in the nd-500-bus-interface skill.]
Where the 244B terminate fits (request Q5): it is Stage B — a pre-load "stop whatever is running and prove it stopped" probe, BEFORE the CS load. "ACCP was terminated; Microprogram is running" means exactly what the words say: SINTRAN terminated the ACCP and then the ALIVE CHECK unexpectedly reported the microprogram still running — because our CMALI lied (canned Messack). [V]
4. LPARP / VPARP and CMALI-state — byte-cited detail¶
LPARP (§5.3.15, manual line 4341-4348) [V]¶
- Direct params: Parameter pointer, 4 bytes, MS byte first (§5.3.11:4194).
- "The address of the parameter area in the MFbus memory is given." Messack params: none.
- Trace value:
00 01 80 00= 0x00018000. The emulator stores this; it is the base of the parameter area in shared MFbus/MPM memory.
VPARP (§5.3.16, manual line 4352-4364) [V]¶
- "Before the command is given, the ND-120 writes a 32-bit word in the parameter area. The ACCP reads and returns the word from its parameter area, and the ND-120 should then check if they are equal."
- Messack params: Test pattern (4 bytes). Messnak: −1 (running), 1 (no parameter pointer given).
- Therefore the ACCP's job is a pure echo of MFbus memory[pointer]. The emulated station already holds the
MPM RAM (
_mpmRam/_mpmSize, attached viaAttachSharedMemory/SetMpmMemory), so it CAN read the 4 bytes at the LPARP pointer and return them. This is the required fix — there is no canned value that works, because SINTRAN chooses the test word. - [OPEN]: the exact mapping of the 32-bit pointer 0x00018000 into the emulator's MPM window (word vs byte
address; whether the low 24 bits index MPM the same way MAR does —
(addr & 0xFFFFFF)*2byte base per the nd-500-bus-interface skill). Match it to however SINTRAN's MON60 writes the test word; if the two sides read the same shared cell, the echo verifies regardless of the exact scaling. - [OPEN]: what SINTRAN compares against. The manual says "check if they are equal" — i.e. it compares the returned 4 bytes to the 4 bytes it wrote. It is a self-consistency check, not a magic constant.
CMALI / ALIVE CHECK (§5.3.26, manual line 4592-4601) [V]¶
- "Checks if the microprogram is running by polling the ALIVE signal ... If ALIVE is true, Messack is returned; otherwise Messnak is returned." Messnak error code: 7 Not alive.
- ALIVE = a flip-flop clocked by the MIR clock — i.e. it is set iff the microprogram is executing.
- State machine the emulator must model:
- reset / master-clear (241B) / TERMINATE (244B) / STOPMIC (034B) → running = FALSE
- STARTMIC (033B) / CONTMIC (035B) / RESTMIC (036B) → running = TRUE
- CMALI (037B):
running ? Messack : Messnak(7)
5. Bottom line for the emulator (OctobusND5000Station)¶
State the station must now track (in addition to the CPU-presence/selftest state already added):
| State var | Set by | Cleared by | Read by |
|---|---|---|---|
_parameterPointer (32-bit) |
LPARP 021B (store the 4 direct-param bytes, MS first) | master-clear | VPARP |
_microRunning (bool) |
STARTMIC 033B, CONTMIC 035B, RESTMIC 036B → true | TERMINATE 244B, STOPMIC 034B, master-clear 241B, reset → false | CMALI 037B |
_kicksEnabled (already exists) |
ENKICK 061B | DISKICK 062B | (gates hw commands) |
Per-command action (reply on the command's srcOMD, from station 70B, as a multibyte message):
- CMSYSPAR 016B — (already) ACK so 5OMBREAD sets 5ALIVE. Reply on srcOMD (=3 for this frame).
- RTEST 060B — Messack + 2 status bytes
00 00(selftest OK). srcOMD=4. - DISKICK 062B / ENKICK 061B — Messack (set
_kicksEnabled). srcOMD=4. - STOPMIC 034B — Messack;
_microRunning = false. - CPURES 071B — Messack (reset CPU state; may clear
_microRunning). - LPARP 021B — Messack; store the 4 param bytes as
_parameterPointer(0x00018000 in the trace). - VPARP 022B — Messack + 4 bytes = the 32-bit word read from MPM memory at
_parameterPointer. This is the fix for "Verification of ACCP parameter pointer failed." If_parameterPointerwas never set, return Messnak 1 (no parameter pointer). - CMALI 037B —
_microRunning ? Messack : Messnak(7). Answering Messnak-7 after the 244B terminate is the fix for "ACCP was terminated; Microprogram is running." - 244B TERMINATE (emergency) — no reply; reset AIB/AOB buffers;
_microRunning = false; ACCP → idle. - LOCSM / LOCSD (CS load) — Messack every command (discard payload; do NOT verify checksum on this path). Never leave one unanswered and never Messnak, or you get EILOCS 2103B. After the load, keep answering.
- STARTMIC 033B — Messack;
_microRunning = true. (Optionally record the CS start address.)
Reply-shape reminders (from the manual, [V]):
- Messack = a multibyte whose body is [ack byte][return params...]; ack byte = 0 (MFACK), consistent with the
working CMSYSPAR ack. For no-param commands the body is a single 00.
- Messnak = a multibyte whose body is [error code][ASTS low][ASTS high] (3 bytes). For CMALI-not-running use
error code 07; ASTS bytes may be 0.
- [OPEN]: the exact discriminator J04's own OMD-4 receiver uses to tell Messack from Messnak (byte count 1
vs 3, or the leading byte) is not carved — J04's octobus receive path is not disassembled. The manual wire
shapes above are authoritative; if a 3-byte 07 00 00 Messnak does not flip J04 to "not running", fall back
to encoding the nak via the reply frame's status high byte = MFNACK(377B), mirroring 5OMBREAD's CSTS test.
Canned-answer verdict, updated: the selftest/terminate/CS-load path passes with canned Messacks except the two state-reading commands: VPARP must echo memory, and CMALI must reflect the running flag. Those two are mandatory; everything else on Stages A–E can stay a canned Messack.
6. Honest [OPEN] items¶
- LOCSM/LOCSD octal codes — not pinned to a specific CM* symbol by bytes. LOCSM is inferred to be in the CMLDC=052B / CMLDM=051B cluster; the trace stops at VPARP so no CS-load command was actually observed on the wire yet. Answer any 0x2A/0x29 (and unrecognised load-family) command with Messack until the real code shows.
- STARTMIC=033B / CONTMIC=035B / RESTMIC=036B — mapped by the CMRUN/CMSTO/CMCON/CMRES 033-036 cluster + manual §-order + "Run/Stop/Continue" semantics; STOPMIC=034B and CPURES=071B and DISKICK=062B are the firmest. Not yet seen post-VPARP on the wire (the run stalls before Stage F).
- VPARP pointer→MPM address scaling — see §4; principle firm (echo shared memory), exact scaling to verify.
- J04 error-string byte addresses — "Verification of ACCP parameter pointer failed",
"ACCP was terminated; Microprogram is running", "Error when loading Control Store" live in the J04-binary
message pool (not dumped). The SINTRAN-side status they map to is
EILOCS 2103B(5P-P2-MON60.NPL:107) /ECSLOAD 2032B(line 66) for the CS-load messages; the parameter-pointer and alive strings are J04-local. [OPEN addr] - Start-swapper (Stage G) — the activate/kick/mailbox handshake is the Nd500MicrocodeServicer's job, tracked separately (LOAD-SWAPPER 3WREG blocker); out of scope for the ACCP command library answered here.
Sources: ND-05.020.01 EN §5.3.9-5.3.57 (manual\ND-05.020.01 EN ND-5000 Hardware Description.md:4168-5120);
N500-SYMBOLS.SYMB.TXT (CM codes); sintran-octobus-frames-octobus-fullflow.txt (live decode);
OCTOBUS-ND100-ND5000-REFERENCE.md §3/§5; SINTRAN-OCTOBUS-MESSAGE-CATALOG.md §1; 5P-P2-MON60.NPL;
nd-500-mon-j04.prog.md; prior carves (CPU-presence, selftest-CSload, 2026-07-18).*