~rabbits/uxn-playdate

691b81540d5d4f005def54fdf0321fe4173b541e — neauoire 5 months ago 993a5cb
Cleanup
4 files changed, 87 insertions(+), 133 deletions(-)

M build.sh
M src/devices/ppu.c
M src/devices/ppu.h
M src/main.c
M build.sh => build.sh +4 -1
@@ 1,6 1,6 @@
#!/bin/sh -e

TARGET=etc/catclock.tal
TARGET=etc/controller.tal

rm -rf bin
mkdir bin


@@ 9,3 9,6 @@ uxnasm $TARGET bin/program.rom
uxnasm etc/format-c.tal bin/format-c.rom
uxncli bin/format-c.rom bin/program.rom

clang-format -i src/devices/ppu.c
clang-format -i src/devices/ppu.h


M src/devices/ppu.c => src/devices/ppu.c +21 -48
@@ 12,12 12,12 @@ WITH REGARD TO THIS SOFTWARE.

#include "ppu.h"

int
ppu_init(Ppu *p, uint32_t *framebuffer)
{
	p->framebuffer = framebuffer;
	return 1;
}
static uint8_t blending[5][16] = {
	{0, 0, 0, 0, 1, 0, 1, 1, 2, 2, 0, 2, 3, 3, 3, 0},
	{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3},
	{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2},
	{1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0}};

static inline void
render(Ppu *p, int offset, int count)


@@ 30,6 30,13 @@ render(Ppu *p, int offset, int count)
	}
}

int
ppu_init(Ppu *p, uint32_t *framebuffer)
{
	p->framebuffer = framebuffer;
	return 1;
}

void
render_all(Ppu *p)
{


@@ 57,53 64,19 @@ ppu_pixel(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t color)
}

void
ppu_clear(Ppu *p)
screen_blit(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t *sprite, uint8_t color, uint8_t flipx, uint8_t flipy, uint8_t twobpp)
{
	uint32_t background = p->color_is_white[0] ? 0xffffffff : 0;
	int i;
	for(i = 0; i < HEIGHT * STRIDE_WORDS * 3; i += 3) {
		p->pixels[i] = background;
		p->pixels[i + 2] = 0;
	}
}

static uint8_t blending[5][16] = {
	{0, 0, 0, 0, 1, 0, 1, 1, 2, 2, 0, 2, 3, 3, 3, 0},
	{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3},
	{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2},
	{1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0}};

void
ppu_1bpp(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t *sprite, uint8_t color, uint8_t flipx, uint8_t flipy)
{
	uint16_t v, h;
	for(v = 0; v < 8; v++)
		for(h = 0; h < 8; h++) {
			uint8_t ch1 = (sprite[v] >> (7 - h)) & 0x1;
			if(ch1 || blending[4][color])
				ppu_pixel(p,
					layer,
					x + (flipx ? 7 - h : h),
					y + (flipy ? 7 - v : v),
					blending[ch1][color]);
		}
}

