Disc support in SINTRAN III — answered from CARVED SYSTEM DATA¶
Full path: E:\Dev\Ronny\NDInsight\tools\boot-floppy\CARVED-DISC-SUPPORT.md
Scope rule for this document: every statement is derived from carved system data — carved segment binaries, the resident common-code image, the SINTRAN image symbol tables, and the recovered NPL source listings. No OCR'd manual was consulted, and none is cited. Where the NPL source is used it is used for naming and comments only and is always cross-checked against carved bytes (the NPL tree is a different revision from the carved images).
Every claim is tagged [VERIFIED] (exact file + address/offset + the bytes or words quoted) or [INFERRED] (reasoning shown). Where nothing was found the document says NOT FOUND.
Companion tool written for this analysis:
E:\Dev\Ronny\NDInsight\tools\boot-floppy\tools\find_disc_layout_table.py
0. Executive summary¶
| Question | Answer |
|---|---|
| Is there a disc-type / geometry TABLE inside the kernel? | YES — two of them, and they are linked. (1) DISPE + the DTxxx geometry records; (2) the device-name table S3DNAM, which names every supported disc unit, gives its size in pages, and points at a DTxxx record. Both byte-verified in all three carved systems. |
| Where are the valid disc SIZES? | In the device-name table (§2A). Every named large-disc unit carries a hard-coded 32-bit page count. Every SCSI and optical entry carries size = 0 — those sizes are interrogated from the drive. |
| How many disc types does it hold? | 24 records in L-VSX-500 and M-VSX-500; 18 records in K-VSX-500 (the ST-506/Winchester group is absent from that generated system). Index range 0..47B (MAXDI=47). |
| Is SCSI in the table? | YES, as disc-type index 36B, record DTSSS, with all geometry fields zero — SCSI geometry is not tabulated, it is interrogated from the drive. |
| Are SCSI disc SIZES validated against a table? | NO. Capacity is taken from the device (READ CAPACITY) and from the disc's own control record; it is a 32-bit value. The only kernel-enforced size limit on the SCSI path is on the block/record size, not on the capacity. |
MSTYP numeric value |
NOT FOUND in any carved symbol table (K03/L07/M06) or NPL listing. The open question is not resolved; see §7. |
1. THE disc-type table — DISPE and the DTxxx records [VERIFIED]¶
1.1 Record layout¶
The layout is documented in the recovered source listing
E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\s3vs-4.symb, listing address
040752 (lines 19568-19582), quoted literally:
% DISK LAYOUT:
% SECWO, SECTR, SECSY, MAXCY, POLSY, REFOR, RESCY, DISPN
% SECWO = WORDS / SECTOR.
% SECTR = SECTORS / TRACK.
% SECSY = SECTORS / CYLINDER.
% MAXCY = VALUE OF MAX CYLINDER.
% POLSY = VALUE OF FIRST CYLINDER IN POOL.
% REFOR = FORMAT TYPE:
% 0 = TRACK OR NO REALLOCATION.
% 10 = TRACK OR NO REALLOCATION + TEST SECTOR ADDRESS
% 20 = SECTOR REALLOCATION.
% RESCY = VALUE OF FIRST RESERVED CYLINDER.
% ALTFO = ALTERNATIVE FORMAT (ADDRESS OF DTxxx OR 0)
% DISPN = INDEX FOR THIS ENTRY(FORMAT).
DILEZ=11 (octal) — 9 words per record (the comment lists 8 names but
ALTFO sits between RESCY and DISPN, giving 9). [VERIFIED]
1.2 The table AS CARVED¶
Carved from the raw big-endian binaries, not from any listing:
| Version | file | load base | table start | DISPE |
records |
|---|---|---|---|---|---|
| K-VSX-500 | versions\K-VSX-500\segments\044-S3IDPIT.bin (twin 053-S3SDPIT.bin) |
4000B |
012337B |
012267B |
18 |
| L-VSX-500 | versions\L-VSX-500\segments\044-S3IDPIT.bin (twin 053-S3SDPIT.bin) |
4000B |
031041B |
031371B |
24 |
| M-VSX-500 | versions\M-VSX-500\segments\044-S3IDPIT.bin (twin 053-S3SDPIT.bin) |
4000B |
035756B |
036306B |
24 |
Independent confirmation of the L and M addresses: the L07 symbol table
SINTRAN\NPL-SOURCE\SYMBOLS\L07\SYMBOL-2-LIST.SYMB.TXT:337 says DISPE=031371
and :338 MAXDI=000047; M06 SYMBOL-2-LIST.SYMB.TXT:461 says DISPE=036306.
The carved table of 24 records is 24 × 9 = 216 words = 330B long and starts at
031041B; 031041B + 330B = 031371B — exactly DISPE. Same arithmetic
holds for M (035756B + 330B = 036306B). [VERIFIED]
The carved K image is a K05 system while the only K symbol table available
is K03; K03 DISPE=012221 does not match the carved image (that address
is zero-filled). The K figure 012267B above was derived structurally, from
the carved pointer array itself (see §1.4). [VERIFIED by structure,
INFERRED as to the name DISPE]
1.3 The carved records — L-VSX-500 (L07), addresses octal¶
Produced by tools\find_disc_layout_table.py 044-S3IDPIT.bin 4000
(add 4000B to the addresses it prints; it prints file-relative addresses
when the meta base is not supplied). Values octal.
| addr | SECWO | SECTR | SECSY | MAXCY | POLSY | REFOR | RESCY | ALTFO | DISPN | name (from listing) |
|---|---|---|---|---|---|---|---|---|---|---|
| 031041 | 1000 | 14 | 44 | 577 | 1124 | 0 | 0 | 0 | 10 | DT014 — DISC-14MB |
| 031052 | 1000 | 14 | 44 | 1134 | 1124 | 0 | 0 | 0 | 11 | DT021 — DISC-21MB |
| 031063 | 1000 | 11 | 33 | 1475 | 1462 | 0 | 0 | 0 | 12 | DT023 — DISC-23MB |
| 031074 | 1000 | 11 | 66 | 1475 | 1462 | 0 | 0 | 0 | 13 | DT045 — DISC-45MB |
| 031105 | 1000 | 11 | 33 | 1775 | 1763 | 0 | 1776 | 0 | 14 | DT028 — DISC-28MB |
| 031116 | 1000 | 11 | 110 | 1775 | 1763 | 0 | 1776 | 0 | 15 | DT074 — DISC-74MB |
| 031127 | 1000 | 22 | 22 | 1466 | 1465 | 10 | 0 | 0 | 20 | DT030 — DISC-30/60/90MB |
| 031140 | 1000 | 22 | 132 | 632 | 0 | 10 | 0 | 0 | 21 | DT037 — DISC-38MB |
| 031151 | 1000 | 22 | 132 | 1466 | 1434 | 10 | 1465 | 0 | 22 | DT070 — DISC-70MB |
| 031162 | 1000 | 22 | 132 | 1466 | 1465 | 10 | 0 | 0 | 23 | DT075 — DISC-75MB |
| 031173 | 1000 | 22 | 264 | 1466 | 1441 | 10 | 1465 | 031204 | 24 | DT140 — DISC-140MB-F |
| 031204 | 1000 | 21 | 252 | 1466 | 1462 | 20 | 1465 | 031173 | 25 | DT135 — DISC-140MB-S |
| 031215 | 1000 | 22 | 264 | 1466 | 1465 | 10 | 0 | 0 | 26 | DT160 — DISC-2-75MB |
| 031226 | 1000 | 22 | 526 | 1466 | 1465 | 10 | 0 | 0 | 27 | DT288 — DISC-288MB-R |
| 031237 | 1000 | 21 | 630 | 1306 | 1303 | 20 | 1305 | 031250 | 30 | DT285 — DISC-288MB-S |
| 031250 | 1000 | 22 | 660 | 1306 | 1260 | 10 | 1305 | 031237 | 31 | DT300 — DISC-288MB-F |
| 031261 | 1000 | 32 | 1160 | 1306 | 1303 | 20 | 1305 | 031272 | 32 | DT450 — DISC-450MB-S |
| 031272 | 1000 | 33 | 1210 | 1306 | 1260 | 10 | 1305 | 031261 | 33 | DT460 — DISC-450MB-F |
| 031303 | 1000 | 32 | 404 | 2300 | 2267 | 20 | 2277 | 0 | 17 | DT310 — DISC-288MB-E |
| 031314 | 1000 | 37 | 1115 | 1367 | 1363 | 20 | 1366 | 0 | 34 | DT470 — DISC-450MB-N |
| 031325 | 1000 | 43 | 536 | 1466 | 1460 | 20 | 1465 | 0 | 35 | DT290 — DISC-288MB-N |
| 031336 | 1000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 36 | DTSSS — SCSI DISK |
| 031347 | 1000 | 36 | 0 | 0 | 0 | 0 | 0 | 0 | 40 | DTOD1 — OPTICAL DISK (RS=1024) |
| 031360 | 2000 | 36 | 0 | 0 | 0 | 0 | 0 | 0 | 41 | DTOD2 — OPTICAL DISK (RS=2048) |
The 24 records are [VERIFIED] from the carved bytes. The DTxxx names and
the % DISC-nnnMB-x comments are [VERIFIED] from the recovered source
listing s3vs-4.symb lines 19583-19613, where the numeric rows match the
carved rows word for word.
M-VSX-500 carries the identical 24 records at 035756B..036305B (spot check:
036253B = 1000 0 0 0 0 0 0 0 36 = DTSSS). [VERIFIED]
K-VSX-500 carries only 18 records at 012337B..012600B: DISPN
20,21,22,23,24,25,26,27,30,31,32,33,17,34,35,36,40,41. The six ST-506 /
Winchester records (DISPN 10-15) are absent from the carved K05 system.
[VERIFIED]
1.4 DISPE — the disc-type pointer array [VERIFIED]¶
L07, carved bytes at 031371B (044-S3IDPIT.bin, base 4000B):
031371: 000000 000000 000000 000000 000000 000000 000000 000000 % types 00-07
031401: 031041 031052 031063 031074 031105 031116 000000 031303 % types 10-17
031411: 031127 031140 031151 031162 031173 031204 031215 031226 % types 20-27
031421: 031237 031250 031261 031272 031314 031325 031336 000000 % types 30-37
031431: 031347 031360 000000 000000 000000 000000 000000 000000 % types 40-47
M06 at 036306B is structurally identical (pointers 035756…036275).
K05 (carved), pointer array at 012267B:
012267: 000000 x8 % types 00-07
012277: 000000 x7 012513 % types 10-17 (10-15 EMPTY, 17=DT310)
012307: 012337 012350 012361 012372 012403 012414 012425 012436 % types 20-27
012317: 012447 012460 012471 012502 012524 012535 012546 000000 % types 30-37
012327: 012557 012570 000000 x6 % types 40-47
Reading: a disc type is supported by this generated system iff its
DISPE entry is non-zero. MAXDI=47B is the maximum index. [VERIFIED]
The bound is enforced in code: IP-P2-DISK-START.NPL:52 (listing address
054024) reads
054024 IF 40>T AND DISPE(T)><0 THEN % 37 IS MAX FORMAT NUMBER
for the SMD driver's fn 36 = READ ELEMENT IN "DISC-LAYOUT-TABLE" function,
and IP-P2-SCSI-DISK.NPL:328 (057052) / IP-P2-SCSI-OPDI.NPL:196 (066064)
use IF X<<="MAXDI" AND DISPE(X)><0. [VERIFIED from the recovered source;
the table those lines index is byte-verified above.]
1.5 Correction to an earlier finding¶
A parallel pass over 006-S3FS concluded "no repeating disc-geometry table
exists in SINTRAN L07". That conclusion is wrong: the table exists, but it
lives in the DPIT segment (044-S3IDPIT / 053-S3SDPIT, load base
4000B), not in the file-system segment. The symbols SECSY, SECTR,
etc. found in FILSYS-SYMBOLS are the field offsets into a record of this
table (SECTR=1, SECSY=2, DISPN=10B — and indeed word 1 = SECTR, word 2 =
SECSY, word 8 = DISPN in the carved records, exactly matching). [VERIFIED]
2A. The DEVICE-NAME table S3DNAM — the list of supported disc units and their sizes [VERIFIED]¶
This is the single most direct answer to "what are the valid disc sizes and supported disc units".
2A.1 Where it lives [VERIFIED]¶
| version | file | load base | first entry |
|---|---|---|---|
| K-VSX-500 | inside segments\006-S3FS.bin (twin 012-S3FSSV.bin) |
26000B |
DISC-38MB-1 at 114651B |
| L-VSX-500 | own segment segments\101-S3DNAM.bin (twin 100-S3SDNAM.bin) |
164000B |
DISC-38MB-1 at 164000B |
| M-VSX-500 | own segment segments\101-S3DNAM.bin (twin 100-S3SDNAM.bin) |
164000B |
DISC-38MB-1 at 164000B |
100-S3SDNAM.meta.json states "description": "Save of device name table".
versions\L-VSX-500\inputs\list-segment.txt lists S3SDNAM 100 / S3DNAM 101;
K's list-segment.txt has no such segments. The move of this table out of the
file-system segment into its own segment pair is a K→L architectural change.
[VERIFIED]
2A.2 Entry format — 17 words per entry, identical in K, L, M [VERIFIED]¶
Raw first entry, 101-S3DNAM.bin byte 0, address 164000B:
042111 051503 026463 034115 041055 030447 000000 000000
000000 044066 001000 002001 030346 000515 001100 000000 031140
| word | value here | content |
|---|---|---|
| 0-7 | 042111…030447 |
packed ASCII name DISC-38MB-1 + ' (047) terminator — [VERIFIED] |
| 8:9 | 000000 044066 |
32-bit device size in PAGES = 18486 — [VERIFIED value, INFERRED unit] |
| 10 | 001000 |
1000B disc, 400B floppy, 1B mag tape — [VERIFIED] |
| 11 | 002001 |
unit / target selector (SCSI targets 1..8 = 2021…2027,2020) — [VERIFIED] |
| 12 | 030346 |
= symbol BABST=030346 (SYMBOLS\L07\FILSYS-SYMBOLS.SYMB.TXT) — [VERIFIED] |
| 13 | 000515 |
[NOT DECODED] - one observed value cannot establish a label; section 8 of this file lists words 12/13 as uncarved. To settle: tabulate word 13 across all 268 entries and show it partitions by device family, as was done for word 14 in section 2A.4 |
| 14 | 001100 |
LOGICAL DEVICE NUMBER — [VERIFIED, see 2A.4] |
| 16 | 031140 |
pointer to the DTxxx geometry record — 031140B = DT037 in §1.3 — [VERIFIED] |
Word 16 is the link to §1. Every value observed in the L07 table is one of
the 24 record addresses byte-verified in §1.3 — 031041(DT014) … 031360
(DTOD2), and 031336 (DTSSS) for every one of the 112 SCSI entries.
Two tables carved independently, and the pointers agree exactly.
[VERIFIED]
2A.3 The valid disc sizes, decoded from the carved bytes [VERIFIED]¶
268 records parse as named entries in L07 (266 real + 2 false hits on misaligned data). Sizes are the 32-bit word 8:9, decimal pages; a SINTRAN page is 1024 words = 2048 bytes.
| named family | pages | ≈ bytes | DTxxx record(s) pointed at |
|---|---|---|---|
DISC-450MB-n-F / -N |
220584 | 451.8 MB | 031261 DT450, 031314 DT470 |
DISC-288MB-n-R/F/E/N |
140391 | 287.5 MB | 031226 DT288, 031250 DT300, 031303 DT310, 031325 DT290 |
DISC-225MB-n-R/F/E/N |
110292 | 225.9 MB | DT288 / DT300 / DT450 / DT310 / DT470 / DT290 |
DISC-140MB-n-F |
69530 | 142.4 MB | 031204 DT135 |
DISC-75MB-n |
36945 | 75.7 MB | 031162 DT075, 031226 DT288, 031215 DT160 |
DISC-74MB-n |
36396 | 74.5 MB | 031116 DT074 |
DISC-70MB-n(-R/F/E/N) |
34765 | 71.2 MB | 031151 DT070 + the -R/F/E/N variants |
DISC-45MB-n |
22032 | 45.1 MB | 031074 DT045 |
DISC-38MB-n |
18486 | 37.9 MB | 031140 DT037 |
DISC-28MB-n |
13648 | 28.0 MB | 031105 DT028 |
DISC-23MB-n |
11016 | 22.6 MB | 031063 DT023 |
DISC-21MB-n |
10728 | 22.0 MB | 031052 DT021 |
DISC-16MB-n |
8000 | 16.4 MB | 031063 DT023 |
DISC-30MB-n / -60MB-n / -90MB-n |
7389 | 15.1 MB | 031127 DT030 |
DISC-14MB-n |
6912 | 14.2 MB | 031041 DT014 |
FLOPPY-DISC-1/2 |
154 | 0.3 MB | 0 |
DISC-[n-]SCSI-1…14 (112 entries) |
0 | — | 031336 DTSSS |
DISC-[n-]OPTICAL-1…4 (32 entries) |
0 | — | 031347 DTOD1 |
MAG-TAPE-1…4, STREAMER-1/2 |
0 | — | 0 |
[INFERRED] DISC-30MB / -60MB / -90MB all sharing 7389 pages and
DT030 means the size field there is per surface/pack member, not the whole
drive; the record DT030 is literally commented % DISC-30/60/90MB in the
source listing.
THE DECISIVE FACT: every SCSI and every optical entry has size 0. That is the byte-level statement that SINTRAN does not hold a table of valid SCSI disc sizes — the size is obtained from the drive and from the disc's control record (§4.3, §4.4). [VERIFIED]
2A.4 Word 14 is the logical device number [VERIFIED]¶
The values observed in word 14 are exactly the logical device numbers held in
the MDISCS attribute arrays of §2:
| word-14 value | device family | matching MDISCS entry |
|---|---|---|
001100 |
all SMD / large-disc names | BBDIS = (BIGDI, **1100**, …, 1540) — SMD |
002210…002225 |
DISC-*-SCSI-1 … SCSI-14 (controller 1..14) |
SCDIS = (SCDI1, **2210**, …, 144300) — SCSI, +1 per controller |
002232…002235 |
DISC-*-OPTICAL-1 … -4 |
continues the SCSI logical-device block |
002206/002207 |
STREAMER-1/2 |
— |
001145/001156 |
FLOPPY-DISC-1/2 |
— |
000560, 001111, 001231, 001224 |
MAG-TAPE-* |
1224 also appears as WWDIS's ST-506 logical device no. |
This resolves what word 14 is: it is not the IOX hardware device number
(500/1540/144300) but the SINTRAN logical device number, and its base
values come from MDISCS. [VERIFIED — the 1100 / 2210 coincidence with the
byte-verified MDISCS arrays is exact.]
2A.5 SCSI addressing capacity of the name table [VERIFIED]¶
101-S3DNAM.bin names 14 SCSI controllers × 8 targets = 112 SCSI disc
units (167770B DISC-SCSI-1 … 173527B DISC-8-SCSI-14) and
4 optical controllers × 8 targets = 32 units (173550B … 174547B).
K's copy inside 006-S3FS has the same SCSI block starting at 165556B.
Unused slots after 174652B carry the literal name 0000000000'.
[VERIFIED]
Note the distinction: 112 names exist, but the number of SCSI unit datafields actually generated into a given system is 9 (K), 10 (L), 4 (M) — see §4.5.
2. The main-swap-disc attribute table MDISCS [VERIFIED]¶
Carved from the resident common code, not a segment:
versions\L-VSX-500\resident\SINTRAN-DATA_commoncode.bin (load base 0).
041445: 000000 000000 000000 041510 041510 041510 041510 041510
041455: 041510 000000 041515 041515 041515 041515 041515 041515
041465: 041515 041515 041515 041515 041515 041515 041515 041515
041475: 041515 041522 000000 000000 000000 000000 000000 000000
041505: 000000 000000 000000 032770 001224 101160 076732 000500
041515: 031550 001100 077603 074436 001540 036442 002210 102020
041525: 102020 144300 000000 000000 000000 000000 000000 000000
Decoded (array base MDISCS = 041440B, one word per disc-type index):
| index range | pointer | attribute array (5 words) | meaning |
|---|---|---|---|
| 00-07 | 0 | — | no swap device |
| 10-15 | 041510 |
032770, 001224, 101160, 076732, 000500 |
ST-506 / Winchester |
| 16 | 0 | — | — |
| 17-35 | 041515 |
031550, 001100, 077603, 074436, 001540 |
SMD |
| 36 | 041522 |
036442, 002210, 102020, 102020, 144300 |
SCSI |
| 37-47 | 0 | — | — |
Cross-verification that this really is MDISCS: word 0 of each attribute
array is a datafield address, and all three match the L07 symbol table exactly:
| word | value | L07 SYMBOL-2-LIST.SYMB.TXT |
|---|---|---|
041510 |
032770 |
WIGDI=032770 (line 362) |
041515 |
031550 |
BIGDI=031550 (line 342) |
041522 |
036442 |
SCDI1=036442 (line 375) |
[VERIFIED — three independent hits.]
Element meaning, from the source header at s3vs-4.symb/PH-P2-OPPSTART.NPL
listing address 041352 (quoted literally):
% MAIN-SWAPPING-DISC DATA (XXDIS)
% EACH ENTRY CONSIST OF THE FOLLOWING 4 LOCATIONS:
% 0: ADDRESS OF DATAFIELD
% 1: LOGICAL DEVICE NUMBER
% 2: ENTRY POINT OF DRIVER USED BY BOOTS-STRAP, ("SWAP DRIVER")
% 3: ENTRY POINT OF START-UP DRIVER
% 4: HARDW. DEV NO FOR SWAPPE CONT.
INTEGER ARRAY WWDIS:=(WIGDI,1224,ZWDIS,WIDIS, 500); % ST-506
INTEGER ARRAY BBDIS:=(BIGDI,1100,ZBDIS,BDISK, 1540); % SMD
INTEGER ARRAY SCDIS:=(SCDI1,2210,SCSWD,SCSWD,144300); % SCSI
So, byte-verified in the carved image:
| class | logical device no. | hardware device no. (IOX) |
|---|---|---|
| ST-506 / Winchester | 1224B | 500B |
| SMD (large disc) | 1100B | 1540B |
| SCSI | 2210B | 144300B |
This confirms the previously-verified )9BYTT DEVNO mapping (500 / 1540 /
144300) from the inside of the running system, and adds the logical device
numbers, which the generation streams do not carry. [VERIFIED]
M-VSX-500 has the same three arrays at 041367B / 041375B / 041403B but with
6-word entries (one extra field):
037175,1224,101434,744,77132,500 / 036465,1100,100007,1425,74636,1540 /
043060,2210,102400,1111,102400,144300. The datafield words again match the
M06 symbol table (WIGDI=037175, BIGDI=036465, SCDI1=043060).
[VERIFIED]
K-VSX-500: NOT FOUND. No 5- or 6-word array of this shape exists in the
carved K resident common code or its segments (searched for word 2210B
followed within 6 words by 144300B, and for 1100B followed by 1540B — no
hits). The K resident carve may not cover this address range. To settle it,
SINTRAN-DATA_commoncode.bin would have to be re-carved for the K05 image over
the full resident extent.
2.1 The valid swap-device-type range [VERIFIED from source, table byte-verified]¶
PH-P2-OPPSTART.NPL:722 (listing 044525):
044525 IF SWTYP<<7 OR>>36 THEN CALL ERRFATAL FI % ILLEGAL MAIN-SWAP-DEVICE TYPE
044535 IF A=7 THEN % MAIN SWAP-DEVICE IS FIXED PHOENIX DISK
044540 20=:SWTYP; 40000=:DSKTYPE; 100000=:XXSWTYPE
A system disc type outside 7..36B is a fatal error at cold start. Type 7 is
remapped to type 20B with the "fixed" bit 100000B — this is the carved-system
counterpart of the generation stream's FR=100000 fixed-disc bit. [VERIFIED
as source text; the MDISCS table it indexes is byte-verified above.]
3. How SINTRAN is installed / generated onto a LARGE DISC¶
Two distinct mechanisms exist, and they must not be conflated.
3.1 Off-line: the )9BYTT MACM generation stream¶
Already verified in this project and documented in
E:\Dev\Ronny\NDInsight\tools\boot-floppy\device-geometry.md. Not repeated here.
3.2 On-line: what the carved kernel itself does — SINTR cold start¶
PH-P2-OPPSTART.NPL (SINTR), listing addresses 044525-045101, is the
routine that lays a SINTRAN system out on the system disc at cold start. The
sequence, quoted:
044525 FILL1: IF SWTYP<<7 OR>>36 THEN CALL ERRFATAL FI % find swap device
044552 X:= MDISCS(SWTYPE)=:LDTA % ADDR OF DISC-ATTRIBUTES
044565 IF A=0 OR A >< T THEN CALL ERRFATAL FI % ILLEGAL LOGICAL DEV.NO.
044601 LDTA.SWDDRIVER=:"CTRNSF" % DISC-DRIVER ADDR
044606 A=:SWPDRIVER % ADDR OF SWAP-DRIVER
044612 A=:MASSNO(0) % LOGICAL DEV.NO. OF MAIN-SWAP-DEVICE
044614 X:=DISPE(SWTYP); T:=X.S0; A:=2000=:D:=0; *RDIV ST % SECTORS/TRACK
044623 IF D><0 THEN CALL ERRFATAL FI
044626 A=:ABLPAGE(0)=:CDABLPAGE
044631 A*200+XXSWTYPE=:BLST(1) % SET START OF SEGFIL0 IN SECTORS.
044637 DISPE(SWTYP)=:HTABL(0) % INITIAL DISC-LAYOUT TABLE
044663 IF "CTRNSF"="BDISK" OR ="SCSWD" THEN
044672 T:=42; X:=1; A:=0=:D % READ FORMAT NECESSARY
044676 DIBUS: CALL CTRNSF; CALL ERRFATAL; GO DIBUS
044701 FI
044701 X:=HTABL(0); ... =:CDIFELEMENT % DISC LAYOUT ELEMENT ADDRESS
...
044757 % COPY FROM SAVE TO IMAGE
044764 X:="LSECO"; CALL FAR CRWDISC % COPY EXT. COMMON
044773 X:="LSDPT"; CALL FAR CRWDISC % COPY DPIT
045002 X:="LSRPT"; CALL FAR CRWDISC % COPY RPIT
045011 X:="LSMPT"; CALL FAR CRWDISC % COPY MPIT
045020 X:="LSIPT"; CALL FAR CRWDISC % COPY IPIT
045027 X:="LSSGT"; CALL FAR CRWDISC % COPY SEGMENT TABLE
045036 X:="LFILS"; CALL FAR CRWDISC % COPY FILE SYSTEM
045044 X:=20; CALL FAR CRWDISC % COPY RT-LOADER PROGRAM SEGMENT
Reading [VERIFIED as source text; every table it consults is byte-verified in §1 and §2]:
- The generated constant
SWTYPselects both the driver set (MDISCS) and the geometry (DISPE). This is the single point where a system's disc type enters the running kernel. CDABLPAGE = SECWO / 2000B— sectors per SINTRAN page — is computed from the table'sSECWOfield.RDIVmust divide exactly (IF D><0 THEN ERRFATAL), soSECWOmust be an exact divisor of2000B(1024 words = one page). Every tabulated entry hasSECWO = 1000B(2 sectors/page) exceptDTOD2, which has2000B(1 sector/page). [VERIFIED against the carved records in §1.3]BLST(1) = CDABLPAGE*200B + XXSWTYPE— the start ofSEGFIL0in sectors;XXSWTYPEis the fixed-disc bit100000B. This is the run-time twin of the generation stream's<page>@<shift> FRaddress construction.- For SMD (
BDISK) and SCSI (SCSWD) the layout is not taken on faith: the kernel issues driver function 42 = READ FORMAT against the actual drive and installs the answer asHTABL(0), the live disc-layout element. - Installation proper is a straight page-range copy from the disc's SAVE area
to the IMAGE/segment area, one
CRWDISCcall per system component (common, DPIT, RPIT, MPIT, IPIT, segment table, file system, RT loader). Addresses arepage * CDABLPAGE + XXSWTYPE, i.e. derived entirely from the disc-layout table entry — seeCRWDISCat listing044427.
Where the format number comes from on an SMD disc — IP-P2-DISK-START.NPL
listing 054620:
054620 FIN: 0=:DIFTCOUNT;
054621 IF CTRG/\77=42 THEN % READ FORMAT
054626 CTRG SHZ -6/\7=:X % X=UNIT NUMBER
054632 X:=HTABL(X); T:=X.DISPN; AD:=PARDF.MEMAD; *DEPO
i.e. fn 42 returns DISPN — the index into DISPE — for that unit; and fn 36
(054014-054052) copies the whole DILEZ-word layout record out to the
caller. [VERIFIED as source text]
4. How SINTRAN is installed onto SCSI (K onward)¶
4.1 SCSI is disc type 36B and carries NO tabulated geometry [VERIFIED]¶
The carved DTSSS record (L07 031336B, M06 036253B, K05 012546B) is
1000 0 0 0 0 0 0 0 36
— SECWO = 1000B (512 words = 1024 bytes per sector) and every other
geometry field is zero. There is no cylinder/head/sector description for SCSI
anywhere in the kernel. [VERIFIED]
[INFERRED] Consequence: the only disc-size information SINTRAN has for a SCSI disc is what it reads off the device at run time. §4.2 and §4.3 show exactly what it reads and what it rejects.
4.2 The SCSI init sequence, carved¶
Segment 065-S3SIPIT.bin (twin 066-S3IIPIT.bin), load base 32000B;
whole-segment disassembly
versions\L-VSX-500\re\segments-ref\065-S3SIPIT\065-S3SIPIT.asm.
INQUI at 062613B (L07 SYMBOL-2-LIST, +376B revision offset, already
established in re\kernel-carving\SCSI-DISKLAYER-COMPLETE\README.md).
INQUIRY, 8-byte allocation length [VERIFIED — full CDB build, re-carved 2026-08-02]:
The whole sequence, from 065-S3SIPIT.asm:
062617 050442 LDT ,B 42 ; T := SMBP1
062620 054443 LDX ,B 43 ; X := SMBP2 -> phys addr of the command buffer
062621 044073 LDA 73 ; A := (062621+73) = 062714
062622 143304 STATX ; -> command word 0
062623 143315 STZTX 1 ; -> command word 1 = 0
062624 170404 SAA 4
062625 156411 SHA ZIN 11 ; A := 4<<9 = 04000B = 0x0800
062626 143324 STATX 2 ; -> command word 2
062627 143335 STZTX 3
062630 143345 STZTX 4
062631 143355 STZTX 5
062714 011000 (data word) ; 0x1200
giving CDB words w0=0x1200, w1=0, w2=0x0800, w3..w5=0.
The byte lane is proved, not assumed. Word 0 is 0x1200 and the INQUIRY opcode 0x12
must be CDB byte 0, so byte 0 is the high byte of each word. Confirmed independently by
REQUEST SENSE in the same driver, which ORs the LUN into the low byte of word 0:
063351 170407 SAA 7
063352 070400 AND ,B 0 ; A := 7 /\ SUDLU (the LUN)
063353 156405 SHA ZIN 5 ; LUN << 5
063354 074076 ORA 76 ; \/ 1400B = 0x0300 (opcode 0x03 in the HIGH byte)
063355 143304 STATX ; -> command word 0
LUN<<5 lands in bits 5-7 of the low byte = SCSI byte 1 bits 5-7, exactly where the LUN
belongs. So word 2 = 0x0800 puts byte 4 = 0x08, byte 5 = 0x00.
The 6-byte CDB is 12 00 00 00 08 00 — allocation length 8. 0x0800 was never a length;
it is SINBL(4 words) x 2 bytes x 256 (into the high byte lane), and SHZ 11 (<<9) applies
both scalings at once.
Independently corroborated by the DMA byte count, which is a literal 8:
063367 000000 (data) SUEBC high word = 0
063370 000010 (data) SUEBC low word = 8 ; SINBL@1 = 4<<1
063376 024371 LDD -7 ; load the double (0, 8)
063377 020403 STD ,B 3 ; =: SUIBC (byte count) = 8
Symbols: SINBL=000004, SINBS=000070, SMBP1=000042, SMBP2=000043 (L07
SYMBOL-1-LIST.SYMB.TXT).
Why the previous citation was not enough. This block used to quote only
062624/062625and jump from "A =04000B" to "allocation length 8". Those two words show only that A becomes 2048; the step to a field value of 8 is a byte-lane claim that was never demonstrated. The conclusion happened to be right, but nothing shown could have detected it being wrong — andSCSI-DEVICE-STRINGS.mdsection 5.3 leans on it to argue that SINTRAN structurally cannot hold SCSI vendor/product strings. That conclusion now rests on two independent constants (CDB allocation length and DMA byte count, both 8) rather than on an assumed lane.
Device-type dispatch [VERIFIED bytes, SCSI meanings INFERRED]:
| addr | word | test | outcome |
|---|---|---|---|
062656 |
156570 |
A := SUTYP >> 8 (INQUIRY byte 0) |
— |
062657 |
131007 |
JAZ type == 0 |
→ 062666 |
062660-062662 |
171003 142065 124004 |
type == 3 | → 062666 |
062663-062665 |
171004 140065 124006 |
type == 4 | → 062666 else 062673 |
062666-062670 |
044423 174265 004423 |
set SUTYP bit 6 (5SCDA, "direct access") |
— |
062671 |
044033 → 062724 = 022400 |
CDB word 0x2500 = READ CAPACITY(10) |
|
062673-062675 |
171001 140065 124003 |
type == 1 | → 062676 |
062676 |
044027 → 062725 = 002400 |
CDB word 0x0500 = READ BLOCK LIMITS |
|
062700-062704 |
171177 140065 124004 171007 |
type == 177B (0x7F) |
T := 7 error |
Named by the recovered NPL (IP-P2-SCSI-DISK.NPL:1240-1256, listing 062260):
062260 IF A SHZ -10=0 OR =3 OR =4 THEN
062270 SUTYP BONE 5SCDA=:SUTYP % DIRECT ACCESS DEVICE
062273 22400 % READ CAPACITY
062275 ELSE IF A=1 THEN
062300 2400 % READ BLOCK SIZE
062302 ELSE IF A=177 THEN
062305 T:=NOLUN; GO FAR ERREX % NO SUCH LUN
So the SCSI disc layer accepts INQUIRY peripheral device types 0, 3 and
4 as direct-access, type 1 as sequential (tape), and treats 177B as
"no such LUN". Anything else falls through to the shift-instruction default.
Separately, SCSDISK's device-type gate at 057552-057556B (LDA ,B 23 /
SHA ZIN SHR 10 / JAZ / SAT 1 / JMP I 54) rejects any nonzero device
type with error TYPER = 1 on the disk path. [VERIFIED]
4.3 THE hard SCSI limit: block/record size, not capacity [VERIFIED]¶
Carved (065-S3SIPIT.asm, addresses octal):
| addr | word | meaning |
|---|---|---|
062757 |
173470 |
AAX 70 — point at the DMA response buffer |
062760 |
143322 |
LDDTX 20 — load the second double of the READ CAPACITY data = BLOCK LENGTH (bytes 4-7) |
062761 |
140005 |
SKP IF DA EQL 0 — high 16 bits must be zero |
062762 |
125110 → 063072=063120 |
error exit |
062763-062764 |
146115 004441 |
SURSZ (,B 41) := low 16 bits |
063023 |
171412 |
SAX 12 — X := 10 decimal (2^10 = 1024) |
063036-063041 |
044441 171001 143056 125031 |
SURSZ <= 1 → error exit |
063042-063046 |
175005 124004 173777 156577 124374 |
while (A & 1)==0 { X--; A >>= 1 } |
063047-063051 |
171001 140065 125021 |
A != 1 after shifting → error exit (not a power of two) |
063052 |
146671 |
D := D - X = log2(record size) |
063053-063055 |
143007 124002 146107 |
if X < 0 then X := 0 |
063120-063121 |
171002 125054 |
the common error exit: T := 2, jump away |
Named by the recovered NPL (IP-P2-SCSI-DISK.NPL, listing 062354-062522):
062354 IF SUTYP BIT 5SCDA THEN
062357 T:=SMBP1; X:=SMBP2+SINBS; *LDDTX 20
062363 IF A><0 GO FAR RSZER % TO BIG
062365 A:=D=:SURSZ % DIRECT ACCESS DEVICE SIZE
...
062422 IF SUTYP BIT 5SCDA THEN
062425 X:=12 % RECORD SIZE 1024 BYTES
...
062434 IF X=:D>1 THEN
062440 IF SURSZ<=1 GO FAR RSZER
062444 DO WHILE A NBIT 0 ; X-1; A SHZ -1 ; OD
062451 IF A><1 GO FAR RSZER % NOT POWER OF 2
062454 FI
062454 D-X; IF X<0 THEN X:=0 FI % BYTE AND RECORD SHIFT
...
062522 RSZER: T:=ILRCS; GO FAR ERREX % ILLEGAL RECORD SIZE
Answer to "any hardcoded size or addressing limit":
- Block/record size — YES, a hard limit. The
READ CAPACITYblock length must (a) fit in 16 bits (IF A><0 GO FAR RSZER % TO BIG), (b) be> 1, and (c) be an exact power of two. Otherwise the unit is rejected withILRCS("illegal record size"). SINTRAN's own record is2^12B = 2^10 = 1024bytes and the shift12B - log2(size)converts between them; a size larger than 1024 clamps the shift to 0 at063053. [VERIFIED] - Capacity — NO limit, and no table. The capacity is a 32-bit double
(
UHLIM,FILSYS-SYMBOLS L07: UHLIM=177776= field,B -2; stored with a double store057742 020776 STD ,B -2). The bounds check inSCSDISK(057352-057362) is a 32-bitCOMPDofABPA2 + ABP32againstUHLIM, withBADPA (T=5)on overflow. [VERIFIED] - LBA addressing — 32-bit, with automatic 6→10-byte CDB promotion.
Carved in
CACOB:064102 171037 SAT 37/064103 143456 SKP IF DT MLST SA/064105 174354 BSET ONE 150 DL, and the buffer-store fork at064110 175354 BSKP ONE 150 DL→064112 143316 STDTX(4-byte LBA) versus064117 145454 RORA SA DL(packed 6-byte CDB). Named by NPL063504IF A>>37 THEN L BONE 15 FI % 10 BYTE FORMAT NECESSARYand063426IF A><0 OR D>>377 OR D=0 THEN L BONE 15 % 10 BYTES FORMAT NECESSARY. [VERIFIED]
4.4 Where the disc size actually comes from [VERIFIED]¶
READ CAPACITY gives the last block address, which the disk layer uses to
locate the control record on the last block. FINEX (057655B) then:
| addr | word | meaning |
|---|---|---|
057673 |
143300 |
LDATX — control-record header |
057674-057675 |
156570 004775 |
NPART := header >> 8, stored to ,B -3 (NPART=177775) |
057702-057706 |
143300 145051 173401 040347 124374 |
XOR checksum loop over the record |
057707-057710 |
140001 124007 |
checksum != 0 → NOCRC |
057711-057713 |
171002 143046 124004 |
NPART <= 2 → NOCRC |
057714-057716 |
171012 143046 124003 |
NPART > 012B (= NCOPA=000012) → NOCRC |
057732 |
143110 |
MOVEW — copy the partition table to the caller |
057741-057742 |
143316 020776 |
STDTX then STD ,B -2 → UHLIM (32-bit) |
057743-057744 |
170436 143304 |
status 36B to the caller |
057747 |
146106 |
T := 0 (success) |
So a SCSI disc's size and partitioning are self-describing, held in a control
record on the disc's own last block, protected by an XOR checksum, and the only
structural constraint is 2 < NPART <= 10 partitions (NCOPA = 000012 in
FILSYS-SYMBOLS). There is no kernel table of legal SCSI disc sizes.
[VERIFIED]
4.5 How many SCSI units a generated system supports [VERIFIED counts, INFERRED meaning]¶
Scanning the carved DPIT segments for the SCSI hardware device number
144300B yields regularly-spaced datafield records:
| version | file | unit-datafield addresses | stride | count |
|---|---|---|---|---|
| K-VSX-500 | 044-S3IDPIT.bin |
013242, 013470, 013716, 014144, 014372, 014620, 015046, 015274, 015522 |
226B |
9 |
| L-VSX-500 | 044-S3IDPIT.bin |
036437, 036642, 037045, 037250, 037453, 037656, 040061, 040264, 040467, 040672 |
203B |
10 |
| M-VSX-500 | 044-S3IDPIT.bin |
043055, 043260, 043463, 043666 |
203B |
4 |
Plus, in each, one further record whose neighbour word is the SCSI driver's
interrupt entry (L: …144300 56621 67247 — 67247B is SCINT, the carved SCSI
interrupt handler), i.e. the controller datafield as opposed to a unit
datafield. [VERIFIED addresses/words; INFERRED that these are per-unit
datafields and therefore that the number of configured SCSI units differs per
generated system: 9 / 10 / 4.] This is a generation parameter, not a
kernel-imposed maximum; no maximum-unit constant was found.
5. @CREATE-DIRECTORY, ALBIT, and the bit file¶
Carved from versions\L-VSX-500\segments\006-S3FS.bin (load base 26000B);
disassembly re\segments-ref\006-S3FS\006-S3FS.asm.
ALBIT = 137500B, CRDIR = 136741B (SYMBOLS\L07\FILSYS-SYMBOLS.SYMB.TXT:1314).
- Bit-file default placement [VERIFIED] —
137523-137532:LDT ,B 1/JPL I 63→GSIZE (037101B)/156777 SAD ZIN SHR 1/171011 SAT 11/141660 RDIV ST/141265 RMPY ST DA/020410 STD ,B 10⇒bit_start = 9 * floor(floor(pages/2)/9). The 9 is a hard literal (SAT 11), identical for every device — it is not read from the disc-layout table. - Bit-file span [VERIFIED words, INFERRED arithmetic] —
137535-137544:GSIZEthen156602 SAD ZIN 2(32-bit shift left 2) then172777 AAA -1⇒ceil(pages / 16384)bitmap pages, i.e. 16384 bits per page = 1 bit per page over a 1024-word page. - "Place at top of disc" — a supplied 32-bit bit address of
-1(137545-137562) makesALBITcomputepages - bitmap_pages. [VERIFIED words, INFERRED meaning] - The only size check [VERIFIED] —
137563-137575: 32-bit compare ofbit_startagainst the declared page count; on failure170500 SAA 100(error code100B) and124123 JMPto the error return. - NO MAXIMUM DISC SIZE IS ENFORCED IN
ALBITORCRDIR. [scope corrected 2026-08-02 - the exhaustive read covers those two routines (~370 words), not the kernel. A ceiling enforced by a caller, byGSIZE, byDEFINE-MASS-STORAGE-UNITor on the disc-layout path would leave both looking exactly as read. Absence in two routines is not absence in SINTRAN.] An exhaustive read ofALBIT(137500B..137730B) andCRDIR(136741B..137477B) finds no comparison of the page count against any ceiling constant. [VERIFIED by exhaustive read] The only implicit ceiling is structural: the bitmap-page count is kept in the 16-bitAregister (137544 004421 STA ,B 21) after a 32-bit<<2, which overflows atpages >= 2^30. [INFERRED] @CREATE-DIRECTORYdoes NOT write a disc boot area [VERIFIED for the call, INFERRED for the byte range] —CRDIRreserves the device with137046 153124 MON 124, callsALBIT(137145, pointer word137234 = 137500),GSIZE(137153→037101),WBFBU(137167→050565),ALPAG(137324→050627), then writes the directory label / master block throughWDIRSat137403(pointer137440 = 040221) and releases with137417 153125 MON 125. There is no bootstrap-area write.
Correction to existing repo docs: SINTRAN\Filesystem\create-directory-placement.md
(≈ lines 49, 104, 182) and create-directory.md §4 read 137710B MPY 20 as
"multiply by 16 = 16 bits/word". That is wrong: MPY (120000B) is a
memory-reference instruction with no immediate form; 20 is a P-relative
displacement and both MPY sites (137701B MPY 27 and 137710B MPY 20)
fetch the same constant word 000011B = 9 at 137730B. They belong to the
bad-page relocation (± one 9-page track), not to bitmap sizing. The
16384-bits-per-page conclusion is still correct but comes from
137540 156602 SAD ZIN 2. [VERIFIED]
6. Installation artefacts that survive inside the running system¶
6.1 The command-name table of the command processor [VERIFIED]¶
versions\L-VSX-500\segments\003-S3CP.bin, load base 30000B. The
'-terminated ASCII name table runs 054131B … 060230B, immediately
followed by a parameter-descriptor pointer table at 060231B. Confirmed against
re\segments-ref\003-S3CP\003-S3CP.asm:11217:
054131 025102 LDD I 102 ; 0x2A42 = '*','B' -> "*BACKUP-DIRECTORY"
054132 040503 ; 0x4143 = 'A','C'
Disc / directory / mass-storage commands, octal addresses in L:
| addr | commands |
|---|---|
054131 |
*BACKUP-DIRECTORY *COPY-USERS-FILES *CREATE-VOLUME |
054163 / 054172 |
*LIST-VOLUME / *RETRIEVE-DIRECTORY |
054352 |
CHANGE-BIT-FILE CHANGE-DIRECTORY-ENTRY |
054476 / 054543 |
CLEAR-MAIN-DIRECTORY / COLD-START |
054573 / 054611 |
COPY-DEVICE COPY-DIRECTORY / COPY-FILE CREATE-DIRECTORY |
054777 |
DEFINE-MASS-STORAGE-UNIT |
055135 |
DELETE-FILE … DELETE-MASS-STORAGE-UNIT |
055250 |
DEVICE-FUNCTION DIRECTORY-STATISTICS |
055331 / 055337 |
DSCNT DUMP / DUMP-BIT-FILE DUMP-DIRECTORY-ENTRY |
055447 |
… ENTER-DIRECTORY EXECUTE-IOX EXPAND-FILE |
056103 |
… LIST-MASS-STORAGE-UNITS … |
056332 / 056373 |
LOAD-BINARY … / MEMORY-LIMITS MODE |
056533 |
PRSRV RECOVER REGENERATE-DIRECTORY |
056653 |
… RESERVE-DEVICE-UNIT RESERVE-DIRECTORY |
057055 / 057376 |
SAVE-DIRECTORY / SET-MAIN-DIRECTORY |
057410 |
SET-MASS-STORAGE-SIZE SET-MEMORY-CONTENTS |
060046 / 060136 / 060152 |
TEST-DIRECTORY / UNLOCK-DIRECTORY / UNRESERVE-DIRECTORY |
M's table is the same, sorted, at 061770B…066022B (DEFINE-MASS-STORAGE-UNIT
062636B, LIST-MASS-STORAGE-UNITS 063753B, SET-MASS-STORAGE-SIZE
065260B). K's table is in definition order, not sorted, observed extent
047753B…053723B; K's exact start address is NOT FOUND.
[VERIFIED except where marked]
The S3CP table entry that dispatches @CREATE-DIRECTORY to CRDIR=136741B
(the pointer, as opposed to the name string at 054611B) was NOT FOUND.
6.2 The DEVICE-FUNCTION subcommand table [VERIFIED]¶
L 003-S3CP.bin, 116734B…117406B. Disc-relevant subcommands:
CLEAR-DEVICE, READ-STATUS, READ-FORMAT, CLEAR-SELECTED-UNIT,
RESERVE-DEVICE, RELEASE-DEVICE, SET-FLOPPY-FORMAT, FORMAT-FLOPPY,
GET-CURRENT-DISC-ADDRESS, DUMP-BOOTSTRAP,
SET-CURRENT-DISC-ADDRESS.
Version deltas: K has no RESERVE-DEVICE/RELEASE-DEVICE here;
M adds FORMAT-TRACK at 125622B. [VERIFIED]
DUMP-BOOTSTRAP exists as a subcommand at K 153367B, L 117361B, M 125575B.
[VERIFIED — the name-table entry and handler address]
~~This is the mechanism that writes the disc boot area; @CREATE-DIRECTORY does not (§5).~~
[DEMOTED TO INFERRED 2026-08-02 — and contradicted.]
A name-table entry proves the subcommand exists and where its handler starts. It says nothing
about what the handler writes, or which device classes it accepts. The competing reading —
that DUMP-BOOTSTRAP is floppy-only, and a hard-disc page 0 is authored by the cold-start
kernel routine in PH-P2-OPPSTART.NPL (FILL2/PL011) — produces the identical name-table
entry at the identical address. The cited evidence cannot separate them.
Two sources point the other way:
DISC-BOOTSTRAP.mdlines 454-456.ND-60.128.5p.97: "Allowed only on floppy disk".
DOC-AUDIT.md (lines 42, 86-105, edit #5 at 174-176) already ruled that
DISC-BOOTSTRAP.md is the better-supported document and recommended this demotion. The edit
was never applied; it is applied now.
Why it matters: acting on the original sentence would point a boot-block writer at a hard disc pack.
To settle it: carve the handler at L 117361B (base 30000B) and look for a device-class
parameter and a MOVNP/CRDISC page-0 write — the check FIRST-BOOT.md lines 256-260
already proposes.
6.3 The canned cold-start ENTER-DIRECTORY line [VERIFIED]¶
Present verbatim in all three versions, twice each:
| version | file | octal addr | text |
|---|---|---|---|
| K | 003-S3COM.bin |
067171 |
ENTER-DIRECTORY PACK-ONE DISC-75MB-1 0' |
| K | 005-S3ERRS.bin |
130740 |
same |
| L | 003-S3CP.bin |
074123 |
same |
| L | 005-S3ERRS.bin |
144744 |
same |
| M | 003-S3CP.bin |
102325 |
same |
| M | 005-S3ERRS.bin |
144744 |
same |
Followed in 005-S3ERRS by SC-75MB-1', SYMB', DATA', MODE',
(SCRATCH)SCRATCH01', SYSTEM'. [VERIFIED bytes; INFERRED that this is the
built-in default main-directory entry command plus default file types.]
Note DISC-75MB-1 is exactly a name in the device-name table of §2A
(164021B, 36945 pages).
6.4 The @CREATE-DIRECTORY / @DEFINE-MASS-STORAGE-UNIT dialogue [VERIFIED]¶
006-S3FS.bin (base 26000B), prompt table from 043220B:
043220 SA DIRECTORY NAME: '
043233 SA OLD DIRECTORY NAME: '
043247 SA NEW DIRECTORY NAME: '
043263 SA DEVICE NAME: ' ID DEVICE UNIT: ' ID DEVICE SUB-UNIT: ' SA FIXED(F) OR REMOVABLE(R): '
043334 SU USER NAME: ' ID NUMBER OF PAGES: ' ...
043535 IB DEVICE NUMBER (OCT): '
046135 IB OCTAL BIT FILE ADDRESS (-1 END OF DISC): ' SA MANUAL CHECK? '
046174 SA VOLUME NAME: '
153331 MASTER BLOCK' BIT FILE'
SA DEVICE NAME: is the prompt that is matched against the §2A device-name
table; ID NUMBER OF PAGES: is the operator-supplied size that reaches GSIZE
and thence ALBIT (§5); IB OCTAL BIT FILE ADDRESS (-1 END OF DISC) is
exactly the -1 case carved at ALBIT 137545B. [VERIFIED strings; the
linkage to ALBIT is VERIFIED at the -1 site, INFERRED for the others.]
6.5 Cold-start MODE-file machinery [VERIFIED]¶
070-S3SSM.bin / 071-S3SM.bin (L): SET-COLDSTART-MODE-FILE'
RESET-COLDSTART-MODE-FILE' at word offset 014063B, and at 064273B:
PARAMETERS TO THE ENTER-DIRECTORY COMMAND'
$WHEN ENTERING MAIN DIRECTORY: ' S COLDSTART INPUT FILE: '
S COLDSTART OUTPUT FILE: '. In K these live inside the merged 003-S3COM /
013-S3OPCSV.
6.6 Library marks — the system-generation record of each build [VERIFIED]¶
SYMBOLS\{K03,L07,M06}\LIBRARY-MARKS.SYMB.TXT are the conditional-assembly
switches of each build (K 687, L 732, M 914 marks). Example raw line
(L07, line 539): 176000/^8SCSI %000004.
| mark | K03 | L07 | M06 | [INFERRED] meaning |
|---|---|---|---|---|
8SCSI, 8SCS1, 8ZSCS |
Y | Y | Y | SCSI support / controller 1 |
8SCS2 |
— | Y | — | SCSI controller 2 |
8SCOD, 8SCMT |
— | Y | Y | SCSI optical disc / SCSI mag tape |
8BDIS, 8ZBDI |
Y | Y | Y | big disc (SMD) driver |
8BDIO, 8WDIS, 8ZWDI |
— | Y | Y | BDIO pool / Winchester disc |
7D1U0…7D8U0 |
only 7D1U0 |
all 8 | 7D1U0,7D2U0 |
SCSI disc unit marks |
7O1U0,7O2U0 |
— | Y | Y | optical units |
WM300, WM310 |
Y | — | — | K only |
8SCS2 existing only in L matches symbol SCSI2 existing only in L07 —
this particular L machine was generated with two SCSI controllers; the K and
M machines with one. [INFERRED — downgraded 2026-08-02]
A conditional-assembly mark EXISTING in a build's mark list is not the same as the mark being SET, and neither is the same as a controller COUNT. "The L build defines a second-controller mark that is not enabled", or "the mark gates a driver variant rather than an instance", produce the identical symbol-table difference. Section 4.5 also counts 10 SCSI unit datafields in L against 9 in K, which is not a 2:1 ratio.
To settle it: the LIBRARY-MARKS line format carries a value (
176000/^8SCSI %000004) — read8SCS2's value and compare against a mark known to be off; or count SCSI CONTROLLER datafields (those adjacent toSCINT) rather than unit datafields.
6.7 Version deltas that matter for disc support [VERIFIED]¶
- Device-name table moved out of
006-S3FSinto its own segment pair100/101-S3*DNAMat K→L. - SCSI is already fully present in K:
DISC-SCSI-*names at165556Bin K's006-S3FS, marks8SCSI/8SCS1/8ZSCS, symbolsSCSI1/SCSID,DTSSSdisc-layout record at012546B,DISPE[36B]non-zero. - K's carved
DISPEhas no ST-506/Winchester types (indices 10-15 zero); L and M have all six. Marks8WDIS/8ZWDIare absent from K03 accordingly. DTOD1/DTOD2(optical) are absent from K03, present in L07/M06 — matching the carvedDISPE[40B]/DISPE[41B]being zero in K and non-zero in L/M.RESERVE-DEVICE/RELEASE-DEVICEadded toDEVICE-FUNCTIONin L;FORMAT-TRACKadded in M.- Command-name table becomes alphabetically sorted from L onward.
6.8 Things explicitly NOT FOUND in the strings sweep¶
- No error text about a disc being too large. The nearest are
DIRECTORY INDEX TOO LARGE/OBJECT INDEX TOO LARGE(L014-S3ERRP.bin, word offset012423B). - No
WINCHESTERstring anywhere in any of the three systems. - No standalone
SCSI/SMD/ND-3201device-type word — the only SCSI text in the images is inside theDISC-n-SCSI-mdevice names. MODEis an ordinary command (L056373B), not an install-only:MODEconstruct.- M-VSX-500 has no
list-segment.txt/list-rt-programs.txtininputs\. - No RT program with a disc/SCSI name in either K's or L's
list-rt-programs.txt; the mass-storage-adjacent ones are1SWAP,5SWAP,RTDIL,RTRFA,DIMWD(L only).
7. MSTYP — the open question is NOT resolved¶
The cross-reference asked whether MSTYP's value could be recovered from the
carved symbol tables.
NOT FOUND. Exhaustive grep of
SINTRAN\NPL-SOURCE\SYMBOLS\K03\*.SYMB.TXTSINTRAN\NPL-SOURCE\SYMBOLS\L07\*.SYMB.TXTSINTRAN\NPL-SOURCE\SYMBOLS\M06\*.SYMB.TXT
for MSTYP, and for every symbol beginning MST, returns only
MSTAT, MSTEN, MSTMP, MSTOR, MSTPN, MSTRM, MSTRN, MSTS, MSTTY, MSTUS —
no MSTYP. The only near-hit anywhere is CMSTY (L07
SYMBOL-2-LIST.SYMB.TXT:2960 CMSTY=120462, M06 :2862 CMSTY=121200), which the
NPL listing (s3vs-4.symb:38028 SUBR CSTYP,CMSTYP) shows is an unrelated
routine. [VERIFIED negative]
Since MAC symbol significance is the last 5 characters and MSTYP is exactly 5,
truncation cannot be hiding it. [INFERRED]
The documented Drum=0 / NCR=1 / CDC=2 / Large disc=3 numbering is therefore
neither verified nor refuted by the carve. What the carve does show is
that the running kernel does not use a value of that shape at all: it uses
SWTYP in the range 7..36B indexing MDISCS and DISPE (§2, §2.1). Those
two numbering schemes are not the same and should not be equated without
further evidence. [INFERRED]
8. What is still uncarved¶
| Gap | What would have to be carved |
|---|---|
K-VSX-500 MDISCS / WWDIS / BBDIS / SCDIS |
Re-carve the resident common code for the K05 image over the full resident extent (SINTRAN:DATA pages 1..63 of the K05 SMD image) into versions\K-VSX-500\resident\SINTRAN-DATA_commoncode.bin; the present K carve does not contain the array. |
SINTR cold-start code as carved bytes |
PH-P2-OPPSTART lives on the start segment; segment 0002 S3IMAGE (load base 0, madr page 0, 63 pages) is carved but has no segments-ref disassembly. Produce segments-ref\002-S3IMAGE to byte-verify §3.2 rather than relying on the NPL listing. |
@CREATE-DIRECTORY command-table dispatch pointer |
003-S3CP (load base 30000B). The name table is now located (054131B-060230B, §6.1) and the parameter-descriptor pointer table starts at 060231B; the routine-address table that maps CREATE-DIRECTORY → CRDIR 136741B still has to be walked out from 060231B. |
| K-VSX-500 command-name table start | K's 003-S3COM table is unsorted and the run found begins mid-word at 047753B; a few words earlier is the true start. Disassemble K-VSX-500\segments\003-S3COM.bin around 047740B to pin it. |
Meaning of device-name-table words 12/13 (BABST=030346, 000515) |
Not decoded. They are constant per device class. |
No source image was modified; every read in this analysis was read-only.
9. Provenance¶
- Carved binaries:
E:\Dev\Ronny\NDInsight\tools\sintran-segment-carver\versions\{K,L,M}-VSX-500\segments\*.bin,…\resident\*.bin - Disassemblies:
…\versions\L-VSX-500\re\segments-ref\065-S3SIPIT\065-S3SIPIT.asm,…\006-S3FS\006-S3FS.asm - Prior byte-verified carves relied on:
…\versions\L-VSX-500\re\kernel-carving\SCSI-DISKLAYER-COMPLETE\README.md,…\SCSI-DRIVER-COMPLETE\,…\SMD-DRIVER-BASELINE\README.md - Symbol tables:
E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\SYMBOLS\{K03,L07,M06}\*.SYMB.TXT - Recovered source listings (naming/comments only, always cross-checked):
E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\s3vs-4.symb,…\NPL\PH-P2-OPPSTART.NPL,…\NPL\IP-P2-DISK-START.NPL,…\NPL\IP-P2-SCSI-DISK.NPL - Device-name table:
…\versions\L-VSX-500\segments\101-S3DNAM.bin(+100-S3SDNAM.bin),…\M-VSX-500\segments\101-S3DNAM.bin,…\K-VSX-500\segments\006-S3FS.bin - Command tables / strings:
…\segments\003-S3CP.bin(K:003-S3COM.bin),005-S3ERRS.bin,006-S3FS.bin,014-S3ERRP.bin,070-S3SSM.bin/071-S3SM.bin,037-S3RTD.bin - Generation switches:
E:\Dev\Ronny\NDInsight\SINTRAN\NPL-SOURCE\SYMBOLS\{K03,L07,M06}\LIBRARY-MARKS.SYMB.TXT - Live listings:
…\versions\{K,L}-VSX-500\inputs\list-segment.txt,list-rt-programs.txt - Tool:
E:\Dev\Ronny\NDInsight\tools\boot-floppy\tools\find_disc_layout_table.py
No file under D:\ND\, no .img/.image, and no carved binary was modified.
Nothing was written outside E:\Dev\Ronny\NDInsight\tools\boot-floppy\ and the
session scratchpad. INSTALL-PROCEDURE.md was not touched.