From ca479d6b8c5157b3fecfc26f036c97612b36a54e Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Tue, 28 Mar 2017 12:22:33 -0400 Subject: [PATCH] more work on vector game; williams examples, tools --- package.json | 2 +- presets/galaxian-scramble/gfxtest.c | 63 +- presets/galaxian-scramble/shoot2.c | 4 +- presets/mw8080bw/shifter.c | 60 ++ presets/vector-z80color/game.c | 287 +++++++-- presets/williams-z80/bitmap_rle.c | 151 +++++ presets/{williams => williams-z80}/gfxtest.c | 60 +- presets/williams-z80/sprites.c | 241 ++++++++ src/platform/galaxian.js | 13 +- src/platform/vector.js | 15 +- src/platform/williams.js | 27 +- src/worker/workermain.js | 7 +- test/cli/test1.c | 615 +++++++++++++++++++ test/cli/testworker.js | 8 + tools/Makefile | 19 +- tools/badspacerobots.png | Bin 0 -> 124828 bytes tools/pbm_to_c.py | 2 +- tools/pcx2will.py | 37 ++ 18 files changed, 1473 insertions(+), 138 deletions(-) create mode 100644 presets/mw8080bw/shifter.c create mode 100644 presets/williams-z80/bitmap_rle.c rename presets/{williams => williams-z80}/gfxtest.c (78%) create mode 100644 presets/williams-z80/sprites.c create mode 100644 test/cli/test1.c create mode 100644 tools/badspacerobots.png create mode 100755 tools/pcx2will.py diff --git a/package.json b/package.json index ba05287b..4fb9cf30 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "scripts": { "test": "npm run test-node && npm run test-browser", - "test-node": "mocha --recursive --timeout 5000 test/cli", + "test-node": "mocha --recursive --timeout 20000 test/cli", "test-browser": "mocha-phantomjs ./testemu.html" }, "repository": { diff --git a/presets/galaxian-scramble/gfxtest.c b/presets/galaxian-scramble/gfxtest.c index 18d65618..fc4554a4 100644 --- a/presets/galaxian-scramble/gfxtest.c +++ b/presets/galaxian-scramble/gfxtest.c @@ -97,26 +97,6 @@ void putstring(byte x, byte y, const char* string) { static int frame; -void testpattern() { - byte i; - watchdog++; - for (i=0; i<32; i++) { - columns[i].attrib = i; - columns[i].scroll = frame; - } - for (i=0; i<8; i++) { - sprites[i].xpos = i*16-frame; - sprites[i].ypos = i*32; - sprites[i].code = i*8; - sprites[i].color = i; - } - for (i=0; i<8; i++) { - missiles[i].xpos = i*32; - missiles[i].ypos = i*16-frame; - } - frame++; -} - void draw_all_chars() { byte i; i = 0; @@ -129,16 +109,6 @@ void draw_all_chars() { } while (++i); } -void draw_test_sprites() { - byte i; - for (i=0; i<8; i++) { - sprites[i].xpos = i*16-frame; - sprites[i].ypos = 190; - sprites[i].code = i+16; - sprites[i].color = 2; - } -} - void putshape(byte x, byte y, byte ofs) { putchar(x, y, ofs+2); putchar(x+1, y, ofs); @@ -146,7 +116,7 @@ void putshape(byte x, byte y, byte ofs) { putchar(x+1, y+1, ofs+1); } -void draw_alien(byte ofs, byte y) { +void draw_sprites(byte ofs, byte y) { byte i; byte x = 0; columns[y].attrib = 1; @@ -175,17 +145,36 @@ void draw_explosion(byte ofs, byte y) { } } +void draw_missiles() { + byte i; + for (i=0; i<7; i++) { + missiles[i].ypos = i + 24; + missiles[i].xpos = i*16 + frame; + sprites[i].xpos = i*32 + frame; + sprites[i].ypos = i*24 + frame; + } +} + +void draw_corners() { + vram[2][0]++; + vram[2][31]++; + vram[29][0]++; + vram[29][31]++; +} + void main() { clrscr(); while (1) { draw_all_chars(); - //draw_test_sprites(); - draw_alien(0x30, 18); - draw_alien(0x50, 21); - draw_alien(0x70, 24); - draw_alien(0xa0, 27); + draw_sprites(0x30, 18); + draw_sprites(0x50, 21); + draw_sprites(0x70, 24); + draw_sprites(0xa0, 27); + draw_sprites(0x0, 29); draw_explosion(0xc0, 12); - putstring(0, 0, "HELLO@WORLD@123"); + draw_missiles(); + putstring(7, 0, "HELLO@WORLD@123"); + draw_corners(); columns[1].attrib = frame; enable_stars = 0&0xff; frame++; diff --git a/presets/galaxian-scramble/shoot2.c b/presets/galaxian-scramble/shoot2.c index 4b8b8500..039cbd3c 100644 --- a/presets/galaxian-scramble/shoot2.c +++ b/presets/galaxian-scramble/shoot2.c @@ -28,8 +28,8 @@ byte __at (0x5080) xram[128]; byte __at (0x6801) enable_irq; byte __at (0x6804) enable_stars; -byte __at (0x6805) missile_width; -byte __at (0x6806) missile_offset; +byte __at (0x6808) missile_width; +byte __at (0x6809) missile_offset; byte __at (0x7000) watchdog; byte __at (0x8100) input0; byte __at (0x8101) input1; diff --git a/presets/mw8080bw/shifter.c b/presets/mw8080bw/shifter.c new file mode 100644 index 00000000..61b7c616 --- /dev/null +++ b/presets/mw8080bw/shifter.c @@ -0,0 +1,60 @@ + +#include + +typedef unsigned char byte; +typedef unsigned char word; + +__sfr __at (0x2) bitshift_offset; +__sfr __at (0x3) bitshift_read; +__sfr __at (0x4) bitshift_value; +__sfr __at (0x6) watchdog_strobe; + +byte __at (0x2400) vidmem[224][32]; // 256x224x1 video memory + +void main(); +// start routine @ 0x0 +// set stack pointer, enable interrupts +void start() { +__asm + LD SP,#0x2400 + DI +__endasm; + main(); +} + +const byte bitmap1[] = +{9,56,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,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x80,0xfb,0xff,0xf0,0x01,0x00,0x00,0x00,0x00,0x40,0x04,0x80,0xf3,0x01,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x06,0xfe,0x03,0xfa,0x01,0x00,0x00,0x00,0x00,0x83,0xff,0x03,0xfd,0x01,0x80,0x00,0x00,0x00,0x81,0xcf,0x00,0xfc,0x00,0x80,0x01,0xc0,0x9f,0x01,0x00,0x00,0xfc,0x00,0x80,0x01,0x30,0xe0,0x00,0x00,0x00,0xf8,0x00,0xc0,0x01,0x0c,0x84,0x41,0x00,0x00,0xf8,0x01,0xc0,0x07,0x04,0xf8,0xc2,0x00,0x00,0xf8,0x03,0xc0,0x07,0x06,0x00,0x43,0x00,0x00,0xf2,0x03,0xc0,0x07,0x02,0x80,0x00,0xf8,0x0f,0xe4,0x03,0xe0,0xff,0x04,0xf8,0x00,0xfe,0x1f,0xe8,0x07,0xe0,0x03,0x07,0x80,0x00,0xbe,0x0f,0xec,0x07,0xe0,0x01,0x06,0x80,0x00,0x3c,0x00,0x92,0x07,0xe0,0x00,0x0a,0xff,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x24,0x08,0x01,0x00,0x00,0x00,0x07,0x60,0x00,0xc6,0x88,0x01,0x00,0x00,0x00,0x07,0x60,0x00,0x02,0x7e,0x03,0x00,0x00,0x80,0x07,0x60,0x00,0xfe,0x27,0x02,0x00,0x00,0x80,0x07,0x60,0x00,0xc1,0x43,0x02,0x00,0x00,0xc0,0x07,0x70,0xc0,0xc0,0x43,0x04,0x00,0x00,0xc0,0x03,0x70,0x40,0xc1,0x67,0x08,0x00,0x00,0xe0,0x03,0x70,0x00,0xe1,0x7f,0x10,0x00,0x1c,0xf0,0x01,0xf0,0x00,0xfa,0xff,0xa0,0x01,0x7f,0xfe,0x00,0xf0,0x00,0xe2,0x1f,0xc1,0x60,0xfe,0x7f,0x00,0xe0,0x81,0x87,0x0f,0x82,0x81,0xfe,0x3f,0x00,0xe0,0x83,0xc8,0x0f,0x02,0xa5,0xfe,0x0f,0x00,0xe0,0x7f,0xf9,0xbf,0x13,0x9f,0xfd,0x00,0x00,0xe0,0x03,0x81,0xff,0x1f,0x61,0x00,0x00,0x06,0xe0,0x03,0x02,0xfe,0x8f,0x01,0x00,0x6c,0x04,0x80,0x01,0x02,0xfc,0x83,0x01,0x00,0xc0,0x04,0x80,0x01,0x03,0x0e,0x81,0x00,0x04,0x80,0x03,0x80,0x01,0xfe,0x01,0x62,0x50,0x08,0x00,0x00,0x80,0x01,0x48,0x00,0x1c,0x80,0x08,0x00,0x00,0x80,0x03,0x50,0x00,0x1c,0x00,0x07,0x00,0x00,0x80,0x03,0x50,0x00,0x34,0x00,0x00,0x00,0x00,0x80,0x03,0x50,0x00,0x24,0x00,0x00,0x00,0x00,0x80,0x07,0x90,0x00,0x3a,0x00,0x00,0x00,0x00,0x80,0x0f,0x98,0x00,0x10,0x00,0x00,0x00,0x00,0x80,0x3f,0x0c,0x07,0x10,0x00,0x00,0x00,0x00,0x00,0xc1,0x03,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,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} +; + +void draw_shifted_sprite(const byte* src, byte x, byte y) { + byte i,j; + byte* dest = &vidmem[x][y>>3]; + byte w = *src++; + byte h = *src++; + bitshift_offset = y & 7; + for (j=0; j #include +#include typedef unsigned char byte; typedef unsigned short word; @@ -9,14 +10,16 @@ typedef signed char sbyte; word __at(0xa000) dvgram[0x1000]; byte __at(0x8840) _dvgstart; -int __at(0x8100) mathbox_sum; +volatile int __at(0x8100) mathbox_sum; sbyte __at(0x8102) mathbox_arg1; sbyte __at(0x8103) mathbox_arg2; byte __at(0x810f) mathbox_go_mul; -byte __at (0x8000) input0; -byte __at (0x8001) input1; -byte __at (0x8002) input2; +volatile byte __at (0x8000) input0; +volatile byte __at (0x8001) input1; +volatile byte __at (0x8002) input2; +volatile byte __at (0x8980) watchdog; +volatile byte __at (0x800f) vidframe; #define LEFT1 !(input1 & 0x8) #define RIGHT1 !(input1 & 0x4) @@ -103,6 +106,10 @@ inline void STAT(byte rgb, byte intens) { dvgwrite(0x6000 | ((intens & 0xf)<<4) | (rgb & 7)); } +inline void STAT_sparkle(byte intens) { + dvgwrite(0x6800 | ((intens & 0xf)<<4)); +} + inline void SCAL(word scale) { dvgwrite(0x7000 | scale); } @@ -204,7 +211,7 @@ void draw_char(char ch) { byte x2 = b>>4; byte y2 = b&15; SVEC((char)(x2-x), (char)(y2-y), bright); - bright = 4; + bright = 2; x = x2; y = y2; } @@ -212,9 +219,21 @@ void draw_char(char ch) { SVEC((char)12-x, (char)-y, 0); } +static word font_shapes[95]; + +void make_cached_font() { + char ch; + for (ch=0; ch<95; ch++) { + watchdog = 0; + font_shapes[ch] = dvgwrofs; + draw_char(ch+0x20); + RTSL(); + } +} + void draw_string(const char* str, byte spacing) { while (*str) { - draw_char(*str++); + JSRL(font_shapes[*str++ - 0x20]); if (spacing) SVEC(spacing, 0, 0); } } @@ -305,8 +324,8 @@ void mat_rotate(Matrix* m, byte axis, byte angle) { break; case 2: m->m[0][0] = cos; - m->m[1][0] = sin; - m->m[0][1] = -sin; + m->m[1][0] = -sin; + m->m[0][1] = sin; m->m[1][1] = cos; break; } @@ -358,22 +377,44 @@ const Vector8 tetra_v[] = { {0,-86,86},{86,86,86},{-86,86,86},{0,0,-86} }; const char tetra_e[] = { 0, 1, 2, 0, 3, 1, -1, 3, 2, -2 }; const Wireframe tetra_wf = { 4, tetra_v, tetra_e }; -const Vector8 ship_v[] = { {0,-86,0},{-30,30,0},{-50,0,0},{50,0,0},{30,30,0} }; +const Vector8 octa_v[] = { {86,0,0},{0,86,0},{-86,0,0},{0,-86,0},{0,0,86},{0,0,-86} }; +const char octa_e[] = { 0, 1, 2, 3, 0, 4, 1, 5, 0, -1, 2, 4, 3, 5, 2, -2 }; +const Wireframe octa_wf = { 6, octa_v, octa_e }; + +const Vector8 ship_v[] = { {0,86,0},{-30,-30,0},{-50,0,0},{50,0,0},{30,-30,0} }; const char ship_e[] = { 0, 1, 2, 3, 4, 0, -2 }; const Wireframe ship_wf = { 5, ship_v, ship_e }; -const Vector8 thrust_v[] = { {-20,30,0},{-30,50,0},{0,86,0},{30,50,0},{20,30,0} }; +const Vector8 thrust_v[] = { {-20,-30,0},{-30,-50,0},{0,-86,0},{30,-50,0},{20,-30,0} }; const char thrust_e[] = { 0, 1, 2, 3, 4, -2 }; const Wireframe thrust_wf = { 5, thrust_v, thrust_e }; +const Vector8 torpedo_v[] = { {-86,0,0},{86,0,0},{-40,-40,0},{40,40,0},{0,-20,0},{0,20,0} }; +const char torpedo_e[] = { 0, 1, -1, 2, 3, -1, 4, 5, -2 }; +const Wireframe torpedo_wf = { 6, torpedo_v, torpedo_e }; + word ship_shapes[32]; word thrust_shapes[32]; word tetra_shapes[32]; +word torpedo_shapes[16]; +word explosion_shape[1]; + +void draw_explosion() { + byte i; + for (i=0; i<30; i++) { + byte angle = rand(); + sbyte xd = isin(angle) >> 4; + sbyte yd = icos(angle) >> 4; + SVEC(xd, yd, 2); + SVEC(-xd, -yd, 2); + } +} void make_cached_shapes() { Matrix mat; byte i; for (i=0; i<32; i++) { + watchdog = 0; ship_shapes[i] = dvgwrofs; mat_rotate(&mat, 2, i<<3); draw_wireframe_ortho(&ship_wf, &mat); @@ -383,9 +424,19 @@ void make_cached_shapes() { RTSL(); tetra_shapes[i] = dvgwrofs; mat_rotate(&mat, 0, i<<3); - draw_wireframe_ortho(&tetra_wf, &mat); + draw_wireframe_ortho(&octa_wf, &mat); RTSL(); } + for (i=0; i<16; i++) { + torpedo_shapes[i] = dvgwrofs; + mat_rotate(&mat, 2, i<<4); + draw_wireframe_ortho(&torpedo_wf, &mat); + RTSL(); + } + explosion_shape[0] = dvgwrofs; + STAT_sparkle(15); + draw_explosion(); + RTSL(); } // MAIN PROGRAM @@ -401,12 +452,14 @@ typedef struct Actor { byte scale; byte color; byte intens; + byte collision_flags; byte angle; word xx; word yy; int velx; int vely; struct Actor* next; + byte removed:1; } Actor; #define WORLD_SCALE 0x2c0 @@ -435,31 +488,9 @@ Actor* new_actor(const Actor* base) { return a; } -void obstacle_update_fn(struct Actor* a) { - a->angle += 1; -} - -const Actor ship_actor = { - ship_shapes, NULL, 3, 0xb0, WHITE, 7, 0, -}; - -const Actor tetra_actor = { - tetra_shapes, obstacle_update_fn, 3, 0x80, CYAN, 7, 0, -}; - -void create_obstacles(byte count) { - while (count--) { - Actor* a = new_actor(&tetra_actor); - a->xx = rand(); - a->yy = rand(); - a->velx = (int)rand()<<8>>8; - a->vely = (int)rand()<<8>>8; - } -} - -void update_actors() { +void draw_and_update_actors() { Actor* a = first_actor; - while (a) { + while (a != NULL) { draw_actor(a); move_actor(a); if (a->update_fn) a->update_fn(a); @@ -467,6 +498,24 @@ void update_actors() { } } +void remove_expired_actors() { + Actor* a; + // get address of first pointer + Actor** prev = &first_actor; + while ((a = *prev) != NULL) { + // was actor removed? + if (a->removed) { + // set previous pointer to skip this actor + *prev = a->next; + // free memory + free(a); + } else { + // get address of next pointer + prev = &a->next; + } + } +} + void draw_actor_rect(Actor* a) { CNTR(); // center beam (0,0) SCAL(WORLD_SCALE); // world scale @@ -484,28 +533,100 @@ inline byte abs(sbyte x) { return (x>=0) ? x : -x; } -inline sbyte get_distance(byte x1, byte y1, byte x2, byte y2) { - sbyte dx = abs(x2-x1); - sbyte dy = abs(y2-y1); - return (dx>>1) + (dy>>1); +inline word get_distance_squared(byte dx, byte dy) { + mathbox_sum = 0; + mul16(dx,dx); + mul16(dy,dy); + return mathbox_sum; } -Actor* test_actor_distance(ActorUpdateFn* fn, Actor* act1, byte mindist) { +typedef void ActorCollisionFn(struct Actor*, struct Actor*); + +byte test_actor_distance(ActorCollisionFn* fn, Actor* act1, byte mindist, byte flags) { Actor* a = first_actor; byte xx1 = act1->xx >> 8; byte yy1 = act1->yy >> 8; + byte count = 0; + // mindist2 = mindist * mindist + word mindist2; + mathbox_sum = 0; + mul16(mindist,mindist); + mindist2 = mathbox_sum; + // go through list of actors while (a) { - if (a != act1) { - sbyte dist = get_distance(xx1, yy1, a->xx >> 8, a->yy >> 8); - if (dist < mindist) fn(a); + // only compare against actors with certain flags + // (that haven't been removed) + if ((a->collision_flags & flags) && !a->removed) { + byte dx = abs(xx1 - (a->xx >> 8)); + byte dy = abs(yy1 - (a->yy >> 8)); + if (dx+dy < mindist) { + word dist2 = get_distance_squared(dx, dy); + if (dist2 < mindist2) { + if (fn) fn(act1, a); + count++; + } + } } a = a->next; } + return count; +} + +void explode_at(Actor* base); + +void explode_actor(Actor* a, Actor* b) { + a->removed = 1; + explode_at(b); + b->removed = 1; +} + +void obstacle_update_fn(struct Actor* a) { + a->angle += 1; +} + +void torpedo_update_fn(struct Actor* a) { + // expire? + if ((a->angle += 60) == 0) { + a->removed = 1; + } else { + // check for torpedo hits + test_actor_distance(explode_actor, a, 12, 0x2); + } +} + +void explosion_update_fn(struct Actor* a) { + a->scale -= 2; + if (a->scale < 8) { + a->removed = 1; + } +} + +const Actor ship_actor = { + ship_shapes, NULL, 3, 0xb0, WHITE, 7, 0x1, +}; +const Actor tetra_actor = { + tetra_shapes, obstacle_update_fn, 3, 0x80, CYAN, 7, 0x2, +}; +const Actor torpedo_actor = { + torpedo_shapes, torpedo_update_fn, 4, 0xe0, YELLOW, 15, 0x4, +}; +const Actor explosion_actor = { + explosion_shape, explosion_update_fn, 8, 0xa0, WHITE, 15, 0, +}; + +void create_obstacles(byte count) { + while (count--) { + Actor* a = new_actor(&tetra_actor); + a->xx = rand() | 0x8000; + a->yy = rand(); + a->velx = (int)rand()<<8>>8; + a->vely = (int)rand()<<8>>8; + } } static int frame = 0; -static Actor* curship; +static Actor* curship = NULL; void draw_thrust() { word rnd = rand(); @@ -530,7 +651,7 @@ void thrust_ship() { sbyte sin = isin(curship->angle); sbyte cos = icos(curship->angle); curship->velx += sin>>3; - curship->vely -= cos>>3; + curship->vely += cos>>3; } int apply_friction(int vel) { @@ -539,37 +660,89 @@ int apply_friction(int vel) { return vel - delta; } -void move_player() { +void shoot_torpedo() { + sbyte sin = isin(curship->angle); + sbyte cos = icos(curship->angle); + Actor* torp = new_actor(&torpedo_actor); + torp->velx = sin << 2; + torp->vely = cos << 2; + torp->xx = curship->xx + torp->velx*4; + torp->yy = curship->yy + torp->vely*4; +} + +static byte can_fire; +static byte newship_timer; + +void new_player_ship() { + if (curship == NULL) { + curship = new_actor(&ship_actor); + } +} + +void explode_at(Actor* base) { + Actor* a = new_actor(&explosion_actor); + a->xx = base->xx; + a->yy = base->yy; +} + +void control_player() { + if (newship_timer && --newship_timer == 0) { + new_player_ship(); + } if (!curship) return; - if (LEFT1) curship->angle += 2; - if (RIGHT1) curship->angle -= 2; - if ((frame&3)==1) { + + if (LEFT1) curship->angle -= 2; + if (RIGHT1) curship->angle += 2; + if ((frame&1)==1) { curship->velx = apply_friction(curship->velx); curship->vely = apply_friction(curship->vely); } if (UP1) { - // draw colorful flame + // draw flame draw_thrust(); // thrust every 4 frames, to avoid precision issues if (!(frame&3)) thrust_ship(); } - test_actor_distance(draw_actor_rect, curship, 32); + if (FIRE1) { + // must release fire button before firing again + if (can_fire) { + shoot_torpedo(); + can_fire = 0; + } + } else { + can_fire = 1; + } + // ship ran into something? + if (test_actor_distance(NULL, curship, 16, 0x2)) { + explode_at(curship); + curship->removed = 1; + curship = NULL; + newship_timer = 255; + } +} + +byte just_one_actor_left() { + return first_actor && first_actor->next == NULL; } void main() { memset(dvgram, 0x20, sizeof(dvgram)); // HALTs dvgwrofs = 0x800; - //draw_string("HELLO WORLD", 0); - //RTSL(); + make_cached_font(); make_cached_shapes(); create_obstacles(5); - curship = new_actor(&ship_actor); - while (1) { + new_player_ship(); + while (!just_one_actor_left()) { dvgreset(); - update_actors(); - move_player(); + control_player(); + draw_and_update_actors(); + CNTR(); HALT(); dvgstart(); + remove_expired_actors(); frame++; + watchdog=0; + while (vidframe == (frame & 0x3)) {} } + main(); } diff --git a/presets/williams-z80/bitmap_rle.c b/presets/williams-z80/bitmap_rle.c new file mode 100644 index 00000000..9fabcc51 --- /dev/null +++ b/presets/williams-z80/bitmap_rle.c @@ -0,0 +1,151 @@ + +#include + +typedef unsigned char byte; +typedef unsigned short word; + +byte __at (0xc000) palette[16]; +byte __at (0xc800) input0; +byte __at (0xc802) input1; +byte __at (0xc804) input2; +byte __at (0xc900) rom_select; +byte __at (0xcb00) video_counter; +byte __at (0xcbff) watchdog0x39; +byte __at (0xcc00) nvram[0x400]; + +byte __at (0x0) vidmem[152][256]; // 256x304x4bpp video memory + +void main(); + +// start routine @ 0x0 +// set stack pointer, enable interrupts +void start() { +__asm + LD SP,#0xc000 + DI +__endasm; + main(); +} + +const byte example_tga[] = { +0x00,0x01,0x09,0x00,0x00,0x08,0x00,0x18,0x00,0x00,0x00,0x00,0x80,0x00,0x60,0x00,0x08,0x00,0x01,0x01,0x01,0x67,0x3b,0x4e,0x9f,0x43,0x58,0xc5,0x56,0xbe,0xac,0xa8,0xac,0xe3,0xe0,0xe0,0xde,0xab,0xbc,0xd6,0xa5,0x72,0xff,0x00,0xff,0x00,0xd1,0x00,0x02,0x01,0x03,0x03,0xaa,0x00,0xd1,0x00,0x01,0x03,0x03,0xab,0x00,0xd1,0x00,0x01,0x03,0x03,0xab,0x00,0xcf,0x00,0x02,0x01,0x03,0x03,0xac,0x00,0xd0,0x00,0x01,0x03,0x03,0xac,0x00,0xb3,0x00,0x02,0x03,0x03,0x00,0x82,0x03,0x95,0x00,0x01,0x03,0x03,0xad,0x00,0xb2,0x00,0x86,0x03,0x95,0x00,0x02,0x03,0x03,0x01,0xac,0x00,0xb1,0x00,0x83,0x03,0x03,0x01,0x01,0x03,0x03,0x94,0x00,0x01,0x03,0x03,0xae,0x00,0xb0,0x00, +0x00,0x01,0x82,0x03,0x04,0x00,0x01,0x01,0x06,0x03,0x94,0x00,0x00,0x03,0xaf,0x00,0xb0,0x00,0x82,0x03,0x04,0x01,0x01,0x03,0x03,0x06,0x95,0x00,0x00,0x03,0xaf,0x00,0xb0,0x00,0x01,0x03,0x03,0x82,0x01,0x82,0x03,0x90,0x00,0x05,0x01,0x03,0x03,0x01,0x03,0x03,0xaf,0x00,0xaf,0x00,0x82,0x03,0x01,0x01,0x01,0x82,0x03,0x91,0x00,0x84,0x03,0xb0,0x00,0xae,0x00,0x00,0x01,0x82,0x03,0x00,0x02,0x82,0x03,0x02,0x01,0x00,0x01,0x84,0x00,0x82,0x03,0x86,0x00,0x85,0x03,0x00,0x01,0xaf,0x00,0xae,0x00,0x8b,0x03,0x83,0x00,0x82,0x03,0x85,0x00,0x83,0x03,0x01,0x06,0x03,0xb1,0x00,0x96,0x00,0x08,0x05,0x03,0x06,0x03,0x03,0x06,0x03,0x06,0x06,0x82,0x03,0x01,0x05,0x06,0x82, +0x03,0x06,0x06,0x03,0x06,0x06,0x03,0x06,0x06,0x8c,0x03,0x00,0x06,0x8e,0x03,0x01,0x06,0x03,0x82,0x00,0x00,0x05,0x82,0x03,0x82,0x06,0x00,0x07,0x84,0x06,0x00,0x07,0x82,0x06,0x82,0x07,0x02,0x06,0x07,0x07,0x83,0x06,0x93,0x00,0x96,0x00,0x00,0x06,0x9c,0x03,0x82,0x01,0x87,0x03,0x00,0x02,0x88,0x03,0x02,0x02,0x03,0x03,0x84,0x00,0x05,0x03,0x01,0x02,0x03,0x02,0x07,0x84,0x02,0x00,0x07,0x83,0x02,0x05,0x07,0x02,0x07,0x07,0x02,0x02,0x82,0x07,0x00,0x06,0x93,0x00,0x97,0x00,0x06,0x03,0x03,0x01,0x02,0x01,0x01,0x03,0x82,0x01,0x04,0x03,0x03,0x01,0x01,0x03,0x85,0x01,0x85,0x03,0x84,0x01,0x82,0x03,0x00,0x02,0x83,0x03,0x00,0x01,0x88,0x03,0x02,0x02,0x03,0x06, +0x83,0x00,0x01,0x03,0x02,0x82,0x01,0x02,0x02,0x01,0x02,0x82,0x01,0x00,0x02,0x82,0x01,0x82,0x02,0x00,0x01,0x84,0x02,0x01,0x07,0x06,0x94,0x00,0x97,0x00,0x01,0x06,0x03,0x84,0x01,0x04,0x03,0x01,0x01,0x03,0x03,0x87,0x01,0x84,0x03,0x07,0x01,0x00,0x01,0x00,0x01,0x02,0x03,0x06,0x85,0x03,0x00,0x01,0x84,0x03,0x00,0x06,0x82,0x03,0x00,0x01,0x82,0x03,0x83,0x00,0x04,0x03,0x01,0x01,0x02,0x02,0x83,0x01,0x82,0x02,0x84,0x01,0x01,0x02,0x02,0x83,0x01,0x01,0x02,0x07,0x95,0x00,0x98,0x00,0x0a,0x03,0x03,0x01,0x01,0x00,0x01,0x03,0x01,0x01,0x03,0x03,0x88,0x01,0x04,0x03,0x03,0x01,0x01,0x00,0x83,0x01,0x00,0x02,0x82,0x03,0x00,0x01,0x83,0x03,0x00,0x01,0x8b,0x03, +0x83,0x00,0x0c,0x03,0x01,0x01,0x02,0x01,0x01,0x02,0x02,0x01,0x02,0x01,0x01,0x02,0x83,0x01,0x01,0x02,0x02,0x83,0x01,0x02,0x02,0x07,0x06,0x95,0x00,0x99,0x00,0x00,0x03,0x87,0x01,0x01,0x03,0x03,0x86,0x01,0x82,0x03,0x86,0x01,0x82,0x03,0x01,0x02,0x02,0x82,0x03,0x02,0x02,0x03,0x06,0x8a,0x03,0x83,0x00,0x00,0x02,0x84,0x01,0x02,0x07,0x02,0x02,0x86,0x01,0x08,0x02,0x01,0x01,0x02,0x01,0x01,0x02,0x02,0x07,0x96,0x00,0x99,0x00,0x01,0x03,0x03,0x83,0x01,0x04,0x03,0x01,0x01,0x03,0x03,0x86,0x01,0x02,0x03,0x06,0x03,0x84,0x01,0x00,0x02,0x82,0x03,0x82,0x01,0x82,0x03,0x00,0x02,0x85,0x03,0x01,0x01,0x06,0x84,0x03,0x82,0x00,0x02,0x03,0x01,0x00,0x83,0x01,0x05, +0x02,0x07,0x02,0x01,0x01,0x02,0x82,0x01,0x03,0x02,0x02,0x01,0x02,0x82,0x01,0x02,0x02,0x07,0x06,0x96,0x00,0x9a,0x00,0x01,0x03,0x03,0x83,0x01,0x04,0x03,0x01,0x01,0x03,0x03,0x84,0x01,0x82,0x03,0x00,0x02,0x84,0x01,0x82,0x03,0x82,0x01,0x00,0x02,0x83,0x03,0x00,0x02,0x83,0x03,0x0d,0x01,0x01,0x03,0x03,0x01,0x01,0x02,0x06,0x00,0x00,0x03,0x02,0x01,0x02,0x83,0x01,0x01,0x02,0x02,0x89,0x01,0x05,0x02,0x01,0x01,0x02,0x02,0x06,0x97,0x00,0x9a,0x00,0x01,0x06,0x03,0x83,0x01,0x04,0x03,0x01,0x01,0x03,0x03,0x84,0x01,0x82,0x03,0x84,0x01,0x83,0x03,0x83,0x01,0x83,0x03,0x06,0x01,0x01,0x02,0x03,0x02,0x00,0x02,0x83,0x00,0x00,0x02,0x83,0x03,0x00,0x00,0x90,0x01, +0x00,0x02,0x82,0x01,0x01,0x02,0x07,0x98,0x00,0x9b,0x00,0x01,0x03,0x03,0x82,0x01,0x05,0x03,0x03,0x01,0x01,0x03,0x03,0x83,0x01,0x82,0x03,0x83,0x01,0x82,0x03,0x0c,0x01,0x00,0x01,0x01,0x02,0x01,0x01,0x03,0x02,0x00,0x01,0x01,0x00,0x82,0x01,0x07,0x02,0x02,0x01,0x02,0x02,0x01,0x02,0x02,0x85,0x01,0x0c,0x02,0x02,0x01,0x01,0x02,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x02,0x83,0x01,0x02,0x02,0x02,0x06,0x98,0x00,0x9b,0x00,0x01,0x03,0x03,0x83,0x01,0x01,0x03,0x01,0x82,0x03,0x82,0x01,0x83,0x03,0x02,0x01,0x01,0x02,0x82,0x03,0x87,0x01,0x01,0x00,0x00,0x83,0x01,0x00,0x00,0x85,0x01,0x03,0x02,0x01,0x00,0x00,0x83,0x01,0x01,0x02,0x02,0x84,0x01,0x00,0x02,0x84, +0x01,0x83,0x02,0x03,0x01,0x02,0x02,0x06,0x99,0x00,0x9c,0x00,0x02,0x03,0x03,0x02,0x82,0x01,0x03,0x03,0x01,0x03,0x03,0x82,0x01,0x88,0x03,0x07,0x01,0x00,0x01,0x01,0x02,0x01,0x02,0x02,0x82,0x01,0x07,0x02,0x01,0x02,0x01,0x01,0x02,0x02,0x01,0x86,0x02,0x82,0x01,0x0a,0x02,0x02,0x01,0x02,0x02,0x01,0x02,0x02,0x01,0x02,0x02,0x82,0x01,0x82,0x02,0x04,0x01,0x01,0x02,0x07,0x06,0x99,0x00,0x9c,0x00,0x07,0x05,0x03,0x03,0x01,0x01,0x02,0x03,0x04,0x83,0x03,0x00,0x01,0x86,0x03,0x0a,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0x02,0x02,0x01,0x01,0x82,0x02,0x09,0x01,0x02,0x01,0x01,0x02,0x01,0x02,0x02,0x01,0x01,0x84,0x02,0x00,0x01,0x83,0x02,0x08,0x01,0x02,0x01,0x02, +0x01,0x02,0x01,0x02,0x01,0x86,0x02,0x01,0x07,0x06,0x9a,0x00,0x9d,0x00,0x06,0x03,0x03,0x02,0x01,0x03,0x01,0x02,0x82,0x03,0x00,0x01,0x82,0x03,0x06,0x01,0x01,0x02,0x01,0x00,0x01,0x01,0x84,0x02,0x00,0x01,0x82,0x02,0x01,0x01,0x01,0x84,0x02,0x07,0x01,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x83,0x02,0x06,0x01,0x02,0x01,0x02,0x01,0x02,0x02,0x82,0x01,0x01,0x02,0x01,0x87,0x02,0x01,0x07,0x05,0x9a,0x00,0x9e,0x00,0x01,0x03,0x03,0x82,0x01,0x01,0x03,0x02,0x85,0x03,0x84,0x01,0x02,0x02,0x01,0x01,0x82,0x02,0x04,0x01,0x01,0x02,0x02,0x01,0x84,0x02,0x00,0x01,0x84,0x02,0x00,0x01,0x82,0x02,0x00,0x01,0x85,0x02,0x00,0x01,0x87,0x02,0x00,0x01,0x85,0x02,0x01,0x07, +0x06,0x9b,0x00,0x9e,0x00,0x04,0x05,0x03,0x01,0x03,0x01,0x87,0x03,0x83,0x01,0x02,0x02,0x02,0x03,0x98,0x02,0x00,0x01,0x86,0x02,0x00,0x01,0x8c,0x02,0x01,0x06,0x06,0x9b,0x00,0x9e,0x00,0x13,0x05,0x05,0x03,0x03,0x06,0x04,0x04,0x03,0x06,0x06,0x03,0x01,0x03,0x04,0x03,0x03,0x04,0x03,0x03,0x01,0x8c,0x02,0x08,0x03,0x06,0x03,0x04,0x03,0x06,0x03,0x04,0x06,0x82,0x03,0x89,0x02,0x0d,0x01,0x04,0x06,0x03,0x04,0x06,0x06,0x03,0x04,0x04,0x07,0x07,0x05,0x06,0x9b,0x00,0x86,0x00,0xa1,0x05,0x82,0x04,0x85,0x05,0x82,0x03,0x82,0x02,0x00,0x03,0x85,0x02,0x00,0x07,0x8a,0x05,0x00,0x03,0x87,0x02,0x00,0x07,0xaa,0x05,0x84,0x00,0x02,0x05,0x05,0x04,0x94,0x05,0x00,0x04, +0x8c,0x05,0x00,0x04,0x83,0x05,0x00,0x06,0x82,0x05,0x01,0x03,0x03,0x84,0x02,0x03,0x03,0x02,0x02,0x07,0x8b,0x05,0x00,0x03,0x85,0x02,0x0a,0x07,0x06,0x05,0x05,0x04,0x05,0x06,0x05,0x05,0x04,0x06,0x8b,0x05,0x00,0x04,0x83,0x05,0x07,0x04,0x05,0x04,0x05,0x05,0x06,0x05,0x04,0x85,0x05,0x03,0x04,0x05,0x06,0x05,0x82,0x00,0x86,0x05,0x00,0x06,0x92,0x05,0x04,0x04,0x05,0x04,0x05,0x06,0x82,0x05,0x03,0x04,0x05,0x05,0x04,0x82,0x05,0x00,0x04,0x85,0x05,0x82,0x03,0x01,0x02,0x03,0x83,0x02,0x05,0x07,0x07,0x05,0x04,0x05,0x04,0x87,0x05,0x00,0x03,0x84,0x02,0x00,0x07,0x82,0x05,0x00,0x06,0x85,0x05,0x07,0x04,0x05,0x05,0x04,0x05,0x06,0x05,0x06,0x85,0x05,0x00,0x04, +0x87,0x05,0x07,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x82,0x05,0x01,0x06,0x00,0x01,0x00,0x00,0x8d,0x05,0x00,0x04,0x89,0x05,0x04,0x06,0x05,0x06,0x05,0x04,0x84,0x05,0x00,0x04,0x88,0x05,0x07,0x04,0x05,0x05,0x04,0x04,0x05,0x03,0x03,0x85,0x02,0x00,0x03,0x8c,0x05,0x00,0x03,0x83,0x02,0x00,0x07,0x86,0x05,0x01,0x06,0x04,0x83,0x05,0x00,0x04,0x84,0x05,0x01,0x04,0x04,0x82,0x05,0x00,0x04,0x82,0x05,0x12,0x04,0x05,0x05,0x04,0x05,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x00,0x00,0x00,0x83,0x05,0x07,0x04,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x8a,0x05,0x0a,0x04,0x05,0x03,0x06,0x05,0x06,0x05,0x05,0x04,0x05,0x04,0x82,0x05,0x06, +0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x83,0x05,0x00,0x04,0x82,0x05,0x12,0x06,0x03,0x03,0x02,0x03,0x03,0x02,0x07,0x07,0x05,0x06,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x82,0x05,0x0b,0x03,0x03,0x02,0x07,0x07,0x05,0x05,0x06,0x05,0x05,0x04,0x04,0x82,0x05,0x03,0x04,0x05,0x05,0x04,0x82,0x05,0x02,0x04,0x05,0x04,0x84,0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x82,0x04,0x09,0x05,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x82,0x04,0x01,0x00,0x00,0x05,0x00,0x05,0x05,0x04,0x04,0x05,0x82,0x04,0x02,0x05,0x05,0x04,0x86,0x05,0x00,0x04,0x85,0x05,0x03,0x03,0x06,0x05,0x04,0x85,0x05,0x04,0x04,0x04,0x05,0x05,0x04,0x83,0x05,0x00,0x04,0x88,0x05,0x05,0x03,0x02, +0x03,0x02,0x02,0x07,0x88,0x05,0x00,0x06,0x83,0x05,0x06,0x03,0x07,0x02,0x07,0x05,0x05,0x04,0x8d,0x05,0x00,0x04,0x86,0x05,0x10,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x05,0x04,0x05,0x04,0x82,0x05,0x03,0x04,0x05,0x00,0x00,0x05,0x00,0x05,0x04,0x05,0x05,0x04,0x82,0x05,0x06,0x04,0x05,0x05,0x04,0x05,0x05,0x04,0x86,0x05,0x0b,0x04,0x05,0x06,0x03,0x06,0x05,0x06,0x05,0x04,0x05,0x04,0x04,0x83,0x05,0x04,0x04,0x04,0x05,0x05,0x04,0x82,0x05,0x15,0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x05,0x03,0x03,0x02,0x02,0x03,0x07,0x05,0x06,0x06,0x04,0x04,0x05,0x04,0x06,0x85,0x05,0x03,0x03,0x02,0x07,0x07,0x86,0x05,0x07,0x04,0x05,0x04,0x05, +0x04,0x05,0x05,0x04,0x84,0x05,0x06,0x06,0x05,0x05,0x06,0x07,0x05,0x04,0x82,0x05,0x12,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x04,0x05,0x04,0x05,0x00,0x00,0x82,0x05,0x05,0x04,0x04,0x05,0x04,0x05,0x05,0x82,0x04,0x11,0x05,0x05,0x04,0x05,0x05,0x06,0x05,0x05,0x04,0x05,0x06,0x06,0x05,0x03,0x03,0x07,0x05,0x04,0x82,0x05,0x0c,0x04,0x05,0x05,0x06,0x05,0x06,0x06,0x04,0x04,0x06,0x04,0x05,0x04,0x83,0x05,0x13,0x04,0x05,0x05,0x04,0x05,0x03,0x03,0x02,0x04,0x07,0x05,0x05,0x04,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x82,0x05,0x09,0x06,0x05,0x03,0x03,0x07,0x05,0x05,0x04,0x05,0x04,0x84,0x05,0x82,0x06,0x0e,0x04,0x05,0x04,0x05,0x06, +0x04,0x05,0x04,0x04,0x05,0x06,0x07,0x07,0x05,0x04,0x83,0x05,0x82,0x04,0x05,0x05,0x06,0x04,0x05,0x04,0x05,0x82,0x04,0x02,0x05,0x04,0x05,0x82,0x00,0x00,0x05,0x84,0x04,0x02,0x05,0x04,0x04,0x8e,0x05,0x04,0x06,0x03,0x02,0x07,0x05,0x82,0x04,0x03,0x05,0x05,0x04,0x04,0x8a,0x05,0x11,0x04,0x04,0x05,0x05,0x04,0x05,0x04,0x05,0x06,0x03,0x02,0x02,0x07,0x05,0x04,0x05,0x04,0x04,0x84,0x05,0x07,0x04,0x05,0x05,0x04,0x05,0x03,0x07,0x06,0x86,0x05,0x02,0x04,0x05,0x04,0x8b,0x05,0x00,0x06,0x82,0x07,0x07,0x06,0x05,0x05,0x04,0x04,0x05,0x05,0x04,0x8b,0x05,0x83,0x00,0x06,0x05,0x04,0x04,0x05,0x05,0x04,0x04,0x82,0x05,0x00,0x06,0x82,0x03,0x08,0x04,0x06,0x03,0x04, +0x03,0x03,0x06,0x03,0x04,0x82,0x03,0x11,0x02,0x07,0x05,0x07,0x04,0x05,0x04,0x04,0x05,0x04,0x04,0x05,0x06,0x06,0x04,0x04,0x06,0x06,0x82,0x05,0x0f,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x04,0x05,0x03,0x02,0x07,0x05,0x05,0x04,0x04,0x82,0x05,0x14,0x04,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x03,0x06,0x05,0x05,0x06,0x05,0x05,0x04,0x05,0x04,0x05,0x04,0x82,0x05,0x16,0x07,0x06,0x05,0x05,0x06,0x06,0x07,0x06,0x05,0x06,0x07,0x02,0x07,0x07,0x06,0x05,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x8e,0x00,0x00,0x05,0x86,0x04,0x09,0x05,0x06,0x03,0x03,0x02,0x01,0x03,0x02,0x02,0x03,0x82,0x02,0x00,0x03,0x82,0x02,0x0f,0x03,0x02,0x07,0x05,0x04,0x05,0x04,0x04,0x05, +0x04,0x04,0x06,0x05,0x06,0x03,0x02,0x82,0x03,0x10,0x06,0x06,0x05,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x03,0x02,0x04,0x05,0x05,0x85,0x04,0x1d,0x05,0x04,0x05,0x04,0x05,0x05,0x06,0x05,0x03,0x07,0x05,0x06,0x05,0x04,0x05,0x05,0x04,0x05,0x04,0x05,0x05,0x06,0x03,0x07,0x06,0x05,0x06,0x07,0x07,0x03,0x83,0x07,0x02,0x02,0x07,0x07,0x82,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x05,0x8e,0x00,0x00,0x05,0x86,0x04,0x01,0x06,0x05,0x83,0x03,0x00,0x02,0x87,0x03,0x09,0x02,0x02,0x03,0x02,0x03,0x05,0x07,0x04,0x05,0x05,0x82,0x04,0x82,0x06,0x14,0x03,0x03,0x02,0x02,0x03,0x03,0x06,0x05,0x05,0x04,0x04,0x05,0x04,0x04,0x06,0x06,0x05,0x03,0x07,0x05,0x06,0x88, +0x04,0x08,0x05,0x04,0x04,0x06,0x04,0x05,0x06,0x07,0x05,0x82,0x04,0x11,0x05,0x04,0x05,0x04,0x04,0x05,0x06,0x03,0x07,0x07,0x06,0x06,0x07,0x03,0x07,0x07,0x06,0x07,0x82,0x02,0x0a,0x07,0x07,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x8e,0x00,0x01,0x05,0x05,0x84,0x04,0x01,0x05,0x04,0x82,0x05,0x07,0x06,0x05,0x06,0x06,0x05,0x05,0x03,0x05,0x84,0x03,0x82,0x02,0x00,0x05,0x83,0x04,0x0e,0x05,0x05,0x04,0x05,0x03,0x03,0x05,0x03,0x03,0x02,0x03,0x03,0x07,0x05,0x06,0x86,0x04,0x04,0x06,0x03,0x06,0x05,0x06,0x84,0x04,0x00,0x05,0x84,0x04,0x0a,0x05,0x04,0x04,0x05,0x06,0x05,0x05,0x04,0x05,0x04,0x06,0x82,0x04,0x0c,0x05,0x05,0x03,0x02,0x07,0x06,0x06,0x07, +0x03,0x07,0x02,0x03,0x07,0x83,0x02,0x05,0x07,0x07,0x05,0x04,0x04,0x05,0x84,0x04,0x00,0x05,0x88,0x00,0x00,0x05,0x83,0x00,0x00,0x05,0x88,0x04,0x00,0x05,0x83,0x04,0x01,0x06,0x05,0x82,0x04,0x00,0x06,0x82,0x05,0x82,0x03,0x05,0x07,0x05,0x07,0x04,0x04,0x05,0x82,0x04,0x0b,0x06,0x05,0x03,0x06,0x03,0x03,0x04,0x03,0x06,0x05,0x05,0x06,0x85,0x04,0x04,0x06,0x05,0x07,0x05,0x05,0x8e,0x04,0x03,0x05,0x06,0x05,0x05,0x86,0x04,0x0b,0x05,0x06,0x03,0x02,0x03,0x06,0x03,0x03,0x07,0x07,0x03,0x07,0x84,0x02,0x01,0x07,0x07,0x84,0x04,0x0b,0x05,0x04,0x04,0x05,0x04,0x05,0x04,0x05,0x05,0x04,0x05,0x06,0x82,0x04,0x00,0x05,0x82,0x00,0x01,0x00,0x05,0x89,0x04,0x01,0x05, +0x05,0x83,0x04,0x0a,0x05,0x05,0x04,0x04,0x06,0x05,0x05,0x03,0x03,0x02,0x05,0x83,0x04,0x02,0x05,0x04,0x04,0x8a,0x05,0x86,0x04,0x83,0x05,0x86,0x04,0x01,0x05,0x05,0x86,0x04,0x03,0x05,0x06,0x05,0x06,0x86,0x04,0x0a,0x05,0x03,0x02,0x07,0x06,0x07,0x07,0x03,0x02,0x03,0x07,0x82,0x02,0x00,0x07,0x82,0x02,0x01,0x07,0x05,0x85,0x04,0x02,0x05,0x04,0x05,0x89,0x04,0x00,0x05,0x82,0x00,0x03,0x00,0x05,0x04,0x05,0x93,0x04,0x04,0x05,0x05,0x03,0x04,0x05,0x8d,0x04,0x01,0x05,0x05,0x88,0x04,0x83,0x05,0x86,0x04,0x01,0x05,0x05,0x86,0x04,0x02,0x05,0x06,0x05,0x87,0x04,0x09,0x05,0x03,0x02,0x06,0x06,0x07,0x03,0x07,0x02,0x03,0x85,0x02,0x02,0x01,0x07,0x07,0x85,0x04, +0x03,0x05,0x04,0x05,0x05,0x8a,0x04,0x82,0x00,0x02,0x00,0x05,0x05,0x96,0x04,0x02,0x05,0x03,0x05,0x98,0x04,0x01,0x05,0x05,0x88,0x04,0x01,0x05,0x05,0x86,0x04,0x05,0x05,0x04,0x05,0x06,0x04,0x07,0x84,0x04,0x09,0x05,0x03,0x02,0x06,0x06,0x07,0x02,0x02,0x07,0x07,0x83,0x02,0x04,0x01,0x02,0x02,0x07,0x07,0x93,0x04,0x00,0x05,0x82,0x00,0x03,0x00,0x00,0x05,0x04,0x91,0x01,0x06,0x00,0x01,0x01,0x04,0x05,0x05,0x06,0x84,0x01,0x03,0x00,0x01,0x04,0x01,0x82,0x00,0x84,0x01,0x06,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x82,0x05,0x04,0x04,0x01,0x01,0x04,0x00,0x82,0x01,0x02,0x05,0x05,0x04,0x85,0x01,0x08,0x04,0x04,0x05,0x04,0x04,0x00,0x01,0x01,0x00,0x82,0x01,0x09, +0x05,0x03,0x06,0x06,0x03,0x02,0x07,0x07,0x02,0x07,0x86,0x02,0x05,0x07,0x07,0x04,0x01,0x04,0x01,0x86,0x04,0x01,0x01,0x04,0x82,0x01,0x00,0x00,0x82,0x01,0x00,0x05,0x82,0x00,0x82,0x00,0x01,0x05,0x01,0x83,0x00,0x01,0x01,0x00,0x88,0x01,0x85,0x00,0x03,0x04,0x05,0x05,0x01,0x85,0x00,0x01,0x01,0x05,0x8d,0x00,0x00,0x04,0x82,0x05,0x00,0x04,0x83,0x00,0x10,0x01,0x01,0x04,0x05,0x05,0x04,0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x04,0x04,0x05,0x04,0x86,0x00,0x08,0x05,0x03,0x05,0x07,0x07,0x02,0x03,0x02,0x07,0x86,0x02,0x03,0x01,0x07,0x07,0x04,0x85,0x01,0x02,0x04,0x01,0x04,0x84,0x01,0x84,0x00,0x00,0x04,0x82,0x00,0x82,0x00,0x02,0x05,0x05,0x04,0x82,0x01,0x03, +0x00,0x01,0x00,0x00,0x83,0x01,0x00,0x04,0x82,0x01,0x08,0x00,0x01,0x00,0x00,0x01,0x04,0x05,0x05,0x01,0x85,0x00,0x02,0x04,0x05,0x04,0x8b,0x00,0x00,0x04,0x82,0x05,0x01,0x04,0x00,0x83,0x01,0x01,0x00,0x01,0x82,0x05,0x01,0x04,0x00,0x82,0x01,0x06,0x00,0x01,0x00,0x04,0x06,0x05,0x07,0x83,0x00,0x0a,0x01,0x00,0x00,0x04,0x05,0x05,0x07,0x03,0x02,0x03,0x07,0x82,0x02,0x00,0x01,0x83,0x02,0x03,0x01,0x07,0x07,0x04,0x84,0x01,0x00,0x04,0x89,0x01,0x03,0x00,0x01,0x00,0x04,0x82,0x00,0x84,0x00,0x82,0x05,0x8a,0x04,0x03,0x01,0x01,0x00,0x01,0x82,0x00,0x03,0x01,0x05,0x05,0x01,0x85,0x00,0x03,0x01,0x05,0x05,0x01,0x85,0x00,0x03,0x01,0x00,0x01,0x01,0x83,0x05,0x00, +0x04,0x82,0x01,0x00,0x00,0x82,0x01,0x0f,0x04,0x05,0x06,0x07,0x04,0x01,0x01,0x00,0x01,0x01,0x00,0x01,0x06,0x06,0x07,0x04,0x86,0x00,0x06,0x04,0x05,0x03,0x03,0x02,0x07,0x03,0x87,0x02,0x04,0x01,0x07,0x02,0x07,0x04,0x83,0x01,0x03,0x04,0x01,0x04,0x04,0x82,0x05,0x82,0x04,0x00,0x05,0x83,0x04,0x83,0x00,0x8f,0x00,0x82,0x05,0x84,0x01,0x08,0x00,0x01,0x04,0x05,0x05,0x01,0x00,0x01,0x01,0x82,0x00,0x02,0x04,0x05,0x05,0x89,0x04,0x05,0x05,0x05,0x03,0x04,0x05,0x04,0x86,0x01,0x04,0x05,0x03,0x02,0x07,0x04,0x86,0x01,0x0d,0x05,0x06,0x05,0x04,0x01,0x01,0x00,0x01,0x00,0x01,0x01,0x04,0x05,0x04,0x83,0x07,0x89,0x02,0x04,0x07,0x07,0x04,0x01,0x04,0x84,0x01,0x01, +0x04,0x05,0x8d,0x00,0x91,0x00,0x01,0x04,0x04,0x86,0x01,0x04,0x05,0x05,0x01,0x01,0x00,0x82,0x01,0x02,0x00,0x04,0x05,0x86,0x00,0x0b,0x05,0x06,0x05,0x05,0x06,0x04,0x07,0x05,0x05,0x01,0x01,0x04,0x83,0x01,0x05,0x04,0x05,0x03,0x07,0x06,0x04,0x86,0x01,0x05,0x04,0x05,0x07,0x05,0x01,0x00,0x82,0x01,0x04,0x00,0x01,0x01,0x05,0x05,0x82,0x03,0x89,0x02,0x08,0x01,0x01,0x04,0x04,0x01,0x01,0x04,0x04,0x01,0x82,0x04,0x8e,0x00,0x91,0x00,0x01,0x05,0x05,0x85,0x01,0x03,0x04,0x05,0x05,0x04,0x85,0x01,0x00,0x04,0x87,0x00,0x08,0x05,0x03,0x03,0x06,0x03,0x06,0x06,0x05,0x04,0x82,0x01,0x06,0x04,0x01,0x01,0x04,0x05,0x04,0x03,0x83,0x04,0x85,0x01,0x04,0x05,0x03,0x04, +0x05,0x02,0x85,0x01,0x82,0x04,0x04,0x05,0x03,0x02,0x03,0x03,0x85,0x02,0x05,0x07,0x02,0x02,0x07,0x07,0x04,0x82,0x01,0x04,0x04,0x01,0x04,0x01,0x05,0x8e,0x00,0x91,0x00,0x0a,0x05,0x04,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x05,0x05,0x86,0x01,0x00,0x04,0x88,0x00,0x06,0x06,0x03,0x02,0x03,0x06,0x05,0x05,0x83,0x04,0x0f,0x01,0x01,0x04,0x04,0x05,0x03,0x06,0x04,0x05,0x04,0x01,0x04,0x01,0x04,0x01,0x01,0x83,0x04,0x01,0x05,0x04,0x82,0x01,0x05,0x04,0x01,0x04,0x01,0x01,0x04,0x82,0x05,0x83,0x06,0x02,0x05,0x06,0x07,0x83,0x06,0x01,0x05,0x05,0x86,0x04,0x02,0x01,0x04,0x05,0x8d,0x00,0x02,0x00,0x04,0x06,0x82,0x05,0x04,0x04,0x06,0x05,0x04,0x06,0x82,0x05,0x10, +0x04,0x05,0x04,0x05,0x04,0x04,0x01,0x04,0x04,0x01,0x04,0x01,0x04,0x05,0x05,0x04,0x04,0x82,0x01,0x02,0x04,0x01,0x04,0x89,0x00,0x02,0x03,0x03,0x06,0x82,0x05,0x83,0x04,0x00,0x01,0x82,0x04,0x82,0x05,0x06,0x04,0x05,0x04,0x01,0x04,0x01,0x01,0x83,0x04,0x07,0x03,0x07,0x07,0x05,0x04,0x04,0x01,0x04,0x82,0x01,0x82,0x04,0x00,0x06,0x85,0x04,0x10,0x07,0x06,0x04,0x04,0x06,0x04,0x04,0x05,0x04,0x01,0x04,0x03,0x04,0x01,0x04,0x04,0x05,0x8c,0x04,0x01,0x00,0x00,0x00,0x05,0x95,0x04,0x08,0x03,0x01,0x04,0x04,0x05,0x05,0x01,0x04,0x01,0x84,0x04,0x89,0x00,0x06,0x06,0x03,0x07,0x05,0x05,0x04,0x05,0x92,0x04,0x09,0x01,0x04,0x04,0x02,0x07,0x05,0x04,0x01,0x04,0x01, +0x84,0x04,0x00,0x03,0x8d,0x04,0x00,0x05,0x8c,0x04,0x00,0x06,0x87,0x04,0x01,0x05,0x00,0x00,0x05,0x98,0x04,0x82,0x05,0x85,0x04,0x01,0x01,0x04,0x8a,0x00,0x01,0x03,0x06,0x82,0x05,0x94,0x04,0x05,0x05,0x03,0x02,0x07,0x07,0x05,0x82,0x04,0x00,0x02,0x8a,0x04,0x00,0x03,0x86,0x04,0x00,0x06,0x94,0x04,0x02,0x01,0x05,0x00,0x00,0x05,0x98,0x04,0x82,0x05,0x86,0x04,0x00,0x05,0x8a,0x00,0x03,0x06,0x05,0x05,0x06,0x82,0x05,0x82,0x04,0x01,0x05,0x05,0x87,0x04,0x0d,0x03,0x04,0x04,0x01,0x04,0x03,0x05,0x03,0x03,0x02,0x07,0x05,0x05,0x06,0x94,0x04,0x01,0x05,0x06,0x94,0x04,0x01,0x05,0x00,0x00,0x05,0x8a,0x04,0x01,0x06,0x06,0x8a,0x04,0x03,0x05,0x00,0x00,0x05,0x87, +0x04,0x8a,0x00,0x83,0x05,0x02,0x04,0x04,0x05,0x82,0x04,0x01,0x05,0x05,0x8d,0x04,0x07,0x05,0x03,0x03,0x02,0x07,0x07,0x05,0x05,0x84,0x04,0x00,0x06,0x8e,0x04,0x00,0x05,0x87,0x04,0x00,0x06,0x8c,0x04,0x01,0x05,0x00,0x02,0x05,0x05,0x06,0x83,0x04,0x03,0x06,0x04,0x04,0x05,0x83,0x04,0x03,0x06,0x06,0x04,0x05,0x83,0x04,0x01,0x06,0x05,0x82,0x00,0x03,0x05,0x06,0x04,0x06,0x83,0x04,0x00,0x05,0x8a,0x00,0x82,0x05,0x05,0x06,0x05,0x04,0x04,0x06,0x04,0x82,0x05,0x87,0x04,0x00,0x06,0x84,0x04,0x01,0x05,0x06,0x82,0x02,0x00,0x07,0x82,0x05,0x84,0x04,0x00,0x06,0x83,0x04,0x02,0x06,0x04,0x06,0x82,0x04,0x0c,0x06,0x04,0x06,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x06, +0x04,0x05,0x82,0x04,0x04,0x06,0x04,0x05,0x04,0x06,0x82,0x04,0x04,0x06,0x04,0x04,0x05,0x00,0x02,0x05,0x04,0x06,0x82,0x04,0x00,0x06,0x82,0x04,0x00,0x06,0x82,0x04,0x00,0x06,0x82,0x04,0x05,0x06,0x04,0x04,0x06,0x05,0x05,0x83,0x00,0x02,0x05,0x04,0x06,0x82,0x04,0x02,0x06,0x04,0x05,0x8a,0x00,0x04,0x05,0x06,0x05,0x05,0x04,0x82,0x06,0x19,0x05,0x05,0x06,0x06,0x05,0x04,0x06,0x06,0x04,0x04,0x05,0x04,0x06,0x06,0x04,0x04,0x06,0x04,0x05,0x03,0x03,0x02,0x03,0x07,0x06,0x06,0x84,0x05,0x0c,0x06,0x06,0x04,0x05,0x04,0x04,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x82,0x04,0x18,0x05,0x05,0x04,0x04,0x06,0x04,0x05,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x06,0x04,0x04, +0x05,0x04,0x04,0x06,0x04,0x04,0x05,0x00,0x95,0x05,0x85,0x00,0x84,0x05,0x00,0x06,0x82,0x05,0x89,0x00,0x89,0x05,0x02,0x06,0x03,0x07,0x82,0x05,0x02,0x06,0x05,0x04,0x88,0x05,0x04,0x03,0x02,0x07,0x03,0x06,0x82,0x07,0x00,0x00,0x87,0x05,0x00,0x06,0x84,0x05,0x00,0x06,0x87,0x05,0x01,0x06,0x04,0x86,0x05,0x00,0x06,0x89,0x05,0x00,0x00,0xb2,0x00,0x85,0x05,0x03,0x03,0x02,0x02,0x06,0x8d,0x05,0x06,0x03,0x02,0x02,0x06,0x06,0x02,0x03,0xad,0x00,0xb3,0x00,0x03,0x06,0x03,0x06,0x06,0x84,0x02,0x05,0x07,0x03,0x02,0x07,0x02,0x04,0x82,0x02,0x03,0x03,0x02,0x02,0x04,0x82,0x02,0x04,0x07,0x06,0x03,0x03,0x07,0xad,0x00,0xb3,0x00,0x00,0x06,0x83,0x03,0x06,0x02,0x01, +0x02,0x02,0x01,0x02,0x01,0x84,0x02,0x00,0x01,0x85,0x02,0x04,0x07,0x06,0x06,0x03,0x03,0xae,0x00,0xb4,0x00,0x00,0x06,0x82,0x03,0x86,0x02,0x02,0x01,0x02,0x01,0x87,0x02,0x04,0x03,0x03,0x06,0x07,0x02,0xaf,0x00,0xb4,0x00,0x00,0x06,0x82,0x03,0x03,0x02,0x01,0x02,0x01,0x87,0x02,0x00,0x01,0x85,0x02,0x03,0x07,0x06,0x02,0x03,0xaf,0x00,0xb5,0x00,0x83,0x03,0x83,0x02,0x05,0x01,0x02,0x02,0x01,0x02,0x01,0x86,0x02,0x03,0x03,0x06,0x03,0x07,0xb0,0x00,0xb5,0x00,0x00,0x05,0x82,0x03,0x8e,0x02,0x04,0x03,0x07,0x06,0x06,0x03,0xb1,0x00,0xb5,0x00,0x01,0x06,0x05,0x82,0x03,0x04,0x07,0x07,0x02,0x07,0x07,0x85,0x02,0x83,0x07,0x03,0x06,0x06,0x03,0x07,0xb1,0x00,0xa7, +0x00,0x85,0x05,0x84,0x00,0x84,0x05,0x03,0x06,0x07,0x07,0x06,0x84,0x05,0x04,0x06,0x07,0x02,0x03,0x02,0x85,0x05,0x02,0x07,0x06,0x06,0x85,0x05,0x83,0x00,0x82,0x05,0xa3,0x00,0xa7,0x00,0x86,0x05,0x82,0x00,0x85,0x05,0x82,0x06,0x86,0x05,0x03,0x07,0x02,0x07,0x06,0x85,0x05,0x01,0x06,0x07,0x86,0x05,0x82,0x00,0x84,0x05,0xa2,0x00,0xa7,0x00,0x86,0x05,0x82,0x00,0x86,0x05,0x01,0x06,0x07,0x86,0x05,0x02,0x06,0x07,0x07,0x86,0x05,0x01,0x06,0x00,0x86,0x05,0x01,0x00,0x00,0x86,0x05,0xa1,0x00,0xa7,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x06,0x06,0x82,0x05,0x00,0x00,0x82,0x05,0x02,0x07,0x03,0x07,0x82, +0x05,0x00,0x00,0x82,0x05,0x83,0x00,0x82,0x05,0x83,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0xa1,0x00,0xa6,0x00,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x82,0x00,0x82,0x05,0x05,0x00,0x00,0x05,0x05,0x06,0x06,0x83,0x05,0x00,0x00,0x82,0x05,0x06,0x07,0x07,0x06,0x05,0x05,0x00,0x00,0x82,0x05,0x83,0x00,0x82,0x05,0x83,0x00,0x05,0x05,0x05,0x00,0x00,0x05,0x05,0xa2,0x00,0xa6,0x00,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x82,0x00,0x82,0x05,0x05,0x00,0x00,0x05,0x05,0x06,0x07,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x07,0x02,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x83,0x00,0x01,0x05,0x05,0x83,0x00,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0xa2,0x00,0xa6,0x00,0x82,0x05, +0x03,0x00,0x00,0x05,0x05,0x82,0x00,0x82,0x05,0x00,0x00,0x83,0x05,0x05,0x06,0x06,0x05,0x05,0x00,0x00,0x82,0x05,0x06,0x07,0x02,0x06,0x05,0x05,0x00,0x00,0x82,0x05,0x83,0x00,0x01,0x05,0x05,0x83,0x00,0x82,0x05,0xa6,0x00,0xa6,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x03,0x02,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x83,0x00,0x01,0x05,0x05,0x84,0x00,0x82,0x05,0xa5,0x00,0xa6,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x86,0x05,0x02,0x06,0x02,0x07,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x82,0x00,0x82,0x05,0x84, +0x00,0x82,0x05,0xa5,0x00,0xa6,0x00,0x86,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x86,0x05,0x82,0x07,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x83,0x00,0x82,0x05,0x85,0x00,0x82,0x05,0xa4,0x00,0xa6,0x00,0x85,0x05,0x82,0x00,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x86,0x05,0x02,0x03,0x02,0x07,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x83,0x00,0x82,0x05,0x86,0x00,0x82,0x05,0xa3,0x00,0xa6,0x00,0x85,0x05,0x82,0x00,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x82,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x02,0x07,0x07,0x06,0x82,0x05,0x00,0x00,0x82,0x05,0x83,0x00,0x82,0x05,0x86,0x00,0x82,0x05,0xa3,0x00,0xa5,0x00,0x82,0x05,0x02, +0x00,0x05,0x05,0x83,0x00,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x82,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x01,0x06,0x07,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x83,0x00,0x82,0x05,0x87,0x00,0x01,0x05,0x05,0xa3,0x00,0xa5,0x00,0x82,0x05,0x02,0x00,0x05,0x05,0x83,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x01,0x07,0x06,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x83,0x00,0x01,0x05,0x05,0x88,0x00,0x01,0x05,0x05,0xa3,0x00,0xa5,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x01,0x07,0x06,0x82,0x05,0x01,0x00,0x00,0x82,0x05,0x83,0x00,0x01,0x05, +0x05,0x83,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0xa3,0x00,0xa5,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x01,0x06,0x06,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x83,0x00,0x82,0x05,0x83,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0xa3,0x00,0xa5,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0x01,0x00,0x00,0x88,0x05,0x00,0x07,0x82,0x05,0x03,0x00,0x00,0x05,0x05,0x83,0x00,0x82,0x05,0x83,0x00,0x82,0x05,0x00,0x00,0x82,0x05,0xa3,0x00,0xa5,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x85,0x05,0x82,0x00,0x87,0x05,0x01,0x00,0x00,0x86, +0x05,0x83,0x00,0x82,0x05,0x83,0x00,0x85,0x05,0xa4,0x00,0xa5,0x00,0x03,0x05,0x05,0x00,0x00,0x82,0x05,0x82,0x00,0x85,0x05,0x82,0x00,0x85,0x05,0x84,0x00,0x84,0x05,0x84,0x00,0x82,0x05,0x83,0x00,0x85,0x05,0xa4,0x00,0xb1,0x00,0x01,0x05,0x05,0x90,0x00,0x01,0x05,0x05,0x8f,0x00,0x01,0x05,0x05,0xa6,0x00,0xff,0x00,0xff,0x00 +}; + +// http://paulbourke.net/dataformats/tga/ + + +typedef struct { + char idlength; + char colourmaptype; + char datatypecode; + short colourmaporigin; + short colourmaplength; + char colourmapdepth; + short x_origin; + short y_origin; + short width; + short height; + char bitsperpixel; + char imagedescriptor; + struct { byte r,g,b; } palette[8]; + byte data[0]; +} TGAHeader; + +void draw_tga(const byte* tgadata, byte x, byte y) { + const TGAHeader* hdr = (TGAHeader*) tgadata; + const byte* src = hdr->data; + byte* dest = &vidmem[x][y]; + byte i,j,lastbyte; + for (i=0; i<8; i++) { + byte pal = 0; + pal |= (hdr->palette[i].r >> 5); + pal |= (hdr->palette[i].g >> 2) & 0x38; + pal |= (hdr->palette[i].b) & 0xc0; + palette[i] = pal; + } + for (j=0; jheight; j++) { + byte* start = dest; + i = 0; + lastbyte = 0; + while (iwidth) { + byte count = *src++; + byte rle = count & 0x80; + byte color = 0; + if (rle) { + color = *src++; // fetch RLE byte + count &= 0x7f; + } + do { + if (!rle) + color = *src++; // fetch raw data + if ((i&1)==0) { + *dest = lastbyte = (color << 4); // even byte + } else { + *dest = lastbyte | color; // odd byte + dest += 256; + } + i++; + } while (count--); + } + dest = start+1; + watchdog0x39 = 0x39; + } +} + +void clrscr() { + // doesn't work because memset uses LDIR + // and reads come from ROM + //memset(vidmem, 0, sizeof(vidmem)); + word i = sizeof(vidmem)-1; + do { + vidmem[0][i] = 0; + watchdog0x39 = 0x39; + } while (i--); +} + +void main() { + clrscr(); + draw_tga(example_tga, 45, 76); // array, so no & + while (1) { + watchdog0x39 = 0x39; + } +} diff --git a/presets/williams/gfxtest.c b/presets/williams-z80/gfxtest.c similarity index 78% rename from presets/williams/gfxtest.c rename to presets/williams-z80/gfxtest.c index a71045ee..99857bad 100644 --- a/presets/williams/gfxtest.c +++ b/presets/williams-z80/gfxtest.c @@ -32,7 +32,7 @@ struct { byte height; } __at (0xca00) blitter; -byte __at (0x0) vidmem[128][304]; // 256x304x4bpp video memory +byte __at (0x0) vidmem[152][256]; // 256x304x4bpp video memory void main(); @@ -54,13 +54,23 @@ const byte font8x8[HICHAR-LOCHAR+1][8] = { }; const byte sprite1[] = { - 4,6, - 0x33,0x33,0x33,0x32, - 0x33,0x33,0x32,0x33, - 0x33,0x32,0x00,0x33, - 0x32,0x00,0x00,0x33, - 0x33,0x00,0x00,0x33, - 0x33,0x33,0x33,0x33 +8,16, +0x00,0x09,0x99,0x00,0x00,0x99,0x90,0x00, +0x00,0x94,0x94,0x90,0x09,0x49,0x49,0x00, +0x04,0x49,0x49,0x90,0x09,0x94,0x94,0x90, +0x94,0x99,0x94,0x90,0x09,0x49,0x99,0x49, +0x99,0x99,0x49,0x93,0x39,0x94,0x99,0x99, +0x04,0x49,0x99,0x94,0x49,0x99,0x94,0x90, +0x00,0x94,0x94,0x43,0x34,0x49,0x49,0x00, +0x00,0x09,0x43,0x94,0x49,0x34,0x90,0x00, +0x00,0x90,0x00,0x39,0x93,0x00,0x09,0x00, +0x00,0x09,0x83,0x33,0x33,0x33,0x90,0x00, +0x00,0x09,0x32,0x23,0x32,0x23,0x90,0x00, +0x00,0x03,0x03,0x23,0x82,0x30,0x30,0x00, +0x03,0x30,0x00,0x33,0x33,0x00,0x03,0x30, +0x00,0x30,0x03,0x00,0x00,0x30,0x03,0x00, +0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, }; inline word swapw(word j) { @@ -69,7 +79,7 @@ inline word swapw(word j) { // x1: 0-151 // y1: 0-255 -void blit_solid(byte x1, byte y1, byte w, byte h, byte color) { +inline void blit_solid(byte x1, byte y1, byte w, byte h, byte color) { blitter.width = w^4; blitter.height = h^4; blitter.dstart = x1+y1*256; // swapped @@ -77,7 +87,7 @@ void blit_solid(byte x1, byte y1, byte w, byte h, byte color) { blitter.flags = DSTSCREEN|SOLID; } -void blit_copy(byte x1, byte y1, byte w, byte h, const byte* data) { +inline void blit_copy(byte x1, byte y1, byte w, byte h, const byte* data) { blitter.width = w^4; blitter.height = h^4; blitter.sstart = swapw((word)data); @@ -86,7 +96,7 @@ void blit_copy(byte x1, byte y1, byte w, byte h, const byte* data) { blitter.flags = DSTSCREEN|FGONLY; } -void draw_sprite(const byte* data, byte x, byte y) { +inline void draw_sprite(const byte* data, byte x, byte y) { blitter.width = data[0]^4; blitter.height = data[1]^4; blitter.sstart = swapw((word)(data+2)); @@ -122,20 +132,26 @@ void draw_string(const char* str, byte x, byte y, byte color) { } while (ch); } +inline void blit_pixel(word xx, byte y, byte color) { + blitter.width = 1^4; + blitter.height = 1^4; + blitter.dstart = (xx>>1)+y*256; // swapped + blitter.solid = color; + blitter.flags = (xx&1) ? SOLID|ODDONLY : SOLID|EVENONLY; +} + void main() { int i; + blit_solid(0, 0, 152, 255, 0x00); for (i=0; i<16; i++) - palette[i] = i*5; - for (i=0; i<128; i+=8) { - vidmem[0][i] += 16; - vidmem[i][2] += 32; - //blit_solid(i/2,i,149-i,255-i*2,i*0x11+1); + palette[i] = i*7; + for (i=0; i<152; i++) { + vidmem[0][i] = 16; + vidmem[i][2] = 32; + blit_pixel(i, i, 0x77); + blit_pixel(i+1, i, 0x33); } - draw_sprite(sprite1, 10, 20); - draw_char('A', 5, 5, 0xff); + draw_sprite(sprite1, 35, 20); draw_string("HELLO WORLD", 20, 5, 0x88); - //blit_solid(0,0,100,100,0x11); - //blit_solid(10,20,100,200,0x22); - watchdog0x39 = 0x39; - main(); + while (1) watchdog0x39 = 0x39; } diff --git a/presets/williams-z80/sprites.c b/presets/williams-z80/sprites.c new file mode 100644 index 00000000..cf50289d --- /dev/null +++ b/presets/williams-z80/sprites.c @@ -0,0 +1,241 @@ + +#include + +typedef unsigned char byte; +typedef unsigned short word; + +byte __at (0xc000) palette[16]; +byte __at (0xc800) input0; +byte __at (0xc802) input1; +byte __at (0xc804) input2; +byte __at (0xc900) rom_select; +byte __at (0xcb00) video_counter; +byte __at (0xcbff) watchdog0x39; +byte __at (0xcc00) nvram[0x400]; + +// blitter flags +#define SRCSCREEN 0x1 +#define DSTSCREEN 0x2 +#define ESYNC 0x4 +#define FGONLY 0x8 +#define SOLID 0x10 +#define RSHIFT 0x20 +#define EVENONLY 0x40 +#define ODDONLY 0x80 + +struct { + byte flags; + byte solid; + word sstart; + word dstart; + byte width; + byte height; +} __at (0xca00) blitter; + +byte __at (0x0) vidmem[128][304]; // 256x304x4bpp video memory + +void main(); + +// start routine @ 0x0 +// set stack pointer, enable interrupts +void start() { +__asm + LD SP,#0xc000 + DI +__endasm; + main(); +} + +const byte palette_data[16] = { + 0x00, 0x03, 0x19, 0x50, 0x52, 0x07, 0x1f, 0x37, 0xe0, 0xa4, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, }; + +const byte sprite_data[] = { +8,128, +0x00,0x09,0x99,0x00,0x00,0x99,0x90,0x00, +0x00,0x94,0x94,0x90,0x09,0x49,0x49,0x00, +0x04,0x49,0x49,0x90,0x09,0x94,0x94,0x90, +0x94,0x99,0x94,0x90,0x09,0x49,0x99,0x49, +0x99,0x99,0x49,0x93,0x39,0x94,0x99,0x99, +0x04,0x49,0x99,0x94,0x49,0x99,0x94,0x90, +0x00,0x94,0x94,0x43,0x34,0x49,0x49,0x00, +0x00,0x09,0x43,0x94,0x49,0x34,0x90,0x00, +0x00,0x90,0x00,0x39,0x93,0x00,0x09,0x00, +0x00,0x09,0x83,0x33,0x33,0x33,0x90,0x00, +0x00,0x09,0x32,0x23,0x32,0x23,0x90,0x00, +0x00,0x03,0x03,0x23,0x82,0x30,0x30,0x00, +0x03,0x30,0x00,0x33,0x33,0x00,0x03,0x30, +0x00,0x30,0x03,0x00,0x00,0x30,0x03,0x00, +0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x00, +0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00, +0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00, +0x00,0x11,0x10,0x01,0x10,0x01,0x11,0x00, +0x11,0x00,0x10,0x11,0x11,0x01,0x00,0x11, +0x10,0x00,0x11,0x11,0x11,0x11,0x00,0x01, +0x10,0x00,0x00,0x11,0x11,0x00,0x00,0x01, +0x00,0x01,0x10,0x11,0x41,0x01,0x10,0x00, +0x00,0x10,0x11,0x11,0x11,0x11,0x01,0x00, +0x01,0x00,0x00,0x51,0x15,0x00,0x00,0x10, +0x01,0x00,0x01,0x10,0x01,0x10,0x00,0x10, +0x01,0x00,0x10,0x00,0x00,0x01,0x00,0x10, +0x00,0x10,0x01,0x00,0x00,0x10,0x01,0x00, +0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x00, +0x00,0x01,0x10,0x00,0x00,0x01,0x10,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0xbb,0xbb,0x00,0x00,0x00, +0x00,0x00,0x00,0xbb,0xbb,0x00,0x00,0x00, +0x00,0x00,0xbb,0xbb,0xbb,0xbb,0x00,0x00, +0x00,0x0b,0x4b,0xbb,0xbb,0xb4,0xb0,0x00, +0x00,0x0b,0x44,0xbb,0xbb,0x49,0xb0,0x00, +0x00,0xbb,0x99,0x4b,0xb4,0x99,0xbb,0x00, +0x00,0x4b,0xb9,0x9b,0xb4,0x4b,0xb4,0x00, +0x00,0x04,0xbb,0x4b,0xb9,0xbb,0x40,0x00, +0x00,0x00,0x4b,0xbb,0xbb,0xb4,0x00,0x00, +0x11,0x00,0x0b,0xbb,0xbb,0xb0,0x00,0x11, +0x10,0x10,0x0b,0x41,0x14,0xb0,0x01,0x01, +0x10,0x00,0x05,0x11,0x11,0x50,0x00,0x01, +0x01,0x00,0x01,0x51,0x15,0x10,0x00,0x10, +0x00,0x10,0x01,0x10,0x01,0x10,0x01,0x00, +0x01,0x01,0x10,0x10,0x01,0x01,0x10,0x10, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x22,0x00,0x00,0x22,0x00,0x00, +0x00,0x20,0x20,0x00,0x00,0x02,0x02,0x00, +0x02,0x22,0x12,0x00,0x00,0x21,0x22,0x20, +0x00,0x02,0x11,0x00,0x00,0x11,0x20,0x00, +0x00,0x00,0x02,0x11,0x11,0x20,0x00,0x00, +0x00,0x00,0x02,0x22,0x22,0x20,0x00,0x00, +0x00,0x00,0x21,0x22,0x22,0x12,0x00,0x00, +0x00,0x00,0x22,0x12,0x21,0x22,0x00,0x00, +0x02,0x00,0x22,0x12,0x21,0x22,0x00,0x20, +0x20,0x02,0x21,0x11,0x11,0x12,0x20,0x02, +0x02,0x22,0x15,0x12,0x21,0x51,0x22,0x20, +0x02,0x11,0x15,0x52,0x25,0x51,0x11,0x20, +0x20,0x00,0x22,0x12,0x21,0x22,0x00,0x02, +0x20,0x02,0x20,0x20,0x02,0x02,0x20,0x02, +0x02,0x02,0x00,0x20,0x02,0x00,0x20,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,0x04,0x04,0x04,0x00, +0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x40, +0x00,0x00,0x04,0x04,0x49,0x49,0x99,0x44, +0x00,0x00,0x44,0x44,0x99,0x94,0x44,0x40, +0x00,0x04,0x49,0x99,0x94,0x49,0x99,0x40, +0x00,0x44,0x99,0x94,0x49,0x99,0x44,0x00, +0x04,0x49,0x44,0x99,0x99,0x44,0x00,0x00, +0x04,0x44,0x00,0x49,0x44,0x40,0x00,0x00, +0x04,0x40,0x00,0x04,0x00,0x00,0x00,0x00, +0x04,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,0x60,0x00,0x00,0x00,0x00,0x06,0x00, +0x60,0x60,0x00,0x00,0x00,0x00,0x06,0x06, +0x60,0x60,0x50,0x00,0x00,0x05,0x06,0x06, +0x60,0x60,0x06,0x00,0x00,0x60,0x06,0x06, +0x66,0x60,0x06,0x06,0x60,0x60,0x06,0x66, +0x66,0x60,0x66,0x66,0x66,0x66,0x06,0x66, +0x66,0x60,0x6b,0x6b,0xb6,0xb6,0x06,0x66, +0x06,0x66,0x66,0xb6,0x6b,0x66,0x66,0x60, +0x00,0x67,0x66,0x66,0x66,0x66,0x66,0x00, +0x00,0x11,0x11,0x66,0x66,0x11,0x11,0x00, +0x01,0x11,0x21,0x11,0x11,0x12,0x11,0x10, +0x00,0x10,0x01,0x01,0x10,0x10,0x01,0x00, +0x00,0x10,0x11,0x00,0x00,0x11,0x01,0x00, +0x00,0x00,0x10,0x00,0x00,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x11,0x11,0x11,0x11,0x00,0x00, +0x00,0x01,0x61,0x11,0x21,0x12,0x10,0x00, +0x00,0x11,0x12,0x11,0x61,0x11,0x11,0x00, +0x00,0x11,0x71,0x21,0x61,0x17,0x11,0x00, +0x00,0x11,0x77,0x11,0x12,0x77,0x11,0x00, +0x00,0x11,0x17,0x17,0x71,0x72,0x11,0x00, +0x00,0x16,0x21,0x78,0x87,0x11,0x11,0x00, +0x00,0x01,0x81,0x88,0x88,0x18,0x10,0x00, +0x00,0x08,0x18,0x58,0x85,0x81,0x80,0x00, +0x00,0x88,0x01,0x88,0x88,0x10,0x88,0x00, +0x00,0x08,0x07,0x78,0x87,0x70,0x80,0x00, +0x08,0x80,0x07,0x80,0x08,0x70,0x08,0x80, +0x88,0x00,0x88,0x00,0x00,0x88,0x00,0x88, +0x80,0x00,0x08,0x80,0x08,0x80,0x00,0x08, +0x00,0x00,0x00,0x80,0x08,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0xaa,0x00,0x00,0xaa,0x00,0x00, +0x00,0x00,0xa0,0x0a,0xa0,0x0a,0x00,0x00, +0x0a,0xaa,0xa4,0xaa,0xaa,0x3a,0xaa,0xa0, +0x00,0x0a,0x3a,0x9a,0xa9,0xa3,0xa0,0x00, +0x00,0x0a,0xaa,0x99,0xa4,0xaa,0xa0,0x00, +0x00,0x0a,0xaa,0x99,0x94,0xaa,0xa0,0x00, +0x00,0xaa,0x33,0xaa,0xaa,0x43,0xaa,0x00, +0x0a,0x3a,0xaa,0x3a,0xa3,0xaa,0xa3,0xa0, +0x00,0xaa,0xaa,0x30,0x03,0xaa,0xaa,0x00, +0x00,0x0a,0xa0,0x30,0x03,0x0a,0xa0,0x00, +0x00,0xa3,0xa0,0x00,0x00,0x0a,0x4a,0x00, +0x00,0xaa,0xa0,0x00,0x00,0x0a,0xaa,0x00, +0x00,0x0a,0xa0,0x00,0x00,0x0a,0xa0,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +inline word swapw(word j) { + return ((j << 8) | (j >> 8)); +} + +// x1: 0-151 +// y1: 0-255 +inline void blit_solid(byte x1, byte y1, byte w, byte h, byte color) { + blitter.width = w^4; + blitter.height = h^4; + blitter.dstart = x1+y1*256; // swapped + blitter.solid = color; + blitter.flags = DSTSCREEN|SOLID; +} + +inline void blit_copy(byte x1, byte y1, byte w, byte h, const byte* data) { + blitter.width = w^4; + blitter.height = h^4; + blitter.sstart = swapw((word)data); + blitter.dstart = x1+y1*256; // swapped + blitter.solid = 0; + blitter.flags = DSTSCREEN|FGONLY; +} + +inline void blit_copy_solid(byte x1, byte y1, byte w, byte h, const byte* data, byte solid) { + blitter.width = w^4; + blitter.height = h^4; + blitter.sstart = swapw((word)data); + blitter.dstart = x1+y1*256; // swapped + blitter.solid = solid; + blitter.flags = DSTSCREEN|FGONLY|SOLID; +} + +inline void draw_sprite(const byte* data, byte x, byte y) { + blitter.width = data[0]^4; + blitter.height = data[1]^4; + blitter.sstart = swapw((word)(data+2)); + blitter.dstart = x+y*256; // swapped + blitter.solid = 0; + blitter.flags = DSTSCREEN|FGONLY; +} + +void main() { + byte y = 0; + byte i; + blit_solid(0, 0, 255, 255, 0); + memcpy(palette, palette_data, 16); + draw_sprite(sprite_data, 20, 20); + while (1) { + for (i=0; i<8; i++) { + byte xpos = 40+i*12; + const byte* sprdata = sprite_data+2+i*8*16; + blit_copy_solid(xpos, y-1, 8, 16, sprdata, 0); + blit_copy(xpos, y, 8, 16, sprdata); + } + y++; + watchdog0x39 = 0x39; + } +} diff --git a/src/platform/galaxian.js b/src/platform/galaxian.js index 5ececa79..cf81282a 100644 --- a/src/platform/galaxian.js +++ b/src/platform/galaxian.js @@ -60,7 +60,7 @@ var GalaxianPlatform = function(mainElement, options) { var vsyncFrequency = hsyncFrequency/132/2; // 60.606060 Hz var vblankDuration = 1/vsyncFrequency * (20/132); // 2500 us var cpuCyclesPerLine = cpuFrequency/hsyncFrequency; - var INITIAL_WATCHDOG = 256; + var INITIAL_WATCHDOG = 8; var showOffscreenObjects = false; var stars = []; for (var i=0; i<256; i++) @@ -225,9 +225,10 @@ var GalaxianPlatform = function(mainElement, options) { [0x5000, 0x5fff, 0xff, function(a,v) { oram.mem[a] = v; }], [0x6801, 0x6801, 0, function(a,v) { interruptEnabled = 1; }], [0x6802, 0x6802, 0, function(a,v) { /* TODO: coin counter */ }], - [0x6804, 0x6804, 0, function(a,v) { starsEnabled = v; }], - [0x6805, 0x6805, 0, function(a,v) { missileWidth = v; }], // not on h/w - [0x6806, 0x6806, 0, function(a,v) { missileOffset = v; }], // not on h/w + [0x6803, 0x6803, 0, function(a,v) { /* TODO: backgroundColor = (v & 1) ? 0xFF000056 : 0xFF000000; */ }], + [0x6804, 0x6804, 0, function(a,v) { starsEnabled = v & 1; }], + [0x6808, 0x6808, 0, function(a,v) { missileWidth = v; }], // not on h/w + [0x6809, 0x6809, 0, function(a,v) { missileOffset = v; }], // not on h/w [0x8202, 0x8202, 0, scramble_protection_w], //[0x8100, 0x8103, 0, function(a,v){ /* PPI 0 */ }], //[0x8200, 0x8203, 0, function(a,v){ /* PPI 1 */ }], @@ -256,8 +257,8 @@ var GalaxianPlatform = function(mainElement, options) { //[0x6800, 0x6807, 0x7, function(a,v) { }], // sound //[0x7800, 0x7800, 0x7, function(a,v) { }], // pitch [0x6000, 0x6003, 0x3, function(a,v) { outlatches.mem[a] = v; }], - [0x7001, 0x7001, 0, function(a,v) { interruptEnabled = v; }], - [0x7004, 0x7004, 0, function(a,v) { starsEnabled = v; }], + [0x7001, 0x7001, 0, function(a,v) { interruptEnabled = v & 1; }], + [0x7004, 0x7004, 0, function(a,v) { starsEnabled = v & 1; }], ]), isContended: function() { return false; }, }; diff --git a/src/platform/vector.js b/src/platform/vector.js index 676f2964..f5791947 100644 --- a/src/platform/vector.js +++ b/src/platform/vector.js @@ -153,6 +153,7 @@ var AtariVectorPlatform = function(mainElement) { cpu.loadState(state.c); cpuram.mem.set(state.cb); dvgram.mem.set(state.db); + switches.set(state.sw); nmicount = state.nmic; } this.saveState = function() { @@ -160,6 +161,7 @@ var AtariVectorPlatform = function(mainElement) { c:cpu.saveState(), cb:cpuram.mem.slice(0), db:dvgram.mem.slice(0), + sw:switches.slice(0), nmic:nmicount } } @@ -295,6 +297,7 @@ var AtariColorVectorPlatform = function(mainElement) { cpu.loadState(state.c); cpuram.mem.set(state.cb); dvgram.mem.set(state.db); + switches.set(state.sw); nmicount = state.nmic; } this.saveState = function() { @@ -302,6 +305,7 @@ var AtariColorVectorPlatform = function(mainElement) { c:cpu.saveState(), cb:cpuram.mem.slice(0), db:dvgram.mem.slice(0), + sw:switches.slice(0), nmic:nmicount } } @@ -314,7 +318,7 @@ var AtariColorVectorPlatform = function(mainElement) { var Z80ColorVectorPlatform = function(mainElement, proto) { var self = this; - var cpuFrequency = 3000000.0; + var cpuFrequency = 4000000.0; var cpuCyclesPerFrame = Math.round(cpuFrequency/60); var cpu, cpuram, dvgram, rom, bus, dvg; var video, audio, timer; @@ -361,6 +365,7 @@ var Z80ColorVectorPlatform = function(mainElement, proto) { [0x810f, 0x810f, 0, function(a,v) { do_math(); } ], [0x8840, 0x8840, 0, function(a,v) { dvg.runUntilHalt(0); }], [0x8880, 0x8880, 0, function(a,v) { dvg.reset(); }], + [0x8980, 0x8980, 0, function(a,v) { switches[0xe] = 16; }], [0xa000, 0xdfff, 0x3fff, function(a,v) { dvgram.mem[a] = v; }], [0xe000, 0xffff, 0x1fff, function(a,v) { cpuram.mem[a] = v; }], ]) @@ -377,6 +382,11 @@ var Z80ColorVectorPlatform = function(mainElement, proto) { self.runCPU(cpu, cpuCyclesPerFrame); cpu.requestInterrupt(); self.restartDebugState(); + switches[0xf] = (switches[0xf] + 1) & 0x3; + if (--switches[0xe] <= 0) { + console.log("WATCHDOG FIRED"); // TODO: alert on video + self.reset(); // watchdog reset + } }); setKeyboardFromMap(video, switches, GRAVITAR_KEYCODE_MAP); } @@ -402,6 +412,7 @@ var Z80ColorVectorPlatform = function(mainElement, proto) { audio.start(); } this.reset = function() { + switches[0xe] = 16; cpu.reset(); } this.readAddress = function(addr) { @@ -412,6 +423,7 @@ var Z80ColorVectorPlatform = function(mainElement, proto) { cpu.loadState(state.c); cpuram.mem.set(state.cb); dvgram.mem.set(state.db); + switches.set(state.sw); mathram.set(state.mr); } this.saveState = function() { @@ -419,6 +431,7 @@ var Z80ColorVectorPlatform = function(mainElement, proto) { c:cpu.saveState(), cb:cpuram.mem.slice(0), db:dvgram.mem.slice(0), + sw:switches.slice(0), mr:mathram.slice(0), } } diff --git a/src/platform/williams.js b/src/platform/williams.js index 20c5625d..6ea8859b 100644 --- a/src/platform/williams.js +++ b/src/platform/williams.js @@ -1,6 +1,9 @@ "use strict"; var WILLIAMS_PRESETS = [ + {id:'gfxtest.c', name:'Graphics Test'}, + {id:'sprites.c', name:'Sprite Test'}, + {id:'bitmap_rle.c', name:'RLE Bitmap'}, ]; var WilliamsPlatform = function(mainElement, proto) { @@ -18,13 +21,14 @@ var WilliamsPlatform = function(mainElement, proto) { var blitregs = new RAM(8).mem; var video, timer, pixels, displayPCs; - var membus, iobus; var screenNeedsRefresh = false; + var membus, iobus; var video_counter; var xtal = 12000000; var cpuFrequency = xtal/3/4; var cpuCyclesPerFrame = cpuFrequency/60; // TODO + var cpuScale = 1; var INITIAL_WATCHDOG = 64; var PIXEL_ON = 0xffeeeeee; var PIXEL_OFF = 0xff000000; @@ -132,15 +136,15 @@ var WilliamsPlatform = function(mainElement, proto) { ]); var memread_williams = new AddressDecoder([ - [0x0000, 0x8fff, 0xffff, function(a) { return banksel ? rom[a] : ram.mem[a]; }], - [0x9000, 0xbfff, 0xffff, function(a) { return ram.mem[a]; }], + [0x0000, 0x97ff, 0xffff, function(a) { return banksel ? rom[a] : ram.mem[a]; }], + [0x9800, 0xbfff, 0xffff, function(a) { return ram.mem[a]; }], [0xc000, 0xcfff, 0x0fff, ioread_williams], [0xd000, 0xffff, 0xffff, function(a) { return rom ? rom[a-0x4000] : 0; }], ]); var memwrite_williams = new AddressDecoder([ - [0x0000, 0x8fff, 0, write_display_byte], - [0x9000, 0xbfff, 0, function(a,v) { ram.mem[a] = v; }], + [0x0000, 0x97ff, 0, write_display_byte], + [0x9800, 0xbfff, 0, function(a,v) { ram.mem[a] = v; }], [0xc000, 0xcfff, 0x0fff, iowrite_williams], //[0x0000, 0xffff, 0, function(a,v) { console.log(hex(a), hex(v)); }], ]); @@ -173,7 +177,7 @@ var WilliamsPlatform = function(mainElement, proto) { blitregs[a] = v; } else { var cycles = doBlit(v); - cpu.setTstates(cpu.getTstates() + cycles); + cpu.setTstates(cpu.getTstates() + cycles * cpuScale); } } @@ -242,7 +246,7 @@ var WilliamsPlatform = function(mainElement, proto) { curpix |= (solid & ~keepmask); else curpix |= (srcdata & ~keepmask); - if (dstaddr < 0x9000) // can cause recursion otherwise + if (dstaddr < 0x9800) // can cause recursion otherwise memwrite_williams(dstaddr, curpix); } @@ -362,11 +366,20 @@ var WilliamsPlatform = function(mainElement, proto) { this.readAddress = function(addr) { return membus.read(addr); } + this.scaleCPUFrequency = function(scale) { + cpuScale = scale; + cpuFrequency *= scale; + cpuCyclesPerFrame *= scale; + } } var WilliamsZ80Platform = function(mainElement) { this.__proto__ = new WilliamsPlatform(mainElement, BaseZ80Platform); + // Z80 @ 4 MHz + // also scale bitblt clocks + this.scaleCPUFrequency(4); + this.ramStateToLongString = function(state) { var blt = state.blt; var sstart = (blt[2] << 8) + blt[3]; diff --git a/src/worker/workermain.js b/src/worker/workermain.js index 223da7d2..36b9dca2 100644 --- a/src/worker/workermain.js +++ b/src/worker/workermain.js @@ -27,9 +27,9 @@ var PLATFORM_PARAMS = { }, 'williams-z80': { code_start: 0x0, - code_size: 0x9000, - data_start: 0x9000, - data_size: 0x3000, + code_size: 0x9800, + data_start: 0x9800, + data_size: 0x2800, }, 'vector-z80color': { code_start: 0x0, @@ -662,6 +662,7 @@ function compileSDCC(code, platform) { '--less-pedantic', //'--fomit-frame-pointer', '--opt-code-speed', + '--oldralloc', // TODO: does this make it fater? '-o', 'main.asm']); /* // ignore if all are warnings (TODO?) diff --git a/test/cli/test1.c b/test/cli/test1.c new file mode 100644 index 00000000..fd5864f6 --- /dev/null +++ b/test/cli/test1.c @@ -0,0 +1,615 @@ + +#include +#include +#include + +typedef unsigned char byte; +typedef unsigned short word; +typedef signed char sbyte; + +word __at(0xa000) dvgram[0x1000]; +byte __at(0x8840) _dvgstart; + +int __at(0x8100) mathbox_sum; +sbyte __at(0x8102) mathbox_arg1; +sbyte __at(0x8103) mathbox_arg2; +byte __at(0x810f) mathbox_go_mul; + +byte __at (0x8000) input0; +byte __at (0x8001) input1; +byte __at (0x8002) input2; + +#define LEFT1 !(input1 & 0x8) +#define RIGHT1 !(input1 & 0x4) +#define UP1 !(input1 & 0x10) +#define DOWN1 !(input1 & 0x20) +#define FIRE1 !(input1 & 0x2) +#define BOMB1 !(input1 & 0x1) +#define COIN1 (input0 & 0x2) +#define COIN2 (input0 & 0x1) +#define START1 (input2 & 0x20) +#define START2 (input2 & 0x40) + +// + +void main(); +void _sdcc_heap_init(void); // for malloc() + +void start() { +__asm + LD SP,#0x0 + DI +; copy initialized data + LD BC, #l__INITIALIZER + LD A, B + LD DE, #s__INITIALIZED + LD HL, #s__INITIALIZER + LDIR +__endasm; + // init heap for malloc() and run main pgm. + _sdcc_heap_init(); + main(); +} + +// VECTOR ROUTINES + +int dvgwrofs; // write offset for DVG buffer + +inline word ___swapw(word j) { + return ((j << 8) | (j >> 8)); +} + +inline void dvgreset() { + dvgwrofs = 0; +} + +inline void dvgstart() { + _dvgstart = 0; +} + +void dvgwrite(word w) { + dvgram[dvgwrofs++] = w; +} + +inline void VCTR(int dx, int dy, byte bright) { + dvgwrite((dy & 0x1fff)); + dvgwrite(((bright & 7) << 13) | (dx & 0x1fff)); +} + +inline void SVEC(signed char dx, signed char dy, byte bright) { + dvgwrite(0x4000 | (dx & 0x1f) | ((bright&7)<<5) | ((dy & 0x1f)<<8)); +} + +inline void JSRL(word offset) { + dvgwrite(0xa000 | offset); +} + +inline void JMPL(word offset) { + dvgwrite(0xe000 | offset); +} + +inline void RTSL() { + dvgwrite(0xc000); +} + +inline void CNTR() { + dvgwrite(0x8000); +} + +inline void HALT() { + dvgwrite(0x2000); +} + +inline void STAT(byte rgb, byte intens) { + dvgwrite(0x6000 | ((intens & 0xf)<<4) | (rgb & 7)); +} + +inline void STAT_sparkle(byte intens) { + dvgwrite(0x6800 | ((intens & 0xf)<<4)); +} + +inline void SCAL(word scale) { + dvgwrite(0x7000 | scale); +} + +enum { + BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, WHITE +} Color; + + +// MATH/3D ROUTINES + +typedef struct { + sbyte m[3][3]; +} Matrix; + +typedef struct { + sbyte x,y,z; +} Vector8; + +typedef struct { + int x,y,z; +} Vector16; + +typedef struct { + byte numverts; + const Vector8* verts; // array of vertices + const sbyte* edges; // array of vertex indices (edges) +} Wireframe; + +void mat_identity(Matrix* m) { + memset(m, 0, sizeof(*m)); + m->m[0][0] = 127; + m->m[1][1] = 127; + m->m[2][2] = 127; +} + +inline void mul16(sbyte a, sbyte b) { + mathbox_arg1 = a; + mathbox_arg2 = b; + mathbox_go_mul=0; +} + +void vec_mat_transform(Vector16* dest, const Vector8* v, const Matrix* m) { + byte i; + int* result = &dest->x; + const sbyte* mval = &m->m[0][0]; + for (i=0; i<3; i++) { + mathbox_sum = 0; + mul16(*mval++, v->x); + mul16(*mval++, v->y); + mul16(*mval++, v->z); + *result++ = mathbox_sum; + } +} + +const sbyte sintbl[64] = { +0, 3, 6, 9, 12, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, +49, 51, 54, 57, 60, 63, 65, 68, 71, 73, 76, 78, 81, 83, 85, 88, +90, 92, 94, 96, 98, 100, 102, 104, 106, 107, 109, 111, 112, 113, 115, 116, +117, 118, 120, 121, 122, 122, 123, 124, 125, 125, 126, 126, 126, 127, 127, 127, +}; + +sbyte isin(byte x0) { + byte x = x0; + if (x0 & 0x40) x = 127-x; + if (x0 & 0x80) { + return -sintbl[x+128]; + } else { + return sintbl[x]; + } +} + +sbyte icos(byte x) { + return isin(x+64); +} + +void mat_rotate(Matrix* m, byte axis, byte angle) { + sbyte sin = isin(angle); + sbyte cos = icos(angle); + mat_identity(m); + switch (axis) { + case 0: + m->m[1][1] = cos; + m->m[2][1] = sin; + m->m[1][2] = -sin; + m->m[2][2] = cos; + break; + case 1: + m->m[2][2] = cos; + m->m[0][2] = sin; + m->m[2][0] = -sin; + m->m[0][0] = cos; + break; + case 2: + m->m[0][0] = cos; + m->m[1][0] = -sin; + m->m[0][1] = sin; + m->m[1][1] = cos; + break; + } +} + +void xform_vertices(Vector16* dest, const Vector8* src, const Matrix* m, byte nv) { + byte i; + for (i=0; iedges; + byte bright = 0; + int x1 = 0; + int y1 = 0; + Vector16 scrnverts[16]; + xform_vertices(scrnverts, wf->verts, m, wf->numverts); + do { + sbyte i = *e++; + if (i == -1) + bright = 0; + else if (i == -2) + break; + else { + int x2 = scrnverts[i].x>>8; + int y2 = scrnverts[i].y>>8; + VCTR(x2-x1, y2-y1, bright); + x1 = x2; + y1 = y2; + } + bright = 2; + } while (1); +} + +static word lfsr = 1; + +word rand() { + word lsb = lfsr & 1; + lfsr >>= 1; + if (lsb) lfsr ^= 0xd400; + return lfsr; +} + +// SHAPE CACHE + +const Vector8 tetra_v[] = { {0,-86,86},{86,86,86},{-86,86,86},{0,0,-86} }; +const char tetra_e[] = { 0, 1, 2, 0, 3, 1, -1, 3, 2, -2 }; +const Wireframe tetra_wf = { 4, tetra_v, tetra_e }; + +const Vector8 octa_v[] = { {86,0,0},{0,86,0},{-86,0,0},{0,-86,0},{0,0,86},{0,0,-86} }; +const char octa_e[] = { 0, 1, 2, 3, 0, 4, 1, 5, 0, -1, 2, 4, 3, 5, 2, -2 }; +const Wireframe octa_wf = { 6, octa_v, octa_e }; + +const Vector8 ship_v[] = { {0,86,0},{-30,-30,0},{-50,0,0},{50,0,0},{30,-30,0} }; +const char ship_e[] = { 0, 1, 2, 3, 4, 0, -2 }; +const Wireframe ship_wf = { 5, ship_v, ship_e }; + +const Vector8 thrust_v[] = { {-20,-30,0},{-30,-50,0},{0,-86,0},{30,-50,0},{20,-30,0} }; +const char thrust_e[] = { 0, 1, 2, 3, 4, -2 }; +const Wireframe thrust_wf = { 5, thrust_v, thrust_e }; + +const Vector8 torpedo_v[] = { {-86,0,0},{86,0,0},{-40,-40,0},{40,40,0},{0,-20,0},{0,20,0} }; +const char torpedo_e[] = { 0, 1, -1, 2, 3, -1, 4, 5, -2 }; +const Wireframe torpedo_wf = { 6, torpedo_v, torpedo_e }; + +word ship_shapes[32]; +word thrust_shapes[32]; +word tetra_shapes[32]; +word torpedo_shapes[16]; +word explosion_shape[1]; + +void draw_explosion() { + byte i; + for (i=0; i<30; i++) { + byte angle = rand(); + sbyte xd = isin(angle) >> 4; + sbyte yd = icos(angle) >> 4; + SVEC(xd, yd, 2); + SVEC(-xd, -yd, 2); + } +} + +void make_cached_shapes() { + Matrix mat; + byte i; + for (i=0; i<32; i++) { + ship_shapes[i] = dvgwrofs; + mat_rotate(&mat, 2, i<<3); + draw_wireframe_ortho(&ship_wf, &mat); + RTSL(); + thrust_shapes[i] = dvgwrofs; + draw_wireframe_ortho(&thrust_wf, &mat); + RTSL(); + tetra_shapes[i] = dvgwrofs; + mat_rotate(&mat, 0, i<<3); + draw_wireframe_ortho(&octa_wf, &mat); + RTSL(); + } + for (i=0; i<16; i++) { + torpedo_shapes[i] = dvgwrofs; + mat_rotate(&mat, 2, i<<4); + draw_wireframe_ortho(&torpedo_wf, &mat); + RTSL(); + } + explosion_shape[0] = dvgwrofs; + STAT_sparkle(15); + draw_explosion(); + RTSL(); +} + +// MAIN PROGRAM + +struct Actor; + +typedef void ActorUpdateFn(struct Actor*); + +typedef struct Actor { + word* shapes; + ActorUpdateFn* update_fn; + byte angshift; + byte scale; + byte color; + byte intens; + byte collision_flags; + byte angle; + word xx; + word yy; + int velx; + int vely; + struct Actor* next; + byte removed:1; +} Actor; + +#define WORLD_SCALE 0x2c0 + +void draw_actor(const Actor* a) { + CNTR(); // center beam (0,0) + SCAL(WORLD_SCALE); // world scale + VCTR(a->xx>>3, a->yy>>3, 0); // go to object center + SCAL(a->scale); // object scale + STAT(a->color, a->intens); // set color/intensity + JSRL(a->shapes[a->angle >> a->angshift]); // draw +} + +void move_actor(Actor* a) { + a->xx += a->velx; + a->yy += a->vely; +} + +static Actor* first_actor = NULL; + +Actor* new_actor(const Actor* base) { + Actor* a = (Actor*) malloc(sizeof(Actor)); + memcpy(a, base, sizeof(Actor)); + a->next = first_actor; + first_actor = a; + return a; +} + +void draw_and_update_actors() { + Actor* a = first_actor; + while (a != NULL) { + draw_actor(a); + move_actor(a); + if (a->update_fn) a->update_fn(a); + a = a->next; + } +} + +void remove_expired_actors() { + Actor* a; + // get address of first pointer + Actor** prev = &first_actor; + while ((a = *prev) != NULL) { + // was actor removed? + if (a->removed) { + // set previous pointer to skip this actor + *prev = a->next; + // free memory + free(a); + } else { + // get address of next pointer + prev = &a->next; + } + } +} + +void draw_actor_rect(Actor* a) { + CNTR(); // center beam (0,0) + SCAL(WORLD_SCALE); // world scale + VCTR(a->xx>>3, a->yy>>3, 0); // go to object center + SCAL(a->scale); // object scale + STAT(RED, 7); // set color/intensity + VCTR(-86,-86,0); + VCTR(86*2,0,2); + VCTR(0,86*2,2); + VCTR(-86*2,0,2); + VCTR(0,-86*2,2); +} + +inline byte abs(sbyte x) { + return (x>=0) ? x : -x; +} + +inline word get_distance_squared(byte dx, byte dy) { + mathbox_sum = 0; + mul16(dx,dx); + mul16(dy,dy); + return mathbox_sum; +} + +typedef void ActorCollisionFn(struct Actor*, struct Actor*); + +byte test_actor_distance(ActorCollisionFn* fn, Actor* act1, byte mindist, byte flags) { + Actor* a = first_actor; + byte xx1 = act1->xx >> 8; + byte yy1 = act1->yy >> 8; + byte count = 0; + // mindist2 = mindist * mindist + word mindist2; + mathbox_sum = 0; + mul16(mindist,mindist); + mindist2 = mathbox_sum; + // go through list of actors + while (a) { + // only compare against actors with certain flags + // (that haven't been removed) + if ((a->collision_flags & flags) && !a->removed) { + byte dx = abs(xx1 - (a->xx >> 8)); + byte dy = abs(yy1 - (a->yy >> 8)); + if (dx+dy < mindist) { + word dist2 = get_distance_squared(dx, dy); + if (dist2 < mindist2) { + if (fn) fn(act1, a); + count++; + } + } + } + a = a->next; + } + return count; +} + +void explode_at(Actor* base); + +void explode_actor(Actor* a, Actor* b) { + a->removed = 1; + explode_at(b); + b->removed = 1; +} + +void obstacle_update_fn(struct Actor* a) { + a->angle += 1; +} + +void torpedo_update_fn(struct Actor* a) { + // expire? + if ((a->angle += 60) == 0) { + a->removed = 1; + } else { + // check for torpedo hits + test_actor_distance(explode_actor, a, 20, 0x2); + } +} + +void explosion_update_fn(struct Actor* a) { + a->scale -= 2; + if (a->scale < 8) { + a->removed = 1; + } +} + +const Actor ship_actor = { + ship_shapes, NULL, 3, 0xb0, WHITE, 7, 0x1, +}; +const Actor tetra_actor = { + tetra_shapes, obstacle_update_fn, 3, 0x80, CYAN, 7, 0x2, +}; +const Actor torpedo_actor = { + torpedo_shapes, torpedo_update_fn, 4, 0xe0, YELLOW, 15, 0x4, +}; +const Actor explosion_actor = { + explosion_shape, explosion_update_fn, 8, 0xa0, WHITE, 15, 0, +}; + +void create_obstacles(byte count) { + while (count--) { + Actor* a = new_actor(&tetra_actor); + a->xx = rand() | 0x8000; + a->yy = rand(); + a->velx = (int)rand()<<8>>8; + a->vely = (int)rand()<<8>>8; + } +} + +static int frame = 0; + +static Actor* curship; + +void draw_thrust() { + word rnd = rand(); + // save old values in actor + byte oldcolor = curship->color; + byte oldintens = curship->intens; + // temporarily give new thrust values + curship->shapes = thrust_shapes; + curship->scale ^= rnd; // random thrust scale + curship->intens = 15; + curship->color = (rnd&1) ? RED : YELLOW; + // draw thrust using player's ship actor + draw_actor(curship); + // restore previous values + curship->shapes = ship_shapes; + curship->scale ^= rnd; + curship->color = oldcolor; + curship->intens = oldintens; +} + +void thrust_ship() { + sbyte sin = isin(curship->angle); + sbyte cos = icos(curship->angle); + curship->velx += sin>>3; + curship->vely += cos>>3; +} + +int apply_friction(int vel) { + int delta = vel >> 8; + if (delta == 0 && vel > 0) delta++; + return vel - delta; +} + +void shoot_torpedo() { + sbyte sin = isin(curship->angle); + sbyte cos = icos(curship->angle); + Actor* torp = new_actor(&torpedo_actor); + torp->velx = sin << 2; + torp->vely = cos << 2; + torp->xx = curship->xx + torp->velx*4; + torp->yy = curship->yy + torp->vely*4; +} + +static byte can_fire; +static byte newship_timer; + +void new_player_ship() { + curship = new_actor(&ship_actor); +} + +void explode_at(Actor* base) { + Actor* a = new_actor(&explosion_actor); + a->xx = base->xx; + a->yy = base->yy; +} + +void control_player() { + if (newship_timer && --newship_timer == 0) { + new_player_ship(); + } + if (!curship) return; + if (LEFT1) curship->angle -= 2; + if (RIGHT1) curship->angle += 2; + if ((frame&1)==1) { + curship->velx = apply_friction(curship->velx); + curship->vely = apply_friction(curship->vely); + } + if (UP1) { + // draw flame + draw_thrust(); + // thrust every 4 frames, to avoid precision issues + if (!(frame&3)) thrust_ship(); + } + if (FIRE1) { + // must release fire button before firing again + if (can_fire) { + shoot_torpedo(); + can_fire = 0; + } + } else { + can_fire = 1; + } + // ship ran into something? + if (test_actor_distance(NULL, curship, 20, 0x2)) { + explode_at(curship); + curship->removed = 1; + curship = NULL; + newship_timer = 255; + } +} + +void main() { + memset(dvgram, 0x20, sizeof(dvgram)); // HALTs + dvgwrofs = 0x800; + make_cached_shapes(); + create_obstacles(5); + new_player_ship(); + while (1) { + dvgreset(); + draw_and_update_actors(); + control_player(); + remove_expired_actors(); + CNTR(); + HALT(); + dvgstart(); + frame++; + } +} diff --git a/test/cli/testworker.js b/test/cli/testworker.js index bffc0dde..30ceff87 100644 --- a/test/cli/testworker.js +++ b/test/cli/testworker.js @@ -81,6 +81,10 @@ function compile(tool, code, platform, callback, outlen, nlines, nerrors) { }); } +function ab2str(buf) { + return String.fromCharCode.apply(null, new Uint16Array(buf)); +} + describe('Worker', function() { it('should assemble DASM', function(done) { compile('dasm', '\tprocessor 6502\n\torg $f000\nfoo lda #0\n', 'vcs', done, 2, 1); @@ -127,6 +131,10 @@ describe('Worker', function() { it('should compile SDCC w/ include', function(done) { compile('sdcc', '#include \nvoid main() {\nstrlen(0);\n}\n', 'mw8080bw', done, 8192, 2, 0); }); + it('should compile big SDCC file', function(done) { + var csource = ab2str(fs.readFileSync('test/cli/test1.c')); + compile('sdcc', csource, 'vector-z80color', done, 32768, 298, 0); + }); it('should NOT compile SDCC', function(done) { compile('sdcc', 'foobar', 'mw8080bw', done, 0, 0, 1); }); diff --git a/tools/Makefile b/tools/Makefile index cc5f70d8..a80d98ab 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -11,5 +11,22 @@ %-48.pbm: %.jpg convert $< -resize 48x192\! -colorspace Gray -dither FloydSteinberg $@ +%.tga: %.png + convert $< -resize 128x96\! +dither $<.gif + convert $<.gif -type palette -compress RLE -colors 8 +dither -flip $@ + convert $@ $@.png + +%.pcx: %.png + convert $< -format raw -type palette -compress none -colors 15 +dither $@ + ship1.pbm: ship1.png - convert ship1.png -negate -flop ship1.pbm \ No newline at end of file + convert ship1.png -negate -flop ship1.pbm + +%.h: + cat $* | hexdump -v -e '"\n" 128/1 "0x%02x,"' + +%.prom: + cat $* | hexdump -v -e '" \n defb " 32/1 "$$%02x,"' | cut -c 2-134 + +%.rot.pbm: %.pbm + convert $< -transpose -bordercolor white -border 4x4 $@ diff --git a/tools/badspacerobots.png b/tools/badspacerobots.png new file mode 100644 index 0000000000000000000000000000000000000000..329d8326e66fb1b1aa1ba209ec7b1679c9639a16 GIT binary patch literal 124828 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%0A9;d%s&tof0tr(Yu?DfL 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ȫUz-1Iyq@CcCdMio7|m&p_Rt0`rii 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]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 U+b4C@0{1o)WmRQrq|Jl=2RI5NuK)l5 literal 0 HcmV?d00001 diff --git a/tools/pbm_to_c.py b/tools/pbm_to_c.py index 0c66261a..0b6f5b02 100755 --- a/tools/pbm_to_c.py +++ b/tools/pbm_to_c.py @@ -22,7 +22,7 @@ with open(sys.argv[1],'rb') as f: header = f.readline().strip() assert(header == 'P4') dims = f.readline().strip() - if dims[0] == '#': + while dims[0] == '#': dims = f.readline().strip() width,height = map(int, dims.split()) wbytes = (width+7)/8 diff --git a/tools/pcx2will.py b/tools/pcx2will.py new file mode 100755 index 00000000..0c7d7e5f --- /dev/null +++ b/tools/pcx2will.py @@ -0,0 +1,37 @@ +#!/usr/bin/python + +import sys, array, string + + +def tohex2(v): + return '0x%02x'%v + +with open(sys.argv[1],'rb') as f: + data = array.array('B', f.read()) + assert data[0] == 0xa + assert data[3] == 8 + + # palette + print "byte palette[16] = {", + for i in range(0,16): + r = data[16+i*3] + g = data[17+i*3] + b = data[18+i*3] + entry = (r>>5) | ((g>>2)&0x38) | (b&0xc0) + print '%s,' % (tohex2(entry)), + print "}" + + # image data + width = (data[9] << 8) + data[8] + 1 + height = (data[11] << 8) + data[10] + 1 + rowlen = (data[0x43] << 8) + data[0x42] + print "%d,%d," % ((width+1)/2,height) + for y in range(0,height): + ofs = 0x80 + y*rowlen + output = [] + for x in range(0,width,2): + b = (data[ofs] << 4) + (data[ofs+1]) + output.append(b) + ofs += 2 + print string.join(map(tohex2,output),',') + ',' +