2009-05-12 22:15:09 +02:00

116 lines
2.7 KiB
C++
Executable File

class Input {
public:
enum Device {
DeviceNone,
DeviceJoypad,
DeviceMultitap,
DeviceMouse,
DeviceSuperScope,
DeviceJustifier,
DeviceJustifiers,
};
enum DeviceID {
DeviceIDNone,
DeviceIDJoypad1,
DeviceIDJoypad2,
DeviceIDMultitap1A,
DeviceIDMultitap1B,
DeviceIDMultitap1C,
DeviceIDMultitap1D,
DeviceIDMultitap2A,
DeviceIDMultitap2B,
DeviceIDMultitap2C,
DeviceIDMultitap2D,
DeviceIDMouse1,
DeviceIDMouse2,
DeviceIDSuperScope,
DeviceIDJustifier1,
DeviceIDJustifier2,
};
enum JoypadID {
JoypadB = 0, JoypadY = 1,
JoypadSelect = 2, JoypadStart = 3,
JoypadUp = 4, JoypadDown = 5,
JoypadLeft = 6, JoypadRight = 7,
JoypadA = 8, JoypadX = 9,
JoypadL = 10, JoypadR = 11,
};
enum MouseID {
MouseX = 0, MouseY = 1,
MouseLeft = 2, MouseRight = 3,
};
enum SuperScopeID {
SuperScopeX = 0, SuperScopeY = 1,
SuperScopeTrigger = 2, SuperScopeCursor = 3,
SuperScopeTurbo = 4, SuperScopePause = 5,
};
enum JustifierID {
JustifierX = 0, JustifierY = 1,
JustifierTrigger = 2, JustifierStart = 3,
};
uint8 port_read(bool port);
void port_set_device(bool port, unsigned device);
void init();
void poll();
void update();
//light guns (Super Scope, Justifier(s)) strobe IOBit whenever the CRT
//beam cannon is detected. this needs to be tested at the cycle level
//(hence inlining here for speed) to avoid 'dead space' during DRAM refresh.
//iobit is updated during port_set_device(),
//latchx, latchy are updated during update() (once per frame)
alwaysinline void tick() {
//only test if Super Scope or Justifier is connected
if(iobit) {
if(ppu.vcounter() == latchy //test Y cursor position
&& ppu.hcounter() == latchx << 2 //test X cursor position (cycles == pixels << 2)
&& latchy < (ppu.overscan() ? 240 : 225) //verify Y is not offscreen
&& latchx < 256 //verify X is not offscreen
) ppu.latch_counters();
}
}
struct port_t {
unsigned device;
unsigned counter0; //read counters
unsigned counter1;
struct superscope_t {
int x, y;
bool trigger;
bool cursor;
bool turbo;
bool pause;
bool offscreen;
bool turbolock;
bool triggerlock;
bool pauselock;
} superscope;
struct justifier_t {
bool active;
int x1, x2;
int y1, y2;
bool trigger1, trigger2;
bool start1, start2;
} justifier;
} port[2];
private:
bool iobit;
uint16_t latchx, latchy;
friend class SNES;
} input;