@@ -61,109 +61,78 @@ uint16_t JoystickReadWord(uint32_t offset)
6161
6262 offset &= 0x03 ;
6363
64- if (offset == 0 )
65- {
66- uint8_t offset0 , offset1 ;
67- uint16_t data = 0xFFFF ;
68-
64+ if (offset == 0 )
65+ {
66+ uint8_t offset0 , offset1 ;
67+ uint16_t data = 0xFFFF ;
68+
6969 if (!joysticksEnabled ) {
70- return 0xFFFF ;
71- }
72-
73- // Joystick data returns active low for buttons pressed, high for non-
74- // pressed.
75- offset0 = joypad0Offset [joystick_ram [1 ] & 0x0F ];
76- offset1 = joypad1Offset [(joystick_ram [1 ] >> 4 ) & 0x0F ];
77-
78- if (offset0 != 0xFF )
79- {
80- uint16_t mask [4 ] = { 0xFEFF , 0xFDFF , 0xFBFF , 0xF7FF };
81- uint16_t msk2 [4 ] = { 0xFFFF , 0xFFFD , 0xFFFB , 0xFFF7 };
82-
83- for (uint8_t i = 0 ; i < 4 ; i ++ ) {
84- data &= (joypad0Buttons [offset0 + i ] ? mask [i ] : 0xFFFF );
85- }
86-
87- data &= msk2 [offset0 / 4 ];
88- }
89-
90- if (offset1 != 0xFF )
91- {
92- uint16_t mask [4 ] = { 0xEFFF , 0xDFFF , 0xBFFF , 0x7FFF };
93- uint16_t msk2 [4 ] = { 0xFF7F , 0xFFBF , 0xFFDF , 0xFFEF };
94-
95- for (uint8_t i = 0 ; i < 4 ; i ++ ) {
96- data &= (joypad1Buttons [offset1 + i ] ? mask [i ] : 0xFFFF );
97- }
98- data &= msk2 [offset1 / 4 ];
70+ return 0xFFFF ;
9971 }
100-
101- return data ;
102- }
103- else if (offset == 2 )
104- {
105- uint8_t offset0 , offset1 ;
106- // Hardware ID returns NTSC/PAL identification bit here
107- // N.B.: On real H/W, bit 7 is *always* zero...!
108- uint16_t data = 0xFF6F | (vjs .hardwareTypeNTSC ? 0x10 : 0x00 );
109-
110- if (!joysticksEnabled )
111- return data ;
112-
113- // Joystick data returns active low for buttons pressed, high for non-
114- // pressed.
115- uint8_t jrmLow = joystick_ram [1 ] & 0x0F ;
116- uint8_t jrmHigh = (joystick_ram [1 ] >> 4 ) & 0x0F ;
117- uint8_t jp0offset = joypad0Offset [jrmLow ];
118- uint8_t jp1offset = joypad1Offset [jrmHigh ];
119-
120- offset0 = jp0offset ; // % 4;
121- offset1 = jp1offset ; // % 4;
122-
123- const int8_t mask [4 ][2 ] = {
124- { BUTTON_A , BUTTON_PAUSE },
125- { BUTTON_B , 0xFF },
126- { BUTTON_C , 0xFF },
127- { BUTTON_OPTION , 0xFF } };
128-
129- if (offset0 != 0xFF )
130- {
131- offset0 /= 4 ;
132-
133- uint8_t i0 = mask [offset0 ][0 ];
134- uint8_t i1 = mask [offset0 ][1 ];
135-
136- uint8_t maskOffset00 = joypad0Buttons [i0 ];
137- uint8_t maskOffset01 = joypad0Buttons [i1 ];
138-
139- data &= (maskOffset00 ? 0xFFFD : 0xFFFF );
140-
141- if (i1 != 0xFF ) {
142- data &= (joypad0Buttons [i1 ] ? 0xFFFE : 0xFFFF );
143- }
144- }
145-
146- if (offset1 != 0xFF )
147- {
148- offset1 /= 4 ;
149-
150- uint8_t i0 = mask [offset1 ][0 ];
151- uint8_t i1 = mask [offset1 ][1 ];
152-
153- uint8_t maskOffset10 = joypad1Buttons [i0 ];
154-
155- data &= (maskOffset10 ? 0xFFF7 : 0xFFFF );
156-
157- if (i1 != 0xFF ) {
158- uint8_t maskOffset11 = joypad1Buttons [i1 ];
159- uint8_t button = maskOffset11 ;
160- uint16_t dataMask = (button ? 0xFFFB : 0xFFFF );
161- data &= dataMask ;
162- }
163- }
164-
165- return data ;
166- }
72+
73+ // Joystick data returns active low for buttons pressed, high for non-
74+ // pressed.
75+ offset0 = joypad0Offset [joystick_ram [1 ] & 0x0F ];
76+ offset1 = joypad1Offset [(joystick_ram [1 ] >> 4 ) & 0x0F ];
77+
78+ if (offset0 != 0xFF )
79+ {
80+ unsigned i ;
81+ uint16_t mask [4 ] = { 0xFEFF , 0xFDFF , 0xFBFF , 0xF7FF };
82+ uint16_t msk2 [4 ] = { 0xFFFF , 0xFFFD , 0xFFFB , 0xFFF7 };
83+
84+ for (i = 0 ; i < 4 ; i ++ )
85+ data &= (joypad0Buttons [offset0 + i ] ? mask [i ] : 0xFFFF );
86+
87+ data &= msk2 [offset0 / 4 ];
88+ }
89+
90+ if (offset1 != 0xFF )
91+ {
92+ unsigned i ;
93+ uint16_t mask [4 ] = { 0xEFFF , 0xDFFF , 0xBFFF , 0x7FFF };
94+ uint16_t msk2 [4 ] = { 0xFF7F , 0xFFBF , 0xFFDF , 0xFFEF };
95+
96+ for (i = 0 ; i < 4 ; i ++ )
97+ data &= (joypad1Buttons [offset1 + i ] ? mask [i ] : 0xFFFF );
98+
99+ data &= msk2 [offset1 / 4 ];
100+ }
101+
102+ return data ;
103+ }
104+ else if (offset == 2 )
105+ {
106+ uint8_t offset0 , offset1 ;
107+ // Hardware ID returns NTSC/PAL identification bit here
108+ // N.B.: On real H/W, bit 7 is *always* zero...!
109+ uint16_t data = 0xFF6F | (vjs .hardwareTypeNTSC ? 0x10 : 0x00 );
110+ const int8_t mask [4 ][2 ] = { { BUTTON_A , BUTTON_PAUSE }, { BUTTON_B , 0xFF }, { BUTTON_C , 0xFF }, { BUTTON_OPTION , 0xFF } };
111+
112+ if (!joysticksEnabled )
113+ return data ;
114+
115+ // Joystick data returns active low for buttons pressed, high for non-
116+ // pressed.
117+ offset0 = joypad0Offset [joystick_ram [1 ] & 0x0F ] / 4 ;
118+ offset1 = joypad1Offset [(joystick_ram [1 ] >> 4 ) & 0x0F ] / 4 ;
119+
120+ if (offset0 != 0xFF )
121+ {
122+ data &= (joypad0Buttons [mask [offset0 ][0 ]] ? 0xFFFD : 0xFFFF );
123+ if (mask [offset0 ][1 ] != 0xF )
124+ data &= (joypad0Buttons [mask [offset0 ][1 ]] ? 0xFFFE : 0xFFFF );
125+ }
126+
127+ if (offset1 != 0xFF )
128+ {
129+ data &= (joypad1Buttons [mask [offset1 ][0 ]] ? 0xFFF7 : 0xFFFF );
130+ if (mask [offset1 ][1 ] != 0xF )
131+ data &= (joypad1Buttons [mask [offset1 ][1 ]] ? 0xFFFB : 0xFFFF );
132+ }
133+
134+ return data ;
135+ }
167136
168137 return 0xFFFF ;
169138}
0 commit comments