Skip to content

Commit 06868b3

Browse files
authored
feat: Virtual Menacer and Justifier lightgun support. (#11)
1 parent 8b7c50e commit 06868b3

File tree

3 files changed

+294
-166
lines changed

3 files changed

+294
-166
lines changed

dist/Cores/ericlewis.Genesis/interact.json

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,45 @@
6565
"defaultval": 0,
6666
"value": 1
6767
},
68+
{
69+
"name": "Lightgun",
70+
"id": 70,
71+
"type": "check",
72+
"enabled": true,
73+
"persist": true,
74+
"address": "0x00000100",
75+
"writeonly": true,
76+
"defaultval": 0,
77+
"value": 1
78+
},
79+
{
80+
"name": "Show Crosshair",
81+
"id": 71,
82+
"type": "check",
83+
"enabled": true,
84+
"persist": true,
85+
"address": "0x00000104",
86+
"writeonly": true,
87+
"defaultval": 1,
88+
"value": 1
89+
},
90+
{
91+
"name": "D-Pad Aim Speed",
92+
"id": 72,
93+
"type": "slider_u32",
94+
"enabled": true,
95+
"address": "0x00000108",
96+
"persist": true,
97+
"writeonly": true,
98+
"defaultval": 3,
99+
"graphical": {
100+
"signed": false,
101+
"min": 1,
102+
"max": 10,
103+
"adjust_small": 1,
104+
"adjust_large": 4
105+
}
106+
},
68107
{
69108
"name": "M30 Controllers",
70109
"id": 499,

src/fpga/core/core_top.sv

Lines changed: 90 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -450,11 +450,14 @@ reg cs_hifi_pcm_enable = 1;
450450
reg [1:0] cs_audio_filter = 0;
451451
reg cs_fm_chip = 0;
452452

453-
//M30 Controller
453+
// Input
454454
reg cs_m30_map_enable = 0;
455+
reg lightgun_enabled = 0;
456+
reg show_crosshair = 1;
457+
reg [7:0] dpad_aim_speed = 4;
455458

456459
always @(posedge clk_74a) begin
457-
reset_counter = reset_counter + 1;
460+
reset_counter = reset_counter + 1;
458461
if (~osnotify_inmenu && reset_delay > 0) begin
459462
reset_delay <= reset_delay - 1;
460463
end
@@ -479,6 +482,9 @@ always @(posedge clk_74a) begin
479482
end
480483
32'h00000080: cs_m30_map_enable <= bridge_wr_data[0];
481484
32'h00000090: cs_menu_pause_enable <= bridge_wr_data[0];
485+
32'h00000100: lightgun_enabled <= bridge_wr_data[0];
486+
32'h00000104: show_crosshair <= bridge_wr_data[0];
487+
32'h00000108: dpad_aim_speed <= bridge_wr_data[7:0];
482488
endcase
483489
end
484490
end
@@ -766,9 +772,9 @@ always @(posedge current_pix_clk) begin
766772

767773
if (~(vblank_line || hblank_c)) begin
768774
video_de_reg <= 1;
769-
video_rgb_reg[23:16] <= red;
770-
video_rgb_reg[15:8] <= green;
771-
video_rgb_reg[7:0] <= blue;
775+
video_rgb_reg[23:16] <= (lg_target && lightgun_enabled && show_crosshair) ? {8{lg_target[0]}} : red;
776+
video_rgb_reg[15:8] <= (lg_target && lightgun_enabled && show_crosshair) ? {8{lg_target[1]}} : green;
777+
video_rgb_reg[7:0] <= (lg_target && lightgun_enabled && show_crosshair) ? {8{lg_target[2]}} : blue;
772778
end
773779

774780
video_hs_reg <= ~hs_prev && hs_c;
@@ -874,8 +880,8 @@ reg pier_quirk = 0;
874880
reg svp_quirk = 0;
875881
reg fmbusy_quirk = 0;
876882
reg schan_quirk = 0;
877-
reg gun_type = 0;
878-
reg [7:0] gun_sensor_delay = 8'd44;
883+
reg lightgun_type = 0;
884+
reg [7:0] lightgun_sensor_delay = 8'd44;
879885

880886
always @(posedge clk_sys) begin
881887
reg [63:0] cart_id;
@@ -929,28 +935,28 @@ always @(posedge clk_sys) begin
929935

930936
// Lightgun device and timing offsets
931937
if(cart_id == "MK-1533 ") begin // Body Count
932-
gun_type <= 0;
933-
gun_sensor_delay <= 8'd100;
938+
lightgun_type <= 0;
939+
lightgun_sensor_delay <= 8'd100;
934940
end
935941
else if(cart_id == "T-95096-") begin // Lethal Enforcers
936-
gun_type <= 1;
937-
gun_sensor_delay <= 8'd52;
942+
lightgun_type <= 1;
943+
lightgun_sensor_delay <= 8'd52;
938944
end
939945
else if(cart_id == "T-95136-") begin // Lethal Enforcers II
940-
gun_type <= 1;
941-
gun_sensor_delay <= 8'd30;
946+
lightgun_type <= 1;
947+
lightgun_sensor_delay <= 8'd30;
942948
end
943949
else if(cart_id == "MK-1658 ") begin // Menacer 6-in-1
944-
gun_type <= 0;
945-
gun_sensor_delay <= 8'd120;
950+
lightgun_type <= 0;
951+
lightgun_sensor_delay <= 8'd120;
946952
end
947953
else if(cart_id == "T-081156") begin // T2: The Arcade Game
948-
gun_type <= 0;
949-
gun_sensor_delay <= 8'd126;
954+
lightgun_type <= 0;
955+
lightgun_sensor_delay <= 8'd126;
950956
end
951957
else begin
952-
gun_type <= 0;
953-
gun_sensor_delay <= 8'd44;
958+
lightgun_type <= 0;
959+
lightgun_sensor_delay <= 8'd44;
954960
end
955961
end
956962
end
@@ -966,6 +972,7 @@ wire [31:0] cont1_key_s;
966972
wire [31:0] cont2_key_s;
967973
wire [31:0] cont3_key_s;
968974
wire [31:0] cont4_key_s;
975+
wire [31:0] cont1_joy_s;
969976

970977
synch_2 #(
971978
.WIDTH(32)
@@ -999,12 +1006,20 @@ synch_2 #(
9991006
clk_sys
10001007
);
10011008

1009+
synch_3 #(
1010+
.WIDTH(32)
1011+
) joy1_s (
1012+
cont1_joy,
1013+
cont1_joy_s,
1014+
clk_sys
1015+
);
1016+
10021017
assign joystick_0 = {
10031018
cs_m30_map_enable ? cont1_key_s[10] : cont1_key_s[9], // Z
10041019
cs_m30_map_enable ? cont1_key_s[7] : cont1_key_s[6], // Y
10051020
cs_m30_map_enable ? cont1_key_s[6] : cont1_key_s[8], // X
10061021
cont1_key_s[14], // mode
1007-
cont1_key_s[15], // start
1022+
lightgun_enabled ? 0 : cont1_key_s[15], // start
10081023
cs_m30_map_enable ? cont1_key_s[11] : cont1_key_s[4], // B
10091024
cs_m30_map_enable ? cont1_key_s[5] : cont1_key_s[5], // C
10101025
cs_m30_map_enable ? cont1_key_s[4] : cont1_key_s[7], // A
@@ -1058,6 +1073,54 @@ assign joystick_3 = {
10581073
cont4_key_s[2], // left
10591074
cont4_key_s[3], // right
10601075
};
1076+
1077+
///////////////////////////////////////////////
1078+
// Lightguns
1079+
///////////////////////////////////////////////
1080+
wire [2:0] lg_target;
1081+
wire lg_sensor;
1082+
wire lg_a;
1083+
wire lg_b;
1084+
wire lg_c;
1085+
wire lg_start;
1086+
1087+
lightgun lightgun
1088+
(
1089+
.CLK(clk_sys),
1090+
.RESET(reset),
1091+
1092+
// .MOUSE(ps2_mouse),
1093+
// .MOUSE_XY(&gun_mode),
1094+
1095+
.JOY_X(cont1_joy_s[7:0]),
1096+
.JOY_Y(cont1_joy_s[15:8]),
1097+
.JOY(cont1_key),
1098+
1099+
.UP(cont1_key[0]),
1100+
.DOWN(cont1_key[1]),
1101+
.LEFT(cont1_key[2]),
1102+
.RIGHT(cont1_key[3]),
1103+
.DPAD_AIM_SPEED(dpad_aim_speed),
1104+
1105+
.RELOAD(lightgun_type),
1106+
1107+
.HDE(~hblank_c),
1108+
.VDE(~vblank_c),
1109+
.CE_PIX(ce_pix),
1110+
.H40(resolution[0]),
1111+
1112+
.BTN_MODE(0),
1113+
// .SIZE(0),
1114+
.SENSOR_DELAY(lightgun_sensor_delay),
1115+
1116+
.TARGET(lg_target),
1117+
.SENSOR(lg_sensor),
1118+
.BTN_A(lg_a),
1119+
.BTN_B(lg_b),
1120+
.BTN_C(lg_c),
1121+
.BTN_START(lg_start)
1122+
);
1123+
10611124
///////////////////////////////////////////////
10621125
// Instance
10631126
///////////////////////////////////////////////
@@ -1119,13 +1182,13 @@ system system
11191182
// .MOUSE(),
11201183
// .MOUSE_OPT(0),
11211184

1122-
// .GUN_OPT(0),
1123-
// .GUN_TYPE(),
1124-
// .GUN_SENSOR(),
1125-
// .GUN_A(),
1126-
// .GUN_B(),
1127-
// .GUN_C(),
1128-
// .GUN_START(),
1185+
.GUN_OPT(lightgun_enabled),
1186+
.GUN_TYPE(lightgun_type),
1187+
.GUN_SENSOR(lg_sensor),
1188+
.GUN_A(lg_a),
1189+
.GUN_B(lg_b),
1190+
.GUN_C(lg_c),
1191+
.GUN_START(lg_start),
11291192

11301193
// .SERJOYSTICK_IN(),
11311194
// .SERJOYSTICK_OUT(),

0 commit comments

Comments
 (0)