From 1ca9d5080123822fc9870b8b66bac11da5d39a10 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Wed, 19 Apr 2017 14:26:46 -0400 Subject: [PATCH] added skeleton files --- Makefile | 7 +- presets/mw8080bw/skeleton.sdcc | 177 ++++++++++++++++++++++++++ presets/vector-z80color/skeleton.sdcc | 135 ++++++++++++++++++++ presets/vicdual/skeleton.sdcc | 2 +- presets/williams-z80/skeleton.sdcc | 162 +++++++++++++++++++++++ src/platform/vector.js | 3 + test/cli/testworker.js | 26 +++- tools/mknotes.py | 1 + tools/williams/Makefile | 2 +- tools/williams/swave.c.rom | Bin 0 -> 16384 bytes 10 files changed, 508 insertions(+), 7 deletions(-) create mode 100644 presets/mw8080bw/skeleton.sdcc create mode 100644 presets/vector-z80color/skeleton.sdcc create mode 100644 presets/williams-z80/skeleton.sdcc create mode 100644 tools/williams/swave.c.rom diff --git a/Makefile b/Makefile index 04e2f82c..b75ea086 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,11 @@ check: lint: gjslint -r src +# https://github.com/Kentzo/git-archive-all archive: mkdir -p release - git-archive-all --prefix 8bitworkshop-1.1/ release/8bitworkshop-1.1.tgz - #git archive --output release/8bitworkshop-1.1.tgz --prefix 8bitworkshop-1.1/ 1.1 + git-archive-all --prefix 8bitworkshop-2.0/ release/8bitworkshop-2.0.zip # 2.0 + #git-archive-all --prefix 8bitworkshop-1.1/ release/8bitworkshop-1.1.zip 1.1 + git archive --prefix 8bitworkshop- -o release/8bitworkshop-tools.zip HEAD tools + diff --git a/presets/mw8080bw/skeleton.sdcc b/presets/mw8080bw/skeleton.sdcc new file mode 100644 index 00000000..3ac62ae2 --- /dev/null +++ b/presets/mw8080bw/skeleton.sdcc @@ -0,0 +1,177 @@ + +#include + +typedef unsigned char byte; +typedef signed char sbyte; +typedef unsigned short word; + +volatile __sfr __at (0x0) input0; +volatile __sfr __at (0x1) input1; +volatile __sfr __at (0x2) input2; +__sfr __at (0x2) bitshift_offset; +volatile __sfr __at (0x3) bitshift_read; +__sfr __at (0x4) bitshift_value; +__sfr __at (0x6) watchdog_strobe; + +byte __at (0x2400) vidmem[224][32]; // 256x224x1 video memory + +#define FIRE1 (input1 & 0x10) +#define LEFT1 (input1 & 0x20) +#define RIGHT1 (input1 & 0x40) +#define COIN1 (input1 & 0x1) +#define START1 (input1 & 0x4) +#define START2 (input1 & 0x2) + +void scanline96() __interrupt; +void scanline224() __interrupt; + +void main(); +// start routine @ 0x0 +// set stack pointer, enable interrupts +void start() { +__asm + LD SP,#0x2400 + EI + NOP +__endasm; + main(); +} + +// scanline 96 interrupt @ 0x8 +// we don't have enough bytes to make this an interrupt +// because the next routine is at 0x10 +void _RST_8() { +__asm + NOP + NOP + NOP + NOP + NOP +__endasm; + scanline96(); +} + +// scanline 224 interrupt @ 0x10 +// this one, we make an interrupt so it saves regs. +void scanline224() __interrupt { + vidmem[2]++; +} + +// scanline 96 function, saves regs +void scanline96() __interrupt { + vidmem[0]++; +} + +/// GRAPHICS FUNCTIONS + +void clrscr() { + memset(vidmem, 0, sizeof(vidmem)); +} + +inline void xor_pixel(byte x, byte y) { + byte* dest = &vidmem[x][y>>3]; + *dest ^= 0x1 << (y&7); +} + +void draw_vline(byte x, byte y1, byte y2) { + byte yb1 = y1/8; + byte yb2 = y2/8; + byte* dest = &vidmem[x][yb1]; + signed char nbytes = yb2 - yb1; + *dest++ ^= 0xff << (y1&7); + if (nbytes > 0) { + while (--nbytes > 0) { + *dest++ ^= 0xff; + } + *dest ^= 0xff >> (~y2&7); + } else { + *--dest ^= 0xff << ((y2+1)&7); + } +} + +#define LOCHAR 0x20 +#define HICHAR 0x5e + +const byte font8x8[HICHAR-LOCHAR+1][8] = { +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x79,0x79,0x00,0x00,0x00 }, { 0x00,0x70,0x70,0x00,0x00,0x70,0x70,0x00 }, { 0x14,0x7f,0x7f,0x14,0x14,0x7f,0x7f,0x14 }, { 0x00,0x12,0x3a,0x6b,0x6b,0x2e,0x24,0x00 }, { 0x00,0x63,0x66,0x0c,0x18,0x33,0x63,0x00 }, { 0x00,0x26,0x7f,0x59,0x59,0x77,0x27,0x05 }, { 0x00,0x00,0x00,0x10,0x30,0x60,0x40,0x00 }, { 0x00,0x00,0x1c,0x3e,0x63,0x41,0x00,0x00 }, { 0x00,0x00,0x41,0x63,0x3e,0x1c,0x00,0x00 }, { 0x08,0x2a,0x3e,0x1c,0x1c,0x3e,0x2a,0x08 }, { 0x00,0x08,0x08,0x3e,0x3e,0x08,0x08,0x00 }, { 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00 }, { 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00 }, { 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00 }, { 0x00,0x01,0x03,0x06,0x0c,0x18,0x30,0x20 }, { 0x00,0x3e,0x7f,0x49,0x51,0x7f,0x3e,0x00 }, { 0x00,0x01,0x11,0x7f,0x7f,0x01,0x01,0x00 }, { 0x00,0x23,0x67,0x45,0x49,0x79,0x31,0x00 }, { 0x00,0x22,0x63,0x49,0x49,0x7f,0x36,0x00 }, { 0x00,0x0c,0x0c,0x14,0x34,0x7f,0x7f,0x04 }, { 0x00,0x72,0x73,0x51,0x51,0x5f,0x4e,0x00 }, { 0x00,0x3e,0x7f,0x49,0x49,0x6f,0x26,0x00 }, { 0x00,0x60,0x60,0x4f,0x5f,0x70,0x60,0x00 }, { 0x00,0x36,0x7f,0x49,0x49,0x7f,0x36,0x00 }, { 0x00,0x32,0x7b,0x49,0x49,0x7f,0x3e,0x00 }, { 0x00,0x00,0x00,0x12,0x12,0x00,0x00,0x00 }, { 0x00,0x00,0x00,0x13,0x13,0x00,0x00,0x00 }, { 0x00,0x08,0x1c,0x36,0x63,0x41,0x41,0x00 }, { 0x00,0x14,0x14,0x14,0x14,0x14,0x14,0x00 }, { 0x00,0x41,0x41,0x63,0x36,0x1c,0x08,0x00 }, { 0x00,0x20,0x60,0x45,0x4d,0x78,0x30,0x00 }, { 0x00,0x3e,0x7f,0x41,0x59,0x79,0x3a,0x00 }, { 0x00,0x1f,0x3f,0x68,0x68,0x3f,0x1f,0x00 }, { 0x00,0x7f,0x7f,0x49,0x49,0x7f,0x36,0x00 }, { 0x00,0x3e,0x7f,0x41,0x41,0x63,0x22,0x00 }, { 0x00,0x7f,0x7f,0x41,0x63,0x3e,0x1c,0x00 }, { 0x00,0x7f,0x7f,0x49,0x49,0x41,0x41,0x00 }, { 0x00,0x7f,0x7f,0x48,0x48,0x40,0x40,0x00 }, { 0x00,0x3e,0x7f,0x41,0x49,0x6f,0x2e,0x00 }, { 0x00,0x7f,0x7f,0x08,0x08,0x7f,0x7f,0x00 }, { 0x00,0x00,0x41,0x7f,0x7f,0x41,0x00,0x00 }, { 0x00,0x02,0x03,0x41,0x7f,0x7e,0x40,0x00 }, { 0x00,0x7f,0x7f,0x1c,0x36,0x63,0x41,0x00 }, { 0x00,0x7f,0x7f,0x01,0x01,0x01,0x01,0x00 }, { 0x00,0x7f,0x7f,0x30,0x18,0x30,0x7f,0x7f }, { 0x00,0x7f,0x7f,0x38,0x1c,0x7f,0x7f,0x00 }, { 0x00,0x3e,0x7f,0x41,0x41,0x7f,0x3e,0x00 }, { 0x00,0x7f,0x7f,0x48,0x48,0x78,0x30,0x00 }, { 0x00,0x3c,0x7e,0x42,0x43,0x7f,0x3d,0x00 }, { 0x00,0x7f,0x7f,0x4c,0x4e,0x7b,0x31,0x00 }, { 0x00,0x32,0x7b,0x49,0x49,0x6f,0x26,0x00 }, { 0x00,0x40,0x40,0x7f,0x7f,0x40,0x40,0x00 }, { 0x00,0x7e,0x7f,0x01,0x01,0x7f,0x7e,0x00 }, { 0x00,0x7c,0x7e,0x03,0x03,0x7e,0x7c,0x00 }, { 0x00,0x7f,0x7f,0x06,0x0c,0x06,0x7f,0x7f }, { 0x00,0x63,0x77,0x1c,0x1c,0x77,0x63,0x00 }, { 0x00,0x70,0x78,0x0f,0x0f,0x78,0x70,0x00 }, { 0x00,0x43,0x47,0x4d,0x59,0x71,0x61,0x00 }, { 0x00,0x00,0x7f,0x7f,0x41,0x41,0x00,0x00 }, { 0x00,0x20,0x30,0x18,0x0c,0x06,0x03,0x01 }, { 0x00,0x00,0x41,0x41,0x7f,0x7f,0x00,0x00 }, { 0x00,0x08,0x18,0x3f,0x3f,0x18,0x08,0x00 } +}; + +void draw_sprite(const byte* src, byte x, byte y) { + byte i,j; + byte* dest = &vidmem[x][y]; + byte w = *src++; + byte h = *src++; + for (j=0; j +#include + +typedef unsigned char byte; +typedef unsigned short word; +typedef signed char sbyte; + +word __at(0xa000) dvgram[0x1000]; +byte __at(0x8840) _dvgstart; + +volatile int __at(0x8100) mathbox_sum; +sbyte __at(0x8102) mathbox_arg1; +sbyte __at(0x8103) mathbox_arg2; +byte __at(0x810f) mathbox_go_mul; + +volatile byte __at (0x8000) input0; +volatile byte __at (0x8001) input1; +volatile byte __at (0x8002) input2; +volatile byte __at (0x800f) vidframe; +byte __at (0x8980) watchdog; + +#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; + +void main() { + memset(dvgram, 0x20, sizeof(dvgram)); // HALTs + while (1) { + dvgreset(); + CNTR(); + VCTR(100,0,1); + VCTR(0,100,2); + VCTR(-100,0,3); + VCTR(0,-100,4); + CNTR(); + HALT(); + dvgstart(); + watchdog=0; + } + main(); +} diff --git a/presets/vicdual/skeleton.sdcc b/presets/vicdual/skeleton.sdcc index a850b24e..84e37428 100644 --- a/presets/vicdual/skeleton.sdcc +++ b/presets/vicdual/skeleton.sdcc @@ -25,7 +25,7 @@ byte __at (0xe800) tileram[256][8]; #define COIN1 (input3 & 0x8) #define START1 !(input2 & 0x10) #define START2 !(input3 & 0x20) -#define VSYNC (input1 & 0x8) +#define TIMER500HZ (input2 & 0x8) inline void set8910(byte reg, byte data) { ay8910_reg = reg; diff --git a/presets/williams-z80/skeleton.sdcc b/presets/williams-z80/skeleton.sdcc new file mode 100644 index 00000000..a2b3631c --- /dev/null +++ b/presets/williams-z80/skeleton.sdcc @@ -0,0 +1,162 @@ + +#include + +typedef unsigned char byte; +typedef signed char sbyte; +typedef unsigned short word; +typedef enum { false, true } bool; + +byte __at (0x0) vidmem[152][256]; // 304x256x4bpp video memory +byte __at (0xc000) palette[16]; +volatile byte __at (0xc804) input0; +volatile byte __at (0xc806) input1; +volatile byte __at (0xc80c) input2; +byte __at (0xc80c) sound_pia; +byte __at (0xc900) rom_select; +volatile byte __at (0xcb00) video_counter; +byte __at (0xcbff) watchdog0x39; +byte __at (0xcc00) nvram[0x400]; + +__sfr __at (0) debug; + +// 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; + +// switch flags +#define UP1 (input0 & 0x1) +#define DOWN1 (input0 & 0x2) +#define LEFT1 (input0 & 0x4) +#define RIGHT1 (input0 & 0x8) +#define START1 (input0 & 0x10) +#define START2 (input0 & 0x20) +#define UP2 (input0 & 0x40) +#define DOWN2 (input0 & 0x80) +#define LEFT2 (input1 & 0x1) +#define RIGHT2 (input1 & 0x2) +#define AUTOUP (input2 & 0x1) +#define ADVANCE (input2 & 0x2) +#define COIN2 (input2 & 0x4) +#define HIGHSCORERESET (input2 & 0x8) +#define COIN1 (input2 & 0x10) +#define COIN3 (input2 & 0x20) +#define TILTSWITCH (input2 & 0x40) +#define SOUNDACK (input2 & 0x80) + +#define WATCHDOG watchdog0x39=0x39; + +// + +void main(); +void _sdcc_heap_init(void); // for malloc() + +// start routine @ 0x0 +// set stack pointer, enable interrupts +void start() { +__asm + LD SP,#0xc000 + DI +; copy initialized data + LD BC, #l__INITIALIZER + LD A, B + LD DE, #s__INITIALIZED + LD HL, #s__INITIALIZER + LDIR +__endasm; + + _sdcc_heap_init(); + main(); +} + +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 draw_solid(word x1, byte y1, byte w, byte h, byte color) { + blitter.width = w^4; + blitter.height = h^4; + blitter.dstart = (x1>>1)+y1*256; // swapped + blitter.solid = color; + blitter.flags = (x1&1) ? DSTSCREEN|SOLID|RSHIFT : DSTSCREEN|SOLID; +} + +inline void draw_vline(word x1, byte y1, byte h, byte color) { + blitter.width = 1^4; + blitter.height = h^4; + blitter.dstart = (x1>>1)+y1*256; // swapped + blitter.solid = color; + blitter.flags = (x1&1) ? DSTSCREEN|SOLID|ODDONLY : DSTSCREEN|SOLID|EVENONLY; +} + +inline void blit_copy_solid(word x, byte y, byte w, byte h, const byte* data, byte solid) { + blitter.width = w^4; + blitter.height = h^4; + blitter.solid = solid; + blitter.sstart = swapw((word)data); + blitter.dstart = (x>>1)+y*256; // swapped + if (solid) + blitter.flags = (x&1) ? DSTSCREEN|FGONLY|SOLID|RSHIFT : DSTSCREEN|FGONLY|SOLID; + else + blitter.flags = (x&1) ? DSTSCREEN|RSHIFT : DSTSCREEN; +} + +// bias sprites by +4 pixels +#define XBIAS 2 + +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>>1)+y*256+XBIAS; // swapped + blitter.flags = (x&1) ? DSTSCREEN|FGONLY|RSHIFT : DSTSCREEN|FGONLY; +} + +inline void draw_sprite_solid(const byte* data, byte x, byte y, byte color) { + blitter.width = data[0]^4; + blitter.height = data[1]^4; + blitter.sstart = swapw((word)(data+2)); + blitter.dstart = (x>>1)+y*256+XBIAS; // swapped + blitter.solid = color; + blitter.flags = (x&1) ? DSTSCREEN|FGONLY|RSHIFT|SOLID : DSTSCREEN|FGONLY|SOLID; +} + +void draw_box(word x1, byte y1, word x2, byte y2, byte color) { + draw_solid(x1, y1, (x2-x1)>>1, 1, color); + draw_solid(x1, y2, (x2-x1)>>1, 1, color); + draw_vline(x1, y1, y2-y1, color); + draw_vline(x2, y1, y2-y1, color); +} + +static byte frame = 0; + +void main() { + palette[0] = 0x11; + palette[1] = 0xff+frame++; + blit_solid(0,0,25,25,0x11); + main(); +} diff --git a/src/platform/vector.js b/src/platform/vector.js index f18e633c..d2d9465e 100644 --- a/src/platform/vector.js +++ b/src/platform/vector.js @@ -348,6 +348,9 @@ var Z80ColorVectorPlatform = function(mainElement, proto) { this.start = function() { cpuram = new RAM(0x2000); dvgram = new RAM(0x4000); + switches[0] = 0x0; + switches[1] = 0xff; + switches[2] = 0x0; // bus bus = { diff --git a/test/cli/testworker.js b/test/cli/testworker.js index 30ceff87..d1b1d030 100644 --- a/test/cli/testworker.js +++ b/test/cli/testworker.js @@ -131,9 +131,29 @@ 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 compile vicdual skeleton', function(done) { + var csource = ab2str(fs.readFileSync('presets/vicdual/skeleton.sdcc')); + compile('sdcc', csource, 'vicdual', done, 16416, 45, 0); + }); + it('should compile mw8080 skeleton', function(done) { + var csource = ab2str(fs.readFileSync('presets/mw8080bw/skeleton.sdcc')); + compile('sdcc', csource, 'mw8080bw', done, 8192, 84, 0); + }); + it('should compile galaxian skeleton', function(done) { + var csource = ab2str(fs.readFileSync('presets/galaxian-scramble/skeleton.sdcc')); + compile('sdcc', csource, 'galaxian-scramble', done, 20512, 29, 0); + }); + it('should compile vector skeleton', function(done) { + var csource = ab2str(fs.readFileSync('presets/vector-z80color/skeleton.sdcc')); + compile('sdcc', csource, 'vector-z80color', done, 32768, 24, 0); + }); + it('should compile williams skeleton', function(done) { + var csource = ab2str(fs.readFileSync('presets/williams-z80/skeleton.sdcc')); + compile('sdcc', csource, 'williams-z80', done, 38912, 39, 0); + }); + it('should compile williams_sound skeleton', function(done) { + var csource = ab2str(fs.readFileSync('presets/sound_williams-z80/skeleton.sdcc')); + compile('sdcc', csource, 'sound_williams-z80', done, 16384, 6, 0); }); it('should NOT compile SDCC', function(done) { compile('sdcc', 'foobar', 'mw8080bw', done, 0, 0, 1); diff --git a/tools/mknotes.py b/tools/mknotes.py index 845994aa..331c21e9 100755 --- a/tools/mknotes.py +++ b/tools/mknotes.py @@ -6,6 +6,7 @@ parser = argparse.ArgumentParser() parser.add_argument('-l', '--length', type=int, default=64, help="length of note table") parser.add_argument('-u', '--upper', type=int, default=49, help="upper note # to test") parser.add_argument('-f', '--freq', type=float, default=3579545/32.0, help="base frequency (Hz)") +parser.add_argument('-b', '--bias', type=float, default=0, help="divisor bias") args = parser.parse_args() test_notes = args.upper diff --git a/tools/williams/Makefile b/tools/williams/Makefile index dbf333a7..0a23a52c 100644 --- a/tools/williams/Makefile +++ b/tools/williams/Makefile @@ -1,5 +1,5 @@ -all: baddies.c badspacerobots.tga tom-thumb.c +all: baddies.c badspacerobots.tga tom-thumb.c swave.c.rom.h %.h: % cat $* | hexdump -v -e '"\n" 128/1 "0x%02x,"' > $@ diff --git a/tools/williams/swave.c.rom b/tools/williams/swave.c.rom new file mode 100644 index 0000000000000000000000000000000000000000..a86a4fc754060e423ab824cdb927c75e4c1d875d GIT binary patch literal 16384 zcmeIuL1>a;7zgm@Rr#1{U>G)O;3h284@M%G+R%3-Tf?;+Hn1h~F~+jV(6Q;9P92@< z7Idh?qArc-PzFUK2&B^%3