Connect SNES VIN to FTDI 3.3V/5V

Connect SNES GND to FTDI GND

Connect SNES Latch to FTDI RX

Connect SNES Clock to FTDI TX

Connect SNES Data to FTDI CTS, also connect 10K pull-up resistor(yours might work without it.)

Use the D2XX library with the following code below

The code simply prints the button values to the console, but you can relay the data to simulate keyboard/joypad/mouse events to make it a little more useful.

#define SNES_Bb 0x001
#define SNES_Yb 0x002
#define SNES_Se 0x004
#define SNES_St 0x008
#define SNES_DU 0x010
#define SNES_DD 0x020
#define SNES_DL 0x040
#define SNES_DR 0x080
#define SNES_Ab 0x100
#define SNES_Xb 0x200
#define SNES_Lb 0x400
#define SNES_Rb 0x800

#define CLK 0x01
#define LAT 0x02

int Data = 0x00;
uint8 DataIn = 0;
int PinValue = 0x00;

void SetPinLow(FT_HANDLE handle, int value);
void SetPinHigh(FT_HANDLE handle, int value);

void ReadSNES() {

    struct timespec interval = {0, 100000}, remainder;
    

    FT_HANDLE handle;
    if(FT_Open(0, &handle) != FT_OK) {
        printf("Device error.\n");
        return;
    }
    else {
        printf("Device working.\n");
    }
    FT_SetBaudRate(handle, 9600);
    
    PinValue = CLK | LAT;
    FT_SetBitMode(handle, PinValue, 0x01);
    
    int i = 0;
    while (1) {
        Data=0x00;
        SetPinLow(handle, LAT);
        SetPinHigh(handle, CLK);
        SetPinHigh(handle, LAT);
        SetPinLow(handle, LAT);

        for (i = 0; i < 12; i++) {
            SetPinHigh(handle, CLK);
            FT_GetBitMode(handle, &DataIn);
            Data |= (((DataIn>>0x03)&0x01)<<i);
            SetPinLow(handle, CLK);
        }
        printf("%03X\n", Data^0xFFF);
        nanosleep(&interval, &remainder);
        
    }
    
}

void SetPinLow(FT_HANDLE handle, int value) {
    PinValue|=value;
    FT_SetBitMode(handle, PinValue, 0x01);
}

void SetPinHigh(FT_HANDLE handle, int value) {
    PinValue&=(value^0xFF);
    FT_SetBitMode(handle, PinValue, 0x01);
}