void
ppu_2bpp(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t *sprite, uint8_t color, uint8_t flipx, uint8_t flipy)
{
	uint16_t v, h;
	for(v = 0; v < 8; v++)
		for(h = 0; h < 8; h++) {
			uint8_t ch1 = ((sprite[v] >> (7 - h)) & 0x1);
			uint8_t ch2 = ((sprite[v + 8] >> (7 - h)) & 0x1);
			uint8_t ch = ch1 + ch2 * 2;
			if(ch || blending[4][color])
	int v, h, opaque = blending[4][color];
	for(v = 0; v < 8; v++) {
		uint16_t c = sprite[v] | (twobpp ? sprite[v + 8] : 0) << 8;
		for(h = 7; h >= 0; --h, c >>= 1) {
			uint8_t ch = (c & 1) | ((c >> 7) & 2);
			if(opaque || ch)
				ppu_pixel(p,
					layer,
					x + (flipx ? 7 - h : h),
					y + (flipy ? 7 - v : v),
					blending[ch][color]);
		}
	}
}

M src/devices/ppu.h => src/devices/ppu.h +1 -3
@@ 40,7 40,5 @@ typedef struct Ppu {

int ppu_init(Ppu *p, uint32_t *framebuffer);
void ppu_pixel(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t color);
void ppu_1bpp(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t *sprite, uint8_t color, uint8_t flipx, uint8_t flipy);
void ppu_2bpp(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t *sprite, uint8_t color, uint8_t flipx, uint8_t flipy);
void ppu_clear(Ppu *p);
void screen_blit(Ppu *p, uint8_t layer, uint16_t x, uint16_t y, uint8_t *sprite, uint8_t color, uint8_t flipx, uint8_t flipy, uint8_t twobpp);
void render_all(Ppu *p);

M src/main.c => src/main.c +61 -81
@@ 10,7 10,59 @@ Uxn u;
Ppu ppu;

unsigned char rom[] = {
	0xa0, 0x0f, 0xf0, 0x80, 0x08, 0x37, 0xa0, 0x0f, 0x00, 0x80, 0x0a, 0x37, 0xa0, 0x0f, 0x00, 0x80, 0x0c, 0x37, 0xa0, 0x01, 0x56, 0x80, 0x20, 0x37, 0xa0, 0x00, 0x60, 0x80, 0x22, 0x37, 0xa0, 0x00, 0xc0, 0x80, 0x24, 0x37, 0x80, 0x22, 0x36, 0x80, 0x01, 0x3f, 0x80, 0x03, 0x31, 0x80, 0x24, 0x36, 0x80, 0x01, 0x3f, 0xa0, 0x00, 0x18, 0x38, 0x80, 0x05, 0x31, 0x80, 0x05, 0x80, 0x00, 0x11, 0xa0, 0x04, 0x4b, 0x2e, 0x80, 0x05, 0x30, 0xa0, 0x00, 0x50, 0x39, 0x80, 0x2a, 0x37, 0x80, 0x08, 0xa0, 0x05, 0x47, 0xa0, 0x03, 0x65, 0x2e, 0x80, 0xc6, 0x16, 0x06, 0x80, 0x02, 0x10, 0x08, 0x80, 0x0c, 0x0d, 0xa0, 0x01, 0x93, 0x2e, 0xa0, 0x03, 0x06, 0x2e, 0x06, 0x80, 0x02, 0x11, 0x02, 0x80, 0x00, 0x10, 0x80, 0x05, 0x09, 0x80, 0x15, 0x0d, 0x80, 0x01, 0x10, 0xa0, 0x02, 0x1a, 0x2e, 0x80, 0x01, 0x90, 0x01, 0x80, 0x0f, 0x1c, 0x04, 0x11, 0x80, 0x00, 0x80, 0x00, 0x11, 0x80, 0x00, 0x90, 0x01, 0x04, 0x11, 0x00, 0x80, 0x00, 0x80, 0xc6, 0x16, 0x26, 0x38, 0xa0, 0x04, 0xbf, 0x38, 0x34, 0xa0, 0x00, 0x90, 0x80, 0x4a, 0x0e, 0x80, 0x19, 0x31, 0x80, 0x1b, 0x31, 0x80, 0x00, 0x80, 0xc5, 0x16, 0x26, 0x38, 0xa0, 0x04, 0xbf, 0x38, 0x34, 0xa0, 0x00, 0x90, 0x80, 0x32, 0x0e, 0x80, 0x15, 0x31, 0x80, 0x17, 0x31, 0x80, 0x00, 0x80, 0xc4, 0x16, 0x80, 0x0c, 0x9b, 0x1a, 0x19, 0x80, 0x20, 0x9f, 0x03, 0x18, 0x80, 0x00, 0x80, 0xc5, 0x16, 0x80, 0x0f, 0x1b, 0x38, 0x26, 0x38, 0xa0, 0x04, 0xbf, 0x38, 0x34, 0xa0, 0x00, 0xb0, 0x80, 0x07, 0x0e, 0x80, 0x11, 0x31, 0x80, 0x13, 0x31, 0x6c, 0x2f, 0x04, 0x80, 0x00, 0x04, 0x80, 0x40, 0x3f, 0xef, 0x3b, 0x80, 0x03, 0x30, 0x38, 0xa0, 0x08, 0x00, 0xef, 0x3b, 0x39, 0x2f, 0x64, 0x80, 0x00, 0x04, 0x80, 0x40, 0x3f, 0xef, 0x3b, 0x80, 0x05, 0x30, 0x38, 0xa0, 0x08, 0x00, 0xef, 0x3b, 0x39, 0x62, 0x6f, 0x6c, 0x06, 0x8f, 0x80, 0x04, 0x80, 0x26, 0x17, 0x06, 0x80, 0x08, 0x0b, 0x80, 0x04, 0x0d, 0x80, 0x0f, 0x04, 0x19, 0x80, 0x0c, 0x1a, 0x80, 0x00, 0x04, 0x80, 0x30, 0x3f, 0xa0, 0x08, 0x87, 0x38, 0x80, 0x2c, 0x37, 0xa0, 0x0c, 0x00, 0x06, 0x80, 0x06, 0x9b, 0x1a, 0x19, 0x80, 0x00, 0x04, 0x80, 0x30, 0x3f, 0x80, 0x03, 0x30, 0xa0, 0x00, 0x18, 0x39, 0x38, 0x80, 0x28, 0x37, 0x06, 0x80, 0x06, 0x1b, 0x80, 0x00, 0x04, 0x80, 0x30, 0x3f, 0x80, 0x05, 0x30, 0xa0, 0x00, 0x30, 0x39, 0x38, 0x80, 0x2a, 0x37, 0x80, 0x01, 0x80, 0x2f, 0x17, 0x01, 0x8a, 0x80, 0xca, 0x0d, 0x22, 0x4f, 0x80, 0x07, 0x0a, 0x80, 0x41, 0x0d, 0x80, 0x0c, 0x1a, 0x80, 0x00, 0x04, 0x80, 0x30, 0x3f, 0xa0, 0x0b, 0x87, 0x38, 0x80, 0x2c, 0x37, 0xa0, 0x0c, 0x00, 0x80, 0x00, 0x87, 0x80, 0x03, 0x1c, 0x80, 0x30, 0x3f, 0x80, 0x03, 0x30, 0x38, 0xa0, 0x00, 0x10, 0x39, 0x80, 0x28, 0x37, 0x80, 0x32, 0x3f, 0x80, 0x05, 0x30, 0x38, 0xa0, 0x00, 0x15, 0x38, 0x80, 0x2a, 0x37, 0x80, 0x04, 0x80, 0x2f, 0x17, 0x01, 0x8a, 0x80, 0xd4, 0x0d, 0x22, 0x6c, 0x80, 0x07, 0x1c, 0x80, 0x0c, 0x1a, 0x80, 0x00, 0x04, 0x80, 0x30, 0x3f, 0xa0, 0x0b, 0x87, 0x38, 0x80, 0x2c, 0x37, 0xa0, 0x0c, 0x00, 0x80, 0x00, 0x87, 0x80, 0x03, 0x1c, 0x80, 0x04, 0x04, 0x19, 0x80, 0x30, 0x3f, 0x80, 0x03, 0x30, 0x38, 0xa0, 0x00, 0x18, 0x39, 0x80, 0x28, 0x37, 0x80, 0x32, 0x3f, 0x80, 0x05, 0x30, 0x38, 0xa0, 0x00, 0x15, 0x38, 0x80, 0x2a, 0x37, 0x80, 0x14, 0x80, 0x2f, 0x17, 0x01, 0x8a, 0x80, 0xd0, 0x0d, 0x22, 0x6c, 0x80, 0x05, 0x30, 0xa0, 0x00, 0x10, 0x39, 0x80, 0x2a, 0x37, 0x80, 0x05, 0xa0, 0x07, 0x47, 0xa0, 0x03, 0x65, 0x2e, 0x80, 0x00, 0x80, 0x26, 0x17, 0x80, 0x03, 0x30, 0x80, 0x05, 0x30, 0x27, 0x27, 0x80, 0x19, 0x30, 0x80, 0x1b, 0x30, 0x80, 0x02, 0x80, 0x54, 0x0e, 0x27, 0x27, 0x80, 0x15, 0x30, 0x80, 0x17, 0x30, 0x80, 0x00, 0x80, 0x47, 0x0e, 0x27, 0x27, 0x80, 0x11, 0x30, 0x80, 0x13, 0x30, 0x80, 0x00, 0x80, 0x3a, 0x0e, 0xa0, 0x00, 0x01, 0x39, 0x80, 0x2a, 0x37, 0xa0, 0x00, 0x01, 0x39, 0x80, 0x28, 0x37, 0xa0, 0x05, 0x37, 0x80, 0x2c, 0x37, 0x80, 0x0a, 0x80, 0x2f, 0x17, 0x6c, 0x80, 0x76, 0x80, 0x26, 0x17, 0x80, 0x03, 0x30, 0xa0, 0x00, 0x20, 0x39, 0x80, 0x28, 0x37, 0x80, 0x2c, 0x37, 0x80, 0x00, 0x80, 0x04, 0x80, 0x2f, 0x17, 0x01, 0x8a, 0x80, 0xf6, 0x0d, 0x22, 0x6c, 0x0f, 0x80, 0x70, 0x33, 0x80, 0x62, 0x33, 0x80, 0x09, 0x31, 0x80, 0x07, 0x31, 0x80, 0x59, 0x32, 0x80, 0x07, 0x30, 0x39, 0xa0, 0x04, 0x9d, 0x2e, 0x80, 0x0b, 0x31, 0xa0, 0x00, 0x00, 0x80, 0x53, 0x32, 0x80, 0x09, 0x30, 0x39, 0xa0, 0x04, 0x9d, 0x2e, 0x39, 0x80, 0x0d, 0x31, 0xa0, 0xff, 0xff, 0x80, 0x00, 0x80, 0x07, 0x30, 0x80, 0x31, 0x32, 0xa0, 0x04, 0xab, 0x2e, 0x26, 0x38, 0x38, 0x80, 0x5b, 0x33, 0xa0, 0xff, 0xff, 0x80, 0x00, 0x80, 0x09, 0x30, 0x80, 0x27, 0x32, 0xa0, 0x04, 0xab, 0x2e, 0x26, 0x38, 0x38, 0x80, 0x64, 0x33, 0x80, 0x0b, 0x30, 0x80, 0x0d, 0x30, 0x38, 0x80, 0x0f, 0x31, 0x80, 0x07, 0x30, 0x26, 0x80, 0x28, 0x37, 0xa0, 0x00, 0x00, 0x28, 0x80, 0x09, 0x30, 0x26, 0x80, 0x2a, 0x37, 0xa0, 0x00, 0x00, 0x28, 0xcf, 0x80, 0x2e, 0x17, 0x1c, 0x80, 0x45, 0x0d, 0x80, 0x0f, 0x30, 0x26, 0x38, 0x26, 0x80, 0x0d, 0x30, 0xa0, 0x04, 0xab, 0x2e, 0x80, 0x14, 0x0d, 0x80, 0x0f, 0x30, 0x80, 0x0d, 0x30, 0x38, 0x80, 0x0f, 0x31, 0x80, 0x07, 0x30, 0xa0, 0x00, 0x00, 0x38, 0x80, 0x07, 0x31, 0x80, 0x0b, 0x30, 0xa0, 0x04, 0xb5, 0x2e, 0x80, 0x14, 0x0d, 0x80, 0x0f, 0x30, 0x80, 0x0b, 0x30, 0x38, 0x80, 0x0f, 0x31, 0x80, 0x09, 0x30, 0xa0, 0x00, 0x00, 0x38, 0x80, 0x09, 0x31, 0x80, 0x9d, 0x0c, 0x42, 0x6c, 0x80, 0x22, 0x36, 0x80, 0x03, 0x3f, 0x03, 0x80, 0x24, 0x13, 0x80, 0x24, 0x36, 0x80, 0x02, 0x3f, 0x03, 0x80, 0x16, 0x13, 0xa0, 0x05, 0x3f, 0x80, 0x2c, 0x37, 0xa0, 0x00, 0x00, 0x26, 0x80, 0x28, 0x37, 0x80, 0x2a, 0x37, 0x80, 0x11, 0x80, 0x26, 0x17, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x01, 0x80, 0x2f, 0x17, 0x01, 0x8a, 0x80, 0xf6, 0x0d, 0x22, 0xa0, 0x00, 0x00, 0x80, 0x28, 0x37, 0x80, 0x2a, 0xb6, 0xa0, 0x00, 0x10, 0x38, 0x05, 0x37, 0x01, 0x8a, 0x80, 0xdd, 0x0d, 0x22, 0x6c, 0x26, 0x80, 0x0f, 0x3f, 0x08, 0x80, 0x05, 0x0d, 0xa0, 0x00, 0x00, 0x24, 0x39, 0x6c, 0xa0, 0x80, 0x00, 0xaf, 0x38, 0x24, 0x6f, 0x38, 0x2a, 0x6c, 0xa0, 0x80, 0x00, 0xaf, 0x38, 0x24, 0x6f, 0x38, 0x2b, 0x6c, 0x80, 0x00, 0x8d, 0x00, 0x9a, 0x02, 0xa7, 0x06, 0xb4, 0x0b, 0xc0, 0x11, 0xcb, 0x18, 0xd5, 0x20, 0xdf, 0x2a, 0xe7, 0x34, 0xee, 0x40, 0xf4, 0x4b, 0xf9, 0x58, 0xfd, 0x65, 0xff, 0x72, 0xff, 0x80, 0xff, 0x8d, 0xfd, 0x9a, 0xf9, 0xa7, 0xf4, 0xb4, 0xee, 0xc0, 0xe7, 0xcb, 0xdf, 0xd5, 0xd5, 0xdf, 0xcb, 0xe7, 0xc0, 0xee, 0xb4, 0xf4, 0xa7, 0xf9, 0x9a, 0xfd, 0x8d, 0xff, 0x80, 0xff, 0x72, 0xff, 0x65, 0xfd, 0x58, 0xf9, 0x4b, 0xf4, 0x40, 0xee, 0x34, 0xe7, 0x2a, 0xdf, 0x20, 0xd5, 0x18, 0xcb, 0x11, 0xc0, 0x0b, 0xb4, 0x06, 0xa7, 0x02, 0x9a, 0x00, 0x8d, 0x00, 0x80, 0x00, 0x72, 0x02, 0x65, 0x06, 0x58, 0x0b, 0x4b, 0x11, 0x3f, 0x18, 0x34, 0x20, 0x2a, 0x2a, 0x20, 0x34, 0x18, 0x3f, 0x11, 0x4b, 0x0b, 0x58, 0x06, 0x65, 0x02, 0x72, 0x00, 0x40, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x1f, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0f, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xfd, 0xf0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfc, 0xfe, 0xfe, 0x0f, 0x0f, 0x1f, 0x1f, 0x3f, 0x3f, 0x7f, 0x7f, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0xc1, 0xe1, 0xf3, 0xf7, 0x7f, 0xfc, 0xfc, 0xf8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0x1f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x83, 0x87, 0xcf, 0xef, 0xfe, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x07, 0x07, 0x07, 0x03, 0x00, 0x01, 0x03, 0x07, 0x3f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xc7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe3, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe0, 0xe0, 0xc0, 0x00, 0x80, 0xc0, 0xe0, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x04, 0x10, 0x10, 0x09, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x10, 0x8c, 0x03, 0x40, 0x90, 0x10, 0xc0, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x01, 0x02, 0x00, 0x49, 0x86, 0x00, 0x00, 0x00, 0xe0, 0x17, 0x00, 0x92, 0x61, 0x00, 0x00, 0x00, 0x07, 0xe8, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x80, 0x40, 0x00, 0x08, 0x31, 0xc0, 0x02, 0x09, 0x08, 0x03, 0x08, 0x08, 0x90, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x01, 0x06, 0x08, 0x10, 0x20, 0x02, 0xfe, 0x9e, 0x26, 0x0f, 0x07, 0x0f, 0x7f, 0x08, 0x08, 0x38, 0x08, 0x08, 0x8f, 0xf0, 0x00, 0x10, 0x10, 0x1c, 0x10, 0x10, 0xf1, 0x0f, 0x00, 0x40, 0x7f, 0x79, 0x64, 0xf0, 0xe0, 0xf0, 0xfe, 0x1c, 0xe0, 0x00, 0x80, 0x60, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x41, 0x83, 0x87, 0x4f, 0x3f, 0x1f, 0x3f, 0xfc, 0xf8, 0xf1, 0xe1, 0xc1, 0x81, 0x01, 0x00, 0x02, 0x02, 0x42, 0x42, 0x42, 0x40, 0x40, 0x00, 0xc0, 0x20, 0x61, 0x81, 0xe1, 0x01, 0x01, 0x00, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x02, 0x82, 0xc1, 0xe1, 0xf2, 0xfc, 0xf8, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x7e, 0x7c, 0x7c, 0xfc, 0xf8, 0xf8, 0xf9, 0x48, 0x54, 0x54, 0x54, 0x48, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x04, 0x0c, 0x10, 0x1c, 0x00, 0x03, 0x00, 0x7c, 0x7e, 0x3e, 0x3e, 0x3f, 0x1f, 0x1f, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x28, 0x24, 0x30, 0xf8, 0xf8, 0xf8, 0xf8, 0x7c, 0xfc, 0x7c, 0x3e, 0xc0, 0x40, 0x80, 0x00, 0x00, 0x10, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x04, 0x0c, 0x14, 0x1f, 0x9f, 0x1f, 0x1f, 0x3e, 0x3f, 0x3e, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x14, 0x24, 0x0c, 0x28, 0x10, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x1e, 0x0f, 0x07, 0x33, 0x39, 0x19, 0x81, 0x63, 0x28, 0x10, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0x00, 0x00, 0x70, 0x10, 0x21, 0x41, 0x41, 0x00, 0x00, 0x00, 0x03, 0xc2, 0x03, 0x80, 0x43, 0x80, 0x1e, 0x04, 0x81, 0x03, 0x07, 0x8f, 0x1f, 0x7f, 0x78, 0xf0, 0xe0, 0xcc, 0x9c, 0x98, 0x81, 0xc6, 0x14, 0x08, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x1f, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xfe, 0xf8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x73, 0x61, 0xc1, 0xc3, 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf8, 0xfb, 0x01, 0x03, 0x07, 0x0e, 0x0c, 0x1c, 0x1c, 0xdc, 0xff, 0xff, 0x3f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0xf0, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc1, 0x61, 0x73, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xf7, 0xf6, 0xef, 0xde, 0xdc, 0xdc, 0xdc, 0xdc, 0xec, 0x6e, 0xf7, 0x7b, 0x3f, 0x3f, 0x3f, 0x3f, 0x1f, 0x1f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0x0f, 0x3f, 0x79, 0x70, 0xe0, 0xe1, 0xe1, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf8, 0xfb, 0x01, 0x03, 0x07, 0x0f, 0x0e, 0x1e, 0x1e, 0xde, 0xff, 0xff, 0x9f, 0x0f, 0x0f, 0x1f, 0x1f, 0x1f, 0xf0, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0x70, 0x79, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xf7, 0xf6, 0xef, 0xde, 0xde, 0xde, 0xde, 0xde, 0xee, 0x6f, 0xf7, 0x7b, 0x1f, 0x1f, 0x1f, 0x1f, 0x0f, 0x0f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0x0f, 0x3f, 0x7e, 0x7c, 0xf8, 0xf8, 0xf8, 0xf8, 0xff, 0xff, 0x7f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf8, 0xfb, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x1f, 0x1f, 0xdf, 0xff, 0xff, 0xe7, 0xc3, 0x83, 0x83, 0x83, 0x83, 0xf0, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x7c, 0x7e, 0xbf, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x7f, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xf7, 0xf6, 0xef, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xef, 0x6f, 0xf7, 0x7b, 0x83, 0x83, 0x83, 0x83, 0x83, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0x0f, 0x3f, 0x7f, 0x7f, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0x9f, 0x0f, 0x07, 0x07, 0x07, 0x07, 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf8, 0xfb, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x1f, 0x1f, 0xdf, 0xff, 0xff, 0xf9, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xfc, 0xfe, 0xfe, 0x7f, 0x7f, 0x7f, 0x7f, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x7f, 0x7f, 0xbf, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x9f, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xf7, 0xf6, 0xef, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xef, 0x6f, 0xf7, 0x7b, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf9, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0xfe, 0xfd, 0xff, 0x0f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc1, 0xc1, 0xc1, 0xc1, 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf8, 0xfb, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x1f, 0x1f, 0xdf, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf0, 0xfc, 0x7e, 0x3e, 0x1f, 0x1f, 0x1f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xbf, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc3, 0xe7, 0xff, 0xfb, 0xfb, 0xfb, 0xfb, 0xf7, 0xf6, 0xef, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xef, 0x6f, 0xf7, 0x7b, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xff, 0x1f, 0x1f, 0x1f, 0x1f, 0x1e, 0x3e, 0x7d, 0xff, 0x0f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0x80, 0xc0, 0xe0, 0xf0, 0x70, 0x70, 0x78, 0x7b, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x1f, 0x1f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xfc, 0x9e, 0x0e, 0x07, 0x87, 0x87, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xbf, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf9, 0xff, 0x7b, 0x7b, 0x7b, 0x7b, 0x77, 0xf6, 0xef, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xef, 0x6f, 0xf7, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x87, 0x87, 0x07, 0x06, 0x0e, 0x9d, 0xff, 0x0f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0x80, 0xc0, 0xe0, 0x70, 0x30, 0x30, 0x38, 0x3b, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x1f, 0x1f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xfc, 0xce, 0x86, 0x83, 0xc3, 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xbf, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, 0xf8, 0xfc, 0xff, 0x3b, 0x3b, 0x3b, 0x3b, 0x37, 0x76, 0xef, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xef, 0x6f, 0xf7, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0x82, 0x86, 0xcd, 0xff, 0x0f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0x80, 0xc0, 0x60, 0x30, 0x10, 0x10, 0x18, 0x1b, 0x01, 0x03, 0x07, 0x0f, 0x0f, 0x1f, 0x1f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xfc, 0xe6, 0xc2, 0xc1, 0xe1, 0xe1, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xbf, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfc, 0xfe, 0xff, 0x1b, 0x1b, 0x1b, 0x1b, 0x17, 0x36, 0x6f, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xef, 0x6f, 0xf7, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xe1, 0xe1, 0xe1, 0xc0, 0xc2, 0xe5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x1e, 0x3e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x3f, 0x1f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x07, 0x1f, 0x7f, 0xfe, 0xfc, 0xf8, 0xf0, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x3f, 0x7f, 0x7f, 0x01, 0x07, 0xff, 0xff, 0xfe, 0xf8, 0xe0, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x3f, 0x7f, 0xff, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0f, 0x1f, 0x3e, 0xfe, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0x7e, 0x00, 0xfc, 0xfc, 0xf8, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x0f, 0x0f, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7e, 0xfe, 0xfc, 0xfc, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x07, 0x07, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0f, 0x1f, 0x1f, 0x3f, 0x7f, 0xff, 0xfe, 0xfc, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x03, 0x00, 0x00, 0x00, 0xfc, 0xf8, 0xf0, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
	0xa0, 0x0f, 0xff, 0x80, 0x08, 0x37, 0xa0, 0x0f, 0x0f, 0x80, 0x0a, 0x37, 0xa0, 0x0f, 0x0f, 0x80, 
	0x0c, 0x37, 0x80, 0x22, 0x36, 0x80, 0x01, 0x3f, 0x80, 0x00, 0x31, 0x80, 0x24, 0x36, 0x80, 0x01, 
	0x3f, 0x80, 0x02, 0x31, 0xa0, 0x00, 0x68, 0x80, 0x04, 0x31, 0xa0, 0x00, 0x30, 0x80, 0x06, 0x31, 
	0x80, 0x00, 0x30, 0x80, 0x04, 0x30, 0x80, 0x01, 0x3f, 0x39, 0x80, 0x08, 0x31, 0x80, 0x02, 0x30, 
	0x80, 0x06, 0x30, 0x80, 0x01, 0x3f, 0x39, 0x80, 0x0a, 0x31, 0x80, 0x08, 0x30, 0x80, 0x04, 0x30, 
	0x38, 0x80, 0x0c, 0x31, 0x80, 0x0a, 0x30, 0x80, 0x06, 0x30, 0x38, 0x80, 0x0e, 0x31, 0xa0, 0x01, 
	0x7a, 0x80, 0x80, 0x37, 0x80, 0x08, 0x30, 0x80, 0x0a, 0x30, 0x80, 0x0c, 0x30, 0x80, 0x0e, 0x30, 
	0x80, 0x03, 0xa0, 0x03, 0x22, 0x2e, 0x80, 0x11, 0x0e, 0x00, 0x80, 0x0d, 0x0e, 0x80, 0x82, 0x16, 
	0x80, 0x08, 0x08, 0x0c, 0x00, 0xa0, 0x01, 0x0e, 0x17, 0x00, 0x80, 0x82, 0x16, 0x0f, 0x80, 0x08, 
	0x30, 0xa0, 0x00, 0x10, 0x38, 0x80, 0x28, 0x37, 0x80, 0x0a, 0x30, 0xa0, 0x00, 0x10, 0x38, 0x80, 
	0x2a, 0x37, 0xa0, 0x03, 0x8e, 0x80, 0x2c, 0x37, 0x80, 0x03, 0xcf, 0x80, 0x04, 0x1f, 0x80, 0x01, 
	0x1c, 0x19, 0x80, 0x2f, 0x17, 0x80, 0x2a, 0x36, 0xa0, 0x00, 0x10, 0x38, 0x80, 0x2a, 0x37, 0xa0, 
	0x03, 0x96, 0x80, 0x2c, 0x37, 0x80, 0x03, 0xcf, 0x80, 0x05, 0x1f, 0x80, 0x01, 0x1c, 0x19, 0x80, 
	0x2f, 0x17, 0x80, 0x2a, 0x36, 0xa0, 0x00, 0x08, 0x39, 0x80, 0x2a, 0x37, 0x80, 0x28, 0x36, 0xa0, 
	0x00, 0x08, 0x39, 0x80, 0x28, 0x37, 0xa0, 0x03, 0x9e, 0x80, 0x2c, 0x37, 0x80, 0x03, 0xcf, 0x80, 
	0x06, 0x1f, 0x80, 0x01, 0x1c, 0x19, 0x80, 0x2f, 0x17, 0x80, 0x28, 0x36, 0xa0, 0x00, 0x10, 0x38, 
	0x80, 0x28, 0x37, 0xa0, 0x03, 0xa6, 0x80, 0x2c, 0x37, 0x80, 0x03, 0xcf, 0x80, 0x07, 0x1f, 0x80, 
	0x01, 0x1c, 0x19, 0x80, 0x2f, 0x17, 0x80, 0x28, 0x36, 0xa0, 0x00, 0x08, 0x39, 0x80, 0x28, 0x37, 
	0xa0, 0x03, 0x86, 0x80, 0x2c, 0x37, 0x80, 0x03, 0x80, 0x2f, 0x17, 0x80, 0x02, 0x30, 0xa0, 0x00, 
	0x09, 0x38, 0x80, 0x2a, 0x37, 0x80, 0x00, 0x30, 0xa0, 0x00, 0x09, 0x39, 0x80, 0x28, 0x37, 0xa0, 
	0x03, 0xae, 0x80, 0x2c, 0x37, 0x80, 0x03, 0xcf, 0x80, 0x03, 0x1f, 0x80, 0x01, 0x1c, 0x19, 0x80, 
	0x2f, 0x17, 0x80, 0x00, 0x30, 0xa0, 0x00, 0x04, 0x38, 0x80, 0x28, 0x37, 0xa0, 0x03, 0xae, 0x80, 
	0x2c, 0x37, 0x80, 0x03, 0xcf, 0x80, 0x02, 0x1f, 0x80, 0x01, 0x1c, 0x19, 0x80, 0x2f, 0x17, 0x80, 
	0x02, 0x30, 0x80, 0x2a, 0x37, 0x80, 0x00, 0x30, 0xa0, 0x00, 0x18, 0x38, 0x80, 0x28, 0x37, 0xa0, 
	0x03, 0xb6, 0x80, 0x2c, 0x37, 0x80, 0x03, 0xcf, 0x80, 0x01, 0x1f, 0x80, 0x01, 0x1c, 0x19, 0x80, 
	0x2f, 0x17, 0x80, 0x2a, 0x36, 0xa0, 0x00, 0x0a, 0x38, 0x80, 0x2a, 0x37, 0xa0, 0x04, 0x16, 0x80, 
	0x2c, 0x37, 0x80, 0x03, 0x80, 0x2f, 0x17, 0x80, 0x02, 0x30, 0x80, 0x2a, 0x37, 0x80, 0x00, 0x30, 
	0xa0, 0x00, 0x24, 0x38, 0x80, 0x28, 0x37, 0xa0, 0x03, 0xb6, 0x80, 0x2c, 0x37, 0x80, 0x03, 0x4f, 
	0x80, 0x01, 0x1c, 0x19, 0x80, 0x2f, 0x17, 0x80, 0x2a, 0x36, 0xa0, 0x00, 0x0a, 0x38, 0x80, 0x2a, 
	0x37, 0xa0, 0x04, 0x0e, 0x80, 0x2c, 0x37, 0x80, 0x03, 0x80, 0x2f, 0x17, 0x80, 0x00, 0x30, 0xa0, 
	0x00, 0x10, 0x39, 0x80, 0x28, 0x37, 0x80, 0x02, 0x30, 0xa0, 0x00, 0x10, 0x39, 0x80, 0x2a, 0x37, 
	0x80, 0x01, 0x80, 0x26, 0x17, 0x80, 0x82, 0x36, 0x80, 0x06, 0x0e, 0x80, 0x00, 0x80, 0x26, 0x17, 
	0x6c, 0x04, 0x80, 0x00, 0x0e, 0x06, 0x80, 0x04, 0x1f, 0x80, 0x00, 0x0e, 0x80, 0x00, 0x04, 0x80, 
	0x0f, 0x1c, 0x80, 0x30, 0x3f, 0xa0, 0x03, 0xbe, 0x38, 0x80, 0x2c, 0x37, 0x80, 0x03, 0x80, 0x2f, 
	0x17, 0x6c, 0x0f, 0x26, 0x80, 0x3c, 0x33, 0x80, 0x2b, 0x33, 0x26, 0x80, 0x49, 0x33, 0x80, 0x0f, 
	0x33, 0x26, 0x80, 0x31, 0x33, 0x80, 0x13, 0x33, 0x26, 0x80, 0x31, 0x33, 0x80, 0x05, 0x33, 0xa0, 
	0x00, 0x00, 0x21, 0xa0, 0x00, 0x00, 0x26, 0x80, 0x28, 0x37, 0xa0, 0x00, 0x00, 0x80, 0x2a, 0x37, 
	0xcf, 0x80, 0x2e, 0x97, 0xa0, 0x00, 0x00, 0x80, 0x2a, 0x37, 0x17, 0x21, 0xaa, 0x80, 0xe6, 0x0d, 
	0x22, 0x22, 0xa0, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x26, 0x80, 0x2a, 0x37, 0xa0, 0x00, 0x00, 0x80, 
	0x28, 0x37, 0xcf, 0x80, 0x2e, 0x97, 0xa0, 0x00, 0x00, 0x80, 0x28, 0x37, 0x17, 0x21, 0xaa, 0x80, 
	0xe6, 0x0d, 0x22, 0x22, 0x42, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xff, 
	0xe7, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0x7e, 0x7f, 0xff, 
	0xef, 0xcf, 0xcf, 0xef, 0xff, 0x7f, 0xfe, 0xff, 0xf7, 0xf3, 0xf3, 0xf7, 0xff, 0xfe, 0x00, 0x00, 
	0x7e, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x7c, 
	0x82, 0x82, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x7c, 
	0x82, 0x02, 0x7c, 0x80, 0x80, 0xfe, 0x00, 0x7c, 0x82, 0x02, 0x1c, 0x02, 0x82, 0x7c, 0x00, 0x0c, 
	0x14, 0x24, 0x44, 0x84, 0xfe, 0x04, 0x00, 0xfe, 0x80, 0x80, 0x7c, 0x02, 0x82, 0x7c, 0x00, 0x7c, 
	0x82, 0x80, 0xfc, 0x82, 0x82, 0x7c, 0x00, 0xfe, 0x02, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, 0x7c, 
	0x82, 0x82, 0x7c, 0x82, 0x82, 0x7c, 0x00, 0x7c, 0x82, 0x82, 0x7e, 0x02, 0x82, 0x7c, 0x00, 0x7c, 
	0x82, 0x02, 0x7e, 0x82, 0x82, 0x7e, 0x00, 0xfc, 0x82, 0x82, 0xfc, 0x82, 0x82, 0xfc, 0x00, 0x7c, 
	0x82, 0x80, 0x80, 0x80, 0x82, 0x7c, 0x00, 0xfc, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfc, 0x00, 0xfe, 
	0x80, 0x80, 0xfe, 0x80, 0x80, 0xfe, 0x00, 0xfe, 0x80, 0x80, 0xf0, 0x80, 0x80, 0x80, 
};

/* Varvara */



@@ 34,23 86,11 @@ emu_error(char *msg, const char *err)
}

static int
load(Uxn *u, char *filepath)
{
	SDFile *f = pd->file->open(filepath, kFileRead | kFileReadData);
	if(f == NULL)
		return emu_error("Missing file", filepath);
	pd->file->read(f, u->ram + PAGE_PROGRAM, sizeof(u->ram) - PAGE_PROGRAM);
	pd->system->logToConsole("Loaded %s\n", filepath);
	return 1;
}

static int
emu_load(unsigned char *r)
{
	int i, len = sizeof(rom);
	for(i = 0; i < len; i++) {
	for(i = 0; i < len; i++)
		u.ram[PAGE_PROGRAM + i] = rom[i];
	}
	return 1;
}



@@ 62,32 102,6 @@ console_deo(Uint8 *d, Uint8 port)
}

