From 55f965625f80cd47d4fdb956b09a3ee0483dbae8 Mon Sep 17 00:00:00 2001 From: Nicholas Orlowsky Date: Wed, 31 Jan 2024 11:04:55 -0600 Subject: [PATCH] corax+ --- README.md | 1 + rom_loader.sv | 3 +- screenshots/corax.png | Bin 0 -> 8070 bytes tests/3-corax+.ch8 | Bin 0 -> 697 bytes yayacemu.cpp | 6 +- yayacemu.sv | 157 +++++++++++++++++++++++++++++++++++------- 6 files changed, 139 insertions(+), 28 deletions(-) create mode 100644 screenshots/corax.png create mode 100644 tests/3-corax+.ch8 diff --git a/README.md b/README.md index 207e674..e20bb15 100644 --- a/README.md +++ b/README.md @@ -45,3 +45,4 @@ yayacemu [PATH_TO_YOUR_ROM] ![Chip 8 Logo Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/chip8-logo.png?raw=true) ![IBM Logo Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/ibm-logo.png?raw=true) +![CORAX+ Test Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/corax.png?raw=true) diff --git a/rom_loader.sv b/rom_loader.sv index 237d98f..06d15cf 100644 --- a/rom_loader.sv +++ b/rom_loader.sv @@ -14,10 +14,11 @@ module rom_loader ( rom_size = load_rom(); $display("HW : ROM size is %0d bytes (%0d bits) (%0d instructions)", rom_size, rom_size * 8, rom_size / 2); for (i = 0; i < rom_size; i++) begin - memory[i] = get_next_instr(); + memory['h200 + i] = get_next_instr(); end close_rom(); $display("HW : ROM loaded successfully"); + $finish; rom_ready = 1; end endmodule diff --git a/screenshots/corax.png b/screenshots/corax.png new file mode 100644 index 0000000000000000000000000000000000000000..7665cbba58e947fcbe780a31f2ead50ef8bb08cf GIT binary patch literal 8070 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 literal 0 HcmV?d00001 diff --git a/yayacemu.cpp b/yayacemu.cpp index 1b5c7d4..3408c98 100644 --- a/yayacemu.cpp +++ b/yayacemu.cpp @@ -89,16 +89,14 @@ int main(int argc, char** argv) { contextp->commandArgs(argc, argv); Vyayacemu* top = new Vyayacemu{contextp}; //while (!contextp->gotFinish()) { - top->pc_out = 0; - while (top->pc_out < 100) { + for (int i = 0; i < 20000; i++) { top->clk_in ^= 1; - top->pc_in = top->pc_out; top->eval(); usleep(500); } printf("TB : Testbench has reached end of simulation. Pausing for 10 seconds before exiting"); fflush(stdout); - usleep(10000000); + usleep(3000000); delete top; delete contextp; return 0; diff --git a/yayacemu.sv b/yayacemu.sv index f78c297..999e81d 100644 --- a/yayacemu.sv +++ b/yayacemu.sv @@ -1,39 +1,44 @@ module yayacemu ( - input wire clk_in, - input int pc_in, - output int pc_out + input wire clk_in ); import "DPI-C" function void init_screen(); wire [31:0] vram [0:2047]; bit [7:0] memory [0:4095]; wire [7:0] registers [0:15]; - logic [7:0] index_reg; + logic [3:0] stack_pointer; + wire [15:0] stack [0:15]; + + logic [15:0] index_reg; logic rom_ready; - int pc; + logic [15:0] program_counter; rom_loader rl (memory, rom_ready); - chip8_cpu cpu (memory, clk_in, vram, index_reg, registers, pc_in, pc_out); + chip8_cpu cpu (memory, clk_in, vram, stack, index_reg, stack_pointer, registers, program_counter); chip8_gpu gpu (vram); initial begin + program_counter = 'h200; + stack_pointer = 4'b0000; init_screen(); end endmodule module chip8_cpu( - input bit [7:0] memory [0:4095], + output bit [7:0] memory [0:4095], input wire clk_in, output wire [31:0] vram [0:2047], - output wire [7:0] index_reg, + output wire [15:0] stack [0:15], + output wire [15:0] index_reg, + output wire [3:0] stack_pointer, output wire [7:0] registers [0:15], - input int pc_in, - output int pc_out + output wire [15:0] program_counter ); logic [15:0] opcode; logic [15:0] scratch; + logic [15:0] scratch2; logic [31:0] x_cord; logic [31:0] y_cord; @@ -42,13 +47,14 @@ module chip8_cpu( logic [7:0] sprite_pixel; int i; + logic [7:0] i8; int r; int c; always_ff @(posedge clk_in) begin - opcode = {memory[pc_in], memory[pc_in+1]}; + opcode = {memory[program_counter+0], memory[program_counter+1]}; $display("HW : opcode is 0x%h (%b)", opcode, opcode); - $display("HW : PC %0d", pc_in); + $display("HW : PC %0d 0x%h", program_counter, program_counter); casez(opcode) 'h00E0: begin @@ -57,10 +63,42 @@ module chip8_cpu( vram[i] = 0; end end - 'h00EE: $display("HW : INSTR RET"); - 'h0???: $display("HW : INSTR SYS addr"); - 'h1???: $display("HW : INSTR JP addr"); - 'h2???: $display("HW : INSTR CALL addr"); + 'h00EE: begin + $display("HW : INSTR RET"); + stack_pointer--; + program_counter = stack[stack_pointer]; + end + 'h0???: $display("HW : INSTR SYS addr (Treating as NOP)"); + 'h1???: begin + $display("HW : INSTR JP addr"); + program_counter = (opcode & 'h0FFF) - 2; + end + 'h2???: begin + $display("HW : INSTR CALL addr"); + stack[stack_pointer] = program_counter; + stack_pointer++; + program_counter = (opcode & 'h0FFF) - 2; + end + 'h3???: begin + $display("HW : INSTR SE Vx, byte"); + scratch = (opcode & 'h00FF); + if (scratch[7:0] == registers[(opcode & 'h0F00) >> 8]) begin + program_counter += 2; + end + end + 'h4???: begin + $display("HW : INSTR SNE Vx, byte"); + scratch = (opcode & 'h00FF); + if (scratch[7:0] != registers[(opcode & 'h0F00) >> 8]) begin + program_counter += 2; + end + end + 'h5??0: begin + $display("HW : INSTR SE Vx, Vy"); + if (registers[(opcode & 'h00F0) >> 4] == registers[(opcode & 'h0F00) >> 8]) begin + program_counter += 2; + end + end 'h6???: begin $display("HW : INSTR LD Vx, byte"); scratch = (opcode & 'h00FF); @@ -71,37 +109,110 @@ module chip8_cpu( scratch = (opcode & 'h00FF); registers[(opcode & 'h0F00) >> 8] += scratch[7:0]; end + 'h8??0: begin + $display("HW : INSTR LD Vx, Vy"); + registers[(opcode & 'h0F00) >> 8] = registers[(opcode & 'h00F0) >> 4]; + end + 'h8??1: begin + $display("HW : INSTR OR Vx, Vy"); + registers[(opcode & 'h0F00) >> 8] |= registers[(opcode & 'h00F0) >> 4]; + end + 'h8??2: begin + $display("HW : INSTR AND Vx, Vy"); + registers[(opcode & 'h0F00) >> 8] &= registers[(opcode & 'h00F0) >> 4]; + end + 'h8??3: begin + $display("HW : INSTR XOR Vx, Vy"); + registers[(opcode & 'h0F00) >> 8] ^= registers[(opcode & 'h00F0) >> 4]; + end + 'h8??4: begin + $display("HW : INSTR ADD Vx, Vy"); + registers[(opcode & 'h0F00) >> 8] += registers[(opcode & 'h00F0) >> 4]; + end + 'h8??5: begin + $display("HW : INSTR SUB Vx, Vy"); + registers[(opcode & 'h0F00) >> 8] -= registers[(opcode & 'h00F0) >> 4]; + end + 'h8??6: begin + $display("HW : INSTR SHR Vx {, Vy}"); + registers[(opcode & 'h0F00) >> 8] = registers[(opcode & 'h00F0) >> 4]>> 1; + end + 'h8??7: begin + $display("HW : INSTR SUBN Vx, Vy"); + registers[(opcode & 'h0F00) >> 8] = registers[(opcode & 'h00F0) >> 4] - registers[(opcode & 'h0F00) >> 8]; + end + 'h8??E: begin + $display("HW : INSTR SHL Vx {, Vy}"); + registers[(opcode & 'h0F00) >> 8] = registers[(opcode & 'h00F0) >> 4]<< 1; + end 'hA???: begin $display("HW : INSTR LD I, addr"); - scratch = (opcode & 'h0FFF); - index_reg = scratch[7:0]; + index_reg = (opcode & 'h0FFF); end 'hD???: begin $display("HW : INSTR DRW Vx, Vy, nibble"); x_cord = {24'h000000, registers[(opcode & 'h0F00) >> 8]}; y_cord = {24'h000000, registers[(opcode & 'h00F0) >> 4]}; + x_cord %= 64; + y_cord %= 32; + scratch = (opcode & 'h000F); size = scratch[7:0]; + registers[15] = 0; for (r = 0; r < size; r++) begin for ( c = 0; c < 8; c++) begin screen_pixel = vram[((r + y_cord) * 64) + (x_cord + c)]; - sprite_pixel = memory[{24'h000000, index_reg} + r] & ('h80 >> c); + sprite_pixel = memory[{16'h0000, index_reg} + r] & ('h80 >> c); if (|sprite_pixel) begin if (screen_pixel == 32'hFFFFFFFF) begin registers[15] = 1; end - vram[((r + y_cord) * 64) + (x_cord + c)] = screen_pixel ^ 32'hFFFFFFFF; + vram[((r + y_cord) * 64) + (x_cord + c)] ^= 32'hFFFFFFFF; end end - end - end + end + end + 'hF?33: begin + $display("HW : INSTR LD B, Vx"); + scratch = {8'h00, registers[(opcode & 'h0F00) >> 8]}; + scratch2 = scratch % 10; + memory[index_reg + 2] = scratch2[7:0]; + scratch /= 10; + scratch2 = scratch % 10; + memory[index_reg + 1] = scratch2[7:0]; + scratch /= 10; + scratch2 = scratch % 10; + memory[index_reg + 0] = scratch2[7:0]; + end + 'hF?55: begin + $display("HW : INSTR LD [I], Vx"); + scratch = (opcode & 'h0F00) >> 8; + for (i8 = 0; i8 <= scratch[7:0]; i8++) begin + scratch2 = index_reg + {8'h00, i8}; + memory[scratch2[11:0]] = registers[i8[3:0]]; + end + index_reg++; + end + 'hF?65: begin + $display("HW : INSTR LD Vx, [I]"); + scratch = (opcode & 'h0F00) >> 8; + for (i8 = 0; i8 <= scratch[7:0]; i8++) begin + scratch2 = index_reg + {8'h00, i8}; + registers[i8[3:0]] = memory[scratch2[11:0]]; + end + index_reg++; + end + 'hF?1E: begin + $display("HW : INSTR ADD I, Vx"); + index_reg = index_reg + {8'h00, registers[(opcode & 'h0F00) >> 8]}; + end default: $display("HW : ILLEGAL INSTRUCTION"); endcase - pc_out <= pc_in + 2; + program_counter += 2; end endmodule