diff --git a/index.html b/index.html index a35d43c7..32b96b9a 100644 --- a/index.html +++ b/index.html @@ -194,7 +194,7 @@ canvas.pixelated {
  • Midway 8080 B&W
  • VIC Dual
  • -
  • Galaxian/Scramble
  • +
  • Scramble
  • Atari Color Vector (Z80)
  • Williams (Z80)
  • diff --git a/presets/vicdual/vic1.c b/presets/vicdual/soundtest.c similarity index 80% rename from presets/vicdual/vic1.c rename to presets/vicdual/soundtest.c index a06bf7cc..6b4e8230 100644 --- a/presets/vicdual/vic1.c +++ b/presets/vicdual/soundtest.c @@ -9,27 +9,39 @@ __sfr __at (0x1) input1; __sfr __at (0x2) input2; __sfr __at (0x3) input3; -__sfr __at (0x1) audreg; -__sfr __at (0x2) auddata; +__sfr __at (0x1) ay8910_reg; +__sfr __at (0x2) ay8910_data; __sfr __at (0x40) palette; -byte __at (0xc000) cellram[32][32]; -byte __at (0xc800) tileram[256][8]; +byte __at (0xe000) cellram[32][32]; +byte __at (0xe800) tileram[256][8]; -#define FIRE1 0x10 -#define LEFT1 0x20 -#define RIGHT1 0x40 +#define LEFT1 !(input1 & 0x10) +#define RIGHT1 !(input1 & 0x20) +#define UP1 !(input1 & 0x40) +#define DOWN1 !(input1 & 0x80) +#define FIRE1 !(input2 & 0x20) void main(); +// start routine @ 0x0 void start() { __asm - LD SP,#0xc800 +; set up stack pointer, interrupt flag + LD SP,#0xE800 DI +; copy initialized data + LD BC, #l__INITIALIZER + LD A, B + LD DE, #s__INITIALIZED + LD HL, #s__INITIALIZER + LDIR __endasm; main(); } +//////// + #define LOCHAR 0x0 #define HICHAR 0xff @@ -49,23 +61,117 @@ void putstring(byte attr, byte x, byte y, const char* string) { } } +const char BOX_CHARS[8] = { 218, 191, 192, 217, 196, 196, 179, 179 }; + +void draw_box(byte x, byte y, byte x2, byte y2, const char* chars) { + byte x1 = x; + putchar(chars[2], x, y); + putchar(chars[3], x2, y); + putchar(chars[0], x, y2); + putchar(chars[1], x2, y2); + while (++x < x2) { + putchar(chars[5], x, y); + putchar(chars[4], x, y2); + } + while (++y < y2) { + putchar(chars[6], x1, y); + putchar(chars[7], x2, y); + } +} + static byte palbank = 0; -void main() { - short i; - memcpy(tileram, font8x8, sizeof(font8x8)); - for (i=0; i<32; i++) { - putchar(CHAR('*'),0,i); - putchar(CHAR('^'),i,0); - putchar(0x4,27,i); - putchar(0xf8,i,31); - } - putstring(0x0, 2, 25, "HELLO THERE"); - for (i=0; i<0x1000; i++) { - //audreg = auddata = i; -// cellram[i&0x3ff] += i; - //tileram[i&0x7ff] += i; - } - //palette = palbank++; - main(); +inline void set8910(byte reg, byte data) { + ay8910_reg = reg; + ay8910_data = data; +} + +const char* const AY8910REGNAMES[14] = { + "PITCH A LO", "PITCH A HI", + "PITCH B LO", "PITCH B HI", + "PITCH C LO", "PITCH C HI", + "NOISE PERI", + "DISABLE", + "ENV-VOL A", + "ENV-VOL B", + "ENV-VOL C", + "ENV PERI LO", + "ENV PERI HI", + "ENV SHAPE" +}; + +const char* const AY8910MASKS[14] = { + "11111111", " 1111", + "11111111", " 1111", + "11111111", " 1111", + " 11111", + " cbaCBA", + " E11111", " E11111", " E11111", + "11111111", " 1111", + " CALH" +}; + +char is_control_active() { + return (LEFT1 || RIGHT1 || UP1 || DOWN1 || FIRE1); +} + +void ay8910test() { + byte i,j,y; + byte curreg=0,curbit=0; + byte ay8910regs[16]; + memset(ay8910regs, 0, sizeof(ay8910regs)); + ay8910regs[7] = 0x3f; + while (1) { + for (i=0; i<=13; i++) { + const char* mask = AY8910MASKS[i]; + y = 29-i*2; + if (i<10) { + putchar(CHAR(i+'0'), 3, y); + } else { + putchar(CHAR('1'), 2, y); + putchar(CHAR(i+'0'-10), 3, y); + } + for (j=0; j<8; j++) { + char ch = mask[j]; + byte bit = (ay8910regs[i] & (128>>j)) != 0; + if (!bit) { + if (ch == '1') + ch = '0'; + else if (ch != ' ') + ch = '.'; + } + putchar(ch, 6+j, y); + } + putstring(0, 16, y, AY8910REGNAMES[i]); + set8910(i, ay8910regs[i]); + } + y = 29-curreg*2; + j = 6+curbit; + putchar(175, 1, y); + putchar(194, j, y-1); + putchar(193, j, y+1); + while (is_control_active()) ; + while (!is_control_active()) ; + putchar(CHAR(' '), 1, y); + putchar(CHAR(' '), j, y-1); + putchar(CHAR(' '), j, y+1); + if (LEFT1) curbit--; + if (RIGHT1) curbit++; + curbit &= 7; + if (UP1) curreg--; + if (DOWN1) curreg++; + curreg &= 15; + if (FIRE1) { + ay8910regs[curreg] ^= (128>>curbit); + while (FIRE1) ; + } + } +} + +void main() { + palette = 2; + memcpy(tileram, font8x8, sizeof(font8x8)); + memset(cellram, CHAR(' '), sizeof(cellram)); + draw_box(0,0,27,31,BOX_CHARS); + ay8910test(); } diff --git a/src/platform/vicdual.js b/src/platform/vicdual.js index f70b51e6..59b0fbfd 100644 --- a/src/platform/vicdual.js +++ b/src/platform/vicdual.js @@ -1,7 +1,7 @@ "use strict"; var VICDUAL_PRESETS = [ - {id:'vic1.c', name:'Graphics Test'}, + {id:'soundtest.c', name:'Sound Tester'}, ]; var VicDualPlatform = function(mainElement) { @@ -39,10 +39,10 @@ var VicDualPlatform = function(mainElement) { 7,3,1,3,6,3,2,6, 7,0,0,0,0,0,0,0, 0,1,2,3,4,5,6,7, - 4,5,6,7,0,0,0,0, - 0,0,0,0,4,5,6,7, - 1,2,4,7,0,0,0,0, - 0,0,0,0,1,2,4,7, + 0,0,0,0,0,0,0,0, + 7,7,7,7,3,3,3,3, + 0,0,0,0,0,0,0,0, + 7,7,7,7,7,7,7,7, ]; // videoram 0xc000-0xc3ff @@ -69,9 +69,12 @@ var VicDualPlatform = function(mainElement) { } var CARNIVAL_KEYCODE_MAP = makeKeycodeMap([ - [Keys.VK_SPACE, 2, -0x20], // P1 + [Keys.VK_SPACE, 2, -0x20], + [Keys.VK_SHIFT, 2, -0x40], [Keys.VK_LEFT, 1, -0x10], [Keys.VK_RIGHT, 1, -0x20], + [Keys.VK_UP, 1, -0x40], + [Keys.VK_DOWN, 1, -0x80], [Keys.VK_1, 2, -0x10], [Keys.VK_2, 3, -0x20], [Keys.VK_5, 3, 0x8], @@ -98,7 +101,7 @@ var VicDualPlatform = function(mainElement) { return inputs[addr&3]; }, write: function(addr, val) { - if (addr & 0x1) { psg.selectRegister(val); }; // audio 1 + if (addr & 0x1) { psg.selectRegister(val & 0xf); }; // audio 1 if (addr & 0x2) { psg.setData(val); }; // audio 2 if (addr & 0x8) { }; // coin status if (addr & 0x40) { palbank = val & 3; }; // palette diff --git a/src/ui.js b/src/ui.js index 9934bb26..7ecb0cb5 100644 --- a/src/ui.js +++ b/src/ui.js @@ -67,8 +67,8 @@ var FileStore = function(storage, prefix) { return files; } this.deleteFile = function(name) { - storage.removeItem(name); - storage.removeItem('local/' + name); + storage.removeItem(prefix + name); + storage.removeItem(prefix + 'local/' + name); } } @@ -531,17 +531,21 @@ function getCurrentLine() { return editor.getCursor().line+1; } +function getDisasmViewPC() { + var line = disasmview.getCursor().line; + if (line) { + var toks = disasmview.getLine(line).split(/\s+/); + if (toks) { + return parseInt(toks[0], 16); + } + } +} + function getCurrentPC() { var line = getCurrentLine(); var pc = sourcefile.line2offset[line]; if (!(pc >= 0)) { - line = disasmview.getCursor().line; - if (line) { - var toks = disasmview.getLine(line).split(/\s+/); - if (toks) { - pc = parseInt(toks[0], 16); - } - } + return getDisasmViewPC(); } return pc; } @@ -774,10 +778,11 @@ function updateDisassembly() { var pc = state.c.PC; if (assemblyfile && assemblyfile.text) { disasmview.setValue(assemblyfile.text); - if (platform.getDebugCallback()) { - var lineno = assemblyfile.findLineForOffset(pc); + var findPC = platform.getDebugCallback() ? pc : getCurrentPC(); + if (findPC) { + var lineno = assemblyfile.findLineForOffset(findPC); if (lineno) { - disasmview.setCursor(lineno-1, 0); + if (platform.getDebugCallback()) disasmview.setCursor(lineno-1, 0); jumpToLine(disasmview, lineno-1); } } diff --git a/src/worker/workermain.js b/src/worker/workermain.js index 9a6982f3..ef354c53 100644 --- a/src/worker/workermain.js +++ b/src/worker/workermain.js @@ -10,7 +10,7 @@ var PLATFORM_PARAMS = { 'vicdual': { code_start: 0x0, code_size: 0x4000, - data_start: 0xc400, + data_start: 0xe400, data_size: 0x400, }, 'galaxian': { @@ -654,6 +654,7 @@ function compileSDCC(code, platform) { '--c1mode', // '--debug', //'-S', 'main.c', //'--asm=z80asm', + '--less-pedantic', '--fomit-frame-pointer', '--opt-code-speed', '-o', 'main.asm']); /* @@ -669,6 +670,8 @@ function compileSDCC(code, platform) { } try { var asmout = FS.readFile("main.asm", {encoding:'utf8'}); + asmout = " .area _HOME\n .area _CODE\n .area _INITIALIZER\n .area _DATA\n .area _INITIALIZED\n .area _BSEG\n .area _BSS\n .area _HEAP\n" + asmout; + //asmout = asmout.replace(".area _INITIALIZER",".area _CODE"); } catch (e) { msvc_errors.push({line:1, msg:e+""}); return {errors:msvc_errors};