The ACCP octobus command table - all 46 dispatcher arms¶
Date: 2026-08-02
Image: Installation\Communication\OctobusAccp\eprom\octo.bin (SHA256 0EA81716AD81984B..., 131072 bytes)
Ghidra program: Raw Binary, 68000:BE:32, base 0 (loaded from C:\Temp\octo\octo.bin, byte-identical)
Evidence tags: [V] proved from firmware behaviour or a hardware code - [I] inferred, not proved - [OPEN] behaviour known, name not established - [inh] inherited from an earlier carve, provenance not re-checked here.
Arm addresses are [V] for all 46 - every cmpi.b immediate was read directly out of the image
and all 46 matched the 0C 00 00 <imm> + 66 shape with zero mismatches.
The table¶
| Code | Octal | Arm | CM* |
Command | Basis |
|---|---|---|---|---|---|
0x0D |
015B | 583A |
- | read back system parameters | [V] behaviour; not RECO - returns the cells 0x0E writes |
0x0E |
016B | 57E8 |
CMSYS |
LSYSPAR (CMSYSPAR) | [V] 3 words = 6 bytes -> 1143A0/A2/A4, sets 1143A6 |
0x0F |
017B | 5736 |
CMTEC |
ECHO | [V] collects n bytes, sends the same n back; no guards |
0x10 |
020B | 6562 |
CMREA |
- | [OPEN] returns 16 words from 114550 |
0x11 |
021B | 5980 |
CMLPA |
LPARP | [V] writes the parameter pointer + flag |
0x12 |
022B | 59B6 |
CMVER |
VPARP | [V] no params; running guard + param-pointer guard -> Messnak 1 |
0x13 |
023B | 4D50 |
CMWWC |
LOCSM | [V] issues WCS; memory params + checksum |
0x14 |
024B | 4EDC |
CMDWW |
LOCSD | [V] issues WCS; 8 words = 128 bits + checksum |
0x15 |
025B | 4FC0 |
CMADR |
DUCS | [V] store latch bit 2 + memory param |
0x16 |
026B | 519C |
CMDRW |
DCSD | [V] store latch bit 2 + direct 14-bit address |
0x17 |
027B | 56BC |
- | - | [OPEN] latch enable + sets running |
0x18 |
030B | 58A4 |
- | AMICTRAP | [V] MREG 0xD0 = ATRAP without OMESS |
0x1B |
033B | 65B6 |
CMRUN |
RUNTST | [V] no params; runs 0xF22C; returns 1131E2. NOT StartMic |
0x1C |
034B | 562E |
CMSTO |
STOPMIC | [V] no params; inverse guard -> Messnak 0 |
0x1D |
035B | 568C |
CMCON |
CONTMIC | [V] no params; calls the 0x79BC enable wrapper |
0x1E |
036B | 6438 |
CMRES |
RESTMIC | [V] two words = CS address + interval, exactly 5.3.46 |
0x1F |
037B | 56EA |
CMALI |
ALIVE | [V] answers nak 7 "not alive" |
0x20 |
040B | 5A46 |
CMLMA |
LMAR | [I] one word |
0x21 |
041B | 5AB0 |
CMLMI |
LMIR | [V] shares 0x773E with console Cmd29_LoadMir |
0x22 |
042B | 5B38 |
CMRMI |
RMIR | [I] no params |
0x23 |
043B | 5BC8 |
CMBUS |
TBUS | [I] one long |
0x24 |
044B | 5CC0 |
CMATE |
RAIB16 | [V] calls AibRead16_AndClearAibf |
0x25 |
045B | 5D56 |
- | RAIB32D | [V] 32-bit pair read then ACON 5 = RAIBF |
0x26 |
046B | 5E64 |
- | LAOB16 | [V] word param -> AobSingleWordWrite |
0x27 |
047B | 5ECE |
- | LAOB32D | [V] long param -> data-pair write |
0x28 |
050B | 5FD6 |
CMRAS |
RASTS | [V] no params, returns one status word |
0x29 |
051B | 6016 |
CMLDM |
LMODE | [V] only non-console caller of 0x77FE |
0x2A |
052B | 608C |
CMTMA |
LCON | [V] one word -> ACON port; inherited "LOCSM" refuted |
0x2B |
053B | 60F6 |
CMWMP |
WMPM | [V] two longs = address + data |
0x2C |
054B | 6178 |
CMRMP |
RMPM | [V] one long = address |
0x2D |
055B | 6326 |
CMSET |
SETTRAC | [I] three words |
0x30 |
060B | 6616 |
CMRSE |
RTEST | [V] reads 1131E2, clears 1144EC/EA |
0x31 |
061B | 6504 |
CMENK |
ENKICK | [V] writes the kicks flag |
0x32 |
062B | 6534 |
CMDIS |
DISKICK | [V] clears the kicks flag |
0x33 |
063B | 5C44 |
CMBUF |
TBUF | [I] one long |
0x34 |
064B | 5F38 |
- | LAOB32M | [I] memory read -> data-pair write |
0x35 |
065B | 5DC0 |
- | RAIB32M | [I] remaining slot in a closed family of six |
0x36 |
066B | 558A |
CMMIC |
STARTMIC | [V] CS address word, ARMA reclocks MAR, sets MRUN, Messnak 9 |
0x37 |
067B | 6390 |
CMLOO |
LOOP | [V] sets 113138, the loop flag itself |
0x38 |
070B | 63B8 |
CMSPE |
Set Clock Speed | [I] one byte -> 0x7B20 |
0x39 |
071B | 6408 |
CMCPU |
CPURES | [V] |
0x3A |
072B | 61F4 |
CMTES |
TESTMPPM | [I] two longs; completes the multiport trio |
0x3B |
073B | 547E |
CMCCD |
DCCD | [V] CS/cache guard + symbol agree |
0x3C |
074B | 52C6 |
- | DUCC | [V] cache latch bit 1 + memory param |
0x3D |
075B | 6644 |
CMRPR |
Read PROM Version | [I] symbol only |
0x3E |
076B | 66B6 |
- | READ CPU MODEL | [V] reads class byte 1131F6 |
Final count: 34 [V], 10 [I], 2 [OPEN]. Codes run 0x0D-0x3E with exactly four holes -
0x19, 0x1A, 0x2E, 0x2F. No name is left tagged [inh]: all six inherited names were audited
against the manual's parameter lists, five confirmed and two disproved (STARTMIC at 0x1B was
really RUNTST; LOCSM at 0x2A was really LCON).
The two [OPEN] arms are not unfinished work - 0x10 and 0x17 implement commands ND-05.020.01
does not document, which is established rather than assumed: every manual command is now accounted
for, and TERM and ARES are hardware-decoded with no arm at all.
How each name was earned¶
Only two kinds of evidence ever produced a name that survived:
- A hardware code. MREG literal
0xD0named AMICTRAP. ACON command5(RAIBF) named RAIB32D. ACON7(MASKAIBF) characterised0x36. - A worker with one or two callers.
0x77FEnamed LMODE.0x773Enamed LMIR.AibRead16_AndClearAibfnamed RAIB16.
Everything else misled at least once: manual section order, position in the image, a caller's name, elimination against the manual list, and a shared worker with many callers.
And a fifth: a WORKER'S OWN NAME. ControlStoreWriteWithVerify (0x741E) says "write", but its
ACON command is 0x18 = AMIRCK, a MIR reclock; the write-control-store command is 0x06 = WCS,
which it never issues. A name assigned by an earlier carve is exactly as unreliable as a name taken
from a call site. Check the hardware code the worker actually issues.
The machinery every arm is built from¶
| Address | Name | Role |
|---|---|---|
0x6986 |
Reply_EmitByte |
append a byte to the reply (60+ callers - identifies nothing) |
0x69D0 |
Reply_EmitWord |
append a word |
0x6F9C |
MsgBody_NextParamByte |
next parameter byte; overrun -> 0x6FE4 |
0x6FFA |
MsgBody_NextParamWord |
next parameter word |
0x7036 |
MsgBody_NextParamLong |
four bytes, big-endian |
0x6A64 |
StatusHiRead |
emit the two ASTS bytes (the Messnak tail) |
0x72EC |
AibRead16_AndClearAibf |
16-bit AIB read + ACON 5 |
0x7374 |
MfBusCmdDataPairStatus |
32-bit pair read + ACON 5 |
0x72A0 |
AobSingleWordWrite |
write one word into AOB |
0x7320 |
MfBusDataPairWithLatchGate_33 |
write the 32-bit pair |
0x7138 |
MfBusMemoryTransaction_VariantB |
read IN from MFbus memory |
0x70AA |
MfBusMemoryTransaction_VariantA |
write OUT to MFbus memory |
Globals: 1143BC message body, 1144EA read cursor, 1144EC body length, 1143AE parameter
pointer, 1143B2 pointer-given flag, 1143AC microprogram running, 1143B6 kicks enabled,
11455C control-store health (good value 0x7F55), 11314A CS initialised, 113138 the loop flag.
Reply shapes: ack = 0x00. nak = 0xFF, error code, then two ASTS bytes.
The documented error list 0-9 is incomplete - arm 0x0D emits 13.
Auditing the inherited names - two confirmed, and one of MY OWN readings overturned [2026-08-03]¶
0x0E = LSYSPAR / CMSYSPAR - CONFIRMED [V]. 5.3.13 says "Direct parameters: System parameters
(6 bytes)" and shows them as three 16-bit words. The arm reads exactly three words and stores
them to 0x001143A0, 0x001143A2, 0x001143A4, then sets 0x001143A6 := 1 as a
"parameters given" flag.
0x1C = STOPMIC - CONFIRMED [V], and its guard runs BACKWARDS from every other arm. 5.3.24
gives Messnak 0 = "Microprogram is not started". The arm tests 0x001143AC and naks when it is
clear - the inverse of the usual "illegal while running" test. That is correct for a stop
command, and it is a nice independent check: a mis-assigned name would almost certainly have the
guard the normal way round.
RETRACTED: 0x0D is NOT RECO¶
Two rounds ago 0x0D was recorded [I] as RECO, Read ECO Levels, because it returns three words and
5.3.52 describes two bytes per module.
It returns the three words 0x001143A0/A2/A4 - the exact cells 0x0E = CMSYSPAR writes - and it
gates on 0x001143A6, the flag CMSYSPAR sets. So it is the read-back of the system parameters,
not a report of board revisions. The writer and the reader name each other; the module-count
coincidence was just a coincidence.
Method note: this was caught by reading the writer of a memory cell after reading its reader. Neither arm alone said what the cells were. When an arm returns some globals, find who writes them.
0x0D therefore joins 0x10 and 0x17 as a command with no manual section, and RECO has no arm
identified.
0x12 = VPARP - CONFIRMED [V], and the doubt was the xref undercount AGAIN¶
5.3.16 gives VPARP no parameters and Messnak -1 and 1. The arm has exactly that: no parameter
read, the running guard, then tst.w 0x001143B2 answering Messnak 1, then it reads the pointer
at 0x001143AE.
The reason it looked wrong was that 0x59F4 was still undefined bytes, so its test of
0x001143B2 never reached the xref list - the same undercount that produced the retracted RAIB16
claim and that this file has now warned about three times.
That is the FIFTH time this single database defect has misled this work. The one thing that went right here is that it was written up as "either the arm reaches the flag another way, or the inherited name is wrong" rather than as a finding. When a sweep contradicts a documented behaviour in this range, suspect the disassembly before suspecting the claim.
TERM and ARES have NO arm - and that settles the sets question properly [V 2026-08-03]¶
5.3.50 TERM and 5.3.51 ARES both say the same three things:
- the command "has a special code with the emergency bit set (bit 7) and is detected by the hardware";
- "(The octobus driver is not activated.)";
- "There is no response to this command."
They bypass the dispatcher entirely. A command the hardware decodes and the driver never sees
cannot have a cmpi.b arm, and does not need one. So the last two open arms were never going to be
TERM and ARES, and the tidy "three arms, three commands" symmetry from two rounds ago was false.
This also repairs, on correct grounds, a claim withdrawn earlier. The sets genuinely are not the same: TERM and ARES have manual sections but no arms. The earlier version of this claim rested on RAIB16 supposedly having no arm, which was an xref undercount and was retracted. This one rests on the manual saying outright that the driver is not involved.
Consequence for 0x10 and 0x17: with TERM and ARES excluded, there is no unclaimed manual
command left for them. They are commands the firmware implements that ND-05.020.01 does not
document, alongside ACON 0x08 and Messnak 13. Their behaviour is recorded; there is no name to
find.
RECO strengthened by the same page. 5.3.52: "the print status of each module consists of two
bytes" - and arm 0x0D returns three words = three modules x two bytes. That upgrades the 0x0D
reading from a guess about shape to a match on structure.
The CM* ALIASES - and a mistake in how this file first dumped them [2026-08-03]¶
The arm code and the CM* code are the same number space. Evidence, from the ACCP-init agent:
39 codes carry a CM* symbol, 7 do not, 39 + 7 = 46, and all four arm holes (0x19, 0x1A,
0x2E, 0x2F) have no CM* symbol either - four for four. So any inferred row can be checked by
looking up 0o<code> in N500-SYMBOLS.SYMB without touching Ghidra.
Correction to this file's own method. The first dump here de-duplicated by value, which silently discarded every alias. Several codes carry two or three names, and the discarded ones were the informative ones:
| Code | Aliases | What the alias settles |
|---|---|---|
0x24 |
CMATE, CMR16 |
read 16 -> RAIB16 |
0x25 |
CMR32 |
read 32 -> RAIB32D |
0x26 |
CML16 |
load 16 -> LAOB16 |
0x27 |
CML32 |
load 32 -> LAOB32D |
0x2A |
CMTMA, CMLDC |
load decoder -> LCON |
0x21 |
CMLMI, CMMAC, CMTMO |
three names on one code |
0x15 |
CMADR, CMAD1, CMRWC |
|
0x16 |
CMDRW, CMAD2 |
|
0x22 |
CMRMI, CMACO |
|
0x23 |
CMBUS, CMAST |
Four of the AIB/AOB names were proved from hardware before these aliases were seen - CMR16 from
AibRead16_AndClearAibf, CMR32 from the pair-read plus ACON 5, CML16/CML32 from the write
workers. The symbol table and the firmware agree on all four independently. CMLDC does the same
for the LCON correction, which is the more useful one since it also refutes the inherited LOCSM.
A caution the agent added and this file endorses: a CM* name is still a name. Better than
section order or position, weaker than a hardware code or a one-or-two-caller worker. 0x2A carrying
both CMTMA and CMLDC shows why - one of those two would have sent a reader nowhere.
Where it leaves the ten inferred rows: eight now have symbol support (CMLMA LMAR, CMRMI RMIR,
CMBUS TBUS, CMSET SETTRAC, CMBUF TBUF, CMSPE Set Clock Speed, CMTES TESTMPPM, CMRPR Read
PROM Version). 0x34 and 0x35 have no CM* symbol at all - consistent with LAOB32M/RAIB32M
being commands SINTRAN never sends, which is exactly why they had to be argued from the closed
six-arm family instead.
An INHERITED name was wrong: 0x1B is RUNTST, not STARTMIC [V 2026-08-03]¶
Reading the manual's parameter lists settled two arms at once. 5.3.23 STARTMIC takes "Control store address (2 bytes)", loads MAR with it, sets MRUN, and can answer Messnak 9. 5.3.53 RUNTST takes "None", returns "Self-test status (2 bytes)", and answers only -1.
| Arm | What it actually does | Command |
|---|---|---|
0x1B (033B, CMRUN) |
no parameters; only the running guard; calls 0xF22C; replies with 0x001131E2, the self-test status word |
RUNTST (5.3.53) |
0x36 (066B, CMMIC) |
reads one word; worker issues ARMA = "reclock MAR"; sets 1143AC (MRUN); answers Messnak 9 - the only arm that does |
STARTMIC (5.3.23) |
0x1B had been carried as STARTMIC since the earlier carve. It is not: STARTMIC needs an address
and this arm reads nothing. CMRUN reads as "run test", which fits RUNTST.
It also pairs cleanly with 0x30 = RTEST, which reads the same 0x001131E2 without running
the test - exactly the 5.3.53 / 5.3.54 relationship.
This is what the provenance question was about. Six names arrived from an earlier carve tagged
[inh]; one is now proved wrong and one (LOCSM at 0x2A) was refuted earlier. The manual's
parameter lists turned out to be the cheapest test available - "does this arm read a parameter at
all?" is one glance and it falsifies a name outright.
ACON command 0x08 is UNDOCUMENTED, and it is what enables kicks [V 2026-08-03]¶
Scanning the whole image for move.w #imm,(0x00220000) gives every static ACON write - 52 sites.
All decode against ND-05.020.01 table 9 except one:
| Site | Command | In table 9? |
|---|---|---|
0x6512 - inside arm 0x31 = ENKICK |
0x08 |
NO |
0x6540 - inside arm 0x32 = DISKICK |
0x07 = MASKAIBF |
yes |
0x6888, 0x100EC |
0x08 |
NO |
Table 9 lists 0,1,2,5,6,7,9,A,C,D,F,10,11,13,14,15,16,17,18,1A - there is no 0x08.
What it must be. DISKICK issues MASKAIBF ("mask AIB-flag interrupt"). ENKICK issues 0x08.
A kick arrives as an AIB-flag interrupt, so enabling kicks means unmasking it. 0x08 is
therefore the unmask counterpart of MASKAIBF, missing from the published table.
This also confirms ENKICK and DISKICK from hardware, not just from their SINTRAN symbols - they are a matched mask/unmask pair on the same interrupt.
Second correction to ND-05.020.01 from this work, alongside the incomplete Messnak error list
(arm 0x0D emits 13, the manual documents 0-9).
The control-store load family, and a flip caught in time¶
0x741E = ControlStoreWriteWithVerify - it writes a control-store word using ACON command
0x18 = AMIRCK ("ACCP reclock MIR without ECMIR"), checks HW_STATUS_HI bit 0, and sets the
control-store error latch 0x001131E2 on failure. Fourth ACON code to explain firmware behaviour.
This flipped a reading I was one step from writing down. Arm 0x15 loops that worker over an
incrementing address, and from the arm alone the natural guess was a dump - control store out to
memory. The worker's name and its ACON code say the opposite: it writes. Decompiling the worker
before recording the arm is what caught it.
0x13 (023B) = LOCSM, Load Control Store Via Memory (5.3.18) [I strong]:
- memory-parameter guard, so it needs
LPARPfirst; - pulls a
{address, count}descriptor out of the parameter block and then reads successive words in from MFbus memory withMfBusMemoryTransaction_VariantB; - builds the same
0x001144F0word array as0x14, accumulating the same checksum; - and calls
CmdPortWrite_A- the worker the consoleCmd21_LoadControlStorealso calls.
So 0x13 is the memory-sourced sibling of 0x14 = LOCSD. That gives LOCSM a home at last, and
it is not 0x2A - see below.
0x15 (025B) drives 0x741E with an incrementing address counter, memory-parameter guarded.
0x16 (026B) drives the same worker with a single 14-bit address and answers Messnak 5 when
it returns non-zero. Both [OPEN].
CAUTION:
ControlStoreWriteWithVerifyis a NAME, not evidence - and the ACON code disagrees¶That function name came from an earlier carve. Its actual ACON command is
0x18= AMIRCK, "ACCP reclock MIR without ECMIR" - a clock operation on the microinstruction register. The command that writes the control store is0x06= WCS, and0x741Edoes not issue it.Reclocking MIR happens on the way in or out of a control-store word, so this worker does not settle direction at all. I was one step from naming
0x15and0x16on the strength of that function name - the same caller-name trap that producedTRAP_OCBAKand the0x795A"re-init" reading, arriving for a fourth time in a different costume.Consequence: four arms (
0x13,0x14,0x15,0x16) touch the control-store path but the manual has only two LOAD commands (LOCSD, LOCSM). So at least two of them are dumps - DCSD (5.3.19) and DUCS (5.3.20) - and the direction cannot be read off0x741E. Whoever picks this up should find who issues ACON0x06(WCS) and work outward from there; the census counted0x000620,964 times per boot, so the real control-store load path is heavily used and easy to spot.
0x13= LOCSM is unaffected - that inference rests on the shared worker with the consoleCmd21_LoadControlStoreand on the checksum, not on0x741E.
RESOLVED the same round - the WCS lead worked¶
Searching the whole image for a write of ACON 0x06 to 0x220000 finds exactly two sites:
0x73D2 and 0x7408. They sit inside the two functions formerly called CmdPortWrite_A and
CmdPortWrite_B, renamed ControlStoreWrite_WCS_A / _B. Those are the control-store write
path, and nothing else in the image issues WCS.
That promotes both loads to [V]:
| Arm | Command | Now proved by |
|---|---|---|
0x14 (024B) |
LOCSD (5.3.17) | issues WCS; 8 words = 128 bits + checksum; direct parameters |
0x13 (023B) |
LOCSM (5.3.18) | issues WCS; same array + checksum; memory parameters |
And it settles what 0x15 and 0x16 are not. Neither issues WCS - they go through 0x741E,
whose command is AMIRCK, a MIR reclock. So they are not control-store loads, which leaves the
dump commands DCSD (5.3.19) and DUCS (5.3.20) as the live candidates, [OPEN] between them.
The technique, worth reusing: when a worker's name is untrustworthy, search the image for the hardware command byte the real operation must issue and see who issues it. Two hits out of a 131072-byte image settled a question four rounds of reading arms had not.
And the same map settles 0x15 / 0x16 as DUMPS¶
0x741E issues, in order: AMIRCK (0x18, reclock MIR from the control store) and then, via
CmdPortWriteShort_B, MDCLK (0x10, clock the MISR serial chain). It checks HW_STATUS_HI
bit 0 and returns a status flag, and it never issues WCS.
Reclock-then-shift is the read direction: pull a control-store word into MIR, then shift the
shadow chain out. A load runs the opposite way - shift in, then WCS - which is exactly what
ControlStoreWrite_WCS_A/_B do for 0x13 and 0x14.
| Arm | Parameter | Command | Basis |
|---|---|---|---|
0x16 (026B) |
one 14-bit CS address (Messnak 3 if > 0x3FFF) |
DCSD, Dump Control Store Directly (5.3.19) | [I] |
0x15 (025B) |
memory parameter, address counter | DUCS, Dump Control Store Via Memory (5.3.20) | [I] |
The four dump commands form a 2x2, and a LATCH BIT is the discriminator [V 2026-08-03]¶
There are two copies of the reclock-and-shift read primitive, identical except for which latch bit they gate:
| Worker | Gates latch bit | Array | Arms that call it |
|---|---|---|---|
0x741E |
2 (0x04) |
control STORE | 0x15, 0x16 |
0x764E |
1 (0x02) |
control CACHE | 0x3B, 0x3C |
0x3B is CMCCD = DCCD, Dump Control Cache Directly - and it calls 0x764E. That pins latch
bit 1 to the cache, and therefore bit 2 to the store. The second axis is already carved: the
parameter-pointer guard marks the memory-parameter variants.
Two hardware facts, two axes, four commands - no elimination required:
| Arm | Array (latch bit) | Parameters | Command |
|---|---|---|---|
0x16 |
store (bit 2) | direct, 14-bit address | DCSD (5.3.19) |
0x15 |
store (bit 2) | memory | DUCS (5.3.20) |
0x3B |
cache (bit 1) | direct | DCCD (5.3.21) |
0x3C |
cache (bit 1) | memory | DUCC (5.3.22) |
All four promoted to [V]. This is the cleanest structural result in the phase: every cell is fixed
by a hardware bit or a guard, and the manual's four dump commands land in the four cells exactly.
Worth contrasting with how this looked two rounds ago, when the same four arms were going to be
assigned by counting what was left over. The 2x2 says the same thing about 0x15/0x16, but for a
reason that would survive one of them turning out to be something else entirely.
And the worker's name is now doubly wrong. ControlStoreWriteWithVerify neither writes (no WCS)
nor is limited to verifying. Left renamed in place rather than re-guessed, with this note as the
correction.
0x2A = LCON - and why the inherited "LOCSM" was wrong¶
0x2A (052B) = LCON, Load CON (5.3.40) [V]. The arm reads one 16-bit word and loops it
through CmdPortWriteTiny, which writes straight to the ACON decoder at 0x220000. The manual:
"The ACON decoder is loaded (16 bits). This is used to generate strobe pulses according to the bit
pattern loaded. Nothing is stored." One word in, written to ACON, nothing retained.
Corroborated by the console twin sharing that worker - Cmd32_LoadControlDecoder.
The earlier carve recorded 0x2A as LOCSM (Load Control Store Via Memory), and that is wrong on
three counts: SINTRAN's symbol is CMTMA, not a load-control-store name; the body loads the
control decoder, not the control store; and LOCSM takes memory parameters while this arm
takes one direct word and carries no parameter-pointer guard. LOCSM has no confirmed arm.
A near-miss worth keeping. Two rounds ago
CmdPortWriteTinybriefly looked like proof that0x3Awas LCON, because the consoleCmd32_LoadControlDecodercalls it. I rejected that on the grounds that a worker with three callers proves nothing. The right answer was a different arm sharing the same worker -0x2A, which matches on parameter shape as well. The rule held: the worker narrowed the field, the 16-bit-word shape picked the winner.
0x3C (074B) has THREE guards - control-store health, running, and the parameter pointer -
so it is a memory-parameter control-store/cache command: DUCS (5.3.20) or DUCC (5.3.22),
[OPEN] between them. With 0x3B = DCCD (cache, directly), the family's fourth member DCSD is still
unplaced.
ECHO - the cleanest identification in the set¶
0x0F (017B) = ECHO, Echo Test (5.3.12) [V], confirmed three independent ways:
- Behaviour. Reads a byte count, collects that many bytes, acks, then emits the same bytes back. The manual's wording is "returns the test pattern".
- The absence of guards. 5.3.11 says "Some commands never return Messnak, like ECHO TEST" - and this is the only arm in all 46 with no guard at all. An absence that the manual predicts is real evidence, unlike an absence a tool failed to show.
- The symbol.
CMTECreads as "test communication", matching 5.3.12's stated purpose, "to assure that the basic communication between the ND-120 and the ACCP works".
Detail the manual does not state: the count is masked to 0x1F, so at most 31 test bytes.
The multiport trio¶
WMPM and RMPM were named from parameter count - two longs (address + data) versus one long
(address). 0x3A takes two longs and its symbol is CMTES, "test". The manual's third multiport
command is TESTMPPM, Test Multiport (5.3.43), and the other two test commands are already spoken
for by CMBUS = TBUS (0x23) and CMBUF = TBUF (0x33). So 0x3A = TESTMPPM, [I].
Why only [I]: the argument is elimination plus shape, and elimination against the manual's list
has misfired twice in this effort already. It needs a worker or a hardware code like the others.
What is still open, and the honest reason¶
- Two arms have behaviour recorded but no name:
0x10and0x17. With TERM and ARES shown to bypass the dispatcher, no unclaimed manual command remains, so these two are almost certainly undocumented - like ACON0x08and Messnak 13.0x10returns the sixteen-word signature block from0x00114550;0x17enables the latch and sets the microprogram-running flag. Behaviour recorded, no name to find. - Four names still carry
[inh]-CMSYSPAR(0x0E),VPARP(0x12),STOPMIC(0x1C),CONTMIC(0x1D),RESTMIC(0x1E). Two of the original six inherited names have already been disproved (LOCSMat0x2A,STARTMICat0x1B), so these deserve the same parameter-list check - it is one glance per arm and it falsified both of the others. - The Ghidra database still has undefined pockets inside the arms, which makes every xref in
0x4D50-0x66B6an undercount. This produced two wrong conclusions in one session. Run a range disassembly over that span, then re-run the guard sweeps - they are the cheapest classifier available and only as good as the disassembly beneath them.