diff --git a/doc/notes.txt b/doc/notes.txt index 91761029..b90697df 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -46,6 +46,7 @@ TODO: - show tool-specific (readonly) include files - verilog debugging makes it slow - fix VCS mame +- checkmarks for active window WEB WORKER FORMAT diff --git a/presets/verilog/ball_slip_counter.v b/presets/verilog/ball_slip_counter.v index 0d9b7045..aa6d078c 100644 --- a/presets/verilog/ball_slip_counter.v +++ b/presets/verilog/ball_slip_counter.v @@ -9,17 +9,19 @@ module ball_slip_counter_top(clk, reset, hsync, vsync, rgb); wire display_on; wire [8:0] hpos; wire [8:0] vpos; + reg ball_reset; + // 9-bit ball timers reg [8:0] ball_htimer; reg [8:0] ball_vtimer; - // motion codes + // 4-bit motion codes reg [3:0] ball_horiz_move; reg [3:0] ball_vert_move; - // stop codes - localparam ball_horiz_stop = 4'd12; - localparam ball_vert_stop = 4'd11; + // 4-bit stop codes + localparam ball_horiz_stop = 4'd11; + localparam ball_vert_stop = 4'd10; // 5-bit constants to load into counters localparam ball_horiz_prefix = 5'b01100; // 192 @@ -36,11 +38,10 @@ module ball_slip_counter_top(clk, reset, hsync, vsync, rgb); ); // update horizontal timer - always @(posedge clk or posedge reset) begin - if (reset || ball_htimer == 0) begin - if (reset) // center-ish of screen - ball_htimer <= {5'b11000, ball_horiz_move}; - else if (ball_vtimer == 0) // nudge ball in horiz. dir + always @(posedge clk or posedge ball_reset) + begin + if (ball_reset || &ball_htimer) begin + if (ball_reset || &ball_vtimer) // nudge ball in horiz. dir ball_htimer <= {ball_horiz_prefix, ball_horiz_move}; else // reset timer but don't move ball horizontally ball_htimer <= {ball_horiz_prefix, ball_horiz_stop}; @@ -49,15 +50,22 @@ module ball_slip_counter_top(clk, reset, hsync, vsync, rgb); end // update vertical timer - always @(posedge hsync or posedge reset) + always @(posedge hsync or posedge ball_reset) begin - if (reset) // center-ish of screen - ball_vtimer <= {5'b11000, ball_vert_move}; - else if (ball_vtimer == 0) // reset timer + if (ball_reset || &ball_vtimer) // reset timer ball_vtimer <= {ball_vert_prefix, ball_vert_move}; else ball_vtimer <= ball_vtimer + 1; end + + // reset ball position + always @(posedge clk or posedge reset) + begin + if (reset) + ball_reset <= 1; + else if (hpos == 128 && vpos == 128) + ball_reset <= 0; + end // collide with vertical and horizontal boundaries wire ball_vert_collide = ball_vgfx && vpos >= 240; @@ -67,18 +75,18 @@ module ball_slip_counter_top(clk, reset, hsync, vsync, rgb); always @(posedge ball_vert_collide or posedge reset) begin if (reset) - ball_vert_move <= 4'd10; + ball_vert_move <= 4'd9; else - ball_vert_move <= 4'b0110 ^ ball_vert_move; // change dir. + ball_vert_move <= (4'd9 ^ 4'd11) ^ ball_vert_move; // change dir. end // horizontal bounce always @(posedge ball_horiz_collide or posedge reset) begin if (reset) - ball_horiz_move <= 4'd11; + ball_horiz_move <= 4'd10; else - ball_horiz_move <= 4'b0110 ^ ball_horiz_move; // change dir. + ball_horiz_move <= (4'd10 ^ 4'd12) ^ ball_horiz_move; // change dir. end // compute ball display diff --git a/src/baseplatform.ts b/src/baseplatform.ts index d47b159f..cb5f383f 100644 --- a/src/baseplatform.ts +++ b/src/baseplatform.ts @@ -119,7 +119,7 @@ function getToolForFilename_6502(fn:string) : string { return "dasm"; // .a } -abstract class Base6502Platform extends BaseDebugPlatform { +export abstract class Base6502Platform extends BaseDebugPlatform { newCPU(membus : MemoryBus) { var cpu = new jt.M6502(); @@ -284,7 +284,7 @@ function BusProbe(bus : MemoryBus) { } } -abstract class BaseZ80Platform extends BaseDebugPlatform { +export abstract class BaseZ80Platform extends BaseDebugPlatform { _cpu; probe; @@ -421,7 +421,7 @@ function getToolForFilename_z80(fn) { declare var FS, ENV, Module; // mame emscripten // TODO: make class -var BaseMAMEPlatform = function() { +export function BaseMAMEPlatform() { var self = this; diff --git a/src/worker/workermain.js b/src/worker/workermain.js index 3d8699b2..ac14c9d7 100644 --- a/src/worker/workermain.js +++ b/src/worker/workermain.js @@ -1158,17 +1158,18 @@ function compileInlineASM(code, platform, options, errors, asmlines) { function compileVerilator(step) { loadNative("verilator_bin"); loadGen("worker/verilator2js"); - var code = step.code; var platform = step.platform || 'verilog'; var errors = []; var asmlines = []; - code = compileInlineASM(code, platform, step, errors, asmlines); + step.code = compileInlineASM(step.code, platform, step, errors, asmlines); + var code = step.code; var match_fn = makeErrorMatcher(errors, /%(.+?): (.+?:)?(\d+)?[:]?\s*(.+)/i, 3, 4); var verilator_mod = verilator_bin({ instantiateWasm: moduleInstFn('verilator_bin'), noInitialRun:true, print:print_fn, printErr:match_fn, + //TOTAL_MEMORY:64*1024*1024, }); var topmod = detectTopModuleName(code); var FS = verilator_mod['FS']; diff --git a/test/cli/testworker.js b/test/cli/testworker.js index 00a832f9..03355d0f 100644 --- a/test/cli/testworker.js +++ b/test/cli/testworker.js @@ -165,6 +165,23 @@ describe('Worker', function() { doBuild(msgs, done2, 2782, 0, 0); }); it('should compile verilog inline assembler (JSASM)', function(done) { + var csource = ab2str(fs.readFileSync('presets/verilog/racing_game_cpu.v')); + var dependfiles = ["hvsync_generator.v", "sprite_bitmap.v", "sprite_renderer.v", "cpu8.v"]; + var depends = []; + for (var dfile of dependfiles) { + var code = ab2str(fs.readFileSync('presets/verilog/' + dfile)); + depends.push({filename:dfile, data:code, prefix:"verilog"}); + } + var msgs = [{code:csource, platform:"verilog", tool:"verilator", dependencies:depends, path:'racing_game_cpu.v'}]; + var done2 = function(err, msg) { + var jscode = msg.output.code; + var fn = new Function(jscode); + assert.ok(fn); + done(err, msg); + }; + doBuild(msgs, done2, 49317, 0, 0); + }); + it('should compile verilog assembler file (JSASM)', function(done) { var csource = ab2str(fs.readFileSync('presets/verilog/test2.asm')); var dependfiles = ["hvsync_generator.v", "font_cp437_8x8.v", "ram.v", "tile_renderer.v", "sprite_scanline_renderer.v", "lfsr.v", "sound_generator.v", "cpu16.v", "cpu_platform.v"]; var depends = [];