activegs-ios/kegs/Src/paddles.cpp

222 lines
5.5 KiB
C++

/*
ActiveGS, Copyright 2004-2016 Olivier Goguel, https://github.com/ogoguel/ActiveGS
Based on Kegs, Copyright 2004 Kent Dickey, https://kegs.sourceforge.net
This code is covered by the GNU GPL licence
*/
#include "defc.h"
#include "adb.h"
#include "moremem.h"
#include "paddles.h"
#include "sim65816.h"
s_paddles g_paddles;
int g_invert_paddles = 0;
int g_swap_paddles = 0;
int g_joystick_type = JOYSTICK_TYPE_NATIVE_1; // OG Trying to set native joystick as default
int g_joystick_native_type1 = -1;
int g_joystick_native_type2 = -1;
int g_joystick_native_type = -1;
void
paddle_fixup_joystick_type()
{
/* If g_paddles.g_joystick_type points to an illegal value, change it */
if(g_joystick_type == JOYSTICK_TYPE_NATIVE_1) {
g_joystick_native_type = g_joystick_native_type1;
if(g_joystick_native_type1 < 0) {
g_joystick_type = JOYSTICK_TYPE_KEYPAD;
printf("no joy 1 --- switching to keypad\n");
}
}
if(g_joystick_type == JOYSTICK_TYPE_NATIVE_2) {
g_joystick_native_type = g_joystick_native_type2;
if(g_joystick_native_type2 < 0) {
g_joystick_type = JOYSTICK_TYPE_KEYPAD;
printf("no joy 2 --- switching to keypad\n");
}
}
}
void
paddle_trigger(double dcycs)
{
/* Called by read/write to $c070 */
g_paddles.g_paddle_trig_dcycs = dcycs;
/* Determine what all the paddle values are right now */
paddle_fixup_joystick_type();
switch(g_joystick_type) {
case JOYSTICK_TYPE_KEYPAD: /* Keypad Joystick */
paddle_trigger_keypad(dcycs);
break;
case JOYSTICK_TYPE_MOUSE: /* Mouse Joystick */
paddle_trigger_mouse(dcycs);
break;
case JOYSTICK_TYPE_NONE: /* None Joystick */
paddle_trigger_none(dcycs);
break;
#if defined(DRIVER_IOS) && defined(ACTIVEGS) && !defined(ACTIVEGSKARATEKA)
case JOYSTICK_TYPE_ICADE: /* Mouse Joystick */
{
extern void paddle_trigger_icade(double);
paddle_trigger_icade(dcycs);
}
break;
#endif
default:
joystick_update(dcycs);
}
}
void
paddle_trigger_mouse(double dcycs)
{
int val_x, val_y;
int mouse_x, mouse_y;
val_x = 0;
mouse_x = g_adb.g_mouse_raw_x;
mouse_y = g_adb.g_mouse_raw_y;
/* mous_phys_x is 0->560, convert that to -32768 to + 32767 cyc */
/* So subtract 280 then mult by 117 */
val_x = (mouse_x - 280) * 117;
/* mous_phys_y is 0->384, convert that to -32768 to + 32767 cyc */
/* so subtract 192 then mult by 180 to overscale it a bit */
val_y = (mouse_y - 192) * 180;
g_paddles.g_paddle_val[0] = val_x;
g_paddles.g_paddle_val[1] = val_y;
g_paddles.g_paddle_val[2] = 32767;
g_paddles.g_paddle_val[3] = 32767;
g_moremem.g_paddle_buttons |= 0xc;
paddle_update_trigger_dcycs(dcycs);
}
void
paddle_trigger_none(double dcycs)
{
g_paddles.g_paddle_val[0] = 32767;
g_paddles.g_paddle_val[1] = 32767;
g_paddles.g_paddle_val[2] = 32767;
g_paddles.g_paddle_val[3] = 32767;
g_moremem.g_paddle_buttons |= 0xc;
paddle_update_trigger_dcycs(dcycs);
}
void
paddle_trigger_keypad(double dcycs)
{
int get_y;
int val_x, val_y;
val_x = adb_get_keypad_xy(get_y=0);
val_y = adb_get_keypad_xy(get_y=1);
/* val_x and val_y are already scale -32768 to +32768 */
g_paddles.g_paddle_val[0] = val_x;
g_paddles.g_paddle_val[1] = val_y;
g_paddles.g_paddle_val[2] = 32767;
g_paddles.g_paddle_val[3] = 32767;
g_moremem.g_paddle_buttons |= 0xc;
paddle_update_trigger_dcycs(dcycs);
}
void
paddle_update_trigger_dcycs(double dcycs)
{
double trig_dcycs;
int val;
int paddle_num;
int scale, trim;
int i;
for(i = 0; i < 4; i++) {
paddle_num = i;
if(g_swap_paddles) {
paddle_num = i ^ 1;
}
val = g_paddles.g_paddle_val[paddle_num];
if(g_invert_paddles) {
val = -val;
}
/* convert -32768 to +32768 into 0->2816.0 cycles (the */
/* paddle delay const) */
/* First multiply by the scale factor to adjust range */
if(paddle_num & 1) {
scale = g_paddles.g_joystick_scale_factor_y;
trim = g_paddles.g_joystick_trim_amount_y;
} else {
scale = g_paddles.g_joystick_scale_factor_x;
trim = g_paddles.g_joystick_trim_amount_x;
}
#if 0
if(i == 0) {
printf("val was %04x(%d) * scale %03x = %d\n",
val, val, scale, (val*scale)>>16);
}
#endif
val = val * scale >> 16;
/* Val is now from -128 to + 128 since scale is */
/* 256=1.0, 128 = 0.5 */
val = val + 128 + trim;
if(val >= 255) {
val = 280; /* increase range */
}
// OG Try to make the joystick up and running, even at fast speed (this might be turned into a user option?)
{
double facteur = 11.04;
if (g_sim65816.g_speed_fast)
{
if (g_sim65816.get_limit_speed() == SPEED_ZIP)
facteur /= g_sim65816.g_zip_pmhz / 2.6;
else
if (g_sim65816.get_limit_speed() == SPEED_UNLIMITED)
facteur /= g_sim65816.g_projected_pmhz / 2.6;
}
else
{
// OG Hack to make the Joystick works with Miniprix (to investigate why it is needed...)
if (g_sim65816.engine.kpc == 0x5A02)
facteur /= 2.6;
}
/* convert 0->255 into 0->2816.0 cycles (the paddle delay const) */
trig_dcycs = dcycs + (val * facteur);
// trig_dcycs = dcycs + (val * 11.04);
g_paddles.g_paddle_dcycs[i] = trig_dcycs;
}
}
}
int
read_paddles(double dcycs, int paddle)
{
double trig_dcycs;
trig_dcycs = g_paddles.g_paddle_dcycs[paddle & 3];
if(dcycs < trig_dcycs) {
return 0x80;
} else {
return 0x00;
}
}
void
paddle_update_buttons()
{
paddle_fixup_joystick_type();
joystick_update_buttons();
}