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>
10 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
13 // --- ---------- -------------------------------------------------------------
14 // JLH 01/16/2010 Created this log ;-)
15 // JPM 06/06/2016 Visual Studio support
19 #include <string.h> // For memset()
27 static uint8_t joystick_ram
[4];
28 uint8_t joypad0Buttons
[21];
29 uint8_t joypad1Buttons
[21];
30 bool audioEnabled
= false;
31 bool joysticksEnabled
= false;
34 bool GUIKeyHeld
= false;
35 extern int start_logging
;
36 int gpu_start_log
= 0;
38 int blit_start_log
= 0;
40 int effect_start2
= 0, effect_start3
= 0, effect_start4
= 0, effect_start5
= 0, effect_start6
= 0;
41 bool interactiveMode
= false;
42 bool iLeft
, iRight
, iToggle
= false;
43 bool keyHeld1
= false, keyHeld2
= false, keyHeld3
= false;
45 bool startMemLog
= false;
46 extern bool doDSPDis
, doGPUDis
;
48 bool blitterSingleStep
= false;
53 void JoystickInit(void)
59 void JoystickExec(void)
61 gpu_start_log
= 0; // Only log while key down!
63 effect_start2
= effect_start3
= effect_start4
= effect_start5
= effect_start6
= 0;
65 iLeft
= iRight
= false;
69 void JoystickReset(void)
71 memset(joystick_ram
, 0x00, 4);
72 memset(joypad0Buttons
, 0, 21);
73 memset(joypad1Buttons
, 0, 21);
77 void JoystickDone(void)
82 uint16_t JoystickReadWord(uint32_t offset
)
85 uint8_t joypad0Offset
[16] = {
86 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0x04, 0x00, 0xFF
88 uint8_t joypad1Offset
[16] = {
89 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0x08, 0x0C, 0xFF
93 #pragma message("Warning: No bounds checking done in JoystickReadByte!")
95 #warning "No bounds checking done in JoystickReadByte!"
101 if (!joysticksEnabled
)
104 // Joystick data returns active low for buttons pressed, high for non-
106 uint16_t data
= 0xFFFF;
107 uint8_t offset0
= joypad0Offset
[joystick_ram
[1] & 0x0F];
108 uint8_t offset1
= joypad1Offset
[(joystick_ram
[1] >> 4) & 0x0F];
112 uint16_t mask
[4] = { 0xFEFF, 0xFDFF, 0xFBFF, 0xF7FF };
113 uint16_t msk2
[4] = { 0xFFFF, 0xFFFD, 0xFFFB, 0xFFF7 };
115 for(uint8_t i
=0; i
<4; i
++)
116 data
&= (joypad0Buttons
[offset0
+ i
] ? mask
[i
] : 0xFFFF);
118 data
&= msk2
[offset0
/ 4];
123 uint16_t mask
[4] = { 0xEFFF, 0xDFFF, 0xBFFF, 0x7FFF };
124 uint16_t msk2
[4] = { 0xFF7F, 0xFFBF, 0xFFDF, 0xFFEF };
126 for(uint8_t i
=0; i
<4; i
++)
127 data
&= (joypad1Buttons
[offset1
+ i
] ? mask
[i
] : 0xFFFF);
129 data
&= msk2
[offset1
/ 4];
134 else if (offset
== 2)
136 // Hardware ID returns NTSC/PAL identification bit here
137 // N.B.: On real H/W, bit 7 is *always* zero...!
138 uint16_t data
= 0xFF6F | (vjs
.hardwareTypeNTSC
? 0x10 : 0x00);
140 if (!joysticksEnabled
)
143 // Joystick data returns active low for buttons pressed, high for non-
145 uint8_t offset0
= joypad0Offset
[joystick_ram
[1] & 0x0F];
146 uint8_t offset1
= joypad1Offset
[(joystick_ram
[1] >> 4) & 0x0F];
150 offset0
/= 4; // Make index 0, 1, 2, 3 instead of 0, 4, 8, 12
151 uint8_t mask
[4][2] = { { BUTTON_A
, BUTTON_PAUSE
}, { BUTTON_B
, 0xFF }, { BUTTON_C
, 0xFF }, { BUTTON_OPTION
, 0xFF } };
152 data
&= (joypad0Buttons
[mask
[offset0
][0]] ? 0xFFFD : 0xFFFF);
154 if (mask
[offset0
][1] != 0xFF)
155 data
&= (joypad0Buttons
[mask
[offset0
][1]] ? 0xFFFE : 0xFFFF);
160 offset1
/= 4; // Make index 0, 1, 2, 3 instead of 0, 4, 8, 12
161 uint8_t mask
[4][2] = { { BUTTON_A
, BUTTON_PAUSE
}, { BUTTON_B
, 0xFF }, { BUTTON_C
, 0xFF }, { BUTTON_OPTION
, 0xFF } };
162 data
&= (joypad1Buttons
[mask
[offset1
][0]] ? 0xFFF7 : 0xFFFF);
164 if (mask
[offset1
][1] != 0xFF)
165 data
&= (joypad1Buttons
[mask
[offset1
][1]] ? 0xFFFB : 0xFFFF);
175 void JoystickWriteWord(uint32_t offset
, uint16_t data
)
178 #pragma message("Warning: No bounds checking done for JoystickWriteWord!")
180 #warning "No bounds checking done for JoystickWriteWord!"
183 joystick_ram
[offset
+ 0] = (data
>> 8) & 0xFF;
184 joystick_ram
[offset
+ 1] = data
& 0xFF;
188 audioEnabled
= (data
& 0x0100 ? true : false);
189 joysticksEnabled
= (data
& 0x8000 ? true : false);