L0 ROM

The L0 ROM is a 64KiB sprite scaling lookup table found in every NeoGeo system as a standalone mask ROM or integrated in NEO-GRZ.
The 000-lo.lo dump commonly found in system ROM sets is 128KiB but only the first half is used.
Hash
- CRC32: 5A86CFF2
- SHA-1: 5992277DEBADEB64D1C1C64B0A92D9293EAF7E4A
Data format
The data is made of 256 tables of 256 bytes, each table corresponding to a vertical shrinking value for sprites.
For the first 256 lines (top half of a full sprite), the index in the table is the pixel row number of the sprite currently being drawn (scanline - Y position).
Each byte entry in the table is used as 2 nibbles:
- The upper nibble is the index to read in the tilemap in VRAM SCB1 (0 to 15).
- The lower nibble is the pixel row number of that tile to fetch in the C ROMs.
For the last 256 lines (bottom half of a full sprite), the index in the table is complemented: the table is read backwards.
- The upper nibble is the index XOR 31 to read in the tilemap in VRAM SCB1 (16 to 31).
- The lower nibble is the pixel row number XOR 15 of that tile to fetch in the C ROMs.
Example of GPU processing

(Maybe place this part in the LSPC page ?)
Sprite with Y scaling value = $1B (10.6% of full size).
| Sprite line # | L0 address | L0 data | Tilemap index | Pixel row in tile |
|---|---|---|---|---|
| 0 | $1B00 | $00 | 0 | 0 |
| 1 | $1B01 | $08 | 0 | 8 |
| 2 | $1B02 | $10 | 1 | 0 |
| ... | ||||
| 26 | $1B1A | $E8 | 14 | 8 |
| 27 | $1B1B | $F8 | 15 | 8 |
| 28 | $1B1C | $FF | 15 | 15 |
| 29 | $1B1D | $FF | 15 | 15 |
| ... | ||||
Datasheet
There are 2 stand alone chip versions used depending on the NeoGeo system, the SOP32 TC531001 and the DIP28 TC531000.
Official TC531001 datasheet: [[1]]
Official TC531000 datasheet: [[2]]