Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Analogizer (Feature Request): add support for SNAC PSX two game controllers (digital and analog) for the Pocket Analogizer adapter #916

Open
RndMnkIII opened this issue Jan 9, 2025 · 0 comments
Assignees

Comments

@RndMnkIII
Copy link

RndMnkIII commented Jan 9, 2025

Recently I've updated Pocket Analogizer SNAC support to extend it to use two PSX game controllers (digital and analog types).
This repo hold the most recent Analogizer framework code:
https://github.com/RndMnkIII/Analogizer

This repo can be used as example of implementation and usage:
https://github.com/RndMnkIII/Analogizer_openfpga-pcengine

The following type of game controllers are supported:

  • Digital controller (SCPH-1010)
  • Analog Joystick (SCPH-1110)
  • Dual Analog (SCPH-1180)
  • DualShock 1 (SCPH-1200)
  • DualShock 2 (SCPH-10010)

The relevant files are:

  • openFPGA_Pocket_Analogizer_SNAC.sv
  • analogizer_psx.sv
  • dualshock_controller.v

Example of menu options for interact.json core configuration file:

 {
                "name": "SNAC Adapter",
                "id": 16,
                "type": "list",
                "enabled": true,
                "persist": true,
                "address": "0xF7000000",
                "defaultval": "0x00",
                "mask": "0xFFFFFFE0",
                "options": [
                  {
                  "value": "0x00",
                  "name": "None"
                  },
                  {
                  "value": "0x01",
                  "name": "DB15 Normal"
                  },
                  {
                  "value": "0x02",
                  "name": "NES"
                  },
                  {
                  "value": "0x03",
                  "name": "SNES"
                  },
                  {
                  "value": "0x04",
                  "name": "PCE 2BTN"
                  },
                  {
                  "value": "0x05",
                  "name": "PCE 6BTN"
                  },
                  {
                  "value": "0x06",
                  "name": "PCE Multitap"
                  },
                  {
                    "value": "0x09",
                    "name": "DB15 Fast"
                  },
                  {
                    "value": "0x0B",
                    "name": "SNES A,B<->X,Y"
                  },
                  {
                    "value": "0x11",
                    "name": "PSX (Digital DPAD)"
                  },
                  {
                    "value": "0x13",
                    "name": "PSX (Analog DPAD)"
                  }
                ]
            }

Example of mapping analog sticks to dpad, from Analogizer PC Engine core_top.v:

//*** Analogizer Interface V1.1 ***
reg analogizer_ena;
reg [3:0] analogizer_video_type;
reg [4:0] snac_game_cont_type /* synthesis keep */;
reg [3:0] snac_cont_assignment /* synthesis keep */;
  