Uint8
datetime_dei(Uint8 *d, Uint8 port)
{
	/*
	time_t seconds = time(NULL);
	struct tm zt = {0};
	struct tm *t = localtime(&seconds);
	if(t == NULL)
		t = &zt;
	switch(port) {
	case 0x0: return (t->tm_year + 1900) >> 8;
	case 0x1: return (t->tm_year + 1900);
	case 0x2: return t->tm_mon;
	case 0x3: return t->tm_mday;
	case 0x4: return t->tm_hour;
	case 0x5: return t->tm_min;
	case 0x6: return t->tm_sec;
	case 0x7: return t->tm_wday;
	case 0x8: return t->tm_yday >> 8;
	case 0x9: return t->tm_yday;
	case 0xa: return t->tm_isdst;
	default: return d[port];
	}
*/
}

Uint8
screen_dei(Uint8 *d, Uint8 port)
{
	switch(port) {


@@ 99,31 113,6 @@ screen_dei(Uint8 *d, Uint8 port)
	}
}

static uint8_t blending[5][16] = {
	{0, 0, 0, 0, 1, 0, 1, 1, 2, 2, 0, 2, 3, 3, 3, 0},
	{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3},
	{1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1, 1, 2, 3, 1},
	{2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2, 2, 3, 1, 2},
	{1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0}};

