From f6d320a05b126848de1ca7f598108085ec7a7040 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sat, 17 Feb 2018 23:12:09 -0600 Subject: [PATCH] new inline verilog assembler --- presets/verilog/framebuffer.v | 20 +-- presets/verilog/racing_game_cpu.v | 65 +++---- presets/verilog/starfield.v | 5 +- src/assembler.js | 189 --------------------- src/platform/verilog.js | 9 +- src/ui.js | 2 +- src/worker/assembler.js | 271 ++++++++++++++++++++++++++++++ src/worker/workermain.js | 31 +++- test/cli/testasm.js | 84 +++++++++ 9 files changed, 434 insertions(+), 242 deletions(-) delete mode 100644 src/assembler.js create mode 100644 src/worker/assembler.js create mode 100644 test/cli/testasm.js diff --git a/presets/verilog/framebuffer.v b/presets/verilog/framebuffer.v index 50c02cdb..cd5d998f 100644 --- a/presets/verilog/framebuffer.v +++ b/presets/verilog/framebuffer.v @@ -41,7 +41,7 @@ module frame_buffer_top(clk, reset, hsync, vsync, hpaddle, vpaddle, parameter IN_VPU = 8'b01000011; reg [7:0] ram[0:63]; - reg [7:0] rom[0:255]; + reg [7:0] rom[0:127]; output wire [7:0] address_bus; output reg [7:0] to_cpu; @@ -95,7 +95,7 @@ module frame_buffer_top(clk, reset, hsync, vsync, hpaddle, vpaddle, vsync, hsync, vpaddle, hpaddle, display_on}; IN_VPU: to_cpu = {vpu_ram[vpu_write], vpu_ram[vpu_write+1]}; // ROM - 8'b1???????: to_cpu = rom[address_bus[6:0] + 128]; + 8'b1???????: to_cpu = rom[address_bus[7:0] + 128]; default: ; endcase @@ -131,7 +131,8 @@ module frame_buffer_top(clk, reset, hsync, vsync, hpaddle, vpaddle, __asm .arch femto8 .org 128 - +.len 128 + .define VPU_LO 8 .define VPU_HI 9 .define VPU_WRITE 10 @@ -152,25 +153,24 @@ Start: sta VPU_LO sta VPU_HI sta 0 - sta 1 DisplayLoop: zero B - movrb A + mov A,[b] sta VPU_WRITE sta VPU_MOVE sta VPU_WRITE sta VPU_MOVE sta VPU_WRITE sta VPU_MOVE - lia F_VSYNC - lib IN_FLAGS - andrb NOP + lda #F_VSYNC + ldb #IN_FLAGS + and none,[B] bz DisplayLoop WaitVsync: - andrb NOP + and none,[B] bnz WaitVsync zero B - movrb A + mov A,[b] inc A sta 0 jmp DisplayLoop diff --git a/presets/verilog/racing_game_cpu.v b/presets/verilog/racing_game_cpu.v index 76f67c10..0acd966f 100644 --- a/presets/verilog/racing_game_cpu.v +++ b/presets/verilog/racing_game_cpu.v @@ -52,7 +52,7 @@ module racing_game_cpu_top(clk, reset, hsync, vsync, hpaddle, vpaddle, parameter IN_FLAGS = 8'b01000010; reg [7:0] ram[0:63]; - reg [7:0] rom[0:255]; + reg [7:0] rom[0:127]; output wire [7:0] address_bus; output reg [7:0] to_cpu; @@ -80,7 +80,7 @@ module racing_game_cpu_top(clk, reset, hsync, vsync, hpaddle, vpaddle, IN_FLAGS: to_cpu = {2'b0, frame_collision, vsync, hsync, vpaddle, hpaddle, display_on}; // ROM - 8'b1???????: to_cpu = rom[address_bus[6:0] + 128]; + 8'b1???????: to_cpu = rom[address_bus[6:0]]; default: ; endcase @@ -154,6 +154,7 @@ module racing_game_cpu_top(clk, reset, hsync, vsync, hpaddle, vpaddle, __asm .arch femto8 .org 128 +.len 128 .define PADDLE_X 0 .define PADDLE_Y 1 @@ -178,11 +179,11 @@ module racing_game_cpu_top(clk, reset, hsync, vsync, hpaddle, vpaddle, .define F_COLLIDE 32 Start: - lia 128 + lda #128 sta PLAYER_X sta ENEMY_X - sta ENEMY_Y - lia 180 + sta ENEMY_Y + lda #180 sta PLAYER_Y zero A sta SPEED @@ -190,67 +191,67 @@ Start: sta ENEMY_DIR ; test hpaddle flag DisplayLoop: - lia F_HPADDLE - lib IN_FLAGS - andrb NOP + lda #F_HPADDLE + ldb #IN_FLAGS + and none,[B] bz DisplayLoop ; [vpos] -> paddle_x - lib IN_VPOS - movrb A + ldb #IN_VPOS + mov A,[B] sta PLAYER_X ; wait for vsync=1 then vsync=0 - lia F_VSYNC - lib IN_FLAGS + lda #F_VSYNC + ldb #IN_FLAGS WaitForVsyncOn: - andrb NOP + and none,[B] bz WaitForVsyncOn WaitForVsyncOff: - andrb NOP + and none,[B] bnz WaitForVsyncOff ; check collision - lia F_COLLIDE - lib IN_FLAGS - andrb NOP + lda #F_COLLIDE + ldb #IN_FLAGS + and none,[B] bz NoCollision ; load slow speed - lia 16 + lda #16 sta SPEED NoCollision: ; update speed - lib SPEED - movrb A + ldb #SPEED + mov A,[B] inc A ; don't store if == 0 bz MaxSpeed sta SPEED MaxSpeed: - movrb A + mov A,[B] lsr A lsr A lsr A lsr A ; add to lo byte of track pos - lib TRACKPOS_LO - addrb B + ldb #TRACKPOS_LO + add B,[B] swapab sta TRACKPOS_LO swapab ; update enemy vert pos - lib ENEMY_Y - addrb A + ldb #ENEMY_Y + add A,[B] sta ENEMY_Y ; update enemy horiz pos - lib ENEMY_X - movrb A - lib ENEMY_DIR - addrb A + ldb #ENEMY_X + mov A,[B] + ldb #ENEMY_DIR + add A,[B] sta ENEMY_X - subi A 64 - andi A 127 + sub A,#64 + and A,#127 bnz SkipXReverse ; load ENEMY_DIR and negate zero A - subrb A + sub A,[B] sta ENEMY_DIR ; back to display loop SkipXReverse: diff --git a/presets/verilog/starfield.v b/presets/verilog/starfield.v index e271042b..bc4d5ca5 100644 --- a/presets/verilog/starfield.v +++ b/presets/verilog/starfield.v @@ -31,9 +31,6 @@ module starfield_top(clk, reset, hsync, vsync, rgb); .lfsr(lfsr)); wire star_on = &lfsr[15:9]; - wire r = display_on && star_on && lfsr[0]; - wire g = display_on && star_on && lfsr[1]; - wire b = display_on && star_on && lfsr[2]; - assign rgb = {b,g,r}; + assign rgb = display_on && star_on ? lfsr[2:0] : 0; endmodule diff --git a/src/assembler.js b/src/assembler.js deleted file mode 100644 index 731cf0b9..00000000 --- a/src/assembler.js +++ /dev/null @@ -1,189 +0,0 @@ - -EXAMPLE_SPEC = { - vars:{ - reg:{bits:2, toks:['a', 'b', 'ip', 'none']}, - unop:{bits:3, toks:['mova','movb','inc','dec','asl','lsr','rol','ror']}, - binop:{bits:3, toks:['or','and','xor','zero','add','sub','adc','sbb']}, - imm4:{bits:4}, - imm8:{bits:8}, - rel:{bits:8, iprel:true, ipofs:1}, - }, - rules:[ - {fmt:'~binop ~reg,b', bits:['00',1,'1',0]}, - {fmt:'~binop ~reg,#~imm8', bits:['01',1,'1',0,2]}, - {fmt:'~binop ~reg,[b]', bits:['11',1,'1',0]}, - {fmt:'~unop ~reg', bits:['00',1,'0',0]}, - {fmt:'lda #~imm8', bits:['01','00','0001',0]}, - {fmt:'ldb #~imm8', bits:['01','01','0001',0]}, - {fmt:'jmp ~imm8', bits:['01','10','0001',0]}, - {fmt:'sta ~imm4', bits:['1001',0]}, - {fmt:'bcc ~rel', bits:['1010','0001',0]}, - {fmt:'bcs ~rel', bits:['1010','0011',0]}, - {fmt:'bz ~rel', bits:['1010','1101',0]}, - {fmt:'bnz ~rel', bits:['1010','0101',0]}, - {fmt:'clc', bits:['10001000']}, - {fmt:'swapab', bits:['10000001']}, - {fmt:'reset', bits:['10001111']}, - ] -} - -function rule2regex(rule, vars) { - var s = rule.fmt; - var varlist = []; - rule.prefix = s.split(/\s+/)[0]; - s = s.replace(/\s+/g, '\\s'); - s = s.replace(/\[/g, '\\['); - s = s.replace(/\]/g, '\\]'); - s = s.replace(/\./g, '\\.'); - s = s.replace(/~\w+/g, function(varname) { - varname = varname.substr(1); - var v = vars[varname]; - varlist.push(varname); - if (!v) - throw Error("Could not find rule for ~" + varname); - else if (v.toks) - return '(\\w+)'; - else - return '([0-9]+|[$][0-9a-f]+|\\w+)'; - }); - rule.re = new RegExp('^'+s+'$', 'i'); - rule.varlist = varlist; - // TODO: check rule constraints - return rule; -} - -var Assembler = function(spec) { - var self = this; - var ip = 0; - var linenum = 0; - var symbols = {}; - var errors = []; - var outwords = []; - var fixups = []; - var width = 8; - - for (var i=0; i> (nb-1-i)*width) & ((1<>3); - var shift = fix.bitofs&7; - var mask = ((1<> (nb-1-i)*width) & ((1<>3); + var shift = fix.bitofs&7; + var mask = ((1<0) al.insns += ' '; + al.insns += hex(word,width/4); + } + } + while (outwords.length < codelen) { + outwords.push(0); + } + fixups = []; + return self.state(); + } + + self.assembleFile = function(text) { + var lines = text.split(/\n/g); + for (var i=0; i0) s += ","; - s += out[i]; + s += 0|out[i]; } - //console.log(s); + asmlines = asmout.asmlines; + for (var i=0; i