MON 215B (octal) - GetObjectEntry (DROBJ)¶
Gets information about a file. An object entry describes each file - it holds the file name, the access rights, the dates last opened for read and write, the size, and the device/unit where the file resides (a 64-byte record). The caller selects the file by directory index, user index and object index (one object entry per file version), and passes a 32-word (64-byte) receive buffer. Files on a remote system reachable through a COSMOS network can be accessed too.
Status: GOTAB dispatch head byte-proven as fall-through (GOTAB[215B] =
000000, no per-call stub); the DROBJ worker body is real SINTRAN L bytes and
calls the ROBJE (Read OBJect Entry) primitive - the SAME primitive MON 41B
ReadObjectEntry drives - together with GDIRA (Get DIRectory Address) and the
user/index helpers; the exact MON 215 -> worker link crosses an uncarved kernel
bridge (see Honest caveats). All addresses/values are octal.
- Full disassembly:
215B-GetObjectEntry.ASM- the actual code (the DROBJ worker body; there is no entry stub because the GOTAB slot is zero). - Bytes live once in the canonical segment layer:
../../segments-ref/.
Dispatch path¶
flowchart LR
A["User program<br/>MON 215B"] --> B["ENT14 level-14<br/>T = MON number"]
B --> C["GOTAB[215B] = 000000<br/>(byte-proven: fall-through)"]
C -.uncarved MFELL / CALLPROC.-> E["DROBJ get-object-entry worker<br/>006-S3FS :104037B"]
E --> F["ROBJE read-object-entry primitive<br/>006-S3FS :55566B (shared with MON 41B)"]
E --> G["GDIRA get-directory-address<br/>006-S3FS :30225B"]
class A blue
class B,C blue
class E,F,G green
classDef blue fill:#E3F2FD,stroke:#0D47A1,color:#0D47A1
classDef teal fill:#E0F7FA,stroke:#00838F,color:#00838F
classDef green fill:#E8F5E9,stroke:#2E7D32,color:#2E7D32
The GOTAB slot is zero, so there is no per-call entry stub. The dashed hop
(C -> E) is the resident MFELL/CALLPROC fall-through second-level dispatch - it
is not present in any carved segment, so it is the one link that cannot be
followed statically.
Code location (dispatch path)¶
Every row is a real region you can open. Byte offset = (addr - loadbase) in octal words x 2.
| Role | Segment (full disasm) | Addr range (octal) | Byte offset | Symbol | Verdict |
|---|---|---|---|---|---|
| GOTAB[215] dispatch word | commoncode.asm - .hex | 071450B (1 word) |
58960 | GOTAB+215 = 000000 |
VERIFIED (fall-through) |
| resident MFELL/CALLPROC bridge | - (uncarved) | - | - | CALLPROC |
UNVERIFIED |
| DROBJ get-object-entry worker | 006-S3FS.asm - .hex | 104037B-104407B (to DWOBJ) |
47166 | DROBJ |
real bytes; link MISATTRIBUTED |
| ROBJE read-object-entry primitive | 006-S3FS.asm - .hex | 55566B (call target) |
- | ROBJE |
called by DROBJ (link cell 104244) - VERIFIED |
| GDIRA get-directory-address | 006-S3FS.asm - .hex | 30225B (call target) |
- | GDIRA |
called by DROBJ (link cell 104402) - VERIFIED |
Verify by hand: grep '^104037 ' ../../segments-ref/006-S3FS/006-S3FS.hex -> byte offset 47166;
then dd if=../../../segments/006-S3FS.bin bs=1 skip=47166 count=8 | od -An -tx1 -> f8 10 22 2e cc 65 cc 59
(= octal 174020 021056 146145 146131 = BSET ZRO SSK / STD I 56 / RADD CLD SL DA / RADD CLD SB DD, the DROBJ entry).
The GOTAB slot itself:
dd if=../../../resident/SINTRAN-DATA_commoncode.bin bs=1 skip=58960 count=2 | od -An -tx1 -> 00 00 (= 000000, fall-through).
The ROBJE link cell: dd if=../../../segments/006-S3FS.bin bs=1 skip=47432 count=2 | od -An -tx1 -> 5b 76 (= octal 055566, the word at 104244B = the resolved ROBJE worker address).
Instruction walkthrough¶
Full listing: 215B-GetObjectEntry.ASM. The functional body
is the DROBJ worker; there is no F16xx stub because GOTAB[215] = 0. All calls to
shared file-system workers are indirect (JPL I / JMP I) through pointer
tables at 104116-104131, 104231-104251 and 104364-104407. nd100-dis renders
those pointer words as bogus instructions - they are data (link cells), not code;
their contents are the real worker addresses (resolved in the .ASM).
- Entry prologue (
104037-104044) -104037 BSET ZRO SSKclears the read/write selector;104040 STD I 56stashes the caller's double-word parameter;104043 SAB 131builds the 131-word local frameB;104044 JPL I 53->003752is the shared resident prologue worker. - Selector latch (
104045-104054) - theSSKflag is latched intoB+127(104050 STA ,B 127/104052 STZ ,B 127) and re-read (104053 LDA ,B 127). - Index resolve (
104055-104232) - the directory/user/object indices are validated and resolved via104063 JPL I 36->031075(USCPS),104070 JPL I 34->046231(FLPAR),104132 JPL I 77->101303(CHDUO),104174 JPL I 45->101043(FOPTB),104177 JPL I 44->071413(STDUO),104214 JPL I 33->056307(ROBJB, read-object-block) and104226 JPL I 23->053114(TUSRT). A range/validity failure funnels to the store-status exit at104362. - Read the object entry (
104202) -104202 JPL I 42->055566(ROBJE), the Read-OBJect-Entry primitive, fetches the 64-byte entry - the same primitive MON 41B ReadObjectEntry uses. The directory address is taken with104330 JPL I 52->030225(GDIRA), and the user helpers104300 JPL I 74->055111(GUSEN),104302 JPL I 74->054527(GMUSI),104306 JPL I 72->054130(GMFKN) resolve the user/index. - Finish (
104351-104363) -104356 MIN ,B 4is the success return-link bump;104362 STA ,B 2writes the result word into the caller's status slotB+2; every path funnels into the resident return104360 JMP I 27->003776.
The JPL I 42 call to ROBJE (link cell 104244 = 055566) plus the JPL I 52
call to GDIRA (link cell 104402 = 030225) are the byte-level proof that DROBJ
is the GetObjectEntry worker: it drives the object-entry read primitive by
directory/user/object index, exactly as the manual describes. DROBJ (Directory
Read OBJect entry) is also the 215B short name in the manual.
Parameter / register contract¶
Manual-side names/types are from 215B_GetObjectEntry.yaml.
| Reg / field | Dir | Meaning | Verdict |
|---|---|---|---|
| entry point (worker) | in | 104037B = DROBJ worker entry |
VERIFIED (bytes) |
SSK (skip flag) |
internal | 0 at entry (get object entry); latched to B+127 |
VERIFIED (bytes) |
D (double) |
in | caller parameter block, saved first (STD I 56) |
VERIFIED (copy); layout inferred |
local frame B |
internal | SAB 131 = 131B-word working frame |
VERIFIED (bytes) |
A (manual) |
in | address of the 32-word (64-byte) object-entry receive buffer | inferred (manual MAC example) |
T (manual) |
in | INDEX: left byte = directory index, right byte = user index | inferred (manual) |
X (manual) |
in | object index | inferred (manual) |
D (manual) |
in | remote system identification (used only if remote bit set) | inferred (manual) |
A (manual) |
out | error number on the error return | inferred (manual) |
B+2 |
out | returned status word (STA ,B 2 at 104362) |
VERIFIED (bytes) |
The user-visible A/T/X/D register convention lives in the caller-side
MON 215 wrapper and the uncarved MFELL/CALLPROC frame, so the precise
user-register-to-field assignment is inferred from the manual, not byte-proven
here.
Pseudo-code (for an emulator)¶
See 215B-GetObjectEntry.pseudo.c - a pseudo-C
model of the handler for emulator authors. Control flow + the calls to ROBJE and
GDIRA are byte-verified; the parameter-field semantics and error-number meanings are
inferred from the call structure and the manual. Every instruction is translated per
the canonical
ND100-INSTRUCTION-SEMANTICS.md
(bare LDA disp = mem[P+disp]; RADD CLD SD DA = A = D; BSET ZRO SSK clears
the skip flag; MIN ,B 4 success bump).
Honest caveats¶
What is byte-proven: GOTAB[215B] = 000000 (level-14 fall-through, no per-call
vector); the DROBJ worker body at 104037B in 006-S3FS is real code (entry bytes
174020 021056 146145 146131 match the disassembly, bounded by the next FILSYS symbol
DWOBJ = 104410B); and it drives the object-entry read - it calls ROBJE (055566B,
link cell 104244, the same primitive MON 41B uses) and GDIRA (030225B, link cell
104402).
What is NOT proven: the link from the zero GOTAB slot to the DROBJ worker.
Because the vector is zero there is no stub to disassemble and no pointer to
dereference; dispatch drops into the resident MFELL/CALLPROC second-level path,
which lives in an uncarved overlay. So the MON 215 -> DROBJ attribution rests on
the DROBJ symbol name (the 215B short name) + its call to ROBJE/GDIRA + the
matching get-object-entry behaviour, not a followed pointer - hence MISATTRIBUTED
in the strict sense. Confirming the link needs a live trace: issue a real MON 215,
single-step the level-14 fall-through into the resident CALLPROC dispatch, and
confirm P lands on DROBJ = 104037.
Region bound: the DROBJ worker is bounded strictly to the next FILSYS symbol
DWOBJ = 104410B (which is the MON 216B SetObjectEntry worker). Several link-cell
targets (003752, 010376, 020274, 001224, 003776) sit below the 26000B
segment load base; they are resident-monitor / save-restore routines outside the
file-system segment and are not resolved here.
Method: ../../../../../EXTRACTING-RESIDENT-CODE.md - dispatch reality: ../../TASK-05-mismatches.md - master map: ../../MON-CALL-INDEX.md.