diff --git a/chip8.sv b/chip8.sv index 5f905ad..93eb025 100644 --- a/chip8.sv +++ b/chip8.sv @@ -35,6 +35,15 @@ logic debug_overlay; rd_memory_data ); + logic [7:0] random_byte; + rng randy( + slow_clk, + {wr_memory_data, rd_memory_data}, + keymap, + cycle_counter, + random_byte + ); + logic [15:0] keymap; keypad keypad ( @@ -58,6 +67,7 @@ logic debug_overlay; fpga_clk, rd_memory_data, keymap, + random_byte, cycle_counter, rd_memory_address, wr_memory_address, diff --git a/cpu.sv b/cpu.sv index 08aef65..495f5da 100644 --- a/cpu.sv +++ b/cpu.sv @@ -5,6 +5,7 @@ module cpu ( input wire fpga_clk, input wire [7:0] rd_memory_data, input wire [15:0] keymap, + input wire [7:0] random_byte, output int cycle_counter, output logic [11:0] rd_memory_address, output logic [11:0] wr_memory_address, @@ -109,7 +110,7 @@ logic [5:0] lcd_led; typedef enum {INIT, DRAW} draw_stage; typedef enum {CLS, LD, DRW, JP, ALU, CALU, CALL, RET, ALUJ, LDL, BCD, IOJ, IOW, NIOJ} cpu_opcode; - typedef enum {REG, IDX_REG, BYTE, MEM, SPRITE_MEM, KEY, DELAY_TIMER, SOUND_TIMER} data_type; + typedef enum {REG, IDX_REG, BYTE, MEM, SPRITE_MEM, KEY, DELAY_TIMER, SOUND_TIMER, RAND} data_type; struct { draw_stage stage; @@ -161,7 +162,6 @@ logic [5:0] lcd_led; end always_ff @(posedge clk_in) begin - $display("%0d", sound_timer); if (cycle_counter % 200 == 0) begin vblank <= 0; if (delay_timer > 0) @@ -423,6 +423,17 @@ logic [5:0] lcd_led; compute_of <= 0; state <= ST_EXEC; end + 16'hC???: begin + instr.op <= LD; + + instr.src <= RAND; + instr.src_byte <= {4'h0, opcode[7:0]}; + + instr.dst <= REG; + instr.dst_reg <= opcode[11:8]; + + state <= ST_EXEC; + end 16'hD???: begin instr.op <= DRW; @@ -641,7 +652,10 @@ logic [5:0] lcd_led; end else if (instr.src == DELAY_TIMER) begin instr.src_byte <= { 4'h0, delay_timer }; instr.src <= BYTE; - end + end else if (instr.src == RAND) begin + instr.src_byte <= {4'h0, random_byte} & instr.src_byte ; + instr.src <= BYTE; + end end LDL: begin if (instr.dst == REG) begin diff --git a/makefile b/makefile index 8e9b437..eb39f63 100644 --- a/makefile +++ b/makefile @@ -2,7 +2,7 @@ SDL_CFLAGS = `sdl2-config --cflags` SDL_LDFLAGS = `sdl2-config --libs` -SV_FILES=aastructs.sv cpu.sv chip8.sv gpu.sv alu.sv keypad.sv +SV_FILES=aastructs.sv cpu.sv chip8.sv gpu.sv alu.sv keypad.sv rng.sv lint: verilator --lint-only -DDUMMY_GPU --timing ${SV_FILES} diff --git a/yayacemu.cpp b/yayacemu.cpp index bdeb7ef..ce38be1 100644 --- a/yayacemu.cpp +++ b/yayacemu.cpp @@ -18,6 +18,9 @@ SDL_Window *window; SDL_Renderer *renderer; SDL_Texture *texture; +int keys[16]; +bool is_beeping; + void init_screen() { SDL_Init(SDL_INIT_EVERYTHING); window = SDL_CreateWindow( @@ -30,7 +33,7 @@ void init_screen() { SDL_TEXTUREACCESS_STREAMING, SCREEN_WIDTH, SCREEN_HEIGHT); } -bool is_beeping; + void draw_screen(const svLogicVecVal *vram) { uint32_t *screen = (uint32_t *)malloc(SCREEN_WIDTH * SCREEN_HEIGHT * 32); for (int i = 0; i < 1024; i++) { @@ -45,21 +48,12 @@ void draw_screen(const svLogicVecVal *vram) { SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); free(screen); - // std::cout << "INF_EMU: Drawing Frame" << '\n'; } -// 1 2 3 A -// 4 5 6 B -// 7 8 9 C -// * 0 # D -// -int keys[16]; uint8_t get_key(uint8_t col) { SDL_Event event; uint8_t res = 0xFF; - // col 1000 - r1 - while (SDL_PollEvent(&event)) { uint8_t down = 0; switch (event.type) { @@ -178,10 +172,12 @@ uint8_t get_key(uint8_t col) { if (col == 0b1011) res = res & 0b0111; } + if (keys[12] == 1) { if (col == 0b0111) res = res & 0b1110; } + if (keys[13] == 1) { if (col == 0b0111) res = res & 0b1101; @@ -191,13 +187,12 @@ uint8_t get_key(uint8_t col) { if (col == 0b0111) res = res & 0b1011; } + if (keys[15] == 1) { if (col == 0b0111) res = res & 0b0111; } - //if (res != 0) - // printf("%04b %04b\n", res, col); return res; } @@ -214,11 +209,10 @@ int main(int argc, char **argv) { dut->fpga_clk ^= 1; dut->eval(); - is_beeping = dut->beep == 1; if (SDL_QuitRequested()) { - std::cout << "INF_EMU: Received Quit from SDL. Goodbye!" << '\n'; + std::cout << "Goodbye!" << '\n'; break; } }