Update gamepad control.

This commit is contained in:
sorgelig
2019-03-21 21:05:27 +08:00
parent c2e490a5f9
commit 900c7f1fcc
5 changed files with 35 additions and 123 deletions

View File

@@ -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

64
NES.sv
View File

@@ -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 /////////////////////////////

View File

@@ -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

View File

@@ -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

View File

@@ -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