예제 #1
0
static void controller_status_command(struct game_controller* cont, uint8_t* cmd)
{
    enum pak_type pak;
    int connected = controller_input_is_connected(cont->cin, &pak);

    if (cmd[1] & 0x80)
        return;

    if (!connected)
    {
        cmd[1] |= 0x80;
        return;
    }

    cmd[3] = 0x05;
    cmd[4] = 0x00;

    switch(pak)
    {
    case PAK_MEM:
    case PAK_RUMBLE:
    case PAK_TRANSFER:
        cmd[5] = 1;
        break;

    case PAK_NONE:
    default:
        cmd[5] = 0;
    }
}
예제 #2
0
static void controller_write_pak_command(struct game_controller* cont, uint8_t* cmd)
{
    enum pak_type pak;
    uint16_t address;
    uint8_t* data;
    uint8_t* crc;
    int connected = controller_input_is_connected(cont->cin, &pak);

    if (!connected)
    {
        cmd[1] |= 0x80;
        return;
    }

    address = (cmd[3] << 8) | (cmd[4] & 0xe0);
    data = &cmd[5];
    crc = &cmd[5 + PAK_CHUNK_SIZE];

    switch (pak)
    {
    case PAK_NONE: /* do nothing */ break;
    case PAK_MEM: mempak_write_command(&cont->mempak, address, data, PAK_CHUNK_SIZE); break;
    case PAK_RUMBLE: rumblepak_write_command(&cont->rumblepak, address, data, PAK_CHUNK_SIZE); break;
    case PAK_TRANSFER: /* TODO */ break;
    default:
        DebugMessage(M64MSG_WARNING, "Unknown plugged pak %d", (int)pak);
    }

    *crc = pak_data_crc(data);
}
예제 #3
0
static void controller_write_pak_command(struct game_controller* cont, uint8_t* cmd)
{
    enum pak_type pak;
    int connected = controller_input_is_connected(cont->cin, &pak);

    if (!connected)
    {
        cmd[1] |= 0x80;
        return;
    }

    switch (pak)
    {
    case PAK_NONE: /* do nothing */
        break;
    case PAK_MEM:
        mempak_write_command(&cont->mempak, cmd);
        break;
    case PAK_RUMBLE:
        rumblepak_write_command(&cont->rumblepak, cmd);
        break;
    case PAK_TRANSFER: /* TODO */
        break;
    default:
        DebugMessage(M64MSG_WARNING, "Unknown plugged pak %d", (int)pak);
    }

    cmd[0x25] = pak_data_crc(&cmd[5]);
}
예제 #4
0
static void controller_read_buttons_command(struct game_controller* cont, uint8_t* cmd)
{
    enum pak_type pak;
    int connected = controller_input_is_connected(cont->cin, &pak);

    if (!connected)
        cmd[1] |= 0x80;

    /* NOTE: buttons reading is done in read_controller_read_buttons instead */
}
예제 #5
0
static void read_controller_read_buttons(struct game_controller* cont, uint8_t* cmd)
{
    enum pak_type pak;
    int connected = controller_input_is_connected(cont->cin, &pak);

    if (!connected)
        return;

    *((uint32_t*)(cmd + 3)) = controller_input_get_input(cont->cin);

#ifdef COMPARE_CORE
    CoreCompareDataSync(4, cmd + 3);
#endif
}