static void
screen_blit(Uint8 layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy, Uint8 twobpp)
{
	int v, h, opaque = blending[4][color];
	for(v = 0; v < 8; v++) {
		Uint16 c = sprite[v] | (twobpp ? sprite[v + 8] : 0) << 8;
		for(h = 7; h >= 0; --h, c >>= 1) {
			Uint8 ch = (c & 1) | ((c >> 7) & 2);
			if(opaque || ch)
				ppu_pixel(&ppu,
					layer,
					x + (flipx ? 7 - h : h),
					y + (flipy ? 7 - v : v),
					blending[ch][color]);
		}
	}
}

void
screen_deo(Uint8 *d, Uint8 port)
{


@@ 154,7 143,7 @@ screen_deo(Uint8 *d, Uint8 port)
		if(addr > 0x10000 - ((n + 1) << (3 + twobpp)))
			return;
		for(i = 0; i <= n; i++) {
			screen_blit(!!layer, x + dy * i, y + dx * i, &u.ram[addr], d[0xf] & 0xf, d[0xf] & 0x10, d[0xf] & 0x20, twobpp);
			screen_blit(&ppu, !!layer, x + dy * i, y + dx * i, &u.ram[addr], d[0xf] & 0xf, d[0xf] & 0x10, d[0xf] & 0x20, twobpp);
			addr += (d[0x6] & 0x04) << (1 + twobpp);
		}
		POKDEV(0xc, addr);   /* auto addr+length */


@@ 172,9 161,7 @@ emu_dei(Uxn *u, Uint8 addr)
	Uint8 p = addr & 0x0f, d = addr & 0xf0;
	switch(d) {
	case 0x20: return screen_dei(&u->dev[d], p);
	case 0xc0: return datetime_dei(&u->dev[d], p);
	}
	pd->system->logToConsole("%02x", addr);
	return u->dev[addr];
}



@@ 223,22 210,13 @@ read_buttons(void)
		state |= !!(current & 0x01) << 0x6;
		state |= !!(current & 0x02) << 0x7;
		u.dev[0x82] = state;
		pd->system->logToConsole("%02x -> %02x", current, state);
		uxn_eval(&u, GETVEC(&u.dev[0x80]));
	}
}

static int update(void *userdata);
const char *fontpath = "/System/Fonts/Asheville-Sans-14-Bold.pft";
LCDFont *font = NULL;

#ifdef _WINDLL
__declspec(dllexport)
#endif

	static int menu_reset(lua_State *L)
static int
menu_reset(lua_State *L)
{

	return 0;
}



@@ 280,10 258,13 @@ update_controller(lua_State *L)

	return 0;
}

static int
update_mouse(lua_State *L)
{
	int i;
	for(i = 0; i < 5; ++i)
		u.dev[0x92 + i] = pd->lua->getArgInt(i + 1);
	uxn_eval(&u, GETVEC(&u.dev[0x90]));
	return 0;
}



@@ 326,4 307,3 @@ eventHandler(PlaydateAPI *playdate, PDSystemEvent event, uint32_t arg)
	}
	return 0;
}