wire [31:0] p1_joy, p2_joy; //analog sticks data, from Analogizer adapter module
//use PSX Dual Shock style left analog stick as directional pad
wire is_analog_input = (snac_game_cont_type == 5'h13);

//! Player 1 ---------------------------------------------------------------------------
reg p1_up, p1_down, p1_left, p1_right;
wire p1_up_analog, p1_down_analog, p1_left_analog, p1_right_analog;
//using left analog joypad
assign p1_up_analog    = (p1_joy[15:8] < 8'h40) ? 1'b1 : 1'b0; //analog range UP 0x00 Idle 0x80 DOWN 0xFF, DEADZONE +- 0x15
assign p1_down_analog  = (p1_joy[15:8] > 8'hC0) ? 1'b1 : 1'b0; 
assign p1_left_analog  = (p1_joy[7:0]  < 8'h40) ? 1'b1 : 1'b0; //analog range LEFT 0x00 Idle 0x80 RIGHT 0xFF, DEADZONE +- 0x15
assign p1_right_analog = (p1_joy[7:0]  > 8'hC0) ? 1'b1 : 1'b0;

always @(posedge clk_sys_42_95) begin
    p1_up    <= (is_analog_input) ? p1_up_analog    : p1_btn[0];
    p1_down  <= (is_analog_input) ? p1_down_analog  : p1_btn[1];
    p1_left  <= (is_analog_input) ? p1_left_analog  : p1_btn[2];
    p1_right <= (is_analog_input) ? p1_right_analog : p1_btn[3];
end
//! Player 2 ---------------------------------------------------------------------------
reg p2_up, p2_down, p2_left, p2_right;
wire p2_up_analog, p2_down_analog, p2_left_analog, p2_right_analog;
//using left analog joypad
assign p2_up_analog    = (p2_joy[15:8] < 8'h40) ? 1'b1 : 1'b0; //analog range UP 0x00 Idle 0x80 DOWN 0xFF, DEADZONE +- 0x15
assign p2_down_analog  = (p2_joy[15:8] > 8'hC0) ? 1'b1 : 1'b0; 
assign p2_left_analog  = (p2_joy[7:0]  < 8'h40) ? 1'b1 : 1'b0; //analog range LEFT 0x00 Idle 0x80 RIGHT 0xFF, DEADZONE +- 0x15
assign p2_right_analog = (p2_joy[7:0]  > 8'hC0) ? 1'b1 : 1'b0;

always @(posedge clk_sys_42_95) begin
    p2_up    <= (is_analog_input) ? p2_up_analog    : p2_btn[0];
    p2_down  <= (is_analog_input) ? p2_down_analog  : p2_btn[1];
    p2_left  <= (is_analog_input) ? p2_left_analog  : p2_btn[2];
    p2_right <= (is_analog_input) ? p2_right_analog : p2_btn[3];
end

  //switch between Analogizer SNAC and Pocket Controls for P1-P4 (P3,P4 when uses PCEngine Multitap)
  wire [15:0] p1_btn, p2_btn, p3_btn, p4_btn;
  reg [15:0] p1_controls, p2_controls, p3_controls, p4_controls; //to the system core game inputs (replaces Pocket framework inputs)

  always @(posedge clk_sys_42_95) begin
    if(snac_game_cont_type == 5'h0) begin //SNAC is disabled
                  p1_controls <= cont1_key_s;
                  p2_controls <= cont2_key_s;
                  p3_controls <= cont3_key_s;
                  p4_controls <= cont4_key_s;
    end
    else begin
      case(snac_cont_assignment)
      4'h0:    begin 
                  p1_controls <= {p1_btn[15:4],p1_right,p1_left,p1_down,p1_up};
                  p2_controls <= cont2_key_s;
                  p3_controls <= cont3_key_s;
                  p4_controls <= cont4_key_s;
                end
      4'h1:    begin 
                  p1_controls <= cont1_key_s;
                  p2_controls <= {p1_btn[15:4],p1_right,p1_left,p1_down,p1_up};
                  p3_controls <= cont3_key_s;
                  p4_controls <= cont4_key_s;
                end
      4'h2:    begin
                  p1_controls <= {p1_btn[15:4],p1_right,p1_left,p1_down,p1_up};
                  p2_controls <= {p2_btn[15:4],p2_right,p2_left,p2_down,p2_up};
                  p3_controls <= cont3_key_s;
                  p4_controls <= cont4_key_s;
                end
      4'h3:    begin
                  p1_controls <= {p2_btn[15:4],p2_right,p2_left,p2_down,p2_up};
                  p2_controls <= {p1_btn[15:4],p1_right,p1_left,p1_down,p1_up};
                  p3_controls <= cont3_key_s;
                  p4_controls <= cont4_key_s;
                end
      4'h4:    begin
                  p1_controls <= {p1_btn[15:4],p1_right,p1_left,p1_down,p1_up};
                  p2_controls <= {p2_btn[15:4],p2_right,p2_left,p2_down,p2_up};
                  p3_controls <= p3_btn;
                  p4_controls <= p4_btn;
                end
      4'h5:    begin
                  p1_controls <= p4_btn;
                  p2_controls <= p3_btn;
                  p3_controls <= {p2_btn[15:4],p2_right,p2_left,p2_down,p2_up};
                  p4_controls <= {p1_btn[15:4],p1_right,p1_left,p1_down,p1_up};
                end
      4'h6:    begin
                  p1_controls <= cont1_key_s;
                  p2_controls <= cont2_key_s;
                  p3_controls <= {p1_btn[15:4],p1_right,p1_left,p1_down,p1_up};
                  p4_controls <= {p2_btn[15:4],p2_right,p2_left,p2_down,p2_up};
                end
      default: begin
                  p1_controls <= cont1_key_s;
                  p2_controls <= cont2_key_s;
                  p3_controls <= cont3_key_s;
                  p4_controls <= cont4_key_s;
                end
      endcase
    end
  end
@rp-jt rp-jt self-assigned this Feb 7, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: No status
Development

No branches or pull requests

2 participants