BizHawk/waterbox/sameboy/joypad.c

49 lines
1.2 KiB
C
Raw Normal View History

2017-07-16 16:23:41 +00:00
#include <stdio.h>
#include "gb.h"
#include <assert.h>
void GB_update_joyp(GB_gameboy_t *gb)
{
uint8_t key_selection = 0;
uint8_t previous_state = 0;
/* Todo: add delay to key selection */
previous_state = gb->io_registers[GB_IO_JOYP] & 0xF;
2017-07-18 22:19:51 +00:00
key_selection = gb->io_registers[GB_IO_JOYP] >> 4 & 3;
2017-07-16 16:23:41 +00:00
gb->io_registers[GB_IO_JOYP] &= 0xF0;
switch (key_selection) {
case 3:
/* Nothing is wired, all up */
gb->io_registers[GB_IO_JOYP] |= 0x0F;
break;
case 2:
/* Direction keys */
2017-07-18 22:19:51 +00:00
gb->io_registers[GB_IO_JOYP] |= ~gb->keys >> 4 & 0xf;
2017-07-16 16:23:41 +00:00
break;
case 1:
/* Other keys */
2017-07-18 22:19:51 +00:00
gb->io_registers[GB_IO_JOYP] |= ~gb->keys & 0xf;
2017-07-16 16:23:41 +00:00
break;
case 0:
/* Todo: verifiy this is correct */
2017-07-18 22:19:51 +00:00
gb->io_registers[GB_IO_JOYP] |= ~(gb->keys >> 4 & gb->keys) & 0xf;
2017-07-16 16:23:41 +00:00
break;
default:
break;
}
if (previous_state != (gb->io_registers[GB_IO_JOYP] & 0xF)) {
/* Todo: disable when emulating CGB */
gb->io_registers[GB_IO_IF] |= 0x10;
}
gb->io_registers[GB_IO_JOYP] |= 0xC0; // No SGB support
}
2017-07-18 22:19:51 +00:00
void GB_set_key_state(GB_gameboy_t *gb, int keys)
2017-07-16 16:23:41 +00:00
{
2017-07-18 22:19:51 +00:00
gb->keys = keys;
2017-07-16 16:23:41 +00:00
}