diff --git a/chip8.sv b/chip8.sv index 3d00bf0..07e9758 100644 --- a/chip8.sv +++ b/chip8.sv @@ -3,7 +3,7 @@ module chip8 ( input wire rst_in ); - bit vram[0:2047]; + bit [7:0] vram[0:1023]; bit [7:0] memory[0:4095]; bit keyboard[15:0]; diff --git a/cpu.sv b/cpu.sv index ba35783..235a506 100644 --- a/cpu.sv +++ b/cpu.sv @@ -6,7 +6,7 @@ module cpu ( input wire [7:0] random_number, output int cycle_counter, output wire [15:0] program_counter, - output wire vram[0:2047], + output wire [7:0] vram[0:1023], output wire [7:0] sound_timer ); @@ -31,6 +31,36 @@ module cpu ( logic [7:0] size; logic screen_pixel; logic [7:0] sprite_pixel; + + task write_pixels; + input [31:0] x; + input [31:0] y; + + int i; + + begin + // bottom left + i = (y*128*2) + x*2 +127; + + if (vram[i/8][7-(i%8)] == 1) begin + registers[15] = 1; + end + + vram[i/8][7-(i%8)] ^= 1; + + // bottom right + i = (y*128*2) + x*2 +128; + vram[i/8][7-(i%8)] ^= 1; + + // top left + i = (y*128*2) + x*2-1; + vram[i/8][7-(i%8)] ^= 1; + + // top right + i = (y*128*2) + x*2; + vram[i/8][7-(i%8)] ^= 1; + end + endtask always_ff @(negedge clk_in) begin if (system_ready) begin @@ -187,14 +217,10 @@ module cpu ( for (int r = 0; r < size; r++) begin for (int c = 0; c < 8; c++) begin if (r + y_cord >= 32 || x_cord + c >= 64) continue; - screen_pixel = vram[((r+y_cord)*64)+(x_cord+c)]; sprite_pixel = memory[{16'h0000, index_reg}+r] & ('h80 >> c); if (|sprite_pixel) begin - if (screen_pixel == 1) begin - registers[15] = 1; - end - vram[((r+y_cord)*64)+(x_cord+c)] ^= 1; + write_pixels(x_cord + c, r+y_cord); end end end diff --git a/gpu.sv b/gpu.sv index e0e16d8..979cddb 100644 --- a/gpu.sv +++ b/gpu.sv @@ -1,15 +1,17 @@ module gpu ( - input wire vram[0:2047] + input wire [7:0] vram[0:1023] ); import "DPI-C" function void init_screen(); - import "DPI-C" function void draw_screen(logic vram[0:2047]); + import "DPI-C" function void draw_screen(logic [7:0] vram[0:1023]); initial begin init_screen(); + end + always_comb begin - draw_screen(vram); + draw_screen(vram); end endmodule diff --git a/yayacemu.cpp b/yayacemu.cpp index e40d11d..3705e9d 100644 --- a/yayacemu.cpp +++ b/yayacemu.cpp @@ -10,8 +10,8 @@ #include #include -#define SCREEN_WIDTH 64 -#define SCREEN_HEIGHT 32 +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 #define EMULATION_HZ 2000 FILE *rom_file; @@ -41,10 +41,14 @@ void set_beep(const svBit beep) { SDL_SetTextureColorMod(texture, 255, 255, 255); } -void draw_screen(const svLogic *vram) { +void draw_screen(const svLogicVecVal *vram) { uint32_t *screen = (uint32_t *)malloc(SCREEN_WIDTH * SCREEN_HEIGHT * 32); - for (int i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT; i++) { - screen[i] = vram[i] == 1 ? 0xFFFFFFFF : 0x00000000; + for (int i = 0; i < 1024; i++) { + uint8_t line_byte = (uint8_t) vram[i].aval; + for (int j = 0; j < 8; j++) { + uint8_t pixel_val = (line_byte >> (7-j)) & 1; + screen[(i*8) + j] = pixel_val == 1 ? 0xFFFFFFFF : 0x00000000; + } } SDL_UpdateTexture(texture, NULL, screen, sizeof(screen[0]) * SCREEN_WIDTH); SDL_RenderClear(renderer);