diff --git a/Gameboy.sv b/Gameboy.sv index ab054f2..a52c374 100644 --- a/Gameboy.sv +++ b/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 ), diff --git a/rtl/gb.v b/rtl/gb.v index e789414..4cdcac8 100644 --- a/rtl/gb.v +++ b/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; diff --git a/rtl/sgb.v b/rtl/sgb.v index baf2a9b..a70af3c 100644 --- a/rtl/sgb.v +++ b/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;