mirror of
https://github.com/MiSTer-devel/Gameboy_MiSTer.git
synced 2026-04-19 03:04:09 +00:00
Super Game Boy multiplayer support
This commit is contained in:
23
Gameboy.sv
23
Gameboy.sv
@@ -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 ),
|
||||
|
||||
15
rtl/gb.v
15
rtl/gb.v
@@ -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;
|
||||
|
||||
|
||||
29
rtl/sgb.v
29
rtl/sgb.v
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user