BDIO / DOMINO nucleus block-I/O driver - L07 byte-verified carve¶
Date: 2026-07-19
Version: SINTRAN III L-VSX-500 (running system), symbols L07.
Ground truth: carved bytes of ../../segments/017-S3SMPIT.bin
(byte-identical to 026-S3IMPIT.bin, cmp = 0 diffs), load base 032000B.
NPL logic reference (DIFFERENT revision, never authoritative bytes):
SINTRAN/NPL-SOURCE/NPL/MP-P2-DISK-START.NPL (BDMTR/BDMFU/MBUILD/DCNVA/
SSBDI/BDTRANS/STRBDIO/REBDIO, NPL-listing addresses 073246-074243) and
DP-P2-VARIABLES.NPL (5DSKC, MTNKDF).
Evidence convention (per claim):
- [V] = byte-verified HERE (carved word reproduced, dd where listed)
- [NPL-V] = matches NPL logic, bytes consistent, but the claim itself
(a name/meaning) comes from the NPL revision
- [I] = inferred, not proven from bytes
- [OPEN] = unresolved; what was tried is recorded
Symbol sources (5-char truncation, L07):
- SYMBOL-2-LIST.SYMB.TXT: routine addresses BDMTR=073454 BDMFU=073565
CCM14=073630 MBUIL=073700 DCNVA=073750 SSBDI=074000 BDTRA=074012
BD12T=074024 STRBD=074072 REBDI=074246 MPUTP=074467 (next symbol)
BDTMU=075326 BDTMV=075356 GETFR=073121 PUTFR=073150 GETSW=073111
ST12L=027027 MONEN=032000 STUPR=032034 RWAIT=032043 WT=032571
GETOU=026656 PUTIN=026670 TO12Q=026725 DOMDF=041064 CLUST=041574
BBASE=041576 N500D=051767 QP100=033315 5DSKC=011171 GAPFD=034006
- SYMBOL-1-LIST.SYMB.TXT: WT12=033616 NKSEN=042171 NKREC=043076
NKREA=043375 NKWRI=043411 9FLEX=012074 RTACT=013552 BRESE=010563
BRELE=010610 WDATA=003527 RDATA=003535 ERRFA=000215 GAPFU=000744
RTREF=004007 CURPR=004010 SSECN=007271 PDVNO=007267 SINEC=007266
STUPR/... plus all datafield offsets used below (HSTAT=10 NFUNC=6
TRLRE=7 TYPCO=11 DMSID=13 ABFUN=14 MEMAD=15 ABPA2=17 ABP31=21 ARESZ=23
DIBRE=25 RTRES=1 SSSTA=10 TYPRI=3 RTDLG=25 DAREG=3 ALEVB=10 LV12B=140
DODMA=13 OWN=5 ADRZE=60 RSFLA=14 PLDNO=15 DRPRT=16 DLPRT=17 DIPO1=17
DIPO2=20 DIPOO=17 OPAIX=21 OPAIN=40 5NOAB=7 STDRI=177776 TMSUB=177772
TMR=177773 TTMR=177774 DSVER=20 DSOW1=22 DSOW2=23 DSCA1=26 DSTSD=26
DSSTS=30 DSCMD=32 DXPOO=34 DSQC1=36 DSQCN=36 DSQC2=37 DSTBL=42
DMYAD=44 DNRPG=50 DMSID=13).
1. Overlay resolution proof [V]¶
All big resident overlays span the same virtual window, so 074072B
"disassembling to something" proves nothing (carving trap 4). Discriminator =
sibling coherence across the whole SUBR family, plus every P-relative literal
resolving to an L07 symbol value.
Candidates tested at base 032000B: 017-S3SMPIT and 065-S3SIPIT
(the SYMBOL-2 driver overlay of the SMD/SCSI carve). Result:
- In 017-S3SMPIT ALL of
BDMTR 073454 / BDMFU 073565 / MBUIL 073700 / DCNVA 073750 / SSBDI 074000 / BDTRA 074012 / BD12T 074024 / STRBD 074072 / REBDI 074246land on routine entries whose bodies reproduce the NPL logic instruction for instruction (sections 3-8), and every literal-pool word resolves to a known L07 symbol:NKWRI 043411at 074241,NKSEN 042171at 074243,NKREC 043076at 074445,NKREA 043375at 074450,WT12 033616at 074245/074465/074011,9FLEX 012074at 074233/074455,BDTMU 075326at 074227/074462,BDTMV 075356at 074451,DOMDF 041064at 073743/074242/074244(-2)/074463,DSVER+DOMDF 041104at 074240,CLUSTER 041574at 074236/074443,BBASE 041576at 074237/074444,N500D 051767at 073776,SSECN 007271at 074226/074446,PDVNO 007267at 074230/074452,SINEC 007266at 074232/074454,GETFR 073121at 073547,PUTFR 073150at 073672,ERRFA 000215at 073550/073674,BRESE 010563at 073551,GAPFU 000744at 073552,GAPFD 034006at 073553,WDATA 003527at 073555,RWAIT 032043at 073556,MONEN 032000at 073557,WT 032571at 073560,RTREF 004007at 073545,QP100 033315at 073546/073671,GETOU 026656at 073665,RDATA 003535at 073666,BRELE 010610at 073667,CURPR 004010at 073673,STUPR 032034at 073675,PUTIN 026670at 074007,RTACT 013552at 074010,ST12L 027027at 074032,BD12T 074024at 074031,REBDI 074246at 074244,TO12Q 026725at 074464. Zero mismatches over 40+ independent symbol hits. - In 065-S3SIPIT the same addresses decode to unrelated bytes (074072 =
156403 SHA ZIN 3, then strayIOX 505etc.) - wrong overlay. - Bonus coherence: the four nucleus gates called from here live in the SAME
overlay window and share an identical prologue (
174000 BSET ZRO SSPTM; STA I ..; SWAP SA DB; STA ,B 2; A:=L; STA ,B 3) atNKSEN 042171,NKREC 043076,NKREA 043375,NKWRI 043411. [V]
Conclusion: the BDIO/DOMINO driver lives in 017-S3SMPIT
(= 026-S3IMPIT), load base 032000B, symbols from SYMBOL-2-LIST (routines)
+ SYMBOL-1-LIST (offsets/nucleus). [V]
dd byte proof (reproduced before publishing)¶
017-S3SMPIT.bin is big-endian; byte offset = (addr_dec - 13312) * 2.
| addr (oct) | byte off (dec) | word (oct) | bytes | what |
|---|---|---|---|---|
| 073454 | 34392 | 004373 | 08 fb |
BDMTR entry STA -5 |
| 073750 | 34768 | 020376 | 20 fe |
DCNVA entry STD -2 |
| 073777 | 34814 | 124012 | a8 0a |
the A:=124012 self-mod constant |
| 074000 | 34816 | 135413 | bb 0b |
SSBDI JPL I ,B 13 = CALL DODMA |
| 074024 | 34856 | 171005 | f2 05 |
BD12T SAT 5 |
| 074072 | 34932 | 146135 | cc 5d |
STRBD entry A:=B |
| 074152 | 35028 | 170567 | f1 77 |
SAA 167 = BDIO WRITE fn 167B |
| 074153 | 35030 | 171070 | f2 38 |
SAT 70 = message size 70B |
| 074235 | 35130 | 000213 | 00 8b |
literal 213B = COMPARE fn |
| 074241 | 35138 | 043411 | 47 09 |
literal = NKWRI |
| 074245 | 35146 | 033616 | 37 8e |
literal = WT12 |
| 074246 | 35148 | 146173 | cc 7b |
REBDI entry X=:B |
| 074456 | 35420 | 104031 104651 104622 | 88 19 89 a9 89 92 |
the 3 benign statuses |
Reproduce e.g.:
dd if=017-S3SMPIT.bin bs=1 skip=34932 count=2 | od -An -tx1 # -> cc 5d
nd100-dis -a -o -b 13312 <swapped>.
2. Datafields and the BDIO message record [V]¶
Four datafields are in play (offsets collide across them - do NOT mix):
- Queue element DF (
Bon monitor level,Xin STRBDIO):RTRES=1, TYPRING=3, NFUNC=6, TRLREG=7, SSSTAT/HSTAT=10, TYPCO=11, DMSID=13, ABFUN=14, MEMAD=15-16 (double), ABPA2=17-20 (double), ABP31=21.HSTAT(+10) receives the final driver status. [V] - Pool DF (
PDF; the DOMINO device/pool datafield):RSFLA=14, PLDNO=15, DRPRT=16, DIPO1=17, DIPO2=20 (double DIPOO), OPAIX=21-22 (double), ARESZ=23-24 (double), DSTSD=26 (last nucleus/BDIO error), TMSUB=-6, TMR=-5, TTMR=-4(timer-retry cells). [V] - Controller DF:
STDRIV=-2(level-12 driver entry),DIBRE=25(input-queue head),DODMA=13(the DODMA vector slot). [V] - DOMDF = 041064 [SYMBOL-2] - the global DOMINO message datafield.
NFUNC=+6(level-12 continuation),DLPRT=+17(local nucleus port). The BDIO message record starts atDSVER = DOMDF+20 = 041104B(this exact sum is the literal at 074240). [V]
BDIO message record (word-by-word, as initialized by the carve)¶
Offsets octal. "msg rel" = offset from the message start (DSVER), which is
what NKWRI/NKREA transfer.
| DOMDF+ | msg rel | field | set by (carved addr) | value |
|---|---|---|---|---|
| 20 | 0 | DSVER | (not written here) | version word, pre-set at init [OPEN] |
| 21 | 1 | - | (not written here) | [OPEN] |
| 22 | 2 | DSOW1 | MBUIL 073734-073735 | 1 = "abstrans message" marker [V] |
| 23 | 3 | DSOW2 | MBUIL 073732-073733 | queue-element DF address (owner) [V] |
| 26 | 6 | DSCA1 | MBUIL 073723-073724 | pool DF address (single word) [V] |
| 30-31 | 10-11 | DSSTS | MBUIL 073716-073720 | -1,-1; completion: 0,0=OK else status in low word [V] |
| 32 | 12 | DSCMD | STRBD 074165 | 166B=READ / 167B=WRITE / 213B=COMPARE [V] |
| 34-35 | 14-15 | DXPOO | MBUIL 073725-073727 (LDD ,B 17 pool) |
DIPOO double (pool index DIPO1,DIPO2) [V] |
| 36 | 16 | DSQC1 (=DSQCN hi) | MBUIL 073721 | 0; -1,-1 on completion = moved to mirror pool / rejected marker [V] |
| 37 | 17 | DSQC2 | MBUIL 073722 | 0 [V] |
| 40-41 | 20-21 | OPAIN | MBUIL 073730-073731 (LDD ,B 21 pool) |
OPAIX double (area index) [V] |
| 42-43 | 22-23 | DSTBL | MBUIL 073710-073711 | ABPA2 double = media (disk block) address [V] |
| 44-45 | 24-25 | DMYAD | MBUIL 073706-073707 | DOMINO memory byte address, bit 31 set (from DCNVA) [V] |
| 50-51 | 30-31 | DNRPG | MBUIL 073712-073715 | 0 : ABP31 = number of pages [V] |
| 52..67 | 32..47 | - | not written by MBUIL/STRBD | [OPEN] carried as-is from DOMDF |
Sizes handed to the nucleus (STRBD 074146-074164, all [V]):
| ABFUN | BDIO function (DSCMD) | NKWRI size (words) |
|---|---|---|
| 61 (write) | 167B |
70B |
| 63 (compare) | 213B (literal at 074235) |
70B |
| 60 / 66 (read) | 166B |
74B |
Completion read-back (REBDI 074264-074272): NKREA with max size 76B
words into the same buffer DSVER+DOMDF. [V]
Nucleus call conventions as used here (register truth from bytes)¶
NKWRI 043411[SYMBOL-1]:A= buffer address (DSVER+DOMDF),T= message id (DMSID, queue-DF word 13),X= 0,D= word count (70B/74B). ReturnsA= status (0 = OK). [V]NKSEN 042171:A= destination port (DOMDF.DLPRT),D=PDF.DRPRT(remote port),X= message id (DMSID). ReturnsA= status. [V]NKREC 043076:T= local port (DOMDF.DLPRT). ReturnsX= message id (0 = none),A= nucleus status. [V]NKREA 043375:T= message id,X= 0,D= max words (76B),A= buffer address. ReturnsA= status (0 = OK). [V]- Before every nucleus buffer operation the owner is stamped:
1BANK (BSET ZRO SSPTM); A:=M[CLUSTER]+14B; D:=DOMDF; AD =: BBASE.OWN (STD ,X 5); 2BANK (BSET ONE SSPTM).CLUSTER=041574,BBASE=041576,OWN=+5. [V]
3. STRBDIO 074072B - annotated disassembly [V]¶
Level-12 DODMA routine for BDIO. Entry (NPL header): B = pool DF,
X = queue DF, T = type. PDF local = 074033, QUDF local = 074034.
; ---- local error/return block (shared, lives BEFORE the entry) ----
074035 005171 STA I 171 ; ERET: SSECN := A (ptr 074226 -> 007271 = SSECN)
074036 054375 LDX -3 ; X := PDF (074033)
074037 006026 STA ,X 26 ; PDF.DSTSD := A (save nucleus error)
074040 046014 LDA ,X 14 ; A := PDF.RSFLA
074041 171001 SAT 1
074042 140065 SKP IF DA EQL ST ; reserved (RSFLA=1) ?
074043 124007 JMP 7 ; no -> 074052
074044 046373 LDA ,X -5 ; A := PDF.TMR
074045 131405 JAF 5 ; already in timer queue -> 074052
074046 046374 LDA ,X -4 ; A := PDF.TTMR
074047 006373 STA ,X -5 ; PDF.TMR := TTMR (arm timer)
074050 044157 LDA 157 ; A := BDTMU (ptr 074227 = 075326)
074051 006372 STA ,X -6 ; PDF.TMSUB := BDTMU (timer retry hook)
074052 046015 LDA ,X 15 ; A := PDF.PLDNO
074053 005155 STA I 155 ; PDVNO := A (074230 -> 007267)
074054 044155 LDA 155 ; A := 1661 (074231 = 001661)
074055 005155 STA I 155 ; SINEC := 1661 (074232 -> 007266)
074056 054401 LDX ,B 1 ; X := QUDF.RTRES
074057 135154 JPL I 154 ; CALL 9FLEX(SINEC,4) (074233 = 012074)
074060 007266 (arg) SINEC ptr ; inline arg 1 = 007266
074061 000004 (arg) 4 ; inline arg 2 = 4
074062 170776 SAA -2 ; A := -2 (nucleus error)
074063 054351 LDX -27 ; RETU: X := QUDF (074034)
074064 006010 STA ,X 10 ; QUDF.HSTAT := A
074065 044346 LDA -32 ; A := PDF
074066 146153 RADD CLD SA DB ; B := PDF
074067 046006 LDA ,X 6 ; A := QUDF.NFUNC
074070 146154 RADD CLD SA DL ; L := NFUNC
074071 146142 EXIT ; immediate return
; ---- entry ----
074072 146135 RADD CLD SB DA ; STRBDIO: A := B
074073 004340 STA -40 ; PDF := B (pool DF) (074033)
074074 014340 STX -40 ; QUDF := X (queue DF) (074034)
074075 146145 RADD CLD SL DA ; A := L
074076 006006 STA ,X 6 ; QUDF.NFUNC := L (restart address)
074077 012011 STT ,X 11 ; QUDF.TYPCO := T
074100 144037 SWAP SB DX ; X :=: B (B=queue DF, X=pool DF)
074101 044414 LDA ,B 14 ; A := ABFUN
074102 171024 SAT 24
074103 140065 SKP IF DA EQL ST ; ABFUN = 24 (return status)?
074104 124003 JMP 3
074105 046026 LDA ,X 26 ; A := PDF.DSTSD
074106 124355 JMP -23 ; GO RETU
074107 171042 SAT 42
074110 140065 SKP IF DA EQL ST ; ABFUN = 42 (read capacity/format)?
074111 124015 JMP 15 ; no -> 074126
074112 024415 LDD ,B 15 ; AD := MEMAD (caller buffer, phys)
074113 146156 RADD CLD SA DT ; T := A (bank)
074114 146117 RADD CLD SD DX ; X := D (offset)
074115 170442 SAA 42
074116 143304 STATX ; buffer[0] := 42 (phys store)
074117 146174 RADD CLD SX DL ; L := X
074120 054313 LDX -65 ; X := PDF
074121 026023 LDD ,X 23 ; AD := PDF.ARESZ (area size, double)
074122 146147 RADD CLD SL DX ; X := L
074123 143316 STDTX ; buffer[+..] := ARESZ (phys, see drift #2)
074124 146105 RADD CLD 0 DA ; A := 0
074125 124336 JMP -42 ; GO RETU (OK)
074126 171060 SAT 60 ; read?
074127 142065 SKP IF DA UEQ ST
074130 124012 JMP 12 ; yes -> 074142
074131 171061 SAT 61 ; write?
074132 142065 SKP IF DA UEQ ST
074133 124007 JMP 7
074134 171063 SAT 63 ; compare?
074135 142065 SKP IF DA UEQ ST
074136 124004 JMP 4
074137 171066 SAT 66 ; read to cache-inhibited?
074140 140065 SKP IF DA EQL ST
074141 124026 JMP 26 ; none of 60/61/63/66 -> 074167
074142 150401 IOF ; (global DOMDF in use from here)
074143 054270 LDX -110 ; X := PDF
074144 135070 JPL I 70 ; CALL MBUILD (074234 = 073700)
074145 124316 JMP -62 ; error return -> RETU (A=-3)
074146 044414 LDA ,B 14 ; A := ABFUN
074147 171061 SAT 61
074150 140065 SKP IF DA EQL ST ; write?
074151 124004 JMP 4
074152 170567 SAA 167 ; A := 167B BDIO WRITE function
074153 171070 SAT 70 ; T := 70B message size
074154 124011 JMP 11 ; -> 074165
074155 171063 SAT 63
074156 140065 SKP IF DA EQL ST ; compare?
074157 124004 JMP 4
074160 044055 LDA 55 ; A := 213B BDIO COMPARE (074235 = 000213)
074161 171070 SAT 70 ; T := 70B
074162 124003 JMP 3
074163 170566 SAA 166 ; A := 166B BDIO READ
074164 171074 SAT 74 ; T := 74B message size
074165 006032 STA ,X 32 ; DOMDF.DSCMD := function (X=DOMDF after MBUILD)
074166 124003 JMP 3 ; -> 074171
074167 170777 SAA -1 ; illegal function
074170 124273 JMP -105 ; GO RETU (A=-1)
074171 146171 RADD CLD SX DD ; D := X (=DOMDF)
074172 054044 LDX 44 ; X := CLUSTER (074236 = 041574)
074173 174000 BSET ZRO SSPTM ; 1BANK
074174 046000 LDA ,X 0 ; A := M[CLUSTER]
074175 172414 AAA 14 ; A += 14B
074176 054041 LDX 41 ; X := BBASE (074237 = 041576)
074177 022005 STD ,X 5 ; BBASE.OWN := (A,D) set owner
074200 174200 BSET ONE SSPTM ; 2BANK
074201 146161 RADD CLD ST DD ; D := T (message size 70B/74B)
074202 050413 LDT ,B 13 ; T := QUDF.DMSID (message id)
074203 044035 LDA 35 ; A := DSVER+DOMDF = 041104 (074240)
074204 146107 RADD CLD 0 DX ; X := 0
074205 135034 JPL I 34 ; CALL NKWRI (074241 = 043411)
074206 131627 JAF -151 ; IF A<>0 GO ERET
074207 054224 LDX -154 ; X := PDF
074210 046016 LDA ,X 16 ; A := PDF.DRPRT
074211 146151 RADD CLD SA DD ; D := DRPRT
074212 054030 LDX 30 ; X := DOMDF (074242 = 041064)
074213 046017 LDA ,X 17 ; A := DOMDF.DLPRT
074214 054413 LDX ,B 13 ; X := DMSID
074215 135026 JPL I 26 ; CALL NKSEN (074243 = 042171)
074216 150402 ION
074217 131616 JAF -162 ; IF A<>0 GO ERET
074220 044022 LDA 22 ; A := DOMDF (074242)
074221 146153 RADD CLD SA DB ; B := DOMDF
074222 044022 LDA 22 ; A := REBDIO (074244 = 074246)
074223 004406 STA ,B 6 ; DOMDF.NFUNC := REBDIO
074224 135021 JPL I 21 ; CALL WT12 (074245 = 033616)
074225 125017 JMP I 17 ; GO REBDIO (074244)
; ---- literal pool 074226-074245 (all resolved above) ----
4. REBDIO 074246B - completion, annotated [V]¶
Entered from WT12 with X = DOMDF when nucleus message(s) arrived.
074246 146173 RADD CLD SX DB ; REBDIO: B := X (=DOMDF)
074247 150401 IOF ; DO:
074250 054173 LDX 173 ; X := CLUSTER (074443 = 041574)
074251 174000 BSET ZRO SSPTM ; 1BANK
074252 046000 LDA ,X 0 ; A := M[CLUSTER]
074253 172414 AAA 14 ; A += 14B
074254 146131 RADD CLD SB DD ; D := B (=DOMDF)
074255 054167 LDX 167 ; X := BBASE (074444 = 041576)
074256 022005 STD ,X 5 ; BBASE.OWN := (A,D)
074257 174200 BSET ONE SSPTM ; 2BANK
074260 050417 LDT ,B 17 ; T := DOMDF.DLPRT
074261 135164 JPL I 164 ; CALL NKREC (074445 = 043076)
074262 133160 JXZ 160 ; WHILE X<>0; else -> 074442 (GO WT12)
074263 005163 STA I 163 ; SSECN := A (nucleus status) (074446 -> 007271)
074264 146176 RADD CLD SX DT ; T := X (message id)
074265 146107 RADD CLD 0 DX ; X := 0
074266 170476 SAA 76
074267 146151 RADD CLD SA DD ; D := 76B (max words)
074270 044157 LDA 157 ; A := DSVER (=20) (074447 = 000020)
074271 146035 RADD SB DA ; A += B (= DSVER+DOMDF buffer)
074272 135156 JPL I 156 ; CALL NKREA (074450 = 043375)
074273 150402 ION
074274 131545 JAF 145 ; IF A<>0 -> next iteration (074441)
074275 054423 LDX ,B 23 ; X := DSOW2 (waiting queue DF)
074276 024430 LDD ,B 30 ; AD := DSSTS
074277 131440 JAF 40 ; A<>0 -> error path 074337
074300 140001 SKP IF DD EQL 0
074301 124036 JMP 36 ; D<>0 -> error path 074337
; -------- transfer OK --------
074302 024436 LDD ,B 36 ; AD := DSQCN
074303 171377 SAT -1
074304 054426 LDX ,B 26 ; X := DSCA1 (pool DF)
074305 140065 SKP IF DA EQL ST
074306 124024 JMP 24 ; } if DSQCN = (-1,-1):
074307 140061 SKP IF DD EQL ST ; } OK but changed to mirror pool
074310 124022 JMP 22
074311 024434 LDD ,B 34 ; AD := DXPOO
074312 052017 LDT ,X 17 ; = PDF.DIPO1 ?
074313 140065 SKP IF DA EQL ST
074314 124016 JMP 16
074315 052020 LDT ,X 20 ; = PDF.DIPO2 ?
074316 140061 SKP IF DD EQL ST
074317 124013 JMP 13
074320 046014 LDA ,X 14 ; PDF.RSFLA = 1 ?
074321 171001 SAT 1
074322 140065 SKP IF DA EQL ST
074323 124007 JMP 7
074324 046373 LDA ,X -5 ; PDF.TMR = 0 ?
074325 131405 JAF 5
074326 046374 LDA ,X -4 ; PDF.TMR := PDF.TTMR
074327 006373 STA ,X -5
074330 044121 LDA 121 ; A := BDTMV (074451 = 075356)
074331 006372 STA ,X -6 ; PDF.TMSUB := BDTMV (timer reconnect)
074332 146105 RADD CLD 0 DA ; A := 0
074333 002026 STZ ,X 26 ; PDF.DSTSD := 0
074334 054423 LDX ,B 23 ; X := DSOW2
074335 006010 STA ,X 10 ; QUDF.HSTAT := 0 (everything OK)
074336 124071 JMP 71 ; -> deliver 074427
; -------- transfer failed --------
074337 171377 SAT -1
074340 054426 LDX ,B 26 ; X := DSCA1 (pool DF)
074341 140065 SKP IF DA EQL ST ; } if DSSTS = (-1,-1)
074342 124021 JMP 21 ; } (message never processed)
074343 140061 SKP IF DD EQL ST
074344 124017 JMP 17
074345 045101 LDA I 101 ; A := SSECN (074446 -> 007271)
074346 131015 JAZ 15 ; and SSECN<>0 => REJECTED
074347 006026 STA ,X 26 ; PDF.DSTSD := SSECN
074350 046015 LDA ,X 15 ; A := PDF.PLDNO
074351 005101 STA I 101 ; PDVNO := A (074452 -> 007267)
074352 044101 LDA 101 ; A := 1661 (074453 = 001661)
074353 005101 STA I 101 ; SINEC := 1661 (074454 -> 007266)
074354 054423 LDX ,B 23 ; X := DSOW2
074355 056001 LDX ,X 1 ; X := X.RTRES
074356 135077 JPL I 77 ; CALL 9FLEX(SINEC,4) (074455 = 012074)
074357 007266 (arg) SINEC ptr
074360 000004 (arg) 4
074361 170776 SAA -2 ; A := -2 (nucleus error)
074362 124043 JMP 43 ; -> HSTAT store 074425
074363 146115 RADD CLD SD DA ; else: A := D (BDIO status word)
074364 006026 STA ,X 26 ; PDF.DSTSD := status
074365 005061 STA I 61 ; SSECN := status (074446)
074366 050070 LDT 70 ; T := 104031 (074456)
074367 142065 SKP IF DA UEQ ST
074370 124034 JMP 34 ; status = 104031 -> -5
074371 050066 LDT 66 ; T := 104651 (074457)
074372 142065 SKP IF DA UEQ ST
074373 124031 JMP 31
074374 050064 LDT 64 ; T := 104622 (074460)
074375 142065 SKP IF DA UEQ ST
074376 124026 JMP 26
074377 046015 LDA ,X 15 ; real device error:
074400 005052 STA I 52 ; PDVNO := PDF.PLDNO (074452)
074401 044060 LDA 60 ; A := 1662 (074461 = 001662)
074402 005052 STA I 52 ; SINEC := 1662 (074454)
074403 046014 LDA ,X 14 ; RSFLA=1 and TMR=0 ?
074404 171001 SAT 1
074405 140065 SKP IF DA EQL ST
074406 124007 JMP 7
074407 046373 LDA ,X -5
074410 131405 JAF 5
074411 046374 LDA ,X -4 ; PDF.TMR := TTMR
074412 006373 STA ,X -5
074413 044047 LDA 47 ; A := BDTMU (074462 = 075326)
074414 006372 STA ,X -6 ; PDF.TMSUB := BDTMU
074415 054423 LDX ,B 23 ; X := DSOW2
074416 056001 LDX ,X 1 ; X := X.RTRES
074417 135036 JPL I 36 ; CALL 9FLEX(SINEC,4) (074455)
074420 007266 (arg) SINEC ptr
074421 000004 (arg) 4
074422 170774 SAA -4 ; A := -4 (device error)
074423 124002 JMP 2
074424 170773 SAA -5 ; A := -5 (blank check / read only)
074425 054423 LDX ,B 23 ; X := DSOW2
074426 006010 STA ,X 10 ; QUDF.HSTAT := A (BDIO error)
; -------- deliver to waiting process --------
074427 044034 LDA 34 ; A := DOMDF (074463 = 041064)
074430 144075 SWAP SX DA ; X := DOMDF-addr, A := DSOW2-queue-DF
074431 056026 LDX ,X 26 ; X := DOMDF.DSCA1 (pool DF)
074432 146173 RADD CLD SX DB ; B := pool DF
074433 150401 IOF
074434 146157 RADD CLD SA DX ; X := DSOW2 queue DF
074435 135027 JPL I 27 ; CALL TO12Q (074464 = 026725)
074436 150402 ION ; (queue DF onto level-12 queue)
074437 044024 LDA 24 ; A := DOMDF (074463)
074440 146153 RADD CLD SA DB ; B := DOMDF
074441 124206 JMP -172 ; OD (loop -> 074247)
074442 125023 JMP I 23 ; GO WT12 (074465 = 033616)
; ---- literal pool 074443-074465 (all resolved above) ----
5. MBUILD 073700B and DCNVA 073750B - message build + address conversion [V]¶
073700 146145 RADD CLD SL DA ; MBUILD: A := L
073701 004376 STA -2 ; SAVL := L (073677)
073702 014374 STX -4 ; SAVX := X (pool DF) (073676)
073703 024415 LDD ,B 15 ; AD := QUDF.MEMAD (ND-100 phys addr)
073704 135036 JPL I 36 ; CALL DCNVA (073742 = 073750)
073705 124033 JMP 33 ; error -> ERET (073740: SAA -3; JMP I SAVL)
073706 054035 LDX 35 ; X := DOMDF (073743 = 041064)
073707 022044 STD ,X 44 ; DOMDF.DMYAD := AD (DOMINO addr, bit31 set)
073710 024417 LDD ,B 17 ; AD := QUDF.ABPA2 (media address)
073711 022042 STD ,X 42 ; DOMDF.DSTBL := AD
073712 044421 LDA ,B 21 ; A := QUDF.ABP31 (number of pages)
073713 146151 RADD CLD SA DD ; D := A
073714 146105 RADD CLD 0 DA ; A := 0
073715 022050 STD ,X 50 ; DOMDF.DNRPG := (0, pages)
073716 170777 SAA -1
073717 146151 RADD CLD SA DD ; D := -1
073720 022030 STD ,X 30 ; DOMDF.DSSTS := (-1,-1)
073721 002036 STZ ,X 36 ; DOMDF.DSQC1 := 0
073722 002037 STZ ,X 37 ; DOMDF.DSQC2 := 0
073723 050353 LDT -25 ; T := SAVX (pool DF addr)
073724 012026 STT ,X 26 ; DOMDF.DSCA1 := pool DF
073725 144063 SWAP ST DB ; B :=: T (B=pool DF, T=queue DF)
073726 024417 LDD ,B 17 ; AD := PDF.DIPOO (DIPO1,DIPO2)
073727 022034 STD ,X 34 ; DOMDF.DXPOO := AD (pool index)
073730 024421 LDD ,B 21 ; AD := PDF.OPAIX (double)
073731 022040 STD ,X 40 ; DOMDF.OPAIN := AD (area index)
073732 146163 RADD CLD ST DB ; B := queue DF again
073733 012023 STT ,X 23 ; DOMDF.DSOW2 := queue DF (owner)
073734 170401 SAA 1
073735 006022 STA ,X 22 ; DOMDF.DSOW1 := 1 (abstrans message)
073736 040341 MIN -37 ; MIN SAVL (skip return)
073737 125340 JMP I -40 ; GO SAVL
073740 170775 SAA -3 ; ERET: A := -3 (illegal memory address)
073741 125336 JMP I -42 ; GO SAVL
073742 073750 (ptr) DCNVA
073743 041064 (ptr) DOMDF
073744 177777 5BIA1 := -1 ; ND-100 addr of ND-500 first page (patched)
073745 177777 5BIA2 := -1
073746 000000 1ADDR (double)
073747 000000
; ---- DCNVA: ND-100 phys word address -> DOMINO byte address, bit 31 ----
073750 020376 STD -2 ; DCNVA: 1ADDR := AD << SELF-MODIFIED to
; 124012 (JMP 12 -> 073762) after 1st call
073751 054025 LDX 25 ; X := N500D (073776 = 051767)
073752 046060 LDA ,X 60 ; A := N500D.ADRZERO (ND-500 base page no)
073753 146151 RADD CLD SA DD ; D := A
073754 146105 RADD CLD 0 DA ; A := 0
073755 156612 SAD ZIN 12 ; AD := AD SHZ 12 (page no -> word addr)
073756 020366 STD -12 ; 5BIAS := AD (073744-073745)
073757 044020 LDA 20 ; A := 124012 (073777)
073760 004370 STA -10 ; M[DCNVA] := 124012 (arm the JMP shortcut)
073761 024365 LDD -13 ; AD := 1ADDR (reload)
073762 144015 SWAP SD DA ; A :=: D
073763 064362 SUB -16 ; A -= 5BIA2 (low) (073745)
073764 144015 SWAP SD DA ; A :=: D
073765 147155 RADD ADC CLD SA DA ; A := A + carry ... } A:=A+C-1-5BIA1
073766 172777 AAA -1 ; A -= 1 }
073767 064355 SUB -23 ; A -= 5BIA1 (high) (073744)
073770 175375 BSKP ONE 170 DA ; IF bit 17 (sign) set:
073771 124002 JMP 2
073772 146142 EXIT ; outside multiport memory -> error return
073773 156601 SAD ZIN 1 ; AD := AD SHZ 1 (word -> BYTE address)
073774 174375 BSET ONE 170 DA ; set bit 17 of A = bit 31 of AD
073775 146542 RADD AD1 CLD SL DP ; EXITA (skip return)
073776 051767 (ptr) N500D
073777 124012 (const) the self-mod JMP word
DOMINO address formula [V]:
DMYAD = ((nd100_word_addr - (ADRZERO << 10dec)) << 1) | 0x80000000,
error (no skip return) if the subtraction goes negative (outside multiport).
N500D=051767 [SYMBOL-2], ADRZERO = N500D+60 [SYMBOL-1 ADRZE=60].
5BIAS is computed once and cached; the entry word is self-modified to
124012 (JMP 12) so later calls skip the bias computation. [V]
6. Level-12 stubs: SSBDI 074000B, BDTRANS 074012B / BD12T 074024B [V]¶
074000 135413 JPL I ,B 13 ; SSBDI: CALL DODMA (controller DF word 13)
074001 146176 RADD CLD SX DT ; T := X
074002 146137 RADD CLD SB DX ; X := B
074003 173425 AAX 25 ; X += DIBRE
074004 135003 JPL I 3 ; CALL PUTIN (074007 = 026670)
074005 135003 JPL I 3 ; CALL RTACT (074010 = 013552)
074006 125003 JMP I 3 ; GO WT12 (074011 = 033616)
074012 146145 RADD CLD SL DA ; BDTRANS: A := L
074013 006007 STA ,X 7 ; QUDF.TRLREG := L
074014 044015 LDA 15 ; A := BD12T (074031 = 074024)
074015 006006 STA ,X 6 ; QUDF.NFUNC := BD12T
074016 150401 IOF
074017 135013 JPL I 13 ; CALL ST12L (074032 = 027027)
074020 150402 ION
074021 046007 LDA ,X 7 ; A := TRLREG
074022 146154 RADD CLD SA DL ; L := TRLREG
074023 146142 EXIT ; BUSY return
074024 171005 SAT 5 ; BD12T (on lev 12, B=disk DF, X=que DF):
074025 135413 JPL I ,B 13 ; T := 5; CALL DODMA
074026 046007 LDA ,X 7 ; A := TRLREG
074027 146154 RADD CLD SA DL ; L := TRLREG
074030 146542 RADD AD1 CLD SL DP ; EXITA - FINISH return (SSSTAT valid)
For a DOMINO device the datafield DODMA slot (word 13) points at STRBDIO;
that binding is runtime configuration data, not carved code. [I]
7. BDMTR 073454B - MTRANS entry for ABSTRANS to DOMINO [V]¶
Monitor level. Entry: A = parameter list, B = pool DF, T = PIT no
(0 => use RTREF), L = return address or 0. Locals: TREG=073446,
AREG=073447, LREG=073450, BREG=073451, QDF=073452, PROW=073453.
073454 004373 STA -5 ; BDMTR: AREG := A
073455 146135 RADD CLD SB DA ; A := B
073456 004373 STA -5 ; BREG := B
073457 010367 STT -11 ; TREG := T
073460 146146 RADD CLD SL DT ; T := L
073461 010367 STT -11 ; LREG := L
073462 150401 IOF
073463 140006 SKP IF DT EQL 0 ; IF T<>0 (swapping):
073464 124010 JMP 10
073465 055060 LDX I 60 ; X := M[RTREF] (073545 = 004007)
073466 014365 STX -13 ; PROW := X
073467 044057 LDA 57 ; A := QP100 (073546 = 033315)
073470 146153 RADD CLD SA DB ; B := QP100
073471 135056 JPL I 56 ; CALL GETFREE (073547 = 073121)
073472 124051 JMP 51 ; pool empty -> FULL (073543: ION; GO WT)
073473 124002 JMP 2 ; -> 073475
073474 135054 JPL I 54 ; CALL ERRFATAL (swapping illegal) (073550 = 000215)
073475 150402 ION
073476 146163 RADD CLD ST DB ; B := T (que element from GETFREE)
073477 010353 STT -25 ; QDF := T
073500 054353 LDX -25 ; X := PROW (073453)
073501 135050 JPL I 50 ; CALL BRESERVE (073551 = 010563)
073502 130002 JAP 2 ; IF A<0:
073503 135045 JPL I 45 ; CALL ERRFATAL (073550)
073504 050344 LDT -34 ; T := LREG
073505 010407 STT ,B 7 ; QDF.TRLREG := LREG (return addr on mon lev)
073506 000411 STZ ,B 11 ; QDF.TYPCO := 0
073507 044340 LDA -40 ; A := AREG (parameter list)
073510 140006 SKP IF DT EQL 0 ; IF T=0:
073511 124003 JMP 3
073512 135040 JPL I 40 ; CALL GAPFU (073552 = 000744)
073513 124002 JMP 2
073514 135037 JPL I 37 ; ELSE CALL GAPFD (073553 = 034006)
073515 150401 IOF ; ---- start level 12 ----
073516 044333 LDA -45 ; A := BREG (controller/pool DF)
073517 146153 RADD CLD SA DB
073520 153543 IRW 140 DB ; LV12:B := controller DF (LV12B=140)
073521 044331 LDA -47 ; A := QDF
073522 153547 IRW 140 DX ; LV12:X := parameters (que DF)
073523 044776 LDA ,B -2 ; A := STDRIV (controller DF -2)
073524 153542 IRW 140 DP ; LV12:P := STDRIV
073525 044027 LDA 27 ; A := 010000 (level-12 bit) (073554)
073526 150306 MST PID ; kick level 12
073527 044323 LDA -55 ; A := QDF
073530 146153 RADD CLD SA DB ; B := QDF
073531 054401 LDX ,B 1 ; X := QDF.RTRES
073532 135023 JPL I 23 ; CALL WDATA (073555 = 003527)
073533 046001 LDA ,X 1 ; A := X.STATUS
073534 174275 BSET ONE 70 DA ; set bit 7 = 5NOABORT (delayed abort)
073535 006001 STA ,X 1 ; X.STATUS := A
073536 150402 ION
073537 051006 LDT I 6 ; T := M[RTREF] (073545)
073540 142067 SKP IF DX UEQ ST ; IF X = RTREF:
073541 125015 JMP I 15 ; GO RWAIT (073556 = 032043)
073542 125015 JMP I 15 ; ELSE GO MONEN (073557 = 032000)
073543 150402 ION ; FULL:
073544 125014 JMP I 14 ; GO WT (073560 = 032571)
; literal pool 073545-073560 (resolved above)
8. BDMFU 073565B - monitor-level completion [V]¶
Activated after the driver finished; X = controller DF. Locals:
PROW=073561, CDF=073562, SSTA=073563, TRLR=073564.
073565 146173 RADD CLD SX DB ; BDMFU: B := X
073566 014374 STX -4 ; CDF := X
073567 146137 RADD CLD SB DX ; DO: X := B
073570 173425 AAX 25 ; X += DIBRE
073571 046000 LDA ,X 0 ; A := S0 (queue head)
073572 171377 SAT -1
073573 142065 SKP IF DA UEQ ST ; WHILE S0 <> -1
073574 124070 JMP 70 ; empty -> 073664 (GO STUPR via 073675)
073575 150401 IOF
073576 135067 JPL I 67 ; CALL GETOUT (073665 = 026656)
073577 146163 RADD CLD ST DB ; B := T (que element)
073600 150402 ION
073601 054401 LDX ,B 1 ; X := RTRES
073602 014357 STX -21 ; PROW := X
073603 133004 JXZ 4 ; IF PROW<>0:
073604 000403 STZ ,B 3 ; TYPRING := 0 (double use, BREGQ)
073605 135061 JPL I 61 ; CALL RDATA (073666 = 003535)
073606 135061 JPL I 61 ; CALL BRELEASE (073667 = 010610)
073607 044407 LDA ,B 7 ; TRLR := TRLREG
073610 004354 STA -24
073611 044410 LDA ,B 10 ; SSTA := SSSTAT
073612 004351 STA -27
073613 044414 LDA ,B 14 ; A := ABFUN
073614 070054 AND 54 ; A &= 77 (073670 = 000077)
073615 171001 SAT 1 ; IF fn not 1, 61, 66:
073616 142065 SKP IF DA UEQ ST
073617 124011 JMP 11
073620 171061 SAT 61
073621 142065 SKP IF DA UEQ ST
073622 124006 JMP 6
073623 171066 SAT 66
073624 142065 SKP IF DA UEQ ST
073625 124003 JMP 3
073626 150110 TRR CCL ; clear cache
073627 124002 JMP 2
073630 150110 TRR CCL ; CCM14: (patch site; symbol CCM14=073630)
073631 146136 RADD CLD SB DT ; T := B (que elem)
073632 044037 LDA 37 ; A := QP100 (073671 = 033315)
073633 146153 RADD CLD SA DB ; B := QP100
073634 150401 IOF
073635 135035 JPL I 35 ; CALL PUTFREE (073672 = 073150)
073636 150402 ION
073637 146167 RADD CLD ST DX ; X := T (que elem)
073640 044322 LDA -56 ; B := CDF (073562)
073641 146153 RADD CLD SA DB
073642 044322 LDA -56 ; A := TRLR (073564)
073643 131417 JAF 17 ; IF TRLR<>0 (from CALL MTRANS):
073644 044315 LDA -63 ; (at 073662) CALL ERRFATAL (073674 = 000215)
073645 131014 JAZ 14 ; IF PROW<>0 (prog aborted?):
073646 044315 LDA -63 ; A := SSTA (073563)
073647 054312 LDX -66 ; X := PROW (073561)
073650 051023 LDT I 23 ; T := M[CURPROG] (073673 = 004010)
073651 140067 SKP IF DX EQL ST ; IF PROW = CURPROG:
073652 124003 JMP 3
073653 153415 IRW 10 DA ; ALEVB:A := SSTA (background A-reg)
073654 124005 JMP 5
073655 056025 LDX ,X 25 ; ELSE X := X.RTDLGADDR
073656 146106 RADD CLD 0 DT ; T := 0
073657 173403 AAX 3 ; X += DAREG
073660 143304 STATX ; phys store SSTA -> saved A-reg
073661 124002 JMP 2
073662 135012 JPL I 12 ; (ERRFATAL, see 073643)
073663 124304 JMP -74 ; OD (-> 073567)
073664 125011 JMP I 11 ; GO STUPR (073675 = 032034)
; literal pool 073665-073675 (resolved above)
9. Pseudo-C of the whole flow (for emulator implementers)¶
ASCII only. Word = 16 bits. Octal constants written with a leading 0o
comment where ambiguous. All addresses cited are L07 virtual addresses in
overlay 017-S3SMPIT (base 032000B).
/* ---- global cells (resident data, runtime-only values) ---- */
/* DOMDF = 041064 global DOMINO message datafield */
/* CLUSTER = 041574, BBASE = 041576 (OWN at +5, double) */
/* N500D = 051767 ND-500/DOMINO CPU datafield, ADRZERO at +60 */
/* SSECN=007271 PDVNO=007267 SINEC=007266 RTREF=004007 */
/* CURPROG=004010 QP100=033315 (pool of 100-word que elements) */
/* ---- DCNVA @073750: ND-100 phys word addr -> DOMINO byte addr ---- */
/* returns skip (ok) with AD = DOMINO address, or no-skip = error */
bool dcnva(uint32_t nd100_word_addr, uint32_t *domino_addr)
{
static uint32_t bias5 = 0xFFFFFFFF; /* 5BIA1:5BIA2 @073744-45 */
static bool armed = false; /* entry word self-mod @073760 */
if (!armed) { /* first call only */
uint16_t adrzero = mem[N500D + 060]; /* ND-500 first page @073752 */
bias5 = (uint32_t)adrzero << 10; /* pages -> words, SHZ 12B */
armed = true; /* M[DCNVA] := 124012 (JMP) */
}
uint32_t a = nd100_word_addr - bias5; /* @073762-073767 */
if (a & 0x80000000u) /* bit 17 of high word set */
return false; /* outside multiport @073772 */
*domino_addr = (a << 1) | 0x80000000u; /* byte addr + bit 31 @073773-74 */
return true; /* EXITA @073775 */
}
/* ---- MBUILD @073700: build the read/write-area message in DOMDF ----
* entry: B = queue DF, X = pool DF; interrupts OFF.
* return: A = -3 (illegal memory address) | skip-return, X = DOMDF. */
int mbuild(df_t *qdf /*B*/, df_t *pdf /*X*/)
{
uint32_t dom;
if (!dcnva(qdf->d[MEMAD], &dom)) /* MEMAD=15-16 @073703-04 */
return -3; /* @073740 */
word *m = &mem[DOMDF];
m[044] = dom; /* DMYAD: DOMINO memory addr */
m[042] = qdf->d[ABPA2]; /* DSTBL: media (block) addr */
m[050] = (uint32_t)qdf->w[ABP31]; /* DNRPG: (0, number of pages) */
m[030] = 0xFFFFFFFF; /* DSSTS := -1,-1 */
m[036] = 0; m[037] = 0; /* DSQC1/DSQC2 := 0 */
m[026] = (word)pdf; /* DSCA1 := pool DF addr */
m[034] = pdf->d[DIPOO]; /* DXPOO := DIPO1,DIPO2 */
m[040] = pdf->d[OPAIX]; /* OPAIN := area index (double) */
m[023] = (word)qdf; /* DSOW2 := queue DF (owner) */
m[022] = 1; /* DSOW1 := 1 (abstrans mark) */
return OK_SKIP; /* MIN SAVL @073736 */
}
/* ---- STRBDIO @074072: level-12 DODMA routine for BDIO ----
* entry: B = pool DF, X = queue DF, T = type, L = restart NFUNC.
* exit: JMP via QUDF.NFUNC with A -> QUDF.HSTAT (RETU @074063),
* or waits on WT12 and continues in REBDIO. */
void strbdio(df_t *pdf /*B*/, df_t *qdf /*X*/, word type /*T*/, word lnk)
{
qdf->w[NFUNC] = lnk; /* @074076 */
qdf->w[TYPCO] = type; /* @074077 */
word fn = qdf->w[ABFUN]; /* @074101 */
if (fn == 024) { /* return last status @074102 */
return retu(pdf->w[DSTSD]); /* pool DF +26 */
}
if (fn == 042) { /* read capacity @074107 */
phys_write(qdf->d[MEMAD] + 0, 042); /* buffer[0] := 42 @074116 */
phys_write_dbl(qdf->d[MEMAD] + .., pdf->d[ARESZ]); /* @074123, drift #2 */
return retu(0); /* OK @074124 */
}
if (fn != 060 && fn != 061 && fn != 063 && fn != 066)
return retu(-1); /* illegal function @074167 */
iof(); /* global DOMDF in use @074142 */
if (mbuild(qdf, pdf) == -3) /* @074144 */
return retu(-3);
word cmd, size;
if (fn == 061) { cmd = 0167; size = 070; } /* WRITE @074152 */
else if (fn == 063) { cmd = 0213; size = 070; } /* COMPARE @074160 */
else { cmd = 0166; size = 074; } /* READ @074163 */
mem[DOMDF + 032] = cmd; /* DSCMD @074165 */
set_owner(); /* BBASE.OWN := (M[CLUSTER]+14,
DOMDF) in 1BANK @074172-074200 */
/* NKWRI(A=DSVER+DOMDF, T=DMSID, X=0, D=size) @074205 */
if (nkwri(DOMDF + 020, qdf->w[DMSID], 0, size) != 0)
return eret(); /* @074206 */
/* NKSEN(A=DOMDF.DLPRT, D=PDF.DRPRT, X=DMSID) @074215 */
if (nksen(mem[DOMDF + 017], pdf->w[DRPRT], qdf->w[DMSID]) != 0)
return eret(); /* @074217 */
mem[DOMDF + 06] = REBDIO; /* DOMDF.NFUNC @074223 */
wt12(); /* wait; nucleus msg resumes us */
rebdio(); /* @074225 */
}
/* ERET @074035: nucleus error on send path */
void eret(word nucleus_status /*A*/)
{
SSECN = nucleus_status;
pdf->w[DSTSD] = nucleus_status;
if (pdf->w[RSFLA] == 1 && pdf->w[TMR] == 0) { /* not in timer queue */
pdf->w[TMR] = pdf->w[TTMR];
pdf->w[TMSUB] = BDTMU; /* let TIMRT try reconnect */
}
PDVNO = pdf->w[PLDNO];
SINEC = 01661;
flex9(SINEC, 4, qdf->w[RTRES]); /* 9FLEX error log @074057 */
retu(-2); /* nucleus error */
}
/* RETU @074063: store status, immediate return through NFUNC */
void retu(word status)
{
qdf->w[HSTAT] = status; /* queue DF +10 */
B = pdf;
goto_via(qdf->w[NFUNC]);
}
/* ---- REBDIO @074246: completion, entered from WT12 with X=DOMDF ---- */
void rebdio(void)
{
for (;;) {
iof();
set_owner(); /* @074250-074257 (1BANK/2BANK) */
word msgid = nkrec(mem[DOMDF + 017]);/* T=DLPRT @074261; X=msgid */
if (msgid == 0) { wt12(); return; } /* @074262 -> 074442 */
SSECN = A; /* nucleus status @074263 */
/* NKREA(T=msgid, X=0, D=76B, A=DSVER+DOMDF) @074272 */
if (nkrea(msgid, 0, 076, DOMDF + 020) != 0)
{ ion(); continue; } /* @074274 */
df_t *own = (df_t *)mem[DOMDF + 023]; /* DSOW2 queue DF */
uint32_t ssts = mem_dbl[DOMDF + 030]; /* DSSTS */
df_t *pl = (df_t *)mem[DOMDF + 026]; /* DSCA1 pool DF */
word hstat;
if (ssts == 0) { /* transfer OK @074277 */
if (mem_dbl[DOMDF + 036] == 0xFFFFFFFF /* DSQCN = -1,-1 */
&& mem_dbl[DOMDF + 034] == pl->d[DIPOO]) { /* still same pool */
/* OK but changed to mirror pool: arm timer reconnect */
if (pl->w[RSFLA] == 1 && pl->w[TMR] == 0) {
pl->w[TMR] = pl->w[TTMR];
pl->w[TMSUB] = BDTMV; /* @074330 */
}
}
pl->w[DSTSD] = 0; /* @074333 */
hstat = 0; /* everything OK @074335 */
} else if (ssts == 0xFFFFFFFF && SSECN != 0) {
/* message rejected by nucleus @074337-074361 */
pl->w[DSTSD] = SSECN;
PDVNO = pl->w[PLDNO]; SINEC = 01661;
flex9(SINEC, 4, own->w[RTRES]);
hstat = -2;
} else {
word st = ssts & 0xFFFF; /* low word = BDIO status @074363 */
pl->w[DSTSD] = st; SSECN = st;
if (st != 0104031 && st != 0104651 && st != 0104622) {
/* real device error @074377 */
PDVNO = pl->w[PLDNO]; SINEC = 01662;
if (pl->w[RSFLA] == 1 && pl->w[TMR] == 0) {
pl->w[TMR] = pl->w[TTMR];
pl->w[TMSUB] = BDTMU; /* @074413 */
}
flex9(SINEC, 4, own->w[RTRES]);
hstat = -4; /* device error */
} else {
hstat = -5; /* blank check / read only
(NPL naming) @074424 */
}
}
own->w[HSTAT] = hstat; /* @074426 (or @074335) */
to12q(own, pl); /* queue owner's que DF onto
level-12 queue @074435 */
ion();
}
}
/* ---- BDTRANS @074012 / BD12T @074024: monitor-side start helper ---- */
/* BDTRANS (called with B=disk DF, X=que DF): saves L in TRLREG,
* plants BD12T in NFUNC, CALL ST12L to schedule level 12, returns BUSY.
* BD12T (on level 12): T:=5; CALL DODMA (disk DF word 13 -> STRBDIO for
* DOMINO units [I]); EXITA = FINISH, SSSTAT in que DF valid. */
/* ---- SSBDI @074000: multi-thread DMA lev-12 start ---- */
/* CALL DODMA; PUTIN(que DF -> controller DIBRE queue); RTACT; GO WT12. */
/* ---- BDMTR @073454: ABSTRANS -> DOMINO on monitor level ----
* T!=0 (swapping) => ERRFATAL. Get a 100-word queue element from QP100
* (GETFREE; pool empty => GO WT), BRESERVE it for RTREF, TRLREG := L,
* TYPCO := 0, GAPFU/GAPFD build the parameter block, then:
* IRW LV12:B := controller DF, IRW LV12:X := que DF,
* IRW LV12:P := controller.STDRIV(-2), MST PID(level 12) @073515-073526
* WDATA; STATUS |= 5NOABORT(bit 7); IF caller is RTREF GO RWAIT else MONEN.
*
* ---- BDMFU @073565: monitor-level completion after driver finished ----
* drain controller DIBRE queue: GETOUT; RDATA+BRELEASE if owner alive;
* cache clear unless fn&77 is 1/61/66 (patch site CCM14 @073630);
* PUTFREE que elem back to QP100; TRLR!=0 => ERRFATAL (MTRANS path);
* else deliver SSSTAT to aborted program's A-reg (current: IRW ALEVB,
* other: phys store via RTDLGADDR+DAREG); loop; GO STUPR. */
10. Differences vs the NPL revision (drift)¶
- Addresses shifted. NPL listing places STRBDIO at
073633B; L07 hasSTRBD=074072B(whole file shifted ~ +237B). All logic matched 1:1 at the new addresses. [V] - Fn-42 second store: NPL writes
*STDTX 10(displacement 10B); the carved word at074123is143316, whichnd100-disdecodes as plainSTDTX. Whether143316carries the 10B displacement inside the opcode or the revision dropped it is not settled here - the octal word is the ground truth. [OPEN, minor] - MBUILD
OPAIN: carved stores a DOUBLE (LDD ,B 21 / STD ,X 40, pool-DF OPAIX -> DOMDF.OPAIN 40-41); NPL prose reads as scalar. NPL'sDIPOO/OPAIXmay simply be doubles in that revision too. [V carve] - Everything else (function codes 166B/167B/213B, sizes 70B/74B, error codes -1..-5, 1661/1662, statuses 104031/104651/104622, BDTMU/BDTMV timer hooks, the whole call ladder) matches the NPL logic exactly. [V]
11. Open questions¶
- [OPEN] Message words
DSVER+32B .. +67B(write) /+73B(read): not initialized by MBUILD/STRBDIO; NKWRI still transfers them. CLOSED 2026-07-20 (S0-2, DOMDF-INITIALIZER-CARVE.md): the "static header" presumption is DISPROVEN - rel +32..67 is the generated zero tail of DOMDF + the ADOML lock + the NKMBU buffer start, swept along because the 70B/76B transfer windows exceed the 32B-word record content. DON'T CARE for the DIOC. DSVER(+20) and +21: CLOSED 2026-07-20 (S0-2) - QUINI @134206 (FILSYS 006-S3FS, lazy init at first pool access) writes DSVER := 1 and DOMDF+21 := 30B after creating the local port (MON 347 fn 1 -> DLPRT). See DOMDF-INITIALIZER-CARVE.md.- [OPEN] Who fires
DOMDF.NFUNC(= REBDIO) when a nucleus message arrives - the WT12/level-12 nucleus dispatcher was not carved here (WT12=033616 entry exists in this overlay; body not analysed). - [OPEN] NKWRI/NKSEN/NKREC/NKREA internals (042171/043076/043375/ 043411): only the common prologue was verified; register conventions above are proven from the caller side only.
- [OPEN] Meaning of benign statuses
104031B/104651B/104622B: the "-5 = blank check or read only" reading is NPL naming only. [NPL-V] - [OPEN] The
STDTXdisplacement question (drift #2). - [I] DODMA slot (device DF word 13) -> STRBDIO binding for DOMINO
units is configuration data (runtime), consistent with
5DSKC=011171[SYMBOL-2] selecting SMD/SCSI-100=0 vs DOMINO=1, but not byte-proven. ``` (end)