mirror of
https://github.com/wavemotion-dave/NINTV-DS.git
synced 2025-06-18 13:55:33 -04:00
108 lines
2.6 KiB
C++
108 lines
2.6 KiB
C++
|
|
#include "HandController.h"
|
|
#include "Intellivision.h"
|
|
|
|
const UINT16 HandController::BUTTON_OUTPUT_VALUES[15] = {
|
|
0x81, //OUTPUT_KEYPAD_ONE
|
|
0x41, //OUTPUT_KEYPAD_TWO
|
|
0x21, //OUTPUT_KEYPAD_THREE
|
|
0x82, //OUTPUT_KEYPAD_FOUR
|
|
0x42, //OUTPUT_KEYPAD_FIVE
|
|
0x22, //OUTPUT_KEYPAD_SIX
|
|
0x84, //OUTPUT_KEYPAD_SEVEN
|
|
0x44, //OUTPUT_KEYPAD_EIGHT
|
|
0x24, //OUTPUT_KEYPAD_NINE
|
|
0x88, //OUTPUT_KEYPAD_CLEAR
|
|
0x48, //OUTPUT_KEYPAD_ZERO
|
|
0x28, //OUTPUT_KEYPAD_ENTER
|
|
0xA0, //OUTPUT_ACTION_BUTTON_TOP
|
|
0x60, //OUTPUT_ACTION_BUTTON_BOTTOM_LEFT
|
|
0xC0 //OUTPUT_ACTION_BUTTON_BOTTOM_RIGHT
|
|
};
|
|
|
|
const UINT16 HandController::DIRECTION_OUTPUT_VALUES[16] = {
|
|
0x04, //OUTPUT_DISC_NORTH
|
|
0x14, //OUTPUT_DISC_NORTH_NORTH_EAST
|
|
0x16, //OUTPUT_DISC_NORTH_EAST
|
|
0x06, //OUTPUT_DISC_EAST_NORTH_EAST
|
|
0x02, //OUTPUT_DISC_EAST
|
|
0x12, //OUTPUT_DISC_EAST_SOUTH_EAST
|
|
0x13, //OUTPUT_DISC_SOUTH_EAST
|
|
0x03, //OUTPUT_DISC_SOUTH_SOUTH_EAST
|
|
0x01, //OUTPUT_DISC_SOUTH
|
|
0x11, //OUTPUT_DISC_SOUTH_SOUTH_WEST
|
|
0x19, //OUTPUT_DISC_SOUTH_WEST
|
|
0x09, //OUTPUT_DISC_WEST_SOUTH_WEST
|
|
0x08, //OUTPUT_DISC_WEST
|
|
0x18, //OUTPUT_DISC_WEST_NORTH_WEST
|
|
0x1C, //OUTPUT_DISC_NORTH_WEST
|
|
0x0C //OUTPUT_DISC_NORTH_NORTH_WEST
|
|
};
|
|
|
|
HandController::HandController(INT32 id, const CHAR* n)
|
|
: InputConsumer(id),
|
|
name(n)
|
|
{
|
|
}
|
|
|
|
HandController::~HandController()
|
|
{
|
|
}
|
|
|
|
INT32 HandController::getInputConsumerObjectCount()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
InputConsumerObject* HandController::getInputConsumerObject(INT32 i)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
int ds_key_input[16] = {0}; // Set to '1' if pressed... 0 if released
|
|
int ds_disc_input[16] = {0}; // Set to '1' if pressed... 0 if released.
|
|
|
|
void HandController::evaluateInputs()
|
|
{
|
|
inputValue = 0;
|
|
bool keypad_active = false;
|
|
|
|
// TODO: this is a bit of a hack... setup 2 sets of inputs or don't instantiate the 2nd controller...
|
|
if (strcmp(name, "Hand Controller #1") == 0)
|
|
{
|
|
for (UINT16 i = 0; i < 15; i++)
|
|
{
|
|
if (ds_key_input[i])
|
|
{
|
|
if (i <= 11) keypad_active=true;
|
|
inputValue |= BUTTON_OUTPUT_VALUES[i];
|
|
}
|
|
}
|
|
|
|
// Keypad has priority over disc...
|
|
if (!keypad_active)
|
|
{
|
|
for (UINT16 i = 0; i < 16; i++)
|
|
{
|
|
if (ds_disc_input[i]) inputValue |= DIRECTION_OUTPUT_VALUES[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
inputValue = (UINT16)(0xFF ^ inputValue);
|
|
}
|
|
|
|
void HandController::resetInputConsumer()
|
|
{
|
|
inputValue = 0xFF;
|
|
}
|
|
|
|
void HandController::setOutputValue(UINT16)
|
|
{}
|
|
|
|
UINT16 HandController::getInputValue()
|
|
{
|
|
return inputValue;
|
|
}
|
|
|