@@ -450,11 +450,14 @@ reg cs_hifi_pcm_enable = 1;
450450reg [1 : 0 ] cs_audio_filter = 0 ;
451451reg cs_fm_chip = 0 ;
452452
453- // M30 Controller
453+ // Input
454454reg cs_m30_map_enable = 0 ;
455+ reg lightgun_enabled = 0 ;
456+ reg show_crosshair = 1 ;
457+ reg [7 : 0 ] dpad_aim_speed = 4 ;
455458
456459always @ (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
484490end
@@ -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;
874880reg svp_quirk = 0 ;
875881reg fmbusy_quirk = 0 ;
876882reg 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
880886always @ (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;
966972wire [31 : 0 ] cont2_key_s;
967973wire [31 : 0 ] cont3_key_s;
968974wire [31 : 0 ] cont4_key_s;
975+ wire [31 : 0 ] cont1_joy_s;
969976
970977synch_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+
10021017assign 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