psx.wiki

GPU Rasterization Rules: Difference between revisions

Revision as of 04:48, 23 October 2026
RemmyLee
(Main page: drop the Hardware Tests lede)
Revision as of 05:11, 23 October 2026
RemmyLee
(Hardware tests: 72 more test pages, listed on the main page by area; RUN.toml no longer published)
Line 1:Line 1:
+---
+title: GPU Rasterization Rules
+type: test
+summary: Records which pixels the GPU writes for small triangles, quads, lines, rectangles, fills and copies.
+category: Hardware tests
+info: Machine = SCPH-5501
+info: Program = gpuraster
+---
+
+## Overview
+
+Each case clears an area of VRAM with GP0(A0h), draws, reads the area back with GP0(C0h) and prints a CRC-32 of it. For small areas it also prints the pixels. All drawing goes to VRAM rows 256 to 511, and the CPU writes each command word after GPUSTAT bits 26 and 28 are set.[^src]
+
+Many cases draw in additive semi-transparency with a red of 8, so the red of a pixel counts how many times it was drawn. These cases print a map in which "." is a pixel not drawn and a digit is the count. The line cases print, for each step along the major axis, the minor coordinate that was drawn.[^src] The [rendering](/hardware/gpu/rendering/) page describes the drawing rules.
+
+## Results
+
+A triangle does not draw its right and bottom edges. The right triangle 0,0, 10,0, 0,10 drew rows 0 to 9, ten pixels wide in row 0 and one pixel wide in row 9, and nothing in column 10 or row 10.[^tri]
+
+The order of the vertices makes no difference: each triangle drew the same pixels with either winding. A square drawn as two triangles split along either diagonal drew the same pixels as a fan of four triangles about its centre. In all three each pixel was drawn once.[^tri]
+
+A line drawn with GP0(40h) includes both end points and draws the same pixels in either direction. A line from 8,8 to 16,8 drew nine pixels, and every line printed the same steps from the centre outward as from the end inward.[^lin]
+
+## Runs
+
+### 28 September 2026 (gpuraster_rsk on 5501a-card-h)
+
+[gpuraster_rsk/00RUN.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_rsk/00RUN.txt)
+
+```
+===== 00 RUN | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+1 tests
+A chain program, linked at 80010000
+Saved on the card in slot 2, from image 1
+COP0 at start: BPC 00000000 BDA 80024F50 TAR 801125E0 DCIC 00000000 BadVaddr 1F801DAA BDAM FFFFFFFF
+BPCM 00000000 SR 70000000 Cause 00000020 EPC 8011314C PRId 00000002
+```
+
+[gpuraster_rsk/01RSK.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_rsk/01RSK.txt)
+
+```
+===== 01 RSK GPU COMMAND PARSING | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Command parsing: polyline end codes, long polylines, NOP numbers, mirrors. After
+each, GP1(01h) resets the command buffer (display-control-commands-gp1.txt:23-28).
+GPUSTAT 5606200F at start
+Polyline 4,4 to 10,4 then the word below, then 55555555h; counts in 14x14:
+50005000h (Wild Arms 2, render-line-commands.txt:32-34) crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+50085008h (x 8, y 8 if a vertex) crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+5555000Ch crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+gouraud: 55555555h in a colour slot, then 10,10 crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+zigzag polyline of 40 vertices: crc 052D62B7, 64 drawn
+NOP numbers followed by a 4x4 tile at 2,2; the tile drawn right means no words eaten:
+00h: 16 drawn, x 2..5, y 2..5
+04h: 16 drawn, x 2..5, y 2..5
+1Eh: 16 drawn, x 2..5, y 2..5
+E0h: 16 drawn, x 2..5, y 2..5
+E7h: 16 drawn, x 2..5, y 2..5
+EFh: 16 drawn, x 2..5, y 2..5
+Mirrors (other-commands.txt:53-56):
+BFh as A0h, 4x1 1,2,3,4 crc 92991416
+ 0001 0002 0003 0004
+9Fh as 80h, row 410 to 411 crc 92991416
+ 0001 0002 0003 0004
+DFh as C0h, 2x1: GPUSTAT.27 set, GPUREAD 00020001
+Copy 256x200 from 0,256 to 256,256 ... done, first row crc 767FF88C
+Waits that ran out: 4
+Done.
+```
+
+### 28 September 2026 (gpuraster_safe on 5501a-card-h)
+
+[gpuraster_safe/00RUN.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/00RUN.txt)
+
+```
+===== 00 RUN | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+15 tests
+A chain program, linked at 80010000
+Saved on the card in slot 2, from image 1
+COP0 at start: BPC 00000000 BDA 80024F50 TAR 80115898 DCIC 00000000 BadVaddr 1F801DAA BDAM FFFFFFFF
+BPCM 00000000 SR 70000000 Cause 00000020 EPC 8011644C PRId 00000002
+```
+
+[gpuraster_safe/01TRI.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/01TRI.txt)
+
+```
+===== 01 TRI GPU TRI FILL RULES | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Triangles, flat, B+F with red 8: each digit is how many times a pixel was drawn.
+Window from local -1,-1, 15x15.
+GPUSTAT 5606200F at start
+GP1(10h) index 7 (GPU type): 00000002, index 8: 00000000
+right angle 0,0 10,0 0,10 crc 8DD3BDDA
+ ...............
+ .1111111111....
+ .111111111.....
+ .11111111......
+ .1111111.......
+ .111111........
+ .11111.........
+ .1111..........
+ .111...........
+ .11............
+ .1.............
+ ...............
+ ...............
+ ...............
+ ...............
+same, other winding 0,0 0,10 10,0 crc 8DD3BDDA
+ ...............
+ .1111111111....
+ .111111111.....
+ .11111111......
+ .1111111.......
+ .111111........
+ .11111.........
+ .1111..........
+ .111...........
+ .11............
+ .1.............
+ ...............
+ ...............
+ ...............
+ ...............
+right angle at 10,10: 10,0 10,10 0,10 crc 61B0F2CF
+ ...............
+ ...............
+ ..........1....
+ .........11....
+ ........111....
+ .......1111....
+ ......11111....
+ .....111111....
+ ....1111111....
+ ...11111111....
+ ..111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+square, two tris, diagonal 10,0-0,10 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+square, two tris, diagonal 0,0-10,10 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+fan of four about 5,5 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+shallow shared edge 12,4-0,12 crc 929F6BD6
+ ...............
+ ...............
+ .111...........
+ .111111........
+ .111111111.....
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ ...............
+ ...............
+steep shared edge 4,12-12,0 crc 8DD49EA8
+ ...............
+ .111111111111..
+ ..11111111111..
+ ..11111111111..
+ ..11111111111..
+ ...1111111111..
+ ...1111111111..
+ ...1111111111..
+ ....111111111..
+ ....111111111..
+ ....111111111..
+ .....11111111..
+ .....11111111..
+ ...............
+ ...............
+flat top 1,1 11,1 6,11 crc F3E4E953
+ ...............
+ ...............
+ ..1111111111...
+ ...111111111...
+ ...11111111....
+ ....1111111....
+ ....111111.....
+ .....11111.....
+ .....1111......
+ ......111......
+ ......11.......
+ .......1.......
+ ...............
+ ...............
+ ...............
+flat bottom 6,1 1,11 11,11 crc 760D9EEE
+ ...............
+ ...............
+ ...............
+ .......1.......
+ ......11.......
+ ......111......
+ .....1111......
+ .....11111.....
+ ....111111.....
+ ....1111111....
+ ...11111111....
+ ...111111111...
+ ...............
+ ...............
+ ...............
+general 1,2 11,5 4,11 crc 09BAF479
+ ...............
+ ...............
+ ...............
+ ...............
+ ...111.........
+ ...111111......
+ ...111111111...
+ ....1111111....
+ ....111111.....
+ ....11111......
+ .....111.......
+ .....11........
+ ...............
+ ...............
+ ...............
+general reversed 4,11 11,5 1,2 crc 09BAF479
+ ...............
+ ...............
+ ...............
+ ...............
+ ...111.........
+ ...111111......
+ ...111111111...
+ ....1111111....
+ ....111111.....
+ ....11111......
+ .....111.......
+ .....11........
+ ...............
+ ...............
+ ...............
+vertical left edge 0,0 0,10 10,5 crc DA2C2C3B
+ ...............
+ ...............
+ .11............
+ .1111..........
+ .111111........
+ .11111111......
+ .1111111111....
+ .11111111......
+ .111111........
+ .1111..........
+ .11............
+ ...............
+ ...............
+ ...............
+ ...............
+vertical right edge 10,0 10,10 0,5 crc 941E212E
+ ...............
+ ...............
+ .........11....
+ .......1111....
+ .....111111....
+ ...11111111....
+ .1111111111....
+ ...11111111....
+ .....111111....
+ .......1111....
+ .........11....
+ ...............
+ ...............
+ ...............
+ ...............
+sliver 0,0 12,1 12,2 crc EEFDFA63
+ ...............
+ ...............
+ .......111111..
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+sliver 0,0 1,12 2,12 crc 1BA1B2CA
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ..1............
+ ..1............
+ ..1............
+ ..1............
+ ..1............
+ ...............
+ ...............
+tiny: 0,0 1,0 0,1 / 3,0 5,0 3,2 / 7,0 8,1 7,1 / 9,5 11,5 10,7 crc D85CFC26
+ ...............
+ .1..11.........
+ ....1..........
+ ...............
+ ...............
+ ...............
+ ..........11...
+ ...........1...
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+degenerate: diagonal, row 12, column 12, point 6,2 crc 6E59FDE2
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/02QDL.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/02QDL.txt)
+
+```
+===== 02 QDL GPU QUAD AND LIMITS | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Quads (count maps as in TRI) and the size and coordinate limits.
+GPUSTAT 5606200F at start
+quad Z order 0,0 10,0 0,10 10,10 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+quad ring order 0,0 10,0 10,10 0,10 crc EB75C572
+ ...............
+ .1111111111....
+ ..111111112....
+ ...11111122....
+ ....1111222....
+ .....112222....
+ ......22222....
+ .....112222....
+ ....1111222....
+ ...11111122....
+ ..111111112....
+ ...............
+ ...............
+ ...............
+ ...............
+quad concave 0,0 10,0 0,10 3,3 crc 56B0BD95
+ ...............
+ .1111111111....
+ .111111112.....
+ .11111122......
+ .1112222.......
+ .111222........
+ .11122.........
+ .1122..........
+ .112...........
+ .12............
+ .1.............
+ ...............
+ ...............
+ ...............
+ ...............
+quad bowtie 0,0 10,10 0,10 10,0 crc 18C4943D
+ ...............
+ ...............
+ .1........1....
+ .11......11....
+ .111....111....
+ .1111..1111....
+ .1111111111....
+ .1111221111....
+ .1112222111....
+ .1122222211....
+ .1222222221....
+ ...............
+ ...............
+ ...............
+ ...............
+two quads sharing x=6 crc 0A5A6AC6
+ ...............
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ ...............
+ ...............
+ ...............
+ ...............
+quad v1=v2 0,0 0,0 0,10 10,10 crc 98839567
+ ...............
+ ...............
+ .1.............
+ .11............
+ .111...........
+ .1111..........
+ .11111.........
+ .111111........
+ .1111111.......
+ .11111111......
+ .111111111.....
+ ...............
+ ...............
+ ...............
+ ...............
+quad 2x2 at 0,0 and 1x1 at 5,5 crc 0FF5BCC3
+ ...............
+ .11............
+ .11............
+ ...............
+ ...............
+ ...............
+ ......1........
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+Size limits: pixels drawn in a 16x16 box inside the triangle
+width 1022: 256 of 256
+width 1023: 256 of 256
+width 1024: 0 of 256
+height 510: 256 of 256
+height 511: 256 of 256
+height 512: 0 of 256
+1023 x 511: 256 of 256
+1024 x 511: 0 of 256
+1023 x 512: 0 of 256
+quad, 2-3-4 is 1032 wide: 136 of 256
+quad, 1-2-3 is 1032 wide: 120 of 256
+quad 1060 wide, each triangle under 1023: 256 of 256
+Offset plus vertex past 11 bits:
+tri at -208 with offset -1024, box 816..847: 272 of 512
+rect at -208 with offset -1024: 512 of 512
+line -208,300 to -177,315 with offset -1024: 32 of 512
+tri 400..520 with offset 512 (one vertex wraps), box 912..927: 247 of 256
+Vertex upper bits, triangle 0,0 10,0 0,10 against the clean words:
+clean: crc 8848BC78, 55 drawn
+x bits 11-15 set: crc 8848BC78, 55 drawn, same
+x bit 11 set: crc 8848BC78, 55 drawn, same
+y bits 11-15 set: crc 8848BC78, 55 drawn, same
+x -4 as FFFCh: crc 4AEAB963, 55 drawn
+x -4 as 07FCh: crc 4AEAB963, 55 drawn, same
+x 3FCh (+1020): crc BA52B49D, 7 drawn
+Gouraud triangle clipped by the area, same pixels either way?
+area from x 0: crc BDDE35AC; area from x -16: crc BDDE35AC; 256 of 256 equal
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/03LIN.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/03LIN.txt)
+
+```
+===== 03 LIN GPU LINE OCTANTS | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Lines, GP0(40h), white. For each line, along its major axis, the minor coordinate
+drawn at each step in base 64 ('.' none, '*' two or more). f: centre to end, r: end
+to centre. Window 17x17, centre 8,8.
+GPUSTAT 5606200F at start
+8,0 f ........888888888 r ........888888888
+8,2 f ........889999aaa r ........889999aaa
+8,4 f ........899aabbcc r ........899aabbcc
+8,6 f ........89aabcdde r ........89aabcdde
+8,8 f ........89abcdefg r ........89abcdefg
+6,8 f ........899abccde r ........899abccde
+4,8 f ........8899aabbc r ........8899aabbc
+2,8 f ........8889999aa r ........8889999aa
+0,8 f ........888888888 r ........888888888
+-2,8 f ........887777666 r ........887777666
+-4,8 f ........877665544 r ........877665544
+-6,8 f ........876654332 r ........876654332
+-8,8 f gfedcba98........ r gfedcba98........
+-8,6 f edccba998........ r edccba998........
+-8,4 f cbbaa9988........ r cbbaa9988........
+-8,2 f aa9999888........ r aa9999888........
+-8,0 f 888888888........ r 888888888........
+-8,-2 f 667777888........ r 667777888........
+-8,-4 f 455667788........ r 455667788........
+-8,-6 f 234456778........ r 234456778........
+-8,-8 f 012345678........ r 012345678........
+-6,-8 f 233456678........ r 233456678........
+-4,-8 f 445566778........ r 445566778........
+-2,-8 f 666777788........ r 666777788........
+0,-8 f 888888888........ r 888888888........
+2,-8 f aa9999888........ r aa9999888........
+4,-8 f cbbaa9988........ r cbbaa9988........
+6,-8 f edccba998........ r edccba998........
+8,-8 f ........876543210 r ........876543210
+8,-6 f ........876654332 r ........876654332
+8,-4 f ........877665544 r ........877665544
+8,-2 f ........887777666 r ........887777666
+5,2 f ........8899aa... r ........8899aa...
+5,3 f ........899aab... r ........899aab...
+7,2 f ........889999aa. r ........889999aa.
+7,3 f ........8899aabb. r ........8899aabb.
+3,1 f ........8899..... r ........8899.....
+1,3 f ........8899..... r ........8899.....
+2,5 f ........8899aa... r ........8899aa...
+3,5 f ........899aab... r ........899aab...
+1,0 f ........88....... r ........88.......
+0,1 f ........88....... r ........88.......
+1,1 f ........89....... r ........89.......
+0,0 f ........8........ r ........8........
+3,2 f ........899a..... r ........899a.....
+-3,2 f .....a998........ r .....a998........
+3,-2 f ........8776..... r ........8776.....
+-3,-2 f .....6778........ r .....6778........
+Long lines in a 41x41 window: 0,0 to 40,k (x major) and 0,0 to k,40 (y major)
+40,1 f 00000000000000000000111111111111111111111
+ r 00000000000000000000111111111111111111111
+1,40 f 00000000000000000000011111111111111111111
+ r 00000000000000000000011111111111111111111
+40,3 f 00000001111111111111222222222222223333333
+ r 00000001111111111111222222222222223333333
+3,40 f 00000001111111111111122222222222223333333
+ r 00000001111111111111122222222222223333333
+40,7 f 00011111122222233333444444555555666666777
+ r 00011111122222233333444444555555666666777
+7,40 f 00011111122222233333344444555555666666777
+ r 00011111122222233333344444555555666666777
+40,13 f 001112223334445556667777888999aaabbbcccdd
+ r 001112223334445556667777888999aaabbbcccdd
+13,40 f 001112223334445556666777888999aaabbbcccdd
+ r 001112223334445556666777888999aaabbbcccdd
+40,20 f 0112233445566778899aabbccddeeffgghhiijjkk
+ r 0112233445566778899aabbccddeeffgghhiijjkk
+20,40 f 00112233445566778899aabbccddeeffgghhiijjk
+ r 00112233445566778899aabbccddeeffgghhiijjk
+40,27 f 011233455677899abbcdeefgghiijkklmmnoopqqr
+ r 011233455677899abbcdeefgghiijkklmmnoopqqr
+27,40 f 011233455677899abbcddefgghiijkklmmnoopqqr
+ r 011233455677899abbcddefgghiijkklmmnoopqqr
+40,39 f 0123456789abcdefghijkklmnopqrstuvwxyzABCD
+ r 0123456789abcdefghijkklmnopqrstuvwxyzABCD
+39,40 f 0123456789abcdefghijjklmnopqrstuvwxyzABCD
+ r 0123456789abcdefghijjklmnopqrstuvwxyzABCD
+0,40 to 40,27 EEDDDCCCBBBAAAzzzyyyxxxxwwwvvvuuutttsssrr
+ back EEDDDCCCBBBAAAzzzyyyxxxxwwwvvvuuutttsssrr
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/04LNS.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/04LNS.txt)
+
+```
+===== 04 LNS GPU LINE SHADE POLY | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Line colours (red channel, 5-bit, base 32), polylines, limits.
+GPUSTAT 5606200F at start
+gouraud 0,0 red 00 to 15,0 red FF, dither off crc B15EA965
+ 02468acehjlnprtv
+same, 15,0 to 0,0 crc B15EA965
+ 02468acehjlnprtv
+gouraud 0,0 to 31,0, red 00 to FF crc F950F6E9
+ 0123456789abcdefghijklmnopqrstuv
+gouraud 0,0 to 7,0, red FF to 00 crc 5EEADFF7
+ vrmid940
+gouraud 0,0 to 0,15 red 00 to FF (a column) crc B15EA965
+ 0
+ 2
+ 4
+ 6
+ 8
+ a
+ c
+ e
+ h
+ j
+ l
+ n
+ p
+ r
+ t
+ v
+gouraud 0,0 to 15,5, red 00 to FF crc C97FCAEE
+ 0200000000000000
+ 0046800000000000
+ 00000ace00000000
+ 00000000hjl00000
+ 00000000000npr00
+ 00000000000000tv
+dither on: 4 gouraud rows red 00 to FF crc 27EF39A3
+ 02368acfgjknprtv
+ 01468adehilnpruv
+ 02368acegjknprtv
+ 02468adehjlnpruv
+dither on: 4 flat rows red 44h crc F2FDA446
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+dither on: 4 flat rows red 44h, right to left crc F2FDA446
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+polyline square 0,0 10,0 10,10 0,10 0,0, counts crc A278982D
+ ..............
+ .21111111112..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .21111111112..
+ ..............
+ ..............
+polyline 0,0 5,0 5,0 5,5 (repeated vertex) crc 3EA60432
+ ..............
+ .111113.......
+ ......1.......
+ ......1.......
+ ......1.......
+ ......1.......
+ ......1.......
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+two single lines 0,0-10,0 and 10,0-10,10 crc 26DE41CB
+ ..............
+ .11111111112..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ..............
+ ..............
+polyline of one segment 0,0 10,3 crc 87F35582
+ ..............
+ .11...........
+ ...111........
+ ......1111....
+ ..........11..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+line 5,5 to 5,5 crc 02362D27
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ......1.......
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+gouraud polyline red, green, blue, red around 0,0 10,0 10,10 0,10: crc 5805F5CA, 31 drawn
+Line size limits (rendering-attributes.txt:9-13), box 256..271 x 300..315:
+across 1022: 16 drawn in box
+across 1023: 16 drawn in box
+across 1024: 0 drawn in box
+across 1023, reversed: 16 drawn in box
+across 1024, reversed: 0 drawn in box
+down 510: 16 drawn in box
+down 511: 16 drawn in box
+down 512: 0 drawn in box
+1023 x 511: 16 drawn in box
+1023 x 512: 0 drawn in box
+line -10,0 to 30,7 clipped at x 0: crc 36C5DA42; unclipped: crc 36C5DA42; first 2 rows 64 of 64 equal
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/05REC.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/05REC.txt)
+
+```
+===== 05 REC GPU RECT SPRITE FLIP | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Rectangles: sizes as pixels drawn and their extent (window from local -2,-2, 20x20),
+then raw textured sprites from the 15-bit page (texel 4000h|v<<8|u).
+GPUSTAT 5606200F at start
+tile 0x3: none drawn
+tile 3x0: none drawn
+tile 1x1: 1 drawn, x 2..2, y 2..2
+tile 2x3: 6 drawn, x 2..3, y 2..4
+tile 1024x2 (size field 400h): none drawn
+tile 1025x2: 2 drawn, x 2..2, y 2..3
+tile 1039x2: 30 drawn, x 2..16, y 2..3
+tile 2x512 (size field 200h): none drawn
+tile 2x513: 2 drawn, x 2..3, y 2..2
+tile 2x1024: none drawn
+tile 2x1027: 6 drawn, x 2..3, y 2..4
+tile 1x1 command 6Ah: 1 drawn, x 5..5, y 5..5
+tile 8x8 command 72h: 64 drawn, x 5..12, y 5..12
+tile 16x16 command 7Ah: 256 drawn, x 2..17, y 2..17
+tile 6x6 at -3,-3: 25 drawn, x 0..4, y 0..4
+tile 4x4 at x 0805h (bit 11): 16 drawn, x 7..10, y 2..5
+tile 4x4 at y F805h: 16 drawn, x 2..5, y 7..10
+tile 16x16 in area local 2..9: 64 drawn, x 4..11, y 4..11
+8x8 u0 v0 crc FF2AA940
+ v00 u 00 01 02 03 04 05 06 07
+ v01 u 00 01 02 03 04 05 06 07
+ v02 u 00 01 02 03 04 05 06 07
+ v03 u 00 01 02 03 04 05 06 07
+ v04 u 00 01 02 03 04 05 06 07
+ v05 u 00 01 02 03 04 05 06 07
+ v06 u 00 01 02 03 04 05 06 07
+ v07 u 00 01 02 03 04 05 06 07
+8x8 u0 v0 x-flip crc A11DE670
+ v00 u 01 00 FF FE FD FC FB FA
+ v01 u 01 00 FF FE FD FC FB FA
+ v02 u 01 00 FF FE FD FC FB FA
+ v03 u 01 00 FF FE FD FC FB FA
+ v04 u 01 00 FF FE FD FC FB FA
+ v05 u 01 00 FF FE FD FC FB FA
+ v06 u 01 00 FF FE FD FC FB FA
+ v07 u 01 00 FF FE FD FC FB FA
+8x8 u0 v0 y-flip crc E74C83BA
+ v00 u 00 01 02 03 04 05 06 07
+ v02 u !C210 !C210 !C210 !C210 10 10 10 10
+ v00 u !0000 !0421 !0842 !0C63 !1084 !14A5 !18C6 !1CE7
+ v00 u !8000 !8421 !8842 !8C63 !9084 !94A5 !98C6 !9CE7
+8x8 u7 v3 x and y flip crc 9217AAF4
+ v03 u 07 06 05 04 03 02 01 00
+ v02 u 07 06 05 04 03 02 01 00
+ v01 u 07 06 05 04 03 02 01 00
+ v00 u 07 06 05 04 03 02 01 00
+16x2 u1 crc 4CF60F65
+ v00 u 01 02 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F
+ v01 u 01 02 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F
+16x1 u3 crc DB02B679
+ v00 u 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12
+16x1 u5 crc BF1ED43E
+ v00 u 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12 13 13
+16x1 u7 crc 79711A63
+ v00 u 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12 13 13 15 16
+40x1 u1 crc 309BED7F
+ v00 u 01 02 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12 13 13 15 16 17 17 19 1A 1B 1B 1D 1E 1F 1F 21 22 23 23 25 26 27 27
+16x1 u252 (wraps) crc 24D2BEA4
+ v00 u FC FD FE FF 00 01 02 03 04 05 06 07 08 09 0A 0B
+2x8 v250 (wraps) crc 3D1AC694
+ v3A u 00 01
+ v00 u !0842 !0842
+ v00 u !0000 !0000
+ v00 u !8000 !8421
+ v00 u !0000 !0421
+ v00 u !C210 !C210
+ v00 u 00 01
+ v01 u 00 01
+16x1 u1 x-flip crc 96035D18
+ v00 u 01 00 FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2
+16x1 u8 x-flip crc DD34FC8D
+ v00 u 09 08 07 06 05 04 03 02 01 00 FF FE FD FC FB FA
+16x1 u255 x-flip crc 1D7602D8
+ v00 u FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0
+2x4 v2 y-flip crc D5CBA493
+ v02 u 00 01
+ v01 u 00 01
+ v00 u 00 01
+ v00 u !C210 !C210
+16x16 command 7Dh, u16 v16, x and y flip crc 6BBE81F0
+16x16 command 7Dh u16 v16 crc 2BB2C2FC
+8x8 command 75h u9 v1 crc 2E2918C4
+ v01 u 09 0A 0B 0B 0D 0E 0F 0F
+1x1 command 6Dh u9 v1 crc 2D147761
+ v01 u 09 !0000
+1x1 command 6Dh u9 v1 x-flip crc 2D147761
+ v01 u 09 !0000
+quad 2Dh u0..8 with E1 x-flip set before it crc AD07C8B3
+ v00 u 00 01 02 03 04 05 06 07
+8x1 u0 x-flip, after the quad crc A65746BD
+ v00 u 01 00 FF FE FD FC FB FA
+4-bit and 8-bit sprites as CLUT index (texel index (u+v)&15 or (u+16v)&255):
+4-bit 16x1 u0: 2000.. 000102030405060708090A0B0C0D0E0F
+4-bit 16x1 u1: 2000.. 0102030405060708090A0B0C0D0E0F0F
+4-bit 24x1 u7: 2000.. 0708090A0B0C0D0E0F0F0102030405060708090A0B0C0D0E
+4-bit 16x1 u0 x-flip: 2000.. 01000F0E0D0C0B0A0908070605040302
+4-bit 16x1 u8 x-flip: 2000.. 090807060504030201000F0E0D0C0B0A
+8-bit 16x1 u0 v4: 1000.. 404142434445464748494A4B4C4D4E4F
+8-bit 16x1 u1 v4: 1000.. 4142434445464747494A4B4C4D4E4F4F
+8-bit 16x1 u0 v4 x-flip: 1000.. 41403F3E3D3C3B3A3938373635343332
+8-bit 16x1 u3 v4 x-flip: 1000.. 434241403F3E3D3C3B3A393837363534
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/06TWN.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/06TWN.txt)
+
+```
+===== 06 TWN GPU TEXTURE WINDOW | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Texture window (E2h) on raw sprites from the 15-bit page: v and u of each texel read.
+GPUSTAT 5606200F at start
+E2 0, 20x1 u0 crc 24B003C5
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
+mask X 1 offset X 0, u0 crc 90E5D6B6
+ v00 u 00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 07 10 11 12 13
+mask X 1 offset X 1, u0 crc D75E924D
+ v00 u 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B
+mask X 2 offset X 1 (offset outside mask), u0 crc 410675BB
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03
+mask X 3 offset X 3, u0 crc 3D9E6DC5
+ v00 u 18 19 1A 1B 1C 1D 1E 1F 18 19 1A 1B 1C 1D 1E 1F 18 19 1A 1B
+mask X 0 offset X 1Fh, u0 crc 24B003C5
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
+mask X 1Fh offset X 0, u0 crc F553A0C8
+ v00 u 00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 07 00 01 02 03
+mask X 1Fh offset X 1Fh, u0 crc 08D90F45
+ v00 u F8 F9 FA FB FC FD FE FF F8 F9 FA FB FC FD FE FF F8 F9 FA FB
+mask X 10h offset X 10h, u0 crc 842259F3
+ v00 u 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93
+mask X 1Eh offset X 0Fh, u0 crc 5BA5C4FB
+ v00 u 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 70 71 72 73
+mask X 1 offset X 1, u4 crc B218DDF6
+ v00 u 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B 1C 1D 1E 1F
+mask X 1 offset X 1, u250 crc C250AF3B
+ v00 u FA FB FC FD FE FF 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D
+mask Y 1 offset Y 1, 2x12 v0 crc 18800D76
+ v08 u 00 01
+ v09 u 00 01
+ v0A u 00 01
+ v0B u 00 01
+ v0C u 00 01
+ v0D u 00 01
+ v0E u 00 01
+ v0F u 00 01
+ v08 u 00 01
+ v09 u 00 01
+ v0A u 00 01
+ v0B u 00 01
+mask Y 1Fh offset Y 1Fh, 2x4 v0 crc AD87A132
+ v38 u 00 01
+ v39 u 00 01
+ v3A u 00 01
+ v00 u !0842 !0842
+E2 with bits 20-23 set and mask X 1 offset X 1 crc D75E924D
+ v00 u 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B
+x-flip, mask X 1 offset X 1, u0 crc 0F1F9343
+ v00 u 09 08 FF FE FD FC FB FA F9 F8 FF FE FD FC FB FA F9 F8 EF EE
+x-flip, mask X 1 offset X 1, u16 crc 069E6191
+ v00 u 19 18 0F 0E 0D 0C 0B 0A 09 08 0F 0E 0D 0C 0B 0A 09 08 FF FE
+quad u0..20, mask X 1 offset X 1 crc D75E924D
+ v00 u 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B
+4-bit 20x1 u0, mask X 1 offset X 1 (index): 2000.. 08090A0B0C0D0E0F08090A0B0C0D0E0F08090A0B
+GP1(10h) index 2 after E2h FFFFFFh: 200FFFFF
+GP1(10h) index 2 after E2h 64D55: 20064D55
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/07TPG.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/07TPG.txt)
+
+```
+===== 07 TPG GPU TEXPAGE CLUT | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Texture page depth, E1 bit 11, CLUT attribute bit 15 and CLUT/page wrap at x 1023.
+GPUSTAT 5606200F at start
+depth 3 (reserved), 8x1 u0 v0 crc AD07C8B3
+ v00 u 00 01 02 03 04 05 06 07
+E1 bit 11 set, 8x1 u0 v5 crc 5416BA95
+ v05 u 00 01 02 03 04 05 06 07
+GPUSTAT after E1 bit 11 and back: 5606211C
+raw sprite over 1234h crc 74B14ED5
+ 1234 1234 1234 1234 8000 8000 8000 8000
+same, semi-transparent command 67h (mode 0) crc 3F3DDD1C
+ 1234 1234 1234 1234 890A 890A 890A 890A
+4-bit CLUT A: 2000.. 000102030405060708090A0B0C0D0E0F
+4-bit CLUT B: 2400.. 000102030405060708090A0B0C0D0E0F
+4-bit CLUT A with attribute bit 15: 2000.. 000102030405060708090A0B0C0D0E0F
+8-bit v4: 1000.. 404142434445464748494A4B4C4D4E4F
+8-bit CLUT with attribute bit 15: 1000.. 404142434445464748494A4B4C4D4E4F
+8-bit u0..31 (index = u), CLUT at 1008,499 crc C9073367
+ 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 780A 780B 780C 780D 780E 780F 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 700A 700B 700C 700D 700E 700F
+8-bit page at x 960, u120..135 v0 (index): 1000.. FC40FD40FE40FF40005A015A025A035A
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/08UVI.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/08UVI.txt)
+
+```
+===== 08 UVI GPU UV INTERPOLATE | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+UV interpolation (raw quads on the 15-bit page) and gouraud colour across widths.
+GPUSTAT 5606200F at start
+First column with u 1, quad w wide with u 0 to 1, w from 1:
+ -- 01 02 02 03 04 04 04 05 06 06 07 07 08 08 08 09 0A 0A 0B 0B 0C 0C 0D 0D 0E 0E 0F 0F 10 10 10
+ 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 1A 1A 1B 1B 1C 1C 1D 1D 1E 1E 1F 1F 20 20 20
+ 21 22 22 23 23 24 24 25 25 26 26 27 27 28 29 29 29 2A 2A 2B 2B 2C 2C 2D 2D 2E 2E 2F 2F 30 30 31
+ 31 32 32 34 34 34 35 35 35 36 36 38 38 38 39 39 39 3B 3B 3B 3B 3D 3D 3D 3F 3F 3F 3F 40 40 40 40
+ 43 43 43 43 45 45 45 45 47 47 47 47 47 4A 4A 4A 4A 4A 4C 4C 4C 4C 4C 4F 4F 4F 4F 4F 4F 52 52 52
+ 52 52 52 56 56 56 56 56 56 56 5A 5A 5A 5A 5A 5A 5A 5A 5E 5E 5E 5E 5E 5E 5E 5E 62 62 62 62 62 62
+ 62 62 62 67 67 67 67 67 67 67 67 67 6C 6C 6C 6C 6C 6C 6C 6C 6C 6C 6C 72 72 72 72 72 72 72 72 72
+Low 16 bits of each row's CRC, quad w wide with u 0 to 255, w = 1..224:
+ 47031826E8EE7E45AEB89F5F2032D23840556D12E21729E31B90C9231A71106D
+ CD483CAF6C3FDA00B865C0E542D6ADF600DC5DF01A4F2BBA0CA35A12A9750D4D
+ CA3418634C7994FBBE0D6F5E94A8863CA00BF8995F4CF142ABC78ED29192CDDD
+ 087392BA328A41A72E7AA399268EE7A87D38623E0F420A1ED9242C11BE9242CF
+ CEE13283439D6C9E1758A7F3FBFB5A01F19341998AE57C49AD63214B527C63F8
+ 4A376DB25EAFB573DB1DD4259A7F84CD1335D1C60C24599E548E217695AD99B8
+ CBF5042B5D489DC6641CF6B32A2440FB5EDB25FC3D99CF862DE74326DC542E11
+ 835B41137206C6B15941E1B0ACBB6E3EE429BA93C631823B60F8B735097AB54D
+ 3FCB034739FBBC6DD1C1E44E7E47D56CD735101A5B890E8A6CB7ED7DD569E94C
+ 015709A964FBDAE27070D2C4F9106C7C1FA256E5D1734C631DF75116332127E0
+ 802CE7D5C904B34AFC5F577F0BEEFBBBEDA178FB8AE098FC7E04CD9254E205EA
+ 703245F245E7E629471E5C59939982DC02ACA53719698F38545E7355F56920AA
+ 363246EE6C9FCE137E8224301FA6A715622530B09BFE5AFB7E9905ED9C608E07
+ 7D2048DFC073BD4526CD386F241D6CA8177FD38B42C4E025A6B3FD3766D5296C
+Gouraud quads red FF to green FF, w wide, 1 tall, dither off: low 16 bits of CRC:
+ 1921E30FC8A702F4E5561A727B3F1215A75BBE10D69D0BD22C514BFC0122BD14
+ 5372AF3F685FC75126FD070C8C043563A1BD6F96876F6F4D90BB10B799D2BD1D
+ 4CC0941B4D13FA3E79ED41925E27C61455F19926717ED2CFCB4675D645EA2416
+ D5CE1A70F8CEF3D6481306C30FC09BA14F48CF5568705D4EFAC6F8F044ADC7CC
+ 57AB7464E2F9780FA04957B7D2CD044271D7168E0E7EC1D02FC6394355021B57
+ 9A9B9644C179802039201C601BFC55D41DD0DF82DCA9B3A6EA87D9C9D8187007
+ AB135F52205F335FE8DEAEA5DB368ED8EEE92C1184A93CFE6214812C1C0380B6
+ 5FF7EDA6ED842C18673E12A88E434D99F1C4AC2C3012668C2987D4609BC36B3F
+ 265C81EDF3BB836E7CE2544B9EE7BFA6BE6BB80761E0C56B56487E5B3F54E61B
+ C6F111B010A414628F154A1FF73439B4AF09450C53E123E869EF961F71188522
+ 55DAEBDFB0DF983B713944B50E1E6CC76720CE445AC98AB356C9247B74DBE123
+ 7C51F45B2D91AF5AD82057578FAA0F27326C40A1789325FA925BE83A75545654
+ B6E24BE8F6B0665ECEC0E60E80E3D0C91F4999F1E4643C6CE4B91A26288FE8C6
+ FA7FEB34116B3D94A739D5ECE54F3DD15592D8ABC0BA9A1DC2F3D84D468D6C6C
+quad 16 wide u 0 to 255 crc BA3CF84D
+ v00 u 00 10 20 30 40 50 60 70 80 8F 9F AF BF CF DF EF
+quad 16 wide u 255 to 0 crc 9E5B7845
+ v00 u FF EF DF CF BF AF 9F 8F 80 70 60 50 40 30 20 10
+quad 16 wide u 0 to 16 crc 3460BB07
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+quad 16 wide u 0 to 15 crc FB04A7AC
+ v00 u 00 01 02 03 04 05 06 07 08 08 09 0A 0B 0C 0D 0E
+quad 2 wide u 0 to 255 crc 74F2C211
+ v00 u 00 80 !0000
+quad 1 wide 16 tall v 0 to 63 (column) crc 19EC8B25
+ v00 u 00
+ v04 u 00
+ v08 u 00
+ v0C u 00
+ v10 u 00
+ v14 u 00
+ v18 u 00
+ v1C u 00
+ v20 u 00
+ v23 u 00
+ v27 u 00
+ v2B u 00
+ v2F u 00
+ v33 u 00
+ v37 u 00
+ v3B u 00
+triangle 25h 0,0 uv0,0 16,0 uv255,10 0,16 uv7,60: crc C17CF0E6
+triangle 1 tall, u 10 to 26 over 16 crc 497ED9D6
+ v00 u 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/09STM.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/09STM.txt)
+
+```
+===== 09 STM GPU SEMI TRANSPARENT | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Semi-transparency (E1 bits 5-6; rendering-attributes.txt:57). Four pixels drawn over
+backgrounds 0000h 2108h 5EF7h 7FFFh with colour 808080h (5-bit 16).
+GPUSTAT 5606200F at start
+m0 tile 62h: 2108 318C 4E73 5EF7
+m0 flat quad 2Ah: 2108 318C 4E73 5EF7
+m0 gouraud quad 3Ah: 2108 318C 4E73 5EF7
+m0 line 42h: 2108 318C 4E73 5EF7
+m0 polyline 4Ah 0-1-3: 2108 39CE 4E73 5EF7
+m0 raw rect 67h texel C210h: A108 B18C CE73 DEF7
+m0 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m0 raw rect 67h texel 8000h: 8000 9084 AD6B BDEF
+m0 blended rect 66h colour 404040h texel C210h: 9084 A108 BDEF CE73
+m0 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m0 raw quad 2Fh u0..3 texel C210h: A108 B18C CE73 DEF7
+m1 tile 62h: 4210 6318 7FFF 7FFF
+m1 flat quad 2Ah: 4210 6318 7FFF 7FFF
+m1 gouraud quad 3Ah: 4210 6318 7FFF 7FFF
+m1 line 42h: 4210 6318 7FFF 7FFF
+m1 polyline 4Ah 0-1-3: 4210 7FFF 7FFF 7FFF
+m1 raw rect 67h texel C210h: C210 E318 FFFF FFFF
+m1 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m1 raw rect 67h texel 8000h: 8000 A108 DEF7 FFFF
+m1 blended rect 66h colour 404040h texel C210h: A108 C210 FFFF FFFF
+m1 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m1 raw quad 2Fh u0..3 texel C210h: C210 E318 FFFF FFFF
+m2 tile 62h: 0000 0000 1CE7 3DEF
+m2 flat quad 2Ah: 0000 0000 1CE7 3DEF
+m2 gouraud quad 3Ah: 0000 0000 1CE7 3DEF
+m2 line 42h: 0000 0000 1CE7 3DEF
+m2 polyline 4Ah 0-1-3: 0000 0000 1CE7 3DEF
+m2 raw rect 67h texel C210h: 8000 8000 9CE7 BDEF
+m2 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m2 raw rect 67h texel 8000h: 8000 A108 DEF7 FFFF
+m2 blended rect 66h colour 404040h texel C210h: 8000 8000 BDEF DEF7
+m2 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m2 raw quad 2Fh u0..3 texel C210h: 8000 8000 9CE7 BDEF
+m3 tile 62h: 1084 318C 6F7B 7FFF
+m3 flat quad 2Ah: 1084 318C 6F7B 7FFF
+m3 gouraud quad 3Ah: 1084 318C 6F7B 7FFF
+m3 line 42h: 1084 318C 6F7B 7FFF
+m3 polyline 4Ah 0-1-3: 1084 4210 6F7B 7FFF
+m3 raw rect 67h texel C210h: 9084 B18C EF7B FFFF
+m3 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m3 raw rect 67h texel 8000h: 8000 A108 DEF7 FFFF
+m3 blended rect 66h colour 404040h texel C210h: 8842 A94A E739 FFFF
+m3 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m3 raw quad 2Fh u0..3 texel C210h: 9084 B18C EF7B FFFF
+Grids against psx-spx's 5-bit formula (gpu.txt:1452-1464), F = colour/8:
+mode 0 tile: crc F5CE64DB, 0 of 8192 differ from the formula
+mode 1 tile: crc 6AD72B96, 0 of 8192 differ from the formula
+mode 2 tile: crc CC580881, 0 of 8192 differ from the formula
+mode 3 tile: crc C13FB0EA, 0 of 8192 differ from the formula
+mode 0 gouraud quad: crc F5CE64DB, 0 of 8192 differ from the formula
+mode 1 gouraud quad: crc 6AD72B96, 0 of 8192 differ from the formula
+mode 2 gouraud quad: crc CC580881, 0 of 8192 differ from the formula
+mode 3 gouraud quad: crc C13FB0EA, 0 of 8192 differ from the formula
+mode 0 raw texel 8000h|gray t: crc 371605E5, 0 of 1024 differ from the formula
+mode 1 raw texel 8000h|gray t: crc 3785FE79, 0 of 1024 differ from the formula
+mode 2 raw texel 8000h|gray t: crc 2E0973ED, 0 of 1024 differ from the formula
+mode 3 raw texel 8000h|gray t: crc 12573AC5, 0 of 1024 differ from the formula
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/10DTH.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/10DTH.txt)
+
+```
+===== 10 DTH GPU DITHER MODULATE | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Dithering (E1 bit 9; psx-spx gpu.txt:1431-1443) and texture modulation. 4x4 blocks as
+red 5-bit in base 32, rows split by '/'.
+GPUSTAT 5606200F at start
+gouraud quad 00 dither on: 0000/0000/0000/0000
+gouraud quad 01 dither on: 0000/0000/0000/0000
+gouraud quad 03 dither on: 0000/0000/0000/0000
+gouraud quad 04 dither on: 0000/0000/0000/0000
+gouraud quad 05 dither on: 0000/0010/0000/1000
+gouraud quad 07 dither on: 0001/1010/0100/1010
+gouraud quad 08 dither on: 0101/1010/0101/1010
+gouraud quad 0C dither on: 1111/1111/1111/1111
+gouraud quad 0E dither on: 1111/2121/1111/2121
+gouraud quad 10 dither on: 1212/2121/1212/2121
+gouraud quad 7C dither on: ffff/ffff/ffff/ffff
+gouraud quad 80 dither on: fgfg/gfgf/fgfg/gfgf
+gouraud quad F7 dither on: uuuv/vuvu/uvuu/vuvu
+gouraud quad F8 dither on: uvuv/vuvu/uvuv/vuvu
+gouraud quad FB dither on: uvvv/vvvv/vvuv/vvvv
+gouraud quad FC dither on: vvvv/vvvv/vvvv/vvvv
+gouraud quad FF dither on: vvvv/vvvv/vvvv/vvvv
+gouraud quad 07 dither off: 0000/0000/0000/0000
+gouraud quad FF dither off: vvvv/vvvv/vvvv/vvvv
+Which commands dither (dither on), colour or texel 0Eh-ish:
+flat quad 28h 0E: 1111/1111/1111/1111
+tile 60h 0E: 1111/1111/1111/1111
+flat lines 40h 0E: 1111/2121/1111/2121
+gouraud quad 38h 0E: 1111/2121/1111/2121
+blended rects 64h 4x1 808080 texel 2: 2222/2222/2222/2222
+blended quad 2Ch 808080 texel 2: 1212/2121/1212/2121
+raw quad 2Dh texel 2: 2222/2222/2222/2222
+blended quad 2Ch 707070 texel 2: 1111/2121/1111/2121
+gouraud textured 3Ch 808080 texel 2: 1212/2121/1212/2121
+Dither position (gouraud 0E, dither on):
+drawn at local 1,0, read from 0,0: 01111/01212/01111/01212
+drawn at 0,0 with offset +1, read from 0,0: 01111/01212/01111/01212
+Dither and blending (gouraud 44h, dither on, background red 0Ah):
+semi mode 0 crc CA1BB721
+ 9999
+ 9999
+ 9999
+ 9999
+semi mode 1 crc 645896F4
+ iiii
+ iiii
+ iiii
+ iiii
+semi mode 2 crc 6E8C946E
+ 2222
+ 2222
+ 2222
+ 2222
+semi mode 3 crc F36DD766
+ cccc
+ cccc
+ cccc
+ cccc
+Modulation grids, dither off, rows colour c (r=g=b), columns texel gray t = 0..31:
+rect 64h: crc 153730D8, 0 of 8192 differ from min(31, t*c/128)
+quad 2Ch: crc 153730D8, 0 of 8192 differ from min(31, t*c/128)
+gouraud quad 3Ch: crc 153730D8, 0 of 8192 differ from min(31, t*c/128)
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/11MSK.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/11MSK.txt)
+
+```
+===== 11 MSK GPU MASK BIT | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Mask bit (E6h; rendering-attributes.txt:123-137). Background 8421h/0421h alternating.
+GPUSTAT 5606200F at start
+write 1234h, read 1234
+set mask, write 0000h, read 8000
+8000h there, check mask, write 1234h, read 8000
+8123h then 0456h, read 0456
+set mask 0000h, then no mask 0456h, read 0456
+E6 0 tile: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 quad: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 line: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 raw sprite texel 45xx: 4500 4501 4502 4503 4504 4505 4506 4507
+E6 0 fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 copy 80h from 7FFFh: 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF
+E6 0 A0h write 1234h: 1234 1234 1234 1234 1234 1234 1234 1234
+check tile: 8421 001F 8421 001F 8421 001F 8421 001F
+check quad: 8421 001F 8421 001F 8421 001F 8421 001F
+check line: 8421 001F 8421 001F 8421 001F 8421 001F
+check raw sprite texel 45xx: 8421 4501 8421 4503 8421 4505 8421 4507
+check fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+check copy 80h from 7FFFh: 8421 7FFF 8421 7FFF 8421 7FFF 8421 7FFF
+check A0h write 1234h: 8421 1234 8421 1234 8421 1234 8421 1234
+set tile: 801F 801F 801F 801F 801F 801F 801F 801F
+set quad: 801F 801F 801F 801F 801F 801F 801F 801F
+set line: 801F 801F 801F 801F 801F 801F 801F 801F
+set raw sprite texel 45xx: C500 C501 C502 C503 C504 C505 C506 C507
+set fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+set copy 80h from 7FFFh: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
+set A0h write 1234h: 9234 9234 9234 9234 9234 9234 9234 9234
+set+check tile: 8421 801F 8421 801F 8421 801F 8421 801F
+set+check quad: 8421 801F 8421 801F 8421 801F 8421 801F
+set+check line: 8421 801F 8421 801F 8421 801F 8421 801F
+set+check raw sprite texel 45xx: 8421 C501 8421 C503 8421 C505 8421 C507
+set+check fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+set+check copy 80h from 7FFFh: 8421 FFFF 8421 FFFF 8421 FFFF 8421 FFFF
+set+check A0h write 1234h: 8421 9234 8421 9234 8421 9234 8421 9234
+E6 0, tile B+F 080808h over 8421h/0421h: 0842 0842 0842 0842 0842 0842 0842 0842
+E6 0, raw sprite texels C210h x4, 4210h x4: C210 C210 C210 C210 4210 4210 4210 4210
+set, semi raw sprite C210h x4 4210h x4 (mode 0): A108 A108 A108 A108 C210 C210 C210 C210
+GPUSTAT bits 11-12 after E6h FFFFFFh: 3
+GPUSTAT bits 11-12 after E6h FFFFFCh: 0
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/12FIL.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/12FIL.txt)
+
+```
+===== 12 FIL GPU FILL | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Fill 02h (memory-transfer-commands.txt:12-22, :61-70): row y 400 from x 496, 64 wide.
+GPUSTAT 5606200F at start
+x 200h w 16 ................################................................
+x 205h w 16 ................################................................
+x 20Fh w 16 ................################................................
+x 1FFh w 16 ################................................................
+x 200h w 1 ................################................................
+x 200h w 15 ................################................................
+x 200h w 17 ................################################................
+x 200h w 0 ................................................................
+x 200h w 400h ................................................................
+x 200h w 410h ................################................................
+x 200h w 8010h ................################................................
+x FE00h w 16 ................################................................
+x 600h w 16 ................################................................
+x 200h w 16 h 0 ................................................................
+x 200h w 16 h 200h ................................................................
+x 200h w 16 h 201h ................################................................
+x 200h w 3F1h: 1024 of 1024 in the row filled
+x 200h w 3FFh: 1024 of 1024 in the row filled
+x 3F0h w 30h: 16 of x 1008..1023, 32 of x 0..31 (################################)
+y 510 h 4 at x 640: 32 of rows 510-511, 32 of rows 0-2 (32 each, rows 0-1 expected)
+y 400 with bit 9 set: 16 of 16 at y 400
+Fill colour to 15-bit, dither on (E1 bit 9) and mask set:
+ 070707: 0000 0000 0000 0000 / 0000 0000
+ 080808: 0421 0421 0421 0421 / 0421 0421
+ 0F0F0F: 0421 0421 0421 0421 / 0421 0421
+ 101010: 0842 0842 0842 0842 / 0842 0842
+ FFFFFF: 7FFF 7FFF 7FFF 7FFF / 7FFF 7FFF
+ 0000F8: 001F 001F 001F 001F / 001F 001F
+ F80000: 7C00 7C00 7C00 7C00 / 7C00 7C00
+ 00FF00: 03E0 03E0 03E0 03E0 / 03E0 03E0
+check mask over 8000h: 7FFF
+area 0..15 x 256..271 and offset 100,50: 16 of 16 at 200h,400
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/13CLC.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/13CLC.txt)
+
+[gpuraster_safe/14CPY.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/14CPY.txt)
+
+```
+===== 14 CPY GPU VRAM COPY | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+VRAM to VRAM copy 80h (memory-transfer-commands.txt:27-37, :72-86). ps1-tests
+gpu/vram-to-vram-overlap: a block of size s (pixel 4000h+64y+2x) copied by dx -3..3,
+dy -1..1; CRC of the (s+8)^2 cell. Order: dy -1 (dx -3..3), dy 0, dy 1.
+GPUSTAT 5606200F at start
+size 2:
+ 8AFE5C49 3EA6B737 181AF0F7 6A2E407A AEF0BD4F 7C9D14A9 30A5B25C
+ B11FF251 D5E868EB 50F985B4 9452635D A3E148C8 702B79F2 46C6795C
+ E082917B DF113383 19AABFCE 9BF578AD BC151CC8 9DB43342 8D17532D
+size 8:
+ 2B035764 592EB9B8 77A20015 3A462060 52174C07 562278C2 2E80011F
+ 76BDFC2A ED9DE864 4011ACC9 B87D6B14 910B29F1 41296584 38BC626F
+ 54587E02 C32831B5 C85880D9 77B525EB 415EE80A DF8C182D C8BFB7A1
+size 15:
+ 6C1F1758 805B376B 10B8F0E5 F7B3CC28 57446D25 892C44DF 4B7D7FB6
+ 7C68D67B F20A24D9 B604F2E4 D01EA284 05C5D018 B51BE940 AD1A9642
+ 6ED0E8E6 DDCBE10B 2799E886 185DD36C A1180B78 7E94D206 66AC4E47
+size 16:
+ A5041F63 28DA841B FE9BD7DF DA218062 10DF2327 F51DC80C BE8560A4
+ ECD61E2D 2962169A 60728C2F E3A58EBF 42AAA2D1 3424D83B 5B77CF84
+ 1C2ED0F7 CE0C2F69 19135606 78C940E6 FC128DBB 5FCD1EA3 7D2C911C
+size 16 x+1:
+ 139F1927 53B1EE87 7144C68C 5ED70784 3B3585E8 D9AD0B76 AC4487B2
+ 5EDBFC92 B65A769A B71A3493 EB6B3615 EFE552F8 BC7D244B BF28E0C3
+ 61123106 740D903A 68652163 8ABFDB58 B6E50E00 23E5B51D D9E81195
+size 16 y+1:
+ 5D23C87B 3A38F41E 8A72B86B A0086299 716C9217 AA5659BB FEECFEA7
+ B050533D C31A9BE3 9119527E 86B35055 31DD76A3 3C868E4E EFFD64AD
+ AF5F0309 46438EBA DB4067FF 2734DBF4 49B43C37 5C369B7D 2197C302
+size 16 xy+1:
+ B5B2B10A CFC29830 A42654B1 8F6DE6EC 78FD8140 C4916694 5F0C508D
+ CC67BDBA 1B92B4F0 5B68F3A0 501009B0 FC298CD7 6DB0F07D 1420D117
+ 7F7C8A98 3DF737D4 187A4370 FB0B8B85 14192340 F6566F7D 8CCF87D8
+Wide rows copied one pixel right (pixel 4000h+x), against a copy made through a buffer:
+ width 100 right: 0 differ; left: 0 differ
+ width 127 right: 0 differ; left: 0 differ
+ width 128 right: 0 differ; left: 0 differ
+ width 129 right: 1 differ, first at 129 reads 407F; left: 0 differ
+ width 200 right: 1 differ, first at 129 reads 407F; left: 0 differ
+ width 300 right: 2 differ, first at 129 reads 407F; left: 0 differ
+width 0, height 1: 1024 of 1024 copied
+width 400h, height 1: 1024 of 1024 copied
+width 401h, height 1: 1 of the first 16 copied
+source x 1016, 16 wide (pixel 4000h+x) crc 588D96AE
+ 43F8 43F9 43FA 43FB 43FC 43FD 43FE 43FF 4000 4001 4002 4003 4004 4005 4006 4007
+destination x 1016, 16 wide: x 0..7 crc CA4D44FF
+ 4008 4009 400A 400B 400C 400D 400E 400F
+source x 404h (4), destination y 404+512 crc C131685B
+ 4004 4005 4006 4007
+set mask, copy 4000h.. crc 0099B424
+ C000 C001 C002 C003
+check mask, 8000h at the 2nd, copy crc 17AD4D9A
+ 4000 8000 4002 4003
+source = destination crc 4DB8ECF5
+ 1111 1111 1111 1111
+A0h 3x1 with words 00020001h 00040003h crc 8BD98464
+ 0001 0002 0003 2222 2222
+C0h 3x1: words 00020001 22220003; GPUSTAT then D6062000
+A0h at x 1022, 4 wide: x 1020..1023 crc EA2AD7C9
+ 0000 0000 3333 3333
+ x 0..3 crc 410BF4E7
+ 4444 4444 0000 0000
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster_safe/15CLP.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/15CLP.txt)
+
+```
+===== 15 CLP GPU AREA OFFSET | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 1F801DAA
+Drawing area (E3h/E4h) and offset (E5h), rendering-attributes.txt:94-121.
+GPUSTAT 5606200F at start
+GP1(10h) after E2-E5 FFFFFFh: index 2 000FFFFF 3 000FFFFF 4 000FFFFF 5 003FFFFF
+after E3 x 155h y 2AAh, E5 2AAAAAh: index 3 003AA955 5 002AAAAA
+index 0 002AAAAA 1 002AAAAA 6 002AAAAA 9 002AAAAA 10h 002AAAAA 17h 00000002
+Counts, B+F red 8, window local 0,0 14x12; area local 2..9 x 2..7:
+quad 0,0-12,10 crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+tile 12x10 crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+line 0,0-13,11 crc C079EC85
+ ..............
+ ..............
+ ..1...........
+ ...11.........
+ .....1........
+ ......1.......
+ .......1......
+ ........1.....
+ ..............
+ ..............
+ ..............
+ ..............
+raw sprite 65h 12x10 ('#') crc A3FD9360
+ ..............
+ ..............
+ ..########....
+ ..########....
+ ..########....
+ ..########....
+ ..########....
+ ..########....
+ ..............
+ ..............
+ ..............
+ ..............
+area one pixel 3,3: tile crc 2F6A7337
+ ..............
+ ..............
+ ..............
+ ...1..........
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+area x1 9 > x2 3: tile crc 2D28A891
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+area y1 7 > y2 2: tile crc 2D28A891
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+offset +2,+2: quad crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+offset -2,-2: quad crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+tile 1016..1031: x 1008..1023 8 drawn; x 0..7 0 drawn
+Area y 812..827 (bit 9), tile at 256,812 16x16; rows 300..315 then 812-512:
+ 256 of 256 drawn at rows 300..315; GP1(10h) index 3 001CB100
+ same area, tile at y 300: 0 of 256
+Waits that ran out: 0
+Done.
+```
+
+### 27 September 2026 (gpuraster_safe on 5501a-card-g3)
+
+Output files: [00RUN.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/00RUN.txt) · [01TRI.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/01TRI.txt) · [02QDL.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/02QDL.txt) · [03LIN.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/03LIN.txt) · [04LNS.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/04LNS.txt) · [05REC.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/05REC.txt) · [06TWN.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/06TWN.txt) · [07TPG.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/07TPG.txt) · [08UVI.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/08UVI.txt) · [09STM.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/09STM.txt) · [10DTH.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/10DTH.txt) · [11MSK.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/11MSK.txt) · [12FIL.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/12FIL.txt) · [13CLC.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/13CLC.txt) · [14CPY.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/14CPY.txt) · [15CLP.txt](/tests/raw/20260927T0000Z-5501a-card-g3/gpuraster_safe/15CLP.txt).
+
+### 27 September 2026 (gpuraster_safe on 5501a-card-g)
+
+Output files: [00RUN.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/00RUN.txt) · [01TRI.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/01TRI.txt) · [02QDL.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/02QDL.txt) · [03LIN.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/03LIN.txt) · [04LNS.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/04LNS.txt) · [05REC.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/05REC.txt) · [06TWN.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/06TWN.txt) · [07TPG.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/07TPG.txt) · [08UVI.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/08UVI.txt) · [09STM.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/09STM.txt) · [10DTH.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/10DTH.txt) · [11MSK.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/11MSK.txt) · [12FIL.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/12FIL.txt) · [13CLC.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/13CLC.txt) · [14CPY.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/14CPY.txt) · [15CLP.txt](/tests/raw/20260927T0000Z-5501a-card-g/gpuraster_safe/15CLP.txt).
+
+### 27 September 2026 (gpuraster on 5501a-card-b)
+
+[gpuraster/s013/00RUN.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/00RUN.txt)
+
+```
+===== 00 RUN | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+16 tests
+A chain program, linked at 80100000
+Saved on the card in slot 2, from image 1
+COP0 at start: BPC 00000000 BDA 00000000 TAR BFC02BAC DCIC 00000000 BadVaddr 00000480 BDAM 00000000
+BPCM 00000000 SR 40000000 Cause 00000020 EPC 8002644C PRId 00000002
+```
+
+[gpuraster/s013/01TRI.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/01TRI.txt)
+
+```
+===== 01 TRI GPU TRI FILL RULES | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Triangles, flat, B+F with red 8: each digit is how many times a pixel was drawn.
+Window from local -1,-1, 15x15.
+GPUSTAT 5606200F at start
+GP1(10h) index 7 (GPU type): 00000002, index 8: 00000000
+right angle 0,0 10,0 0,10 crc 8DD3BDDA
+ ...............
+ .1111111111....
+ .111111111.....
+ .11111111......
+ .1111111.......
+ .111111........
+ .11111.........
+ .1111..........
+ .111...........
+ .11............
+ .1.............
+ ...............
+ ...............
+ ...............
+ ...............
+same, other winding 0,0 0,10 10,0 crc 8DD3BDDA
+ ...............
+ .1111111111....
+ .111111111.....
+ .11111111......
+ .1111111.......
+ .111111........
+ .11111.........
+ .1111..........
+ .111...........
+ .11............
+ .1.............
+ ...............
+ ...............
+ ...............
+ ...............
+right angle at 10,10: 10,0 10,10 0,10 crc 61B0F2CF
+ ...............
+ ...............
+ ..........1....
+ .........11....
+ ........111....
+ .......1111....
+ ......11111....
+ .....111111....
+ ....1111111....
+ ...11111111....
+ ..111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+square, two tris, diagonal 10,0-0,10 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+square, two tris, diagonal 0,0-10,10 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+fan of four about 5,5 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+shallow shared edge 12,4-0,12 crc 929F6BD6
+ ...............
+ ...............
+ .111...........
+ .111111........
+ .111111111.....
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ ...............
+ ...............
+steep shared edge 4,12-12,0 crc 8DD49EA8
+ ...............
+ .111111111111..
+ ..11111111111..
+ ..11111111111..
+ ..11111111111..
+ ...1111111111..
+ ...1111111111..
+ ...1111111111..
+ ....111111111..
+ ....111111111..
+ ....111111111..
+ .....11111111..
+ .....11111111..
+ ...............
+ ...............
+flat top 1,1 11,1 6,11 crc F3E4E953
+ ...............
+ ...............
+ ..1111111111...
+ ...111111111...
+ ...11111111....
+ ....1111111....
+ ....111111.....
+ .....11111.....
+ .....1111......
+ ......111......
+ ......11.......
+ .......1.......
+ ...............
+ ...............
+ ...............
+flat bottom 6,1 1,11 11,11 crc 760D9EEE
+ ...............
+ ...............
+ ...............
+ .......1.......
+ ......11.......
+ ......111......
+ .....1111......
+ .....11111.....
+ ....111111.....
+ ....1111111....
+ ...11111111....
+ ...111111111...
+ ...............
+ ...............
+ ...............
+general 1,2 11,5 4,11 crc 09BAF479
+ ...............
+ ...............
+ ...............
+ ...............
+ ...111.........
+ ...111111......
+ ...111111111...
+ ....1111111....
+ ....111111.....
+ ....11111......
+ .....111.......
+ .....11........
+ ...............
+ ...............
+ ...............
+general reversed 4,11 11,5 1,2 crc 09BAF479
+ ...............
+ ...............
+ ...............
+ ...............
+ ...111.........
+ ...111111......
+ ...111111111...
+ ....1111111....
+ ....111111.....
+ ....11111......
+ .....111.......
+ .....11........
+ ...............
+ ...............
+ ...............
+vertical left edge 0,0 0,10 10,5 crc DA2C2C3B
+ ...............
+ ...............
+ .11............
+ .1111..........
+ .111111........
+ .11111111......
+ .1111111111....
+ .11111111......
+ .111111........
+ .1111..........
+ .11............
+ ...............
+ ...............
+ ...............
+ ...............
+vertical right edge 10,0 10,10 0,5 crc 941E212E
+ ...............
+ ...............
+ .........11....
+ .......1111....
+ .....111111....
+ ...11111111....
+ .1111111111....
+ ...11111111....
+ .....111111....
+ .......1111....
+ .........11....
+ ...............
+ ...............
+ ...............
+ ...............
+sliver 0,0 12,1 12,2 crc EEFDFA63
+ ...............
+ ...............
+ .......111111..
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+sliver 0,0 1,12 2,12 crc 1BA1B2CA
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ..1............
+ ..1............
+ ..1............
+ ..1............
+ ..1............
+ ...............
+ ...............
+tiny: 0,0 1,0 0,1 / 3,0 5,0 3,2 / 7,0 8,1 7,1 / 9,5 11,5 10,7 crc D85CFC26
+ ...............
+ .1..11.........
+ ....1..........
+ ...............
+ ...............
+ ...............
+ ..........11...
+ ...........1...
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+degenerate: diagonal, row 12, column 12, point 6,2 crc 6E59FDE2
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/02QDL.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/02QDL.txt)
+
+```
+===== 02 QDL GPU QUAD AND LIMITS | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Quads (count maps as in TRI) and the size and coordinate limits.
+GPUSTAT 5606200F at start
+quad Z order 0,0 10,0 0,10 10,10 crc 823AB2F7
+ ...............
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ .1111111111....
+ ...............
+ ...............
+ ...............
+ ...............
+quad ring order 0,0 10,0 10,10 0,10 crc EB75C572
+ ...............
+ .1111111111....
+ ..111111112....
+ ...11111122....
+ ....1111222....
+ .....112222....
+ ......22222....
+ .....112222....
+ ....1111222....
+ ...11111122....
+ ..111111112....
+ ...............
+ ...............
+ ...............
+ ...............
+quad concave 0,0 10,0 0,10 3,3 crc 56B0BD95
+ ...............
+ .1111111111....
+ .111111112.....
+ .11111122......
+ .1112222.......
+ .111222........
+ .11122.........
+ .1122..........
+ .112...........
+ .12............
+ .1.............
+ ...............
+ ...............
+ ...............
+ ...............
+quad bowtie 0,0 10,10 0,10 10,0 crc 18C4943D
+ ...............
+ ...............
+ .1........1....
+ .11......11....
+ .111....111....
+ .1111..1111....
+ .1111111111....
+ .1111221111....
+ .1112222111....
+ .1122222211....
+ .1222222221....
+ ...............
+ ...............
+ ...............
+ ...............
+two quads sharing x=6 crc 0A5A6AC6
+ ...............
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ .111111111111..
+ ...............
+ ...............
+ ...............
+ ...............
+quad v1=v2 0,0 0,0 0,10 10,10 crc 98839567
+ ...............
+ ...............
+ .1.............
+ .11............
+ .111...........
+ .1111..........
+ .11111.........
+ .111111........
+ .1111111.......
+ .11111111......
+ .111111111.....
+ ...............
+ ...............
+ ...............
+ ...............
+quad 2x2 at 0,0 and 1x1 at 5,5 crc 0FF5BCC3
+ ...............
+ .11............
+ .11............
+ ...............
+ ...............
+ ...............
+ ......1........
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+ ...............
+Size limits: pixels drawn in a 16x16 box inside the triangle
+width 1022: 256 of 256
+width 1023: 256 of 256
+width 1024: 0 of 256
+height 510: 256 of 256
+height 511: 256 of 256
+height 512: 0 of 256
+1023 x 511: 256 of 256
+1024 x 511: 0 of 256
+1023 x 512: 0 of 256
+quad, 2-3-4 is 1032 wide: 136 of 256
+quad, 1-2-3 is 1032 wide: 120 of 256
+quad 1060 wide, each triangle under 1023: 256 of 256
+Offset plus vertex past 11 bits:
+tri at -208 with offset -1024, box 816..847: 272 of 512
+rect at -208 with offset -1024: 512 of 512
+line -208,300 to -177,315 with offset -1024: 32 of 512
+tri 400..520 with offset 512 (one vertex wraps), box 912..927: 247 of 256
+Vertex upper bits, triangle 0,0 10,0 0,10 against the clean words:
+clean: crc 8848BC78, 55 drawn
+x bits 11-15 set: crc 8848BC78, 55 drawn, same
+x bit 11 set: crc 8848BC78, 55 drawn, same
+y bits 11-15 set: crc 8848BC78, 55 drawn, same
+x -4 as FFFCh: crc 4AEAB963, 55 drawn
+x -4 as 07FCh: crc 4AEAB963, 55 drawn, same
+x 3FCh (+1020): crc BA52B49D, 7 drawn
+Gouraud triangle clipped by the area, same pixels either way?
+area from x 0: crc BDDE35AC; area from x -16: crc BDDE35AC; 256 of 256 equal
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/03LIN.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/03LIN.txt)
+
+```
+===== 03 LIN GPU LINE OCTANTS | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Lines, GP0(40h), white. For each line, along its major axis, the minor coordinate
+drawn at each step in base 64 ('.' none, '*' two or more). f: centre to end, r: end
+to centre. Window 17x17, centre 8,8.
+GPUSTAT 5606200F at start
+8,0 f ........888888888 r ........888888888
+8,2 f ........889999aaa r ........889999aaa
+8,4 f ........899aabbcc r ........899aabbcc
+8,6 f ........89aabcdde r ........89aabcdde
+8,8 f ........89abcdefg r ........89abcdefg
+6,8 f ........899abccde r ........899abccde
+4,8 f ........8899aabbc r ........8899aabbc
+2,8 f ........8889999aa r ........8889999aa
+0,8 f ........888888888 r ........888888888
+-2,8 f ........887777666 r ........887777666
+-4,8 f ........877665544 r ........877665544
+-6,8 f ........876654332 r ........876654332
+-8,8 f gfedcba98........ r gfedcba98........
+-8,6 f edccba998........ r edccba998........
+-8,4 f cbbaa9988........ r cbbaa9988........
+-8,2 f aa9999888........ r aa9999888........
+-8,0 f 888888888........ r 888888888........
+-8,-2 f 667777888........ r 667777888........
+-8,-4 f 455667788........ r 455667788........
+-8,-6 f 234456778........ r 234456778........
+-8,-8 f 012345678........ r 012345678........
+-6,-8 f 233456678........ r 233456678........
+-4,-8 f 445566778........ r 445566778........
+-2,-8 f 666777788........ r 666777788........
+0,-8 f 888888888........ r 888888888........
+2,-8 f aa9999888........ r aa9999888........
+4,-8 f cbbaa9988........ r cbbaa9988........
+6,-8 f edccba998........ r edccba998........
+8,-8 f ........876543210 r ........876543210
+8,-6 f ........876654332 r ........876654332
+8,-4 f ........877665544 r ........877665544
+8,-2 f ........887777666 r ........887777666
+5,2 f ........8899aa... r ........8899aa...
+5,3 f ........899aab... r ........899aab...
+7,2 f ........889999aa. r ........889999aa.
+7,3 f ........8899aabb. r ........8899aabb.
+3,1 f ........8899..... r ........8899.....
+1,3 f ........8899..... r ........8899.....
+2,5 f ........8899aa... r ........8899aa...
+3,5 f ........899aab... r ........899aab...
+1,0 f ........88....... r ........88.......
+0,1 f ........88....... r ........88.......
+1,1 f ........89....... r ........89.......
+0,0 f ........8........ r ........8........
+3,2 f ........899a..... r ........899a.....
+-3,2 f .....a998........ r .....a998........
+3,-2 f ........8776..... r ........8776.....
+-3,-2 f .....6778........ r .....6778........
+Long lines in a 41x41 window: 0,0 to 40,k (x major) and 0,0 to k,40 (y major)
+40,1 f 00000000000000000000111111111111111111111
+ r 00000000000000000000111111111111111111111
+1,40 f 00000000000000000000011111111111111111111
+ r 00000000000000000000011111111111111111111
+40,3 f 00000001111111111111222222222222223333333
+ r 00000001111111111111222222222222223333333
+3,40 f 00000001111111111111122222222222223333333
+ r 00000001111111111111122222222222223333333
+40,7 f 00011111122222233333444444555555666666777
+ r 00011111122222233333444444555555666666777
+7,40 f 00011111122222233333344444555555666666777
+ r 00011111122222233333344444555555666666777
+40,13 f 001112223334445556667777888999aaabbbcccdd
+ r 001112223334445556667777888999aaabbbcccdd
+13,40 f 001112223334445556666777888999aaabbbcccdd
+ r 001112223334445556666777888999aaabbbcccdd
+40,20 f 0112233445566778899aabbccddeeffgghhiijjkk
+ r 0112233445566778899aabbccddeeffgghhiijjkk
+20,40 f 00112233445566778899aabbccddeeffgghhiijjk
+ r 00112233445566778899aabbccddeeffgghhiijjk
+40,27 f 011233455677899abbcdeefgghiijkklmmnoopqqr
+ r 011233455677899abbcdeefgghiijkklmmnoopqqr
+27,40 f 011233455677899abbcddefgghiijkklmmnoopqqr
+ r 011233455677899abbcddefgghiijkklmmnoopqqr
+40,39 f 0123456789abcdefghijkklmnopqrstuvwxyzABCD
+ r 0123456789abcdefghijkklmnopqrstuvwxyzABCD
+39,40 f 0123456789abcdefghijjklmnopqrstuvwxyzABCD
+ r 0123456789abcdefghijjklmnopqrstuvwxyzABCD
+0,40 to 40,27 EEDDDCCCBBBAAAzzzyyyxxxxwwwvvvuuutttsssrr
+ back EEDDDCCCBBBAAAzzzyyyxxxxwwwvvvuuutttsssrr
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/04LNS.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/04LNS.txt)
+
+```
+===== 04 LNS GPU LINE SHADE POLY | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Line colours (red channel, 5-bit, base 32), polylines, limits.
+GPUSTAT 5606200F at start
+gouraud 0,0 red 00 to 15,0 red FF, dither off crc B15EA965
+ 02468acehjlnprtv
+same, 15,0 to 0,0 crc B15EA965
+ 02468acehjlnprtv
+gouraud 0,0 to 31,0, red 00 to FF crc F950F6E9
+ 0123456789abcdefghijklmnopqrstuv
+gouraud 0,0 to 7,0, red FF to 00 crc 5EEADFF7
+ vrmid940
+gouraud 0,0 to 0,15 red 00 to FF (a column) crc B15EA965
+ 0
+ 2
+ 4
+ 6
+ 8
+ a
+ c
+ e
+ h
+ j
+ l
+ n
+ p
+ r
+ t
+ v
+gouraud 0,0 to 15,5, red 00 to FF crc C97FCAEE
+ 0200000000000000
+ 0046800000000000
+ 00000ace00000000
+ 00000000hjl00000
+ 00000000000npr00
+ 00000000000000tv
+dither on: 4 gouraud rows red 00 to FF crc 27EF39A3
+ 02368acfgjknprtv
+ 01468adehilnpruv
+ 02368acegjknprtv
+ 02468adehjlnpruv
+dither on: 4 flat rows red 44h crc F2FDA446
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+dither on: 4 flat rows red 44h, right to left crc F2FDA446
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+ 8888888888888888
+polyline square 0,0 10,0 10,10 0,10 0,0, counts crc A278982D
+ ..............
+ .21111111112..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .1.........1..
+ .21111111112..
+ ..............
+ ..............
+polyline 0,0 5,0 5,0 5,5 (repeated vertex) crc 3EA60432
+ ..............
+ .111113.......
+ ......1.......
+ ......1.......
+ ......1.......
+ ......1.......
+ ......1.......
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+two single lines 0,0-10,0 and 10,0-10,10 crc 26DE41CB
+ ..............
+ .11111111112..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ...........1..
+ ..............
+ ..............
+polyline of one segment 0,0 10,3 crc 87F35582
+ ..............
+ .11...........
+ ...111........
+ ......1111....
+ ..........11..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+line 5,5 to 5,5 crc 02362D27
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ......1.......
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+gouraud polyline red, green, blue, red around 0,0 10,0 10,10 0,10: crc 5805F5CA, 31 drawn
+Line size limits (rendering-attributes.txt:9-13), box 256..271 x 300..315:
+across 1022: 16 drawn in box
+across 1023: 16 drawn in box
+across 1024: 0 drawn in box
+across 1023, reversed: 16 drawn in box
+across 1024, reversed: 0 drawn in box
+down 510: 16 drawn in box
+down 511: 16 drawn in box
+down 512: 0 drawn in box
+1023 x 511: 16 drawn in box
+1023 x 512: 0 drawn in box
+line -10,0 to 30,7 clipped at x 0: crc 36C5DA42; unclipped: crc 36C5DA42; first 2 rows 64 of 64 equal
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/05REC.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/05REC.txt)
+
+```
+===== 05 REC GPU RECT SPRITE FLIP | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Rectangles: sizes as pixels drawn and their extent (window from local -2,-2, 20x20),
+then raw textured sprites from the 15-bit page (texel 4000h|v<<8|u).
+GPUSTAT 5606200F at start
+tile 0x3: none drawn
+tile 3x0: none drawn
+tile 1x1: 1 drawn, x 2..2, y 2..2
+tile 2x3: 6 drawn, x 2..3, y 2..4
+tile 1024x2 (size field 400h): none drawn
+tile 1025x2: 2 drawn, x 2..2, y 2..3
+tile 1039x2: 30 drawn, x 2..16, y 2..3
+tile 2x512 (size field 200h): none drawn
+tile 2x513: 2 drawn, x 2..3, y 2..2
+tile 2x1024: none drawn
+tile 2x1027: 6 drawn, x 2..3, y 2..4
+tile 1x1 command 6Ah: 1 drawn, x 5..5, y 5..5
+tile 8x8 command 72h: 64 drawn, x 5..12, y 5..12
+tile 16x16 command 7Ah: 256 drawn, x 2..17, y 2..17
+tile 6x6 at -3,-3: 25 drawn, x 0..4, y 0..4
+tile 4x4 at x 0805h (bit 11): 16 drawn, x 7..10, y 2..5
+tile 4x4 at y F805h: 16 drawn, x 2..5, y 7..10
+tile 16x16 in area local 2..9: 64 drawn, x 4..11, y 4..11
+8x8 u0 v0 crc FF2AA940
+ v00 u 00 01 02 03 04 05 06 07
+ v01 u 00 01 02 03 04 05 06 07
+ v02 u 00 01 02 03 04 05 06 07
+ v03 u 00 01 02 03 04 05 06 07
+ v04 u 00 01 02 03 04 05 06 07
+ v05 u 00 01 02 03 04 05 06 07
+ v06 u 00 01 02 03 04 05 06 07
+ v07 u 00 01 02 03 04 05 06 07
+8x8 u0 v0 x-flip crc A11DE670
+ v00 u 01 00 FF FE FD FC FB FA
+ v01 u 01 00 FF FE FD FC FB FA
+ v02 u 01 00 FF FE FD FC FB FA
+ v03 u 01 00 FF FE FD FC FB FA
+ v04 u 01 00 FF FE FD FC FB FA
+ v05 u 01 00 FF FE FD FC FB FA
+ v06 u 01 00 FF FE FD FC FB FA
+ v07 u 01 00 FF FE FD FC FB FA
+8x8 u0 v0 y-flip crc E74C83BA
+ v00 u 00 01 02 03 04 05 06 07
+ v02 u !C210 !C210 !C210 !C210 10 10 10 10
+ v00 u !0000 !0421 !0842 !0C63 !1084 !14A5 !18C6 !1CE7
+ v00 u !8000 !8421 !8842 !8C63 !9084 !94A5 !98C6 !9CE7
+8x8 u7 v3 x and y flip crc 9217AAF4
+ v03 u 07 06 05 04 03 02 01 00
+ v02 u 07 06 05 04 03 02 01 00
+ v01 u 07 06 05 04 03 02 01 00
+ v00 u 07 06 05 04 03 02 01 00
+16x2 u1 crc 4CF60F65
+ v00 u 01 02 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F
+ v01 u 01 02 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F
+16x1 u3 crc DB02B679
+ v00 u 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12
+16x1 u5 crc BF1ED43E
+ v00 u 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12 13 13
+16x1 u7 crc 79711A63
+ v00 u 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12 13 13 15 16
+40x1 u1 crc 309BED7F
+ v00 u 01 02 03 03 05 06 07 07 09 0A 0B 0B 0D 0E 0F 0F 11 12 13 13 15 16 17 17 19 1A 1B 1B 1D 1E 1F 1F 21 22 23 23 25 26 27 27
+16x1 u252 (wraps) crc 24D2BEA4
+ v00 u FC FD FE FF 00 01 02 03 04 05 06 07 08 09 0A 0B
+2x8 v250 (wraps) crc 3D1AC694
+ v3A u 00 01
+ v00 u !0842 !0842
+ v00 u !0000 !0000
+ v00 u !8000 !8421
+ v00 u !0000 !0421
+ v00 u !C210 !C210
+ v00 u 00 01
+ v01 u 00 01
+16x1 u1 x-flip crc 96035D18
+ v00 u 01 00 FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2
+16x1 u8 x-flip crc DD34FC8D
+ v00 u 09 08 07 06 05 04 03 02 01 00 FF FE FD FC FB FA
+16x1 u255 x-flip crc 1D7602D8
+ v00 u FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0
+2x4 v2 y-flip crc D5CBA493
+ v02 u 00 01
+ v01 u 00 01
+ v00 u 00 01
+ v00 u !C210 !C210
+16x16 command 7Dh, u16 v16, x and y flip crc 6BBE81F0
+16x16 command 7Dh u16 v16 crc 2BB2C2FC
+8x8 command 75h u9 v1 crc 2E2918C4
+ v01 u 09 0A 0B 0B 0D 0E 0F 0F
+1x1 command 6Dh u9 v1 crc 2D147761
+ v01 u 09 !0000
+1x1 command 6Dh u9 v1 x-flip crc 2D147761
+ v01 u 09 !0000
+quad 2Dh u0..8 with E1 x-flip set before it crc AD07C8B3
+ v00 u 00 01 02 03 04 05 06 07
+8x1 u0 x-flip, after the quad crc A65746BD
+ v00 u 01 00 FF FE FD FC FB FA
+4-bit and 8-bit sprites as CLUT index (texel index (u+v)&15 or (u+16v)&255):
+4-bit 16x1 u0: 2000.. 000102030405060708090A0B0C0D0E0F
+4-bit 16x1 u1: 2000.. 0102030405060708090A0B0C0D0E0F0F
+4-bit 24x1 u7: 2000.. 0708090A0B0C0D0E0F0F0102030405060708090A0B0C0D0E
+4-bit 16x1 u0 x-flip: 2000.. 01000F0E0D0C0B0A0908070605040302
+4-bit 16x1 u8 x-flip: 2000.. 090807060504030201000F0E0D0C0B0A
+8-bit 16x1 u0 v4: 1000.. 404142434445464748494A4B4C4D4E4F
+8-bit 16x1 u1 v4: 1000.. 4142434445464747494A4B4C4D4E4F4F
+8-bit 16x1 u0 v4 x-flip: 1000.. 41403F3E3D3C3B3A3938373635343332
+8-bit 16x1 u3 v4 x-flip: 1000.. 434241403F3E3D3C3B3A393837363534
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/06TWN.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/06TWN.txt)
+
+```
+===== 06 TWN GPU TEXTURE WINDOW | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Texture window (E2h) on raw sprites from the 15-bit page: v and u of each texel read.
+GPUSTAT 5606200F at start
+E2 0, 20x1 u0 crc 24B003C5
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
+mask X 1 offset X 0, u0 crc 90E5D6B6
+ v00 u 00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 07 10 11 12 13
+mask X 1 offset X 1, u0 crc D75E924D
+ v00 u 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B
+mask X 2 offset X 1 (offset outside mask), u0 crc 410675BB
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03
+mask X 3 offset X 3, u0 crc 3D9E6DC5
+ v00 u 18 19 1A 1B 1C 1D 1E 1F 18 19 1A 1B 1C 1D 1E 1F 18 19 1A 1B
+mask X 0 offset X 1Fh, u0 crc 24B003C5
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13
+mask X 1Fh offset X 0, u0 crc F553A0C8
+ v00 u 00 01 02 03 04 05 06 07 00 01 02 03 04 05 06 07 00 01 02 03
+mask X 1Fh offset X 1Fh, u0 crc 08D90F45
+ v00 u F8 F9 FA FB FC FD FE FF F8 F9 FA FB FC FD FE FF F8 F9 FA FB
+mask X 10h offset X 10h, u0 crc 842259F3
+ v00 u 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93
+mask X 1Eh offset X 0Fh, u0 crc 5BA5C4FB
+ v00 u 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 70 71 72 73
+mask X 1 offset X 1, u4 crc B218DDF6
+ v00 u 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B 1C 1D 1E 1F
+mask X 1 offset X 1, u250 crc C250AF3B
+ v00 u FA FB FC FD FE FF 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D
+mask Y 1 offset Y 1, 2x12 v0 crc 18800D76
+ v08 u 00 01
+ v09 u 00 01
+ v0A u 00 01
+ v0B u 00 01
+ v0C u 00 01
+ v0D u 00 01
+ v0E u 00 01
+ v0F u 00 01
+ v08 u 00 01
+ v09 u 00 01
+ v0A u 00 01
+ v0B u 00 01
+mask Y 1Fh offset Y 1Fh, 2x4 v0 crc AD87A132
+ v38 u 00 01
+ v39 u 00 01
+ v3A u 00 01
+ v00 u !0842 !0842
+E2 with bits 20-23 set and mask X 1 offset X 1 crc D75E924D
+ v00 u 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B
+x-flip, mask X 1 offset X 1, u0 crc 0F1F9343
+ v00 u 09 08 FF FE FD FC FB FA F9 F8 FF FE FD FC FB FA F9 F8 EF EE
+x-flip, mask X 1 offset X 1, u16 crc 069E6191
+ v00 u 19 18 0F 0E 0D 0C 0B 0A 09 08 0F 0E 0D 0C 0B 0A 09 08 FF FE
+quad u0..20, mask X 1 offset X 1 crc D75E924D
+ v00 u 08 09 0A 0B 0C 0D 0E 0F 08 09 0A 0B 0C 0D 0E 0F 18 19 1A 1B
+4-bit 20x1 u0, mask X 1 offset X 1 (index): 2000.. 08090A0B0C0D0E0F08090A0B0C0D0E0F08090A0B
+GP1(10h) index 2 after E2h FFFFFFh: 200FFFFF
+GP1(10h) index 2 after E2h 64D55: 20064D55
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/07TPG.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/07TPG.txt)
+
+```
+===== 07 TPG GPU TEXPAGE CLUT | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Texture page depth, E1 bit 11, CLUT attribute bit 15 and CLUT/page wrap at x 1023.
+GPUSTAT 5606200F at start
+depth 3 (reserved), 8x1 u0 v0 crc AD07C8B3
+ v00 u 00 01 02 03 04 05 06 07
+E1 bit 11 set, 8x1 u0 v5 crc 5416BA95
+ v05 u 00 01 02 03 04 05 06 07
+GPUSTAT after E1 bit 11 and back: D606211C
+raw sprite over 1234h crc 74B14ED5
+ 1234 1234 1234 1234 8000 8000 8000 8000
+same, semi-transparent command 67h (mode 0) crc 3F3DDD1C
+ 1234 1234 1234 1234 890A 890A 890A 890A
+4-bit CLUT A: 2000.. 000102030405060708090A0B0C0D0E0F
+4-bit CLUT B: 2400.. 000102030405060708090A0B0C0D0E0F
+4-bit CLUT A with attribute bit 15: 2000.. 000102030405060708090A0B0C0D0E0F
+8-bit v4: 1000.. 404142434445464748494A4B4C4D4E4F
+8-bit CLUT with attribute bit 15: 1000.. 404142434445464748494A4B4C4D4E4F
+8-bit u0..31 (index = u), CLUT at 1008,499 crc C9073367
+ 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 780A 780B 780C 780D 780E 780F 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 700A 700B 700C 700D 700E 700F
+8-bit page at x 960, u120..135 v0 (index): 1000.. FC40FD40FE40FF40005A015A025A035A
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/08UVI.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/08UVI.txt)
+
+```
+===== 08 UVI GPU UV INTERPOLATE | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+UV interpolation (raw quads on the 15-bit page) and gouraud colour across widths.
+GPUSTAT 5606200F at start
+First column with u 1, quad w wide with u 0 to 1, w from 1:
+ -- 01 02 02 03 04 04 04 05 06 06 07 07 08 08 08 09 0A 0A 0B 0B 0C 0C 0D 0D 0E 0E 0F 0F 10 10 10
+ 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 1A 1A 1B 1B 1C 1C 1D 1D 1E 1E 1F 1F 20 20 20
+ 21 22 22 23 23 24 24 25 25 26 26 27 27 28 29 29 29 2A 2A 2B 2B 2C 2C 2D 2D 2E 2E 2F 2F 30 30 31
+ 31 32 32 34 34 34 35 35 35 36 36 38 38 38 39 39 39 3B 3B 3B 3B 3D 3D 3D 3F 3F 3F 3F 40 40 40 40
+ 43 43 43 43 45 45 45 45 47 47 47 47 47 4A 4A 4A 4A 4A 4C 4C 4C 4C 4C 4F 4F 4F 4F 4F 4F 52 52 52
+ 52 52 52 56 56 56 56 56 56 56 5A 5A 5A 5A 5A 5A 5A 5A 5E 5E 5E 5E 5E 5E 5E 5E 62 62 62 62 62 62
+ 62 62 62 67 67 67 67 67 67 67 67 67 6C 6C 6C 6C 6C 6C 6C 6C 6C 6C 6C 72 72 72 72 72 72 72 72 72
+Low 16 bits of each row's CRC, quad w wide with u 0 to 255, w = 1..224:
+ 47031826E8EE7E45AEB89F5F2032D23840556D12E21729E31B90C9231A71106D
+ CD483CAF6C3FDA00B865C0E542D6ADF600DC5DF01A4F2BBA0CA35A12A9750D4D
+ CA3418634C7994FBBE0D6F5E94A8863CA00BF8995F4CF142ABC78ED29192CDDD
+ 087392BA328A41A72E7AA399268EE7A87D38623E0F420A1ED9242C11BE9242CF
+ CEE13283439D6C9E1758A7F3FBFB5A01F19341998AE57C49AD63214B527C63F8
+ 4A376DB25EAFB573DB1DD4259A7F84CD1335D1C60C24599E548E217695AD99B8
+ CBF5042B5D489DC6641CF6B32A2440FB5EDB25FC3D99CF862DE74326DC542E11
+ 835B41137206C6B15941E1B0ACBB6E3EE429BA93C631823B60F8B735097AB54D
+ 3FCB034739FBBC6DD1C1E44E7E47D56CD735101A5B890E8A6CB7ED7DD569E94C
+ 015709A964FBDAE27070D2C4F9106C7C1FA256E5D1734C631DF75116332127E0
+ 802CE7D5C904B34AFC5F577F0BEEFBBBEDA178FB8AE098FC7E04CD9254E205EA
+ 703245F245E7E629471E5C59939982DC02ACA53719698F38545E7355F56920AA
+ 363246EE6C9FCE137E8224301FA6A715622530B09BFE5AFB7E9905ED9C608E07
+ 7D2048DFC073BD4526CD386F241D6CA8177FD38B42C4E025A6B3FD3766D5296C
+Gouraud quads red FF to green FF, w wide, 1 tall, dither off: low 16 bits of CRC:
+ 1921E30FC8A702F4E5561A727B3F1215A75BBE10D69D0BD22C514BFC0122BD14
+ 5372AF3F685FC75126FD070C8C043563A1BD6F96876F6F4D90BB10B799D2BD1D
+ 4CC0941B4D13FA3E79ED41925E27C61455F19926717ED2CFCB4675D645EA2416
+ D5CE1A70F8CEF3D6481306C30FC09BA14F48CF5568705D4EFAC6F8F044ADC7CC
+ 57AB7464E2F9780FA04957B7D2CD044271D7168E0E7EC1D02FC6394355021B57
+ 9A9B9644C179802039201C601BFC55D41DD0DF82DCA9B3A6EA87D9C9D8187007
+ AB135F52205F335FE8DEAEA5DB368ED8EEE92C1184A93CFE6214812C1C0380B6
+ 5FF7EDA6ED842C18673E12A88E434D99F1C4AC2C3012668C2987D4609BC36B3F
+ 265C81EDF3BB836E7CE2544B9EE7BFA6BE6BB80761E0C56B56487E5B3F54E61B
+ C6F111B010A414628F154A1FF73439B4AF09450C53E123E869EF961F71188522
+ 55DAEBDFB0DF983B713944B50E1E6CC76720CE445AC98AB356C9247B74DBE123
+ 7C51F45B2D91AF5AD82057578FAA0F27326C40A1789325FA925BE83A75545654
+ B6E24BE8F6B0665ECEC0E60E80E3D0C91F4999F1E4643C6CE4B91A26288FE8C6
+ FA7FEB34116B3D94A739D5ECE54F3DD15592D8ABC0BA9A1DC2F3D84D468D6C6C
+quad 16 wide u 0 to 255 crc BA3CF84D
+ v00 u 00 10 20 30 40 50 60 70 80 8F 9F AF BF CF DF EF
+quad 16 wide u 255 to 0 crc 9E5B7845
+ v00 u FF EF DF CF BF AF 9F 8F 80 70 60 50 40 30 20 10
+quad 16 wide u 0 to 16 crc 3460BB07
+ v00 u 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
+quad 16 wide u 0 to 15 crc FB04A7AC
+ v00 u 00 01 02 03 04 05 06 07 08 08 09 0A 0B 0C 0D 0E
+quad 2 wide u 0 to 255 crc 74F2C211
+ v00 u 00 80 !0000
+quad 1 wide 16 tall v 0 to 63 (column) crc 19EC8B25
+ v00 u 00
+ v04 u 00
+ v08 u 00
+ v0C u 00
+ v10 u 00
+ v14 u 00
+ v18 u 00
+ v1C u 00
+ v20 u 00
+ v23 u 00
+ v27 u 00
+ v2B u 00
+ v2F u 00
+ v33 u 00
+ v37 u 00
+ v3B u 00
+triangle 25h 0,0 uv0,0 16,0 uv255,10 0,16 uv7,60: crc C17CF0E6
+triangle 1 tall, u 10 to 26 over 16 crc 497ED9D6
+ v00 u 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/09STM.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/09STM.txt)
+
+```
+===== 09 STM GPU SEMI TRANSPARENT | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Semi-transparency (E1 bits 5-6; rendering-attributes.txt:57). Four pixels drawn over
+backgrounds 0000h 2108h 5EF7h 7FFFh with colour 808080h (5-bit 16).
+GPUSTAT 5606200F at start
+m0 tile 62h: 2108 318C 4E73 5EF7
+m0 flat quad 2Ah: 2108 318C 4E73 5EF7
+m0 gouraud quad 3Ah: 2108 318C 4E73 5EF7
+m0 line 42h: 2108 318C 4E73 5EF7
+m0 polyline 4Ah 0-1-3: 2108 39CE 4E73 5EF7
+m0 raw rect 67h texel C210h: A108 B18C CE73 DEF7
+m0 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m0 raw rect 67h texel 8000h: 8000 9084 AD6B BDEF
+m0 blended rect 66h colour 404040h texel C210h: 9084 A108 BDEF CE73
+m0 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m0 raw quad 2Fh u0..3 texel C210h: A108 B18C CE73 DEF7
+m1 tile 62h: 4210 6318 7FFF 7FFF
+m1 flat quad 2Ah: 4210 6318 7FFF 7FFF
+m1 gouraud quad 3Ah: 4210 6318 7FFF 7FFF
+m1 line 42h: 4210 6318 7FFF 7FFF
+m1 polyline 4Ah 0-1-3: 4210 7FFF 7FFF 7FFF
+m1 raw rect 67h texel C210h: C210 E318 FFFF FFFF
+m1 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m1 raw rect 67h texel 8000h: 8000 A108 DEF7 FFFF
+m1 blended rect 66h colour 404040h texel C210h: A108 C210 FFFF FFFF
+m1 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m1 raw quad 2Fh u0..3 texel C210h: C210 E318 FFFF FFFF
+m2 tile 62h: 0000 0000 1CE7 3DEF
+m2 flat quad 2Ah: 0000 0000 1CE7 3DEF
+m2 gouraud quad 3Ah: 0000 0000 1CE7 3DEF
+m2 line 42h: 0000 0000 1CE7 3DEF
+m2 polyline 4Ah 0-1-3: 0000 0000 1CE7 3DEF
+m2 raw rect 67h texel C210h: 8000 8000 9CE7 BDEF
+m2 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m2 raw rect 67h texel 8000h: 8000 A108 DEF7 FFFF
+m2 blended rect 66h colour 404040h texel C210h: 8000 8000 BDEF DEF7
+m2 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m2 raw quad 2Fh u0..3 texel C210h: 8000 8000 9CE7 BDEF
+m3 tile 62h: 1084 318C 6F7B 7FFF
+m3 flat quad 2Ah: 1084 318C 6F7B 7FFF
+m3 gouraud quad 3Ah: 1084 318C 6F7B 7FFF
+m3 line 42h: 1084 318C 6F7B 7FFF
+m3 polyline 4Ah 0-1-3: 1084 4210 6F7B 7FFF
+m3 raw rect 67h texel C210h: 9084 B18C EF7B FFFF
+m3 raw rect 67h texel 4210h: 4210 4210 4210 4210
+m3 raw rect 67h texel 8000h: 8000 A108 DEF7 FFFF
+m3 blended rect 66h colour 404040h texel C210h: 8842 A94A E739 FFFF
+m3 opaque raw rect 65h texel C210h: C210 C210 C210 C210
+m3 raw quad 2Fh u0..3 texel C210h: 9084 B18C EF7B FFFF
+Grids against psx-spx's 5-bit formula (gpu.txt:1452-1464), F = colour/8:
+mode 0 tile: crc F5CE64DB, 0 of 8192 differ from the formula
+mode 1 tile: crc 6AD72B96, 0 of 8192 differ from the formula
+mode 2 tile: crc CC580881, 0 of 8192 differ from the formula
+mode 3 tile: crc C13FB0EA, 0 of 8192 differ from the formula
+mode 0 gouraud quad: crc F5CE64DB, 0 of 8192 differ from the formula
+mode 1 gouraud quad: crc 6AD72B96, 0 of 8192 differ from the formula
+mode 2 gouraud quad: crc CC580881, 0 of 8192 differ from the formula
+mode 3 gouraud quad: crc C13FB0EA, 0 of 8192 differ from the formula
+mode 0 raw texel 8000h|gray t: crc 371605E5, 0 of 1024 differ from the formula
+mode 1 raw texel 8000h|gray t: crc 3785FE79, 0 of 1024 differ from the formula
+mode 2 raw texel 8000h|gray t: crc 2E0973ED, 0 of 1024 differ from the formula
+mode 3 raw texel 8000h|gray t: crc 12573AC5, 0 of 1024 differ from the formula
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/10DTH.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/10DTH.txt)
+
+```
+===== 10 DTH GPU DITHER MODULATE | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Dithering (E1 bit 9; psx-spx gpu.txt:1431-1443) and texture modulation. 4x4 blocks as
+red 5-bit in base 32, rows split by '/'.
+GPUSTAT 5606200F at start
+gouraud quad 00 dither on: 0000/0000/0000/0000
+gouraud quad 01 dither on: 0000/0000/0000/0000
+gouraud quad 03 dither on: 0000/0000/0000/0000
+gouraud quad 04 dither on: 0000/0000/0000/0000
+gouraud quad 05 dither on: 0000/0010/0000/1000
+gouraud quad 07 dither on: 0001/1010/0100/1010
+gouraud quad 08 dither on: 0101/1010/0101/1010
+gouraud quad 0C dither on: 1111/1111/1111/1111
+gouraud quad 0E dither on: 1111/2121/1111/2121
+gouraud quad 10 dither on: 1212/2121/1212/2121
+gouraud quad 7C dither on: ffff/ffff/ffff/ffff
+gouraud quad 80 dither on: fgfg/gfgf/fgfg/gfgf
+gouraud quad F7 dither on: uuuv/vuvu/uvuu/vuvu
+gouraud quad F8 dither on: uvuv/vuvu/uvuv/vuvu
+gouraud quad FB dither on: uvvv/vvvv/vvuv/vvvv
+gouraud quad FC dither on: vvvv/vvvv/vvvv/vvvv
+gouraud quad FF dither on: vvvv/vvvv/vvvv/vvvv
+gouraud quad 07 dither off: 0000/0000/0000/0000
+gouraud quad FF dither off: vvvv/vvvv/vvvv/vvvv
+Which commands dither (dither on), colour or texel 0Eh-ish:
+flat quad 28h 0E: 1111/1111/1111/1111
+tile 60h 0E: 1111/1111/1111/1111
+flat lines 40h 0E: 1111/2121/1111/2121
+gouraud quad 38h 0E: 1111/2121/1111/2121
+blended rects 64h 4x1 808080 texel 2: 2222/2222/2222/2222
+blended quad 2Ch 808080 texel 2: 1212/2121/1212/2121
+raw quad 2Dh texel 2: 2222/2222/2222/2222
+blended quad 2Ch 707070 texel 2: 1111/2121/1111/2121
+gouraud textured 3Ch 808080 texel 2: 1212/2121/1212/2121
+Dither position (gouraud 0E, dither on):
+drawn at local 1,0, read from 0,0: 01111/01212/01111/01212
+drawn at 0,0 with offset +1, read from 0,0: 01111/01212/01111/01212
+Dither and blending (gouraud 44h, dither on, background red 0Ah):
+semi mode 0 crc CA1BB721
+ 9999
+ 9999
+ 9999
+ 9999
+semi mode 1 crc 645896F4
+ iiii
+ iiii
+ iiii
+ iiii
+semi mode 2 crc 6E8C946E
+ 2222
+ 2222
+ 2222
+ 2222
+semi mode 3 crc F36DD766
+ cccc
+ cccc
+ cccc
+ cccc
+Modulation grids, dither off, rows colour c (r=g=b), columns texel gray t = 0..31:
+rect 64h: crc 153730D8, 0 of 8192 differ from min(31, t*c/128)
+quad 2Ch: crc 153730D8, 0 of 8192 differ from min(31, t*c/128)
+gouraud quad 3Ch: crc 153730D8, 0 of 8192 differ from min(31, t*c/128)
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/11MSK.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/11MSK.txt)
+
+```
+===== 11 MSK GPU MASK BIT | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Mask bit (E6h; rendering-attributes.txt:123-137). Background 8421h/0421h alternating.
+GPUSTAT 5606200F at start
+write 1234h, read 1234
+set mask, write 0000h, read 8000
+8000h there, check mask, write 1234h, read 8000
+8123h then 0456h, read 0456
+set mask 0000h, then no mask 0456h, read 0456
+E6 0 tile: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 quad: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 line: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 raw sprite texel 45xx: 4500 4501 4502 4503 4504 4505 4506 4507
+E6 0 fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+E6 0 copy 80h from 7FFFh: 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF
+E6 0 A0h write 1234h: 1234 1234 1234 1234 1234 1234 1234 1234
+check tile: 8421 001F 8421 001F 8421 001F 8421 001F
+check quad: 8421 001F 8421 001F 8421 001F 8421 001F
+check line: 8421 001F 8421 001F 8421 001F 8421 001F
+check raw sprite texel 45xx: 8421 4501 8421 4503 8421 4505 8421 4507
+check fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+check copy 80h from 7FFFh: 8421 7FFF 8421 7FFF 8421 7FFF 8421 7FFF
+check A0h write 1234h: 8421 1234 8421 1234 8421 1234 8421 1234
+set tile: 801F 801F 801F 801F 801F 801F 801F 801F
+set quad: 801F 801F 801F 801F 801F 801F 801F 801F
+set line: 801F 801F 801F 801F 801F 801F 801F 801F
+set raw sprite texel 45xx: C500 C501 C502 C503 C504 C505 C506 C507
+set fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+set copy 80h from 7FFFh: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
+set A0h write 1234h: 9234 9234 9234 9234 9234 9234 9234 9234
+set+check tile: 8421 801F 8421 801F 8421 801F 8421 801F
+set+check quad: 8421 801F 8421 801F 8421 801F 8421 801F
+set+check line: 8421 801F 8421 801F 8421 801F 8421 801F
+set+check raw sprite texel 45xx: 8421 C501 8421 C503 8421 C505 8421 C507
+set+check fill 02h: 001F 001F 001F 001F 001F 001F 001F 001F
+set+check copy 80h from 7FFFh: 8421 FFFF 8421 FFFF 8421 FFFF 8421 FFFF
+set+check A0h write 1234h: 8421 9234 8421 9234 8421 9234 8421 9234
+E6 0, tile B+F 080808h over 8421h/0421h: 0842 0842 0842 0842 0842 0842 0842 0842
+E6 0, raw sprite texels C210h x4, 4210h x4: C210 C210 C210 C210 4210 4210 4210 4210
+set, semi raw sprite C210h x4 4210h x4 (mode 0): A108 A108 A108 A108 C210 C210 C210 C210
+GPUSTAT bits 11-12 after E6h FFFFFFh: 3
+GPUSTAT bits 11-12 after E6h FFFFFCh: 0
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/12FIL.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/12FIL.txt)
+
+```
+===== 12 FIL GPU FILL | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Fill 02h (memory-transfer-commands.txt:12-22, :61-70): row y 400 from x 496, 64 wide.
+GPUSTAT 5606200F at start
+x 200h w 16 ................################................................
+x 205h w 16 ................################................................
+x 20Fh w 16 ................################................................
+x 1FFh w 16 ################................................................
+x 200h w 1 ................################................................
+x 200h w 15 ................################................................
+x 200h w 17 ................################################................
+x 200h w 0 ................................................................
+x 200h w 400h ................................................................
+x 200h w 410h ................################................................
+x 200h w 8010h ................################................................
+x FE00h w 16 ................################................................
+x 600h w 16 ................################................................
+x 200h w 16 h 0 ................................................................
+x 200h w 16 h 200h ................................................................
+x 200h w 16 h 201h ................################................................
+x 200h w 3F1h: 1024 of 1024 in the row filled
+x 200h w 3FFh: 1024 of 1024 in the row filled
+x 3F0h w 30h: 16 of x 1008..1023, 32 of x 0..31 (################################)
+y 510 h 4 at x 640: 32 of rows 510-511, 32 of rows 0-2 (32 each, rows 0-1 expected)
+y 400 with bit 9 set: 16 of 16 at y 400
+Fill colour to 15-bit, dither on (E1 bit 9) and mask set:
+ 070707: 0000 0000 0000 0000 / 0000 0000
+ 080808: 0421 0421 0421 0421 / 0421 0421
+ 0F0F0F: 0421 0421 0421 0421 / 0421 0421
+ 101010: 0842 0842 0842 0842 / 0842 0842
+ FFFFFF: 7FFF 7FFF 7FFF 7FFF / 7FFF 7FFF
+ 0000F8: 001F 001F 001F 001F / 001F 001F
+ F80000: 7C00 7C00 7C00 7C00 / 7C00 7C00
+ 00FF00: 03E0 03E0 03E0 03E0 / 03E0 03E0
+check mask over 8000h: 7FFF
+area 0..15 x 256..271 and offset 100,50: 16 of 16 at 200h,400
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s013/13CLC.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/13CLC.txt)
+
+[gpuraster/s013/14CPY.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s013/14CPY.txt)
+
+```
+===== 14 CPY GPU VRAM COPY | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+VRAM to VRAM copy 80h (memory-transfer-commands.txt:27-37, :72-86). ps1-tests
+gpu/vram-to-vram-overlap: a block of size s (pixel 4000h+64y+2x) copied by dx -3..3,
+dy -1..1; CRC of the (s+8)^2 cell. Order: dy -1 (dx -3..3), dy 0, dy 1.
+GPUSTAT 5606200F at start
+size 2:
+ 8AFE5C49 3EA6B737 181AF0F7 6A2E407A AEF0BD4F 7C9D14A9 30A5B25C
+ B11FF251 D5E868EB 50F985B4 9452635D A3E148C8 702B79F2 46C6795C
+ E082917B DF113383 19AABFCE 9BF578AD BC151CC8 9DB43342 8D17532D
+size 8:
+ 2B035764 592EB9B8 77A20015 3A462060 52174C07 562278C2 2E80011F
+ 76BDFC2A ED9DE864 4011ACC9 B87D6B14 910B29F1 41296584 38BC626F
+ 54587E02 C32831B5 C85880D9 77B525EB 415EE80A DF8C182D C8BFB7A1
+size 15:
+ 6C1F1758 805B376B 10B8F0E5 F7B3CC28 57446D25 892C44DF 4B7D7FB6
+ 7C68D67B F20A24D9 B604F2E4 D01EA284 05C5D018 B51BE940 AD1A9642
+ 6ED0E8E6 DDCBE10B 2799E886 185DD36C A1180B78 7E94D206 66AC4E47
+size 16:
+ A5041F63 28DA841B FE9BD7DF DA218062 10DF2327 F51DC80C BE8560A4
+ ECD61E2D 2962169A 60728C2F E3A58EBF 42AAA2D1 3424D83B 5B77CF84
+ 1C2ED0F7 CE0C2F69 19135606 78C940E6 FC128DBB 5FCD1EA3 7D2C911C
+size 16 x+1:
+ 139F1927 53B1EE87 7144C68C 5ED70784 3B3585E8 D9AD0B76 AC4487B2
+ 5EDBFC92 B65A769A B71A3493 EB6B3615 EFE552F8 BC7D244B BF28E0C3
+ 61123106 740D903A 68652163 8ABFDB58 B6E50E00 23E5B51D D9E81195
+size 16 y+1:
+ 5D23C87B 3A38F41E 8A72B86B A0086299 716C9217 AA5659BB FEECFEA7
+ B050533D C31A9BE3 9119527E 86B35055 31DD76A3 3C868E4E EFFD64AD
+ AF5F0309 46438EBA DB4067FF 2734DBF4 49B43C37 5C369B7D 2197C302
+size 16 xy+1:
+ B5B2B10A CFC29830 A42654B1 8F6DE6EC 78FD8140 C4916694 5F0C508D
+ CC67BDBA 1B92B4F0 5B68F3A0 501009B0 FC298CD7 6DB0F07D 1420D117
+ 7F7C8A98 3DF737D4 187A4370 FB0B8B85 14192340 F6566F7D 8CCF87D8
+Wide rows copied one pixel right (pixel 4000h+x), against a copy made through a buffer:
+ width 100 right: 0 differ; left: 0 differ
+ width 127 right: 0 differ; left: 0 differ
+ width 128 right: 0 differ; left: 0 differ
+ width 129 right: 1 differ, first at 129 reads 407F; left: 0 differ
+ width 200 right: 1 differ, first at 129 reads 407F; left: 0 differ
+ width 300 right: 2 differ, first at 129 reads 407F; left: 0 differ
+width 0, height 1: 1024 of 1024 copied
+width 400h, height 1: 1024 of 1024 copied
+width 401h, height 1: 1 of the first 16 copied
+source x 1016, 16 wide (pixel 4000h+x) crc 588D96AE
+ 43F8 43F9 43FA 43FB 43FC 43FD 43FE 43FF 4000 4001 4002 4003 4004 4005 4006 4007
+destination x 1016, 16 wide: x 0..7 crc CA4D44FF
+ 4008 4009 400A 400B 400C 400D 400E 400F
+source x 404h (4), destination y 404+512 crc C131685B
+ 4004 4005 4006 4007
+set mask, copy 4000h.. crc 0099B424
+ C000 C001 C002 C003
+check mask, 8000h at the 2nd, copy crc 17AD4D9A
+ 4000 8000 4002 4003
+source = destination crc 4DB8ECF5
+ 1111 1111 1111 1111
+A0h 3x1 with words 00020001h 00040003h crc 8BD98464
+ 0001 0002 0003 2222 2222
+C0h 3x1: words 00020001 22220003; GPUSTAT then D6062000
+A0h at x 1022, 4 wide: x 1020..1023 crc EA2AD7C9
+ 0000 0000 3333 3333
+ x 0..3 crc 410BF4E7
+ 4444 4444 0000 0000
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s014/15CLP.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s014/15CLP.txt)
+
+```
+===== 15 CLP GPU AREA OFFSET | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Drawing area (E3h/E4h) and offset (E5h), rendering-attributes.txt:94-121.
+GPUSTAT 5606200F at start
+GP1(10h) after E2-E5 FFFFFFh: index 2 000FFFFF 3 000FFFFF 4 000FFFFF 5 003FFFFF
+after E3 x 155h y 2AAh, E5 2AAAAAh: index 3 003AA955 5 002AAAAA
+index 0 002AAAAA 1 002AAAAA 6 002AAAAA 9 002AAAAA 10h 002AAAAA 17h 00000002
+Counts, B+F red 8, window local 0,0 14x12; area local 2..9 x 2..7:
+quad 0,0-12,10 crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+tile 12x10 crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+line 0,0-13,11 crc C079EC85
+ ..............
+ ..............
+ ..1...........
+ ...11.........
+ .....1........
+ ......1.......
+ .......1......
+ ........1.....
+ ..............
+ ..............
+ ..............
+ ..............
+raw sprite 65h 12x10 ('#') crc A3FD9360
+ ..............
+ ..............
+ ..########....
+ ..########....
+ ..########....
+ ..########....
+ ..########....
+ ..########....
+ ..............
+ ..............
+ ..............
+ ..............
+area one pixel 3,3: tile crc 2F6A7337
+ ..............
+ ..............
+ ..............
+ ...1..........
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+area x1 9 > x2 3: tile crc 2D28A891
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+area y1 7 > y2 2: tile crc 2D28A891
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+offset +2,+2: quad crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+offset -2,-2: quad crc 9891E0E1
+ ..............
+ ..............
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..11111111....
+ ..............
+ ..............
+ ..............
+ ..............
+tile 1016..1031: x 1008..1023 8 drawn; x 0..7 0 drawn
+Area y 812..827 (bit 9), tile at 256,812 16x16; rows 300..315 then 812-512:
+ 256 of 256 drawn at rows 300..315; GP1(10h) index 3 001CB100
+ same area, tile at y 300: 0 of 256
+Waits that ran out: 0
+Done.
+```
+
+[gpuraster/s014/16RSK.txt](/tests/raw/20260927T0000Z-5501a-card-b/gpuraster/s014/16RSK.txt)
+
+```
+===== 16 RSK GPU COMMAND PARSING | BIOS 19951204 System ROM Version 3.0 11/18/96 A
+BadVaddr as the group starts: 00000480
+Command parsing: polyline end codes, long polylines, NOP numbers, mirrors. After
+each, GP1(01h) resets the command buffer (display-control-commands-gp1.txt:23-28).
+GPUSTAT 5606200F at start
+Polyline 4,4 to 10,4 then the word below, then 55555555h; counts in 14x14:
+50005000h (Wild Arms 2, render-line-commands.txt:32-34) crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+50085008h (x 8, y 8 if a vertex) crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+5555000Ch crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+gouraud: 55555555h in a colour slot, then 10,10 crc 27A546F8
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ .....vvvvvvv..
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+ ..............
+zigzag polyline of 40 vertices: crc 1E36FAE4, 65 drawn
+NOP numbers followed by a 4x4 tile at 2,2; the tile drawn right means no words eaten:
+00h: 16 drawn, x 2..5, y 2..5
+04h: 16 drawn, x 2..5, y 2..5
+1Eh: 16 drawn, x 2..5, y 2..5
+E0h: 16 drawn, x 2..5, y 2..5
+E7h: 16 drawn, x 2..5, y 2..5
+EFh: 16 drawn, x 2..5, y 2..5
+Mirrors (other-commands.txt:53-56):
+BFh as A0h, 4x1 1,2,3,4 crc 92991416
+ 0001 0002 0003 0004
+9Fh as 80h, row 410 to 411 crc 92991416
+ 0001 0002 0003 0004
+DFh as C0h, 2x1: GPUSTAT.27 set, GPUREAD 00020001
+Copy 256x200 from 0,256 to 256,256 ... done, first row crc 190A55AD
+Waits that ran out: 4
+Done.
+```
+
+## References
+
+[^src]: Console test suite (PsyQ build), programs/gpu/gpuraster.c and gpuraster.md.
+[^tri]: Hardware test run 20260928T0000Z-5501a-card-h: [gpuraster_safe/01TRI.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/01TRI.txt).
+[^lin]: Hardware test run 20260928T0000Z-5501a-card-h: [gpuraster_safe/03LIN.txt](/tests/raw/20260928T0000Z-5501a-card-h/gpuraster_safe/03LIN.txt).