From 900c7f1fcc2b5cb875ebb00aeeeecc1a495178cc Mon Sep 17 00:00:00 2001 From: sorgelig Date: Thu, 21 Mar 2019 21:05:27 +0800 Subject: [PATCH] Update gamepad control. --- NES.qsf | 1 - NES.sv | 64 ++++++++++++++++++-------------------------------- NES_Q13.qsf | 1 - keyboard.v | 66 ---------------------------------------------------- sys/hps_io.v | 26 ++++++++++----------- 5 files changed, 35 insertions(+), 123 deletions(-) delete mode 100644 keyboard.v diff --git a/NES.qsf b/NES.qsf index 4913427..ca1e050 100644 --- a/NES.qsf +++ b/NES.qsf @@ -364,7 +364,6 @@ set_global_assignment -name SYSTEMVERILOG_FILE apu.sv set_global_assignment -name VERILOG_FILE nes.v set_global_assignment -name VERILOG_FILE mmu.v set_global_assignment -name VERILOG_FILE mappers/mapLoopy.v -set_global_assignment -name VERILOG_FILE keyboard.v set_global_assignment -name VERILOG_FILE dsp.v set_global_assignment -name VERILOG_FILE compat.v set_global_assignment -name SYSTEMVERILOG_FILE NES.sv diff --git a/NES.sv b/NES.sv index 2187767..ef68491 100644 --- a/NES.sv +++ b/NES.sv @@ -131,7 +131,7 @@ parameter CONF_STR1 = { "FS,NES;", "F,FDS;", "-;", - "OG,Disk Swap,Auto,Select;", + "OG,Disk Swap,Auto,FDS button;", "O5,Invert mirroring,OFF,ON;", "-;", }; @@ -156,11 +156,11 @@ parameter CONF_STR3 = { `endif "-;", "R0,Reset;", - "J,A,B,Select,Start;", + "J1,A,B,Select,Start,FDS,PP 1,PP 2,PP 3,PP 4,PP 5,PP 6,PP 7,PP 8,PP 9,PP 10,PP 11,PP 12;", "V,v",`BUILD_DATE }; -wire [7:0] joyA,joyB,joyC,joyD; +wire [20:0] joyA,joyB,joyC,joyD; wire [1:0] buttons; wire [31:0] status; @@ -182,7 +182,6 @@ wire int_audio = 1; wire forced_scandoubler; wire ps2_kbd_clk, ps2_kbd_data; -wire [10:0] ps2_key; reg [31:0] sd_lba; reg sd_rd = 0; @@ -202,17 +201,17 @@ hps_io #(.STRLEN(($size(CONF_STR1)>>3) + ($size(CONF_STR2)>>3) + ($size(CONF_STR ( .clk_sys(clk), .HPS_BUS(HPS_BUS), - .conf_str({CONF_STR1,bk_ena ? "R" : "+",CONF_STR2,bk_ena ? "R" : "+",CONF_STR3}), + .conf_str({CONF_STR1,bk_ena ? "R" : "+",CONF_STR2,bk_ena ? "R" : "+",CONF_STR3}), - .buttons(buttons), - .forced_scandoubler(forced_scandoubler), + .buttons(buttons), + .forced_scandoubler(forced_scandoubler), - .joystick_0(joyA), - .joystick_1(joyB), - .joystick_2(joyC), - .joystick_3(joyD), + .joystick_0(joyA), + .joystick_1(joyB), + .joystick_2(joyC), + .joystick_3(joyD), - .status(status), + .status(status), .ioctl_download(downloading), .ioctl_addr(ioctl_addr), @@ -233,22 +232,11 @@ hps_io #(.STRLEN(($size(CONF_STR1)>>3) + ($size(CONF_STR2)>>3) + ($size(CONF_STR .img_readonly(img_readonly), .img_size(img_size), - .ps2_key(ps2_key), - .ps2_kbd_led_use(0), .ps2_kbd_led_status(0) ); -wire [7:0] nes_joy_A = (reset_nes) ? 8'd0 : - { joyA[0], joyA[1], joyA[2], joyA[3], joyA[7], joyA[6], joyA[5], joyA[4] } | kbd_joy0; -wire [7:0] nes_joy_B = (reset_nes) ? 8'd0 : - { joyB[0], joyB[1], joyB[2], joyB[3], joyB[7], joyB[6], joyB[5], joyB[4] } | kbd_joy1; -wire [7:0] nes_joy_C = (reset_nes) ? 8'd0 : - { joyC[0], joyC[1], joyC[2], joyC[3], joyC[7], joyC[6], joyC[5], joyC[4] }; -wire [7:0] nes_joy_D = (reset_nes) ? 8'd0 : - { joyD[0], joyD[1], joyD[2], joyD[3], joyD[7], joyD[6], joyD[5], joyD[4] }; - wire clock_locked; wire clk85; wire clk; @@ -293,7 +281,16 @@ wire [7:0] memory_dout; reg [23:0] joypad_bits, joypad_bits2; reg [7:0] powerpad_d3, powerpad_d4; reg [1:0] last_joypad_clock; -wire fds_swap = fds_swap_invert ^ (joy_swap ? nes_joy_B[2] : nes_joy_A[2]); + +wire [11:0] powerpad = joyA[20:9] | joyB[20:9] | joyC[20:9] | joyD[20:9]; + +wire [7:0] nes_joy_A = { joyA[0], joyA[1], joyA[2], joyA[3], joyA[7], joyA[6], joyA[5], joyA[4] }; +wire [7:0] nes_joy_B = { joyB[0], joyB[1], joyB[2], joyB[3], joyB[7], joyB[6], joyB[5], joyB[4] }; +wire [7:0] nes_joy_C = { joyC[0], joyC[1], joyC[2], joyC[3], joyC[7], joyC[6], joyC[5], joyC[4] }; +wire [7:0] nes_joy_D = { joyD[0], joyD[1], joyD[2], joyD[3], joyD[7], joyD[6], joyD[5], joyD[4] }; + +wire fds_btn = joyA[8] | joyB[8]; +wire fds_swap = fds_swap_invert ^ fds_btn; reg [1:0] nes_ce; @@ -306,7 +303,7 @@ always @(posedge clk) begin last_joypad_clock <= 0; end else begin if (joypad_strobe) begin - joypad_bits <= {status[10] ? {8'h08, nes_joy_C} : 16'h0000, joy_swap ? nes_joy_B : nes_joy_A}; + joypad_bits <= {status[10] ? {8'h08, nes_joy_C} : 16'h0000, joy_swap ? nes_joy_B : nes_joy_A} | fds_btn; joypad_bits2 <= {status[10] ? {8'h04, nes_joy_D} : 16'h0000, joy_swap ? nes_joy_A : nes_joy_B}; powerpad_d4 <= {4'b0000, powerpad[7], powerpad[11], powerpad[2], powerpad[3]}; powerpad_d3 <= {powerpad[6], powerpad[10], powerpad[9], powerpad[5], powerpad[8], powerpad[4], powerpad[0], powerpad[1]}; @@ -490,23 +487,6 @@ video video .ce_pix(CE_PIXEL) ); -wire [7:0] kbd_joy0; -wire [7:0] kbd_joy1; -wire [11:0] powerpad; - -keyboard keyboard -( - .clk(clk), - .reset(reset_nes), - - .ps2_key(ps2_key), - - .joystick_0(kbd_joy0), - .joystick_1(kbd_joy1), - - .powerpad(powerpad) -); - ///////////////////////// STATE SAVE/LOAD ///////////////////////////// diff --git a/NES_Q13.qsf b/NES_Q13.qsf index 498250c..61ddd5e 100644 --- a/NES_Q13.qsf +++ b/NES_Q13.qsf @@ -368,7 +368,6 @@ set_global_assignment -name SYSTEMVERILOG_FILE apu.sv set_global_assignment -name VERILOG_FILE nes.v set_global_assignment -name VERILOG_FILE mmu.v set_global_assignment -name VERILOG_FILE mappers/mapLoopy.v -set_global_assignment -name VERILOG_FILE keyboard.v set_global_assignment -name VERILOG_FILE dsp.v set_global_assignment -name VERILOG_FILE compat.v set_global_assignment -name SYSTEMVERILOG_FILE NES.sv diff --git a/keyboard.v b/keyboard.v deleted file mode 100644 index bfd2420..0000000 --- a/keyboard.v +++ /dev/null @@ -1,66 +0,0 @@ - - -module keyboard -( - input clk, - input reset, - - input [10:0] ps2_key, - - output [7:0] joystick_0, - output [7:0] joystick_1, - - output reg [11:0] powerpad -); - -reg joy_num; -reg [7:0] buttons; -assign joystick_0 = joy_num ? 7'b0 : buttons; -assign joystick_1 = joy_num ? buttons : 7'b0; - -wire [7:0] code = {ps2_key[7:0]}; -wire pressed = ps2_key[9]; - -always @(posedge clk) begin - reg old_stb; - - if(reset)begin - joy_num <= 0; - buttons <= 0; - powerpad <= 0; - end - - old_stb <= ps2_key[10]; - if(old_stb != ps2_key[10]) begin - case(code) - 'h16: if(pressed) joy_num <= 0; // 1 - 'h1E: if(pressed) joy_num <= 1; // 2 - - 'h75: buttons[4] <= pressed; // arrow up - 'h72: buttons[5] <= pressed; // arrow down - 'h6B: buttons[6] <= pressed; // arrow left - 'h74: buttons[7] <= pressed; // arrow right - - 'h29: buttons[0] <= pressed; // Space - 'h11: buttons[1] <= pressed; // Alt - 'h0d: buttons[2] <= pressed; // Tab - 'h76: buttons[3] <= pressed; // Escape - 'h5A: buttons[3] <= pressed; // Enter - - 'h24: powerpad[0] <= pressed; // E - 'h2D: powerpad[1] <= pressed; // R - 'h2C: powerpad[2] <= pressed; // T - 'h35: powerpad[3] <= pressed; // Y - 'h23: powerpad[4] <= pressed; // D - 'h2B: powerpad[5] <= pressed; // F - 'h34: powerpad[6] <= pressed; // G - 'h33: powerpad[7] <= pressed; // H - 'h21: powerpad[8] <= pressed; // C - 'h2A: powerpad[9] <= pressed; // V - 'h32: powerpad[10] <= pressed; // B - 'h31: powerpad[11] <= pressed; // N - endcase - end -end - -endmodule diff --git a/sys/hps_io.v b/sys/hps_io.v index 1003bbd..06283fb 100644 --- a/sys/hps_io.v +++ b/sys/hps_io.v @@ -38,12 +38,12 @@ module hps_io #(parameter STRLEN=0, PS2DIV=2000, WIDE=0, VDNUM=1, PS2WE=0) // parameter STRLEN and the actual length of conf_str have to match input [(8*STRLEN)-1:0] conf_str, - output reg [15:0] joystick_0, - output reg [15:0] joystick_1, - output reg [15:0] joystick_2, - output reg [15:0] joystick_3, - output reg [15:0] joystick_4, - output reg [15:0] joystick_5, + output reg [31:0] joystick_0, + output reg [31:0] joystick_1, + output reg [31:0] joystick_2, + output reg [31:0] joystick_3, + output reg [31:0] joystick_4, + output reg [31:0] joystick_5, output reg [15:0] joystick_analog_0, output reg [15:0] joystick_analog_1, output reg [15:0] joystick_analog_2, @@ -330,13 +330,13 @@ always@(posedge clk_sys) begin case(cmd) // buttons and switches - 'h01: cfg <= io_din[7:0]; - 'h02: joystick_0 <= io_din; - 'h03: joystick_1 <= io_din; - 'h10: joystick_2 <= io_din; - 'h11: joystick_3 <= io_din; - 'h12: joystick_4 <= io_din; - 'h13: joystick_5 <= io_din; + 'h01: cfg <= io_din[7:0]; + 'h02: if(byte_cnt==1) joystick_0[15:0] <= io_din; else joystick_0[31:16] <= io_din; + 'h03: if(byte_cnt==1) joystick_1[15:0] <= io_din; else joystick_1[31:16] <= io_din; + 'h10: if(byte_cnt==1) joystick_2[15:0] <= io_din; else joystick_2[31:16] <= io_din; + 'h11: if(byte_cnt==1) joystick_3[15:0] <= io_din; else joystick_3[31:16] <= io_din; + 'h12: if(byte_cnt==1) joystick_4[15:0] <= io_din; else joystick_4[31:16] <= io_din; + 'h13: if(byte_cnt==1) joystick_5[15:0] <= io_din; else joystick_5[31:16] <= io_din; // store incoming ps2 mouse bytes 'h04: begin