Code: Select all
## PBJ Stream format: Initially starts in PB8 mode. In PB8 mode: 00000000 : 0x00 8 times. 01111111 : 0xff 8 times. 0nnnnnnn ... : For each bit in the pb8 control byte, 0 is a new byte, 1 is the previous byte. In BG mode: 0nnnnnnn : 128-N Run of BG In both modes: 10011111 xx : Switch to BG mode and set BG to X. 100nnnnn xx : 32-N incrementing run starting at X. 10111111 : Switch to PB8 mode. 10111110 xx yy : Set PPU_ADDR to yyxx 101nnnnn xx yy : For 32-N times, emit alternately X and Y. 110nnnnn ... : 32-N literal bytes. 11111111 : End stream. 111nnnnn xx : 32-N run of X.
The decoder assembles to 159 bytes of ROM and uses 5 bytes of RAM.
The current encoder is a bit dumb as it's only able to use either pb8 planes or everything else but not both.
Example file sizes:
The pbj picture in this post: 4513 bytes
The gus portrait from 240p test suite: 2297 bytes
The title screen from Zooming sectary: 1423 bytes
EDIT: oops, I uploaded the wrong decoder.