AKS(QUALIFIER_CONTROL)
AKS(QUALIFIER_ALT)
AKS(QUALIFIER_WIN)
-
+AKS(CUBO1)
+AKS(CUBO2)
+AKS(CUBO3)
+AKS(CUBO4)
+AKS(CUBO5)
+AKS(CUBO6)
+AKS(CUBO7)
+AKS(CUBO8)
+AKS(CUBOTOUCH)
#include "arcadia.h"
#include "zfile.h"
#include "videograb.h"
+#include "xwin.h"
+#include "drawing.h"
/* supported roms
*
ld_direction = 0;
ser_buf_offset = 0;
}
+
+#define TOUCH_BUFFER_SIZE 10
+static int touch_buf_offset, touch_write_buf_offset;
+static int touch_cmd_active;
+static uae_u8 touch_data[TOUCH_BUFFER_SIZE + 1];
+static uae_u8 touch_data_w[TOUCH_BUFFER_SIZE];
+static int touch_active;
+extern uae_u16 cubo_flag;
+
+int touch_serial_write(void)
+{
+ if (!touch_write_buf_offset && touch_active) {
+ if ((cubo_flag & 0x8000) && !(cubo_flag & 0x4000)) {
+ uae_u8 *p = touch_data_w;
+ int x = (lightpen_x[0] * 999) / gfxvidinfo.drawbuffer.inwidth;
+ int y = (lightpen_y[0] * 999) / gfxvidinfo.drawbuffer.inheight;
+
+ if (x < 0)
+ x = 0;
+ if (x > 999)
+ x = 999;
+ if (y < 0)
+ y = 0;
+ if (y > 999)
+ y = 999;
+
+ write_log(_T("%d*%d\n"), x, y);
+
+ *p++ = 0x01;
+ sprintf((char*)p, "%03d", x);
+ p += 3;
+ *p++ = ',';
+ sprintf((char*)p, "%03d", y);
+ p += 3;
+ *p++ = 0x0d;
+ touch_write_buf_offset = p - touch_data_w;
+
+ cubo_flag |= 0x4000;
+ }
+
+ }
+ if (touch_write_buf_offset > 0) {
+ uae_u16 v = touch_data_w[0];
+ touch_write_buf_offset--;
+ memmove(touch_data_w, touch_data_w + 1, touch_write_buf_offset);
+ return v;
+ }
+ return -1;
+}
+
+static void touch_command_do(void)
+{
+ TCHAR *s = au((char*)touch_data);
+ write_log(_T("Cubo touch screen command '%s'\n"), s);
+ xfree(s);
+
+ if (!memcmp(touch_data, "MDU", 3))
+ touch_active = 1;
+ if (!memcmp(touch_data, "MP", 2))
+ touch_active = 2;
+ if (!memcmp(touch_data, "MI", 2))
+ touch_active = 0;
+
+ // just respond "ok" to all commands..
+ touch_data_w[0] = 0x01;
+ touch_data_w[1] = '0';
+ touch_data_w[2] = 0x0d;
+ touch_write_buf_offset = 3;
+}
+
+void touch_serial_read(uae_u16 w)
+{
+ w &= 0xff;
+ if (!touch_cmd_active) {
+ if (w == 0x01) {
+ touch_cmd_active = 1;
+ touch_buf_offset = 0;
+ }
+ } else {
+ if (w == 0x0d) {
+ touch_command_do();
+ touch_cmd_active = 0;
+ } else {
+ if (touch_buf_offset < TOUCH_BUFFER_SIZE) {
+ touch_data[touch_buf_offset++] = (uae_u8)w;
+ touch_data[touch_buf_offset] = 0;
+ }
+ }
+ }
+}
cfgfile_dwrite_bool(f, _T("cd32cd"), p->cs_cd32cd);
cfgfile_dwrite_bool(f, _T("cd32c2p"), p->cs_cd32c2p);
cfgfile_dwrite_bool(f, _T("cd32nvram"), p->cs_cd32nvram);
+ cfgfile_dwrite_bool(f, _T("cd32cubo"), p->cs_cd32cubo);
cfgfile_dwrite(f, _T("cd32nvram_size"), _T("%d"), p->cs_cd32nvram_size / 1024);
cfgfile_dwrite_bool(f, _T("cdtvcd"), p->cs_cdtvcd);
cfgfile_dwrite_bool(f, _T("cdtv-cr"), p->cs_cdtvcr);
|| cfgfile_yesno(option, value, _T("cd32cd"), &p->cs_cd32cd)
|| cfgfile_yesno(option, value, _T("cd32c2p"), &p->cs_cd32c2p)
|| cfgfile_yesno(option, value, _T("cd32nvram"), &p->cs_cd32nvram)
+ || cfgfile_yesno(option, value, _T("cd32cubo"), &p->cs_cd32cubo)
|| cfgfile_yesno(option, value, _T("cdtvcd"), &p->cs_cdtvcd)
|| cfgfile_yesno(option, value, _T("cdtv-cr"), &p->cs_cdtvcr)
|| cfgfile_yesno(option, value, _T("cdtvram"), &p->cs_cdtvram)
p->cs_agnusrev = -1;
p->cs_deniserev = -1;
p->cs_mbdmac = 0;
- p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = p->cs_cd32fmv = false;
+ p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = p->cs_cd32fmv = p->cs_cd32cubo = false;
p->cs_cd32nvram_size = 1024;
p->cs_cdtvcd = p->cs_cdtvram = false;
p->cs_cdtvcard = 0;
p->cs_agnusrev = -1;
p->cs_deniserev = -1;
p->cs_mbdmac = 0;
- p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = p->cs_cd32fmv = false;
+ p->cs_cd32c2p = p->cs_cd32cd = p->cs_cd32nvram = p->cs_cd32fmv = p->cs_cd32cubo = false;
p->cs_cdtvcd = p->cs_cdtvram = p->cs_cdtvcard = false;
p->cs_ide = 0;
p->cs_pcmcia = 0;
if (!configure_rom (p, roms, romcheck))
return 0;
}
- if (config > 0) {
+ if (config == 1) {
p->cs_cd32fmv = true;
roms[0] = 74;
roms[1] = 23;
roms[2] = -1;
if (!configure_rom (p, roms, romcheck))
return 0;
+ } else if (config > 1) {
+ p->cs_cd32cubo = true;
}
return 1;
}
extern void ld_serial_read(uae_u16 v);
extern int ld_serial_write(void);
+extern int cubo_enabled;
+extern void touch_serial_read(uae_u16 w);
+extern int touch_serial_write(void);
+
#endif /* ARCADIA */
#endif /* UAE_ARCADIA_H */
extern uae_u64 input_getqualifiers (void);
extern void setsystime (void);
+extern void inputdevice_map(void);
#define JSEM_MODE_DEFAULT 0
#define JSEM_MODE_WHEELMOUSE 1
static int analog_port[NORMAL_JPORTS][2];
static int digital_port[NORMAL_JPORTS][2];
static int lightpen_port[NORMAL_JPORTS];
+int cubo_enabled;
+uae_u16 cubo_flag;
#define POTDAT_DELAY_PAL 8
#define POTDAT_DELAY_NTSC 7
arcadia_coin[1]++;
break;
+ case AKS_CUBO1:
+ case AKS_CUBO2:
+ case AKS_CUBO3:
+ case AKS_CUBO4:
+ case AKS_CUBO5:
+ case AKS_CUBO6:
+ case AKS_CUBO7:
+ case AKS_CUBO8:
+ {
+ int idx = code - AKS_CUBO1;
+ if (state) {
+ cubo_flag ^= 1 << idx;
+ write_log(_T("Cubo flag = %02x\n"), cubo_flag & 0xff);
+ }
+ break;
+ }
+ case AKS_CUBOTOUCH:
+ if (state)
+ cubo_flag |= 0x8000;
+ else
+ cubo_flag &= ~0x8000;
+ cubo_flag &= ~0x4000;
+ break;
+
case AKS_ALGSERVICE:
alg_flag &= ~2;
alg_flag |= state ? 2 : 0;
lightpen_y[lpnum] += delta;
}
}
+ if (lightpen_x[lpnum] < -10)
+ lightpen_x[lpnum] = -10;
+ if (lightpen_x[lpnum] >= gfxvidinfo.drawbuffer.inwidth + 10)
+ lightpen_x[lpnum] = gfxvidinfo.drawbuffer.inwidth + 10;
+ if (lightpen_y[lpnum] < -10)
+ lightpen_y[lpnum] = -10;
+ if (lightpen_y[lpnum] >= gfxvidinfo.drawbuffer.inheight + 10)
+ lightpen_y[lpnum] = gfxvidinfo.drawbuffer.inheight + 10;
+#if 0
+ write_log(_T("%d*%d\n"), lightpen_x[0], lightpen_y[0]);
+#endif
}
break;
case 1: /* ->JOY1 */
lastmxy_abs[i][1] = 0;
}
lightpen_trigger2 = 0;
+ cubo_flag = 0;
+ alg_flag = 0;
}
static int getoldport (struct uae_input_device *id)
cd32_pad_enabled[1] = 1;
return 2;
}
+ if (ei >= INPUTEVENT_SPC_CUBO_SW1 && ei <= INPUTEVENT_SPC_CUBO_TOUCH) {
+ cubo_enabled = 1;
+ return 3;
+ }
return 0;
}
// if (!input_acquired)
// write_log (_T("input devices acquired (%s)\n"), allmode ? "all" : "selected only");
input_acquired = 1;
+
+ inputdevice_map();
}
void inputdevice_unacquire(bool emulationactive, int inputmask)
relativecount[i][0] = relativecount[i][1] = 0;
}
}
+
+#define CUBO_DEBUG 0
+
+static uae_u32 REGPARAM2 cubo_get(uaecptr addr)
+{
+ addr &= 0xffff;
+ if (addr == 3) {
+#if CUBO_DEBUG
+ write_log(("%08x %02x %08x\n"), addr, cubo_flag, M68K_GETPC);
+#endif
+ return cubo_flag;
+ }
+#if CUBO_DEBUG
+ write_log(("%08x %08x\n"), addr, M68K_GETPC);
+#endif
+ return 0;
+}
+static void REGPARAM2 cubo_put(uaecptr addr, uae_u32 v)
+{
+#if CUBO_DEBUG
+ write_log(("%08x %08x %08x\n"), addr, v, M68K_GETPC);
+#endif
+}
+
+static addrbank cubo_bank = {
+ cubo_get, cubo_get, cubo_get,
+ cubo_put, cubo_put, cubo_put,
+ default_xlate, default_check, NULL, NULL, _T("CUBO"),
+ dummy_lgeti, dummy_wgeti, ABFLAG_RAM, S_READ, S_WRITE,
+ NULL, 65536
+};
+
+void inputdevice_map(void)
+{
+ if ((cubo_enabled || currprefs.cs_cd32cubo) && get_mem_bank_real(0x00800000) == &dummy_bank) {
+ write_log(_T("Cubo CD32 enabled\n"));
+ map_banks(&cubo_bank, 0x00800000 >> 16, 1, 0);
+ }
+}
DEFEVENT(KEY_NP_DIV,_T("Numpad Divide"),AM_K,0,0,AK_NPDIV)
DEFEVENT(KEY_NP_LPAREN,_T("Numpad Left Parenthesis"),AM_K,0,0,AK_NPLPAREN)
DEFEVENT(KEY_NP_RPAREN,_T("Numpad Right Parenthesis"),AM_K,0,0,AK_NPRPAREN)
-DEFEVENT(KEY_2B,_T("Keycode 0x2b"),AM_K,0,0,0x2b)
-DEFEVENT(KEY_30,_T("Keycode 0x30"),AM_K,0,0,0x30)
DEFEVENT(KEY_BACKQUOTE,_T("Back Quote"),AM_K,0,0,AK_BACKQUOTE)
DEFEVENT(KEY_1,_T("1"),AM_K,0,0,AK_1)
DEFEVENT(KEY_1C,_T("Keycode 0x1C"),AM_K,0,0,0x1c)
+DEFEVENT(KEY_2B,_T("Keycode 0x2B"),AM_K,0,0,0x2b)
+
DEFEVENT(KEY_2C,_T("Keycode 0x2C"),AM_K,0,0,0x2C)
+DEFEVENT(KEY_30,_T("Keycode 0x30"),AM_K,0,0,0x30)
+
DEFEVENT(KEY_3B,_T("Keycode 0x3B"),AM_K,0,0,0x3b)
DEFEVENT(KEY_68,_T("Keycode 0x68"),AM_K,0,0,0x68)
DEFEVENT(SPC_ALG_LHOLSTER,_T("American Laser Games Left Holster"),AM_K,0,0,AKS_ALGLHOLSTER)
DEFEVENT(SPC_ALG_RHOLSTER,_T("American Laser Games Right Holster"),AM_K,0,0,AKS_ALGRHOLSTER)
+DEFEVENT(SPC_CUBO_SW1,_T("Cubo CD32 Switch #1"),AM_K,0,0,AKS_CUBO1)
+DEFEVENT(SPC_CUBO_SW2,_T("Cubo CD32 Switch #2"),AM_K,0,0,AKS_CUBO2)
+DEFEVENT(SPC_CUBO_SW3,_T("Cubo CD32 Switch #3"),AM_K,0,0,AKS_CUBO3)
+DEFEVENT(SPC_CUBO_SW4,_T("Cubo CD32 Switch #4"),AM_K,0,0,AKS_CUBO4)
+DEFEVENT(SPC_CUBO_SW5,_T("Cubo CD32 Switch #5"),AM_K,0,0,AKS_CUBO5)
+DEFEVENT(SPC_CUBO_SW6,_T("Cubo CD32 Switch #6"),AM_K,0,0,AKS_CUBO6)
+DEFEVENT(SPC_CUBO_SW7,_T("Cubo CD32 Switch #7"),AM_K,0,0,AKS_CUBO7)
+DEFEVENT(SPC_CUBO_SW8,_T("Cubo CD32 Switch #8"),AM_K,0,0,AKS_CUBO8)
+DEFEVENT(SPC_CUBO_TOUCH,_T("Cubo CD32 Touchscreen touch"),AM_K,0,0,AKS_CUBOTOUCH)
+
DEFEVENT(SPC_CDTV_FRONT_PANEL_STOP,_T("CDTV Front Panel Stop"),AM_K,0,0,AKS_CDTV_FRONT_PANEL_STOP)
DEFEVENT(SPC_CDTV_FRONT_PANEL_PLAYPAUSE,_T("CDTV Front Panel Play/Pause"),AM_K,0,0,AKS_CDTV_FRONT_PANEL_PLAYPAUSE)
DEFEVENT(SPC_CDTV_FRONT_PANEL_PREV,_T("CDTV Front Panel Previous"),AM_K,0,0,AKS_CDTV_FRONT_PANEL_PREV)
ld_serial_read(serdatshift);
}
#endif
+ if (currprefs.cs_cd32cubo || cubo_enabled) {
+ touch_serial_read(serdatshift);
+ }
#ifdef SERIAL_MAP
if (sermap_data && sermap_enabled)
shmem_serial_send(serdatshift);
}
}
#endif
+ if ((currprefs.cs_cd32cubo || cubo_enabled) && !data_in_serdatr) {
+ int ch = touch_serial_write();
+ if (ch >= 0) {
+ serdatr = ch | 0x100;
+ data_in_serdatr = 1;
+ serdatr_last_got = 0;
+ serial_check_irq();
+ }
+ }
if (seriallog > 0 && !data_in_serdatr && gotlogwrite) {
int ch = read_log();
if (ch > 0) {