BizHawk/libsnes/bsnes/snes/controller/mouse/mouse.cpp

96 lines
3.0 KiB
C++

#ifdef CONTROLLER_CPP
uint2 Mouse::data() {
if(counter >= 32) return 1;
if(counter == 0) {
position_x = interface()->inputPoll(port, Input::Device::Mouse, 0, (unsigned)Input::MouseID::X); //-n = left, 0 = center, +n = right
position_y = interface()->inputPoll(port, Input::Device::Mouse, 0, (unsigned)Input::MouseID::Y); //-n = up, 0 = center, +n = down
}
bool direction_x = position_x < 0; //0 = right, 1 = left
bool direction_y = position_y < 0; //0 = down, 1 = up
int position_x_fixed = position_x;
int position_y_fixed = position_y;
if(position_x < 0) position_x_fixed = -position_x; //abs(position_x)
if(position_y < 0) position_y_fixed = -position_y; //abs(position_y)
position_x_fixed = min(127, position_x_fixed); //range = 0 - 127
position_y_fixed = min(127, position_y_fixed);
switch(counter++) { default:
case 0: return 0;
case 1: return 0;
case 2: return 0;
case 3: return 0;
case 4: return 0;
case 5: return 0;
case 6: return 0;
case 7: return 0;
case 8: return interface()->inputPoll(port, Input::Device::Mouse, 0, (unsigned)Input::MouseID::Right);
case 9: return interface()->inputPoll(port, Input::Device::Mouse, 0, (unsigned)Input::MouseID::Left);
case 10: return 0; //speed (0 = slow, 1 = normal, 2 = fast, 3 = unused)
case 11: return 0; // ||
case 12: return 0; //signature
case 13: return 0; // ||
case 14: return 0; // ||
case 15: return 1; // ||
case 16: return (direction_y)?1:0;
case 17: return (position_y_fixed >> 6) & 1;
case 18: return (position_y_fixed >> 5) & 1;
case 19: return (position_y_fixed >> 4) & 1;
case 20: return (position_y_fixed >> 3) & 1;
case 21: return (position_y_fixed >> 2) & 1;
case 22: return (position_y_fixed >> 1) & 1;
case 23: return (position_y_fixed >> 0) & 1;
case 24: return (direction_x) ? 1 : 0;
case 25: return (position_x_fixed >> 6) & 1;
case 26: return (position_x_fixed >> 5) & 1;
case 27: return (position_x_fixed >> 4) & 1;
case 28: return (position_x_fixed >> 3) & 1;
case 29: return (position_x_fixed >> 2) & 1;
case 30: return (position_x_fixed >> 1) & 1;
case 31: return (position_x_fixed >> 0) & 1;
}
}
void Mouse::latch(bool data) {
if(latched == data) return;
latched = data;
counter = 0;
}
void Mouse::serialize(serializer& s) {
Processor::serialize(s);
//Save block.
unsigned char block[Controller::SaveSize] = {0};
block[0] = latched ? 1 : 0;
block[1] = counter;
block[2] = (unsigned short)position_x >> 8;
block[3] = (unsigned short)position_x;
block[4] = (unsigned short)position_y >> 8;
block[5] = (unsigned short)position_y;
s.array(block, Controller::SaveSize);
if(s.mode() == nall::serializer::Load) {
latched = (block[0] != 0);
counter = block[1];
position_x = (short)(((unsigned short)block[2] << 8) | (unsigned short)block[3]);
position_y = (short)(((unsigned short)block[4] << 8) | (unsigned short)block[5]);
}
}
Mouse::Mouse(bool port) : Controller(port) {
latched = 0;
counter = 0;
}
#endif