Super Game Boy multiplayer support

This commit is contained in:
paulb-nl
2020-06-24 01:22:46 +02:00
committed by GitHub
parent 7edd0c2cac
commit c95d2f5836
3 changed files with 46 additions and 21 deletions

View File

@@ -215,8 +215,8 @@ wire [24:0] ioctl_addr;
wire [15:0] ioctl_dout;
reg ioctl_wait;
wire [15:0] joystick_0, joystick_1;
wire [15:0] joystick = joystick_0 | joystick_1;
wire [15:0] joystick_0, joystick_1, joystick_2, joystick_3;
wire [7:0] filetype;
reg [31:0] sd_lba;
@@ -266,7 +266,9 @@ hps_io #(.STRLEN($size(CONF_STR)>>3), .WIDE(1)) hps_io
.forced_scandoubler(forced_scandoubler),
.joystick_0(joystick_0),
.joystick_1(joystick_1)
.joystick_1(joystick_1),
.joystick_2(joystick_2),
.joystick_3(joystick_3)
);
///////////////////////////////////////////////////
@@ -561,12 +563,12 @@ gb gb (
.ce_2x ( ce_cpu2x ), // ~8MHz in dualspeed mode (GBC)
.fast_boot ( status[2] ),
.joystick ( joystick ),
.isGBC ( isGBC ),
.isGBC_game ( isGBC_game ),
.joy_p54 (joy_p54 ),
.joy_sgb (joy_do_sgb ),
.joy_p54 ( joy_p54 ),
.joy_din ( joy_do_sgb ),
// interface to the "external" game cartridge
.cart_addr ( cart_addr ),
@@ -652,7 +654,8 @@ lcd lcd
.v_cnt ( v_cnt )
);
wire [5:0] joy_p54, joy_do_sgb;
wire [1:0] joy_p54;
wire [3:0] joy_do_sgb;
wire [14:0] sgb_lcd_data;
wire [15:0] sgb_border_pix;
wire sgb_lcd_clkena, sgb_lcd_on;
@@ -668,7 +671,11 @@ sgb sgb (
.clk_vid ( CLK_VIDEO ),
.ce_pix ( ce_pix ),
.joy_di ( joy_p54 ),
.joystick_0 ( joystick_0 ),
.joystick_1 ( joystick_1 ),
.joystick_2 ( joystick_2 ),
.joystick_3 ( joystick_3 ),
.joy_p54 ( joy_p54 ),
.joy_do ( joy_do_sgb ),
.sgb_en ( ~sgb_en[1] & isSGB_game & ~isGBC ),

View File

@@ -53,8 +53,8 @@ module gb (
output [1:0] lcd_mode,
output lcd_on,
output [5:0] joy_p54,
input [5:0] joy_sgb,
output [1:0] joy_p54,
input [3:0] joy_din,
output speed, //GBC
@@ -329,8 +329,6 @@ end
// ------------------------------ inputs ------------------------------
// --------------------------------------------------------------------
wire [3:0] joy_p4 = ~{ joystick[2], joystick[3], joystick[1], joystick[0] } | {4{p54[0]}};
wire [3:0] joy_p5 = ~{ joystick[7], joystick[6], joystick[5], joystick[4] } | {4{p54[1]}};
reg [1:0] p54;
always @(posedge clk_cpu) begin
@@ -338,8 +336,8 @@ always @(posedge clk_cpu) begin
else if(sel_joy && !cpu_wr_n) p54 <= cpu_do[5:4];
end
wire [7:0] joy_do = { 2'b11, joy_sgb };
assign joy_p54 = {p54, joy_p4 & joy_p5};
wire [7:0] joy_do = { 2'b11, p54, joy_din };
assign joy_p54 = p54;
// --------------------------------------------------------------------
// ---------------------------- interrupts ----------------------------
@@ -362,7 +360,7 @@ wire [7:0] irq_vec =
//wire vs = (lcd_mode == 2'b01);
//reg vsD, vsD2;
reg [7:0] inputD, inputD2;
reg [3:0] inputD, inputD2;
// irq is low when an enable irq is active
wire irq_n = !(ie_r & if_r);
@@ -397,7 +395,8 @@ always @(negedge clk_cpu) begin //negedge to trigger interrupt earlier
if(~old_serial_irq & serial_irq) if_r[3] <= 1'b1;
// falling edge on any input line P10..P13
inputD <= {joy_p4, joy_p5};
inputD <= joy_din;
inputD2 <= inputD;
if(~inputD & inputD2) if_r[4] <= 1'b1;

View File

@@ -17,8 +17,13 @@ module sgb (
input [8:0] h_cnt,
input [8:0] v_cnt,
input [5:0] joy_di,
output [5:0] joy_do,
input [7:0] joystick_0,
input [7:0] joystick_1,
input [7:0] joystick_2,
input [7:0] joystick_3,
input [1:0] joy_p54,
output [3:0] joy_do,
output reg [15:0] sgb_border_pix,
@@ -46,10 +51,10 @@ localparam CMD_ATTR_TRN = 5'h15;
localparam CMD_ATTR_SET = 5'h16;
localparam CMD_MASK_EN = 5'h17;
assign joy_do = joypad_id_out ? {joy_di[5:4],2'b11,joypad_id} : joy_di;
wire p14 = joy_di[4];
wire p15 = joy_di[5];
wire p14 = joy_p54[0];
wire p15 = joy_p54[1];
reg old_p15, old_p14;
reg [7:0] data;
@@ -330,6 +335,7 @@ end
2 player: 0F,0E. 4 player: 0F,0E,0D,0C
Normal Gameboy or Super Gameboy with multiplayer disabled will always return 0F.
*/
reg [1:0] joypad_id;
reg joypad_id_out;
reg joylock;
@@ -357,6 +363,19 @@ always @(posedge clk_sys) begin
end
assign joy_do = joypad_id_out ? {2'b11,joypad_id} : joy_data;
wire [3:0] joy_dir = ~{ joystick[2], joystick[3], joystick[1], joystick[0] } | {4{p14}};
wire [3:0] joy_buttons = ~{ joystick[7], joystick[6], joystick[5], joystick[4] } | {4{p15}};
wire [3:0] joy_data = joy_dir & joy_buttons;
wire [7:0] joystick =
(~sgb_en | ~mlt_ctrl[0]) ? (joystick_0 | joystick_1) :
(joypad_id == 2'b11) ? joystick_0 :
(joypad_id == 2'b10) ? joystick_1 :
(joypad_id == 2'b01) ? joystick_2 :
joystick_3;
wire lcd_off = !lcd_on || (lcd_mode == 2'd01);
reg old_lcd_off;