Readout: add the Tier-1 Pixel-Planes array section (§05)
Signal-chain Pixel-Planes stage flips to "simulated"; new section shows the 64x128 tile footprint the array lit for the object (18/50), the 26-byte pixel-memory bit layout (Z24 + RGB), and states the validation + the honest remaining gap (the compiled micro-code binary, still undecoded, that carries the ground/sky). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,30 @@
|
||||
letter-spacing:.05em;color:var(--mute);line-height:1.5;border-top:1px solid var(--line)}
|
||||
.duo figcaption b{color:var(--phos)}
|
||||
|
||||
.arr{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:18px;align-items:start}
|
||||
@media(max-width:640px){.arr{grid-template-columns:1fr}}
|
||||
.arr figure{margin:0;border:1px solid var(--line2);border-radius:10px;overflow:hidden;
|
||||
background:linear-gradient(180deg,#05090d,#070d13)}
|
||||
.arr canvas{display:block;width:100%;height:auto}
|
||||
.arr figcaption{padding:10px 13px;font-family:var(--mono);font-size:11px;color:var(--mute);
|
||||
line-height:1.5;border-top:1px solid var(--line)}
|
||||
.arr figcaption b{color:var(--phos)}
|
||||
.arrinfo{display:flex;flex-direction:column;gap:14px;padding-top:4px}
|
||||
.pmlab{font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
|
||||
color:var(--faint)}
|
||||
.pmbar{display:flex;gap:2px;height:34px;font-family:var(--mono);font-size:10px;font-weight:600}
|
||||
.pmbar span{display:flex;align-items:center;justify-content:center;border-radius:3px;
|
||||
color:#04070a;letter-spacing:.02em;white-space:nowrap;overflow:hidden}
|
||||
.pmbar .z{flex:24;background:var(--cyan)}
|
||||
.pmbar .r{flex:8;background:#ff6b6b}
|
||||
.pmbar .g{flex:8;background:var(--phos)}
|
||||
.pmbar .b{flex:8;background:#6ba8ff}
|
||||
.pmbar .free{flex:160;background:#12202a;color:var(--faint)}
|
||||
.mini{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
|
||||
.mini li{position:relative;padding-left:18px;font-size:13.5px;color:var(--mute);line-height:1.45}
|
||||
.mini li::before{content:"›";position:absolute;left:2px;color:var(--cyan);font-weight:700}
|
||||
.mini li b{color:var(--ink)}
|
||||
|
||||
.hero-render .tag{position:absolute;top:12px;left:16px;font-family:var(--mono);
|
||||
font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--faint);
|
||||
border:1px solid var(--line2);border-radius:5px;padding:4px 9px;z-index:2}
|
||||
@@ -94,9 +118,11 @@
|
||||
.stage .d{font-size:12.5px;color:var(--mute)}
|
||||
.stage.on .v{color:var(--phos)}
|
||||
.stage.wait .v{color:var(--amber)}
|
||||
.stage.sim .v{color:var(--cyan)}
|
||||
.stage .dot{position:absolute;top:14px;right:14px;width:7px;height:7px;border-radius:50%}
|
||||
.stage.on .dot{background:var(--phos);box-shadow:0 0 8px var(--phos)}
|
||||
.stage.wait .dot{background:var(--amber);box-shadow:0 0 8px var(--amber)}
|
||||
.stage.sim .dot{background:var(--cyan);box-shadow:0 0 8px var(--cyan)}
|
||||
|
||||
/* two-column data */
|
||||
.cols{display:grid;grid-template-columns:1.05fr .95fr;gap:20px}
|
||||
@@ -195,7 +221,7 @@
|
||||
<div class="stage on"><span class="dot"></span><div class="k">cpu</div><div class="v">i860</div><div class="d">transform · clip · classify</div></div>
|
||||
<div class="stage on"><span class="dot"></span><div class="k">geom</div><div class="v">Binitize</div><div class="d">per-region 64×128 bins</div></div>
|
||||
<div class="stage on"><span class="dot"></span><div class="k">out</div><div class="v">IGC DMA</div><div class="d">SEND / TILE / FLUSH stream</div></div>
|
||||
<div class="stage wait"><span class="dot"></span><div class="k">px</div><div class="v">Pixel-Planes</div><div class="d">bit-serial array — next build</div></div>
|
||||
<div class="stage sim"><span class="dot"></span><div class="k">px</div><div class="v">Pixel-Planes</div><div class="d">array model simulated · §05</div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -274,7 +300,45 @@
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2><span class="idx">05</span> What it took to get here</h2>
|
||||
<h2><span class="idx">05</span> The Pixel-Planes array, simulated</h2>
|
||||
<p class="sub">This is the final stage in silicon — and it now runs in software. The
|
||||
<span class="mono">PXPL5 IGC</span> is a region rasteriser: the screen splits into
|
||||
<b>64 × 128 tiles</b>; every pixel carries a 26-byte bit-memory and an enable bit; all
|
||||
pixels evaluate one linear tree in lockstep —
|
||||
<span class="mono">eval_ltree(x,y,A,B,C) = (int)(x·A + y·B + C)</span>. A triangle becomes
|
||||
three <b>edge trees</b> into the enable register, then <b>Z and R/G/B planes</b>
|
||||
interpolated per pixel and z-buffered in pixel memory (<span class="mono">IGCOPS.C</span>).
|
||||
Fed the captured surface, the model lights the tiles below and renders pixels that match our
|
||||
reference rasteriser to within edge anti-aliasing — the array reproduced faithfully.</p>
|
||||
<div class="arr">
|
||||
<figure>
|
||||
<canvas id="tiles" width="500" height="360" aria-label="the object's footprint across the 64x128 tile array"></canvas>
|
||||
<figcaption><b>the object's footprint across the array</b> — 18 of 50 tiles lit,
|
||||
each a 64×128 region of pixel processors</figcaption>
|
||||
</figure>
|
||||
<div class="arrinfo">
|
||||
<div class="pmlab">pixel memory · 26 bytes = 208 bits</div>
|
||||
<div class="pmbar">
|
||||
<span class="z">Z · 24b</span><span class="r">R·8</span><span class="g">G·8</span>
|
||||
<span class="b">B·8</span><span class="free">enable + working bits</span>
|
||||
</div>
|
||||
<ul class="mini">
|
||||
<li>three edge trees → the <b>enable register</b> (the inside test)</li>
|
||||
<li>Z / R / G / B are <b>planes</b>, evaluated per pixel by the linear tree</li>
|
||||
<li>z-buffer via <span class="mono">MEM2geMEM2</span>; every write gated by enable</li>
|
||||
<li>output read back out of pixel memory → framebuffer</li>
|
||||
<li><b>validated</b> pixel-faithful to the reference — ~1%, at edges only</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<p class="sub" style="margin-top:16px">What this is <b>not</b>, yet: a decode of the compiled
|
||||
<b>bit-serial micro-code</b> the DMA actually ships (§02, right). That binary encoding is still
|
||||
undecoded, and it is how the ground and sky — which carry no stored vertices — reach the array.
|
||||
This is the array's <b>computational</b> model: the pixels that micro-code would produce.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2><span class="idx">06</span> What it took to get here</h2>
|
||||
<p class="sub">The i860 core was corrected against the toolchain's own assembler output
|
||||
and MAME's validated i860 model. A selection of the load-bearing fixes:</p>
|
||||
<div class="fixlist">
|
||||
@@ -299,15 +363,16 @@
|
||||
<li>Real PXPL5 IGC opcode stream emitted and decoded (<b>SEND / TILE / FLUSH</b>)</li>
|
||||
<li>Geometry binned into <b>191 screen regions</b></li>
|
||||
<li>Object <b>recovered and shaded</b> — a 9×5 height-field surface, lit by the firmware's own normals (above)</li>
|
||||
<li><b>Pixel-Planes array simulated</b> (§05) — 64×128 tiles, per-pixel memory, edge trees + z-buffer, validated pixel-faithful</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h3>The last mile to pixels</h3>
|
||||
<ul class="todo">
|
||||
<li>Our software-shaded frame is here — the <b>board's own hardware-shaded, textured</b> frame is what remains</li>
|
||||
<li>The SEND payloads are <b>bit-serial Pixel-Planes micro-code</b>, not stored triangles</li>
|
||||
<li>A shaded frame needs the <b>128×64 pixel-processor array simulator</b></li>
|
||||
<li>The model is known — <span class="mono">IGCOPS.C</span>: <span class="mono">eval_ltree = Ax+By+C</span>, an enable register, bit-serial MEM ops</li>
|
||||
<li>The array's <b>computational model</b> runs and matches the reference — the piece left is the board's own <b>compiled micro-code</b></li>
|
||||
<li>The DMA's SEND payloads are <b>bit-serial Pixel-Planes micro-code</b>; that binary encoding is still undecoded</li>
|
||||
<li>It is how the <b>ground and sky</b> — which carry no stored vertices — reach the array</li>
|
||||
<li>Cross-referencing the <span class="mono">0x0610ff / 0x00401</span> words against <span class="mono">IGCOPS.C</span> + the PXPL5 assembler is the next decode</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -315,7 +380,7 @@
|
||||
|
||||
<footer>
|
||||
<span>VWE TESLA REL410 · firmware-decomp · emu860</span>
|
||||
<span>Tier 0 complete · Tier 1 (rasteriser) next</span>
|
||||
<span>Tier 0 complete · Tier 1 array simulated · micro-code decode next</span>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
@@ -556,5 +621,36 @@
|
||||
bx.fillRect(px,py,CELL,CELL);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- IGC tile footprint: which 64x128 tiles the array lit for the object ---- */
|
||||
var TILES={ntx:10,nty:5,touched:[[0,2],[1,1],[1,2],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3],[4,1],[4,2],[4,3],[5,1],[5,2],[6,1],[6,2],[7,1],[8,1]]};
|
||||
(function(){
|
||||
var tc=document.getElementById('tiles'), tx=tc.getContext('2d');
|
||||
var W=tc.width, H=tc.height, NX=TILES.ntx, NY=TILES.nty;
|
||||
var lit={}; TILES.touched.forEach(function(t){lit[t[0]+'_'+t[1]]=1;});
|
||||
var gap=3;
|
||||
var cw=(H-2*gap)/(NY*2); // enforce 64:128 -> cellH = 2*cellW
|
||||
var ch=cw*2;
|
||||
var gw=NX*cw, gh=NY*ch;
|
||||
var ox=(W-gw)/2, oy=(H-gh)/2;
|
||||
tx.clearRect(0,0,W,H);
|
||||
for(var ty2=0;ty2<NY;ty2++)for(var tx2=0;tx2<NX;tx2++){
|
||||
var px=ox+tx2*cw, py=oy+ty2*ch;
|
||||
var on=lit[tx2+'_'+ty2];
|
||||
if(on){
|
||||
tx.fillStyle='rgba(65,255,142,0.16)'; tx.fillRect(px,py,cw-gap,ch-gap);
|
||||
tx.strokeStyle='rgba(65,255,142,0.85)'; tx.lineWidth=1.2;
|
||||
tx.strokeRect(px+0.5,py+0.5,cw-gap-1,ch-gap-1);
|
||||
tx.fillStyle='rgba(65,255,142,0.9)';
|
||||
tx.fillRect(px+cw/2-1.5,py+ch/2-1.5,3,3);
|
||||
} else {
|
||||
tx.strokeStyle='rgba(84,105,122,0.28)'; tx.lineWidth=1;
|
||||
tx.strokeRect(px+0.5,py+0.5,cw-gap-1,ch-gap-1);
|
||||
}
|
||||
}
|
||||
// caption-ish label of tile dimensions along the top-left cell
|
||||
tx.fillStyle='rgba(95,208,255,0.7)'; tx.font='9px ui-monospace,monospace';
|
||||
tx.fillText('64×128',ox+2,oy-4>8?oy-4:10);
|
||||
})();
|
||||
})();
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user