Follow shrub packet pointers: adjacent records hold unrelated payloads
The header pointers found in the previous commit are live, so they can be dereferenced. Two records 0x30 apart in the level 0 table at 0x22a6b8 were followed. Range measured: savestate slot 1, reading 0x00936a70 (from the record at 0x22a6b8) and 0x009376f0 (from the record at 0x22a6e8), 64 bytes each. The two payloads have nothing in common. 0x00936a70 is fixed-point vertex data: 8d 8c 80 80 89 87 7c 80 8d 8c 80 80 89 87 7c 80 4e 4e 4c 80 4e 4e 4c 80 4e 4e 4c 80 4e 4e 4c 80 repeating Every high byte is 0x80 or 0x7c and the pattern repeats on an 8-byte boundary. As s16 these are large negatives in a narrow band around -32500, consistent with Q16.15 fixed point rather than f32, and with a stride of 4 s16 per vertex. 0x009376f0 is a tagged sub-list, not vertex data: 00 00 00 30 cd 00 00 00 cd 00 00 00 cd 00 00 00 cd 00 00 00 01 00 00 05 22 c1 01 6e 00 00 00 00 Structurally different: small integers, a repeating 0xcd, 0x30 tags in the high byte. Nothing here is position data. This supports the type reading of the header: the table is a tagged collection where the tag selects the payload kind, not a uniform array. It also rules out the alternative that the 16-byte tiling was one uniform record format with varying fields -- two adjacent records with unrelated payloads is not that. Still open: the mapping from tag value to payload kind. The 0x30 appearing in record bytes 8-11 in RAM also heads the second payload, which is suggestive but is one coincidence so far and is deliberately not written up as a link.
This commit is contained in:
@@ -211,3 +211,45 @@ as data by something, not stored as a tag.
|
|||||||
`0x6d` marks a payload that the loader expands. That needs the same records
|
`0x6d` marks a payload that the loader expands. That needs the same records
|
||||||
compared one by one against their disc spans, which is the next step and is
|
compared one by one against their disc spans, which is the next step and is
|
||||||
now cheap because the anchor exists.
|
now cheap because the anchor exists.
|
||||||
|
|
||||||
|
## Following the pointers: packet payloads differ by type
|
||||||
|
|
||||||
|
The header pointers found above are live, so they can be dereferenced. Two
|
||||||
|
consecutive records from the level 0 table at `0x22a6b8` were followed.
|
||||||
|
|
||||||
|
**Range measured:** savestate slot 1, reading `0x00936a70` (from the record at
|
||||||
|
`0x22a6b8`) and `0x009376f0` (from the record at `0x22a6e8`), 64 bytes each.
|
||||||
|
|
||||||
|
**Result: the two payloads have nothing in common.**
|
||||||
|
|
||||||
|
`0x00936a70` -- fixed-point vertex data:
|
||||||
|
|
||||||
|
8d 8c 80 80 89 87 7c 80 8d 8c 80 80 89 87 7c 80
|
||||||
|
4e 4e 4c 80 4e 4e 4c 80 4e 4e 4c 80 4e 4e 4c 80 (repeating)
|
||||||
|
|
||||||
|
Every high byte is `0x80` or `0x7c`, and the pattern repeats on a 8-byte
|
||||||
|
boundary. Read as `s16` these are large negatives in a narrow band around
|
||||||
|
-32500. That is consistent with Q16.15 fixed-point rather than `f32`, and with
|
||||||
|
a stride of 4 `s16` per vertex.
|
||||||
|
|
||||||
|
`0x009376f0` -- a tagged sub-list, not vertex data:
|
||||||
|
|
||||||
|
00 00 00 30 cd 00 00 00 cd 00 00 00 cd 00 00 00
|
||||||
|
cd 00 00 00 01 00 00 05 22 c1 01 6e 00 00 00 00
|
||||||
|
|
||||||
|
Structurally different: small integers, a repeating `0xcd`, and `0x30` tags in
|
||||||
|
the high byte. Nothing here is position data.
|
||||||
|
|
||||||
|
**What this supports.** Two records 0x30 apart in the same table hold payloads
|
||||||
|
of entirely different kinds. That is direct evidence for the type reading of
|
||||||
|
the header: the table is a tagged collection where the tag selects what the
|
||||||
|
payload is, not a uniform array of one thing.
|
||||||
|
|
||||||
|
It also rules out the alternative I could not previously exclude -- that the
|
||||||
|
16-byte tiling was a single uniform record format and the varying bytes were
|
||||||
|
all fields of it. Two adjacent records with unrelated payloads is not that.
|
||||||
|
|
||||||
|
**Still open.** The mapping from tag value to payload kind. The `0x30` that
|
||||||
|
appears in record bytes 8-11 in RAM also appears at the head of the second
|
||||||
|
payload, which is suggestive but is one coincidence so far and should not be
|
||||||
|
written up as a link until it is seen in more than one record.
|
||||||
|
|||||||
Reference in New Issue
Block a user