5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
6 // Extensive rewrite by James Hammons
7 // (C) 2013 Underground Software
9 // JLH = James Hammons <jlhamm@acm.org>
12 // --- ---------- -------------------------------------------------------------
13 // JLH 01/16/2010 Created this log ;-)
17 #include <string.h> // For memset()
25 static uint8_t joystick_ram[4];
26 uint8_t joypad0Buttons[21];
27 uint8_t joypad1Buttons[21];
28 bool audioEnabled = false;
29 bool joysticksEnabled = false;
32 bool GUIKeyHeld = false;
33 extern int start_logging;
34 int gpu_start_log = 0;
36 int blit_start_log = 0;
38 int effect_start2 = 0, effect_start3 = 0, effect_start4 = 0, effect_start5 = 0, effect_start6 = 0;
39 bool interactiveMode = false;
40 bool iLeft, iRight, iToggle = false;
41 bool keyHeld1 = false, keyHeld2 = false, keyHeld3 = false;
43 bool startMemLog = false;
44 extern bool doDSPDis, doGPUDis;
46 bool blitterSingleStep = false;
51 void JoystickInit(void)
57 void JoystickExec(void)
59 gpu_start_log = 0; // Only log while key down!
61 effect_start2 = effect_start3 = effect_start4 = effect_start5 = effect_start6 = 0;
63 iLeft = iRight = false;
67 void JoystickReset(void)
69 memset(joystick_ram, 0x00, 4);
70 memset(joypad0Buttons, 0, 21);
71 memset(joypad1Buttons, 0, 21);
75 void JoystickDone(void)
80 uint16_t JoystickReadWord(uint32_t offset)
83 uint8_t joypad0Offset[16] = {
84 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0x04, 0x00, 0xFF
86 uint8_t joypad1Offset[16] = {
87 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0x08, 0x0C, 0xFF
90 #warning "No bounds checking done in JoystickReadByte!"
95 if (!joysticksEnabled)
98 // Joystick data returns active low for buttons pressed, high for non-
100 uint16_t data = 0xFFFF;
101 uint8_t offset0 = joypad0Offset[joystick_ram[1] & 0x0F];
102 uint8_t offset1 = joypad1Offset[(joystick_ram[1] >> 4) & 0x0F];
106 uint16_t mask[4] = { 0xFEFF, 0xFDFF, 0xFBFF, 0xF7FF };
107 uint16_t msk2[4] = { 0xFFFF, 0xFFFD, 0xFFFB, 0xFFF7 };
109 for(uint8_t i=0; i<4; i++)
110 data &= (joypad0Buttons[offset0 + i] ? mask[i] : 0xFFFF);
112 data &= msk2[offset0 / 4];
117 uint16_t mask[4] = { 0xEFFF, 0xDFFF, 0xBFFF, 0x7FFF };
118 uint16_t msk2[4] = { 0xFF7F, 0xFFBF, 0xFFDF, 0xFFEF };
120 for(uint8_t i=0; i<4; i++)
121 data &= (joypad1Buttons[offset1 + i] ? mask[i] : 0xFFFF);
123 data &= msk2[offset1 / 4];
128 else if (offset == 2)
130 // Hardware ID returns NTSC/PAL identification bit here
131 // N.B.: On real H/W, bit 7 is *always* zero...!
132 uint16_t data = 0xFF6F | (vjs.hardwareTypeNTSC ? 0x10 : 0x00);
134 if (!joysticksEnabled)
137 // Joystick data returns active low for buttons pressed, high for non-
139 uint8_t offset0 = joypad0Offset[joystick_ram[1] & 0x0F];
140 uint8_t offset1 = joypad1Offset[(joystick_ram[1] >> 4) & 0x0F];
144 offset0 /= 4; // Make index 0, 1, 2, 3 instead of 0, 4, 8, 12
145 uint8_t mask[4][2] = { { BUTTON_A, BUTTON_PAUSE }, { BUTTON_B, 0xFF }, { BUTTON_C, 0xFF }, { BUTTON_OPTION, 0xFF } };
146 data &= (joypad0Buttons[mask[offset0][0]] ? 0xFFFD : 0xFFFF);
148 if (mask[offset0][1] != 0xFF)
149 data &= (joypad0Buttons[mask[offset0][1]] ? 0xFFFE : 0xFFFF);
154 offset1 /= 4; // Make index 0, 1, 2, 3 instead of 0, 4, 8, 12
155 uint8_t mask[4][2] = { { BUTTON_A, BUTTON_PAUSE }, { BUTTON_B, 0xFF }, { BUTTON_C, 0xFF }, { BUTTON_OPTION, 0xFF } };
156 data &= (joypad1Buttons[mask[offset1][0]] ? 0xFFF7 : 0xFFFF);
158 if (mask[offset1][1] != 0xFF)
159 data &= (joypad1Buttons[mask[offset1][1]] ? 0xFFFB : 0xFFFF);
169 void JoystickWriteWord(uint32_t offset, uint16_t data)
171 #warning "No bounds checking done for JoystickWriteWord!"
173 joystick_ram[offset + 0] = (data >> 8) & 0xFF;
174 joystick_ram[offset + 1] = data & 0xFF;
178 audioEnabled = (data & 0x0100 ? true : false);
179 joysticksEnabled = (data & 0x8000 ? true : false);