Files
vt1200/xie/evidence/protocol_model_corrected.txt
T
arti d8d54bb990 feat(xie): a client-chosen XIE image is displayed on the VT1200
The XIE path now runs end to end: XieCreateImage -> XieCreatePhoto ->
XiePutTile -> XieExport(photomap -> depth-1 pixmap) -> XCopyArea(pixmap ->
window), and the client's tile appears on screen at the client's own window
position, pixel-exact.

TWO FAULTS BEHIND THE LONG DEAD END

1. Device model (harness/mame/vt1200.cpp, opt-in VT1200_ACCEL=1).  The
   accelerator's output port 0x5600200 returns the pixel stream the firmware
   pushed into the FIFO -- the firmware then stores it into the drawable itself
   (file 0x125528: MOVE *B6,*B1 ; ADDK 0x10,B1).  The FIFO read pointer was
   never reset between transfers, so consecutive exports read stale words and
   the same fill produced 759 then 516 set pixels.  Reset m_fifo_in/out on the
   data-register write; the export is now deterministic.

2. Measurement, not the device.
   - dwt/screenshot.py without --real reads 1024x1024 at a 128-byte row stride,
     but the VR319 default programs 1280x1024 at a 2048-bit (256-byte) pitch.
     That is the "shifted" picture; --real is the correct read.
   - The earlier "0 differing bytes over 128 KiB" VRAM comparison stepped peek
     by 1024 *bit* addresses, so it scanned rows 0..63 only -- never the window
     at rows 200..263.  Over the real raster the white/black diff is 576 bytes
     spanning exactly those rows.
   - New instrument: decclient does a server-side XGetImage readback of the
     pixmap and window and counts set pixels.  That separated "the server never
     drew it" from "the framebuffer view is wrong".

EVIDENCE (reproduced twice, the second time from a fresh machine)

  no export vs 0xFF : 4096 / 4096 pixels differ
  no export vs 0x00 :    0 / 4096   (the window background is black)
  0xFF      vs 0x00 : 4096 / 4096
  0xAA      vs 0x0F : 2048 / 4096   (the two stripe phases)

Tile byte 0xAA reproduces as 1-pixel vertical stripes, 0x0F as 4-pixel, with
no shear -- so the placement is right and the pixels are the client's.

Contents: xie/ holds DEC XIE 2.3 headers, 84 man pages and complete
client+server source; a libXie.a and decclient built from DEC's own code; the
XIE probes; and evidence/ with every measurement, including explicit
retractions of the earlier wrong readings (VRAM_IDENTICAL_FOR_BOTH_FILLS and
friends).  xie/evidence/XIE_IMAGE_DISPLAYED.md is the report; frames are in
xie/evidence/png/.

The accelerator model stays opt-in: it answers the status poll and relays the
pixel stream, but performs no compositing, so it is a stand-in and the verified
default configuration is unchanged (a no-env run still parks in the level-0
diagnostics menu at PC=3FDCE400).
2026-11-01 23:22:25 +02:00

49 lines
2.5 KiB
Plaintext

THE REPLY MODEL WAS WRONG. This is the most consequential correction of the
session and it explains the ERR8/ERR10/ERR14 inconsistencies and several
retractions.
1) SUCCESSFUL create AND arm SEND NO PACKET AT ALL.
Measured with a strict one-request-per-read probe on valid ids:
create -> (no packet) and the resource really is created
arm -> (no packet) when it succeeds
put -> BadMatch packet when it fails
Only ERRORS produce a packet. So "no-reply" in earlier runs meant SUCCESS,
not a lost reply, and my reader was silently consuming nothing.
2) HARDCODED IDS ARE INVALID. The client id base differs per connection
(0x004xxxxx, 0x005xxxxx, 0x006xxxxx were all observed). Every request using
a literal id such as 0x0047xxxx or 0x0048xxxx was rejected:
create id=0x00470001 -> BadIDChoice
create id=0x00470002 -> BadIDChoice
create id=0x00470100 -> BadIDChoice
create id=0x00480002 -> BadIDChoice (also has bit 19 set)
while c.new_id(...) works. Consequences: many sequences in earlier turns
created NOTHING and then "measured" arm/put against a non-existent resource;
the ERR14 results and several contradictions come from this.
3) ERROR PACKET LAYOUT (from a raw hexdump, no parsing assumptions):
type=0 | error_code | sequence | bad_value | minor | major=0x81
e.g. 00 0e 03 00 | 02 10 47 00 | 08 00 81 00 -> code 14, minor 8 (create)
So the error vocabulary in the tooling was correct; the ATTRIBUTION was not,
because with several requests outstanding the first packet read may belong to
an earlier request.
RE-VERIFIED WITH THE CORRECT MODEL (valid ids, one request per read):
w9=0x100 (byte8=1): create silent OK, arm silent OK, put = BadMatch
w9=0x300 (byte8=3): create silent OK, arm = BadMatch, put = BadMatch
and on the arm path the shared lookup still SUCCEEDS in both cases:
w9=0x100 : H_STORE -> K -> L(a7=FFFFFFFF) -> N(jrlt) -> P_6BBE2_SUCCESS
w9=0x300 : H_STORE -> K -> L(a7=FFFFFFFF) -> N(jrlt) -> P_6BBE2_SUCCESS
So for arm the lookup returns 0 in both cases and the BadMatch with byte8=3 is
produced later, in slot 20's body. Instrumenting slot 20's four MOVK 0x8 sites
(0x6ABD2, 0x6AC5C, 0x6AC96, 0x6ACD4) with valid ids: NONE of them fires.
NEXT: find the callee in slot 20's post-lookup body that returns 8 -- candidates
are the DD dispatcher 0x7E80008 and the per-element helpers -- now that valid ids
and the no-reply model are in place. Every earlier measurement that used a
literal id must be considered void until re-run.