From cef2bc1a9bb061d14b3254ae0bdaeb840f734dcd Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 10 Sep 2017 18:38:11 +0300 Subject: [PATCH] Cubo CD32 dip switches and partial touch screen emulation. --- aks.def | 10 ++++- arcadia.cpp | 92 +++++++++++++++++++++++++++++++++++++++ cfgfile.cpp | 10 +++-- include/arcadia.h | 4 ++ include/inputdevice.h | 1 + inputdevice.cpp | 84 +++++++++++++++++++++++++++++++++++ inputevents.def | 16 ++++++- od-win32/serial_win32.cpp | 12 +++++ 8 files changed, 223 insertions(+), 6 deletions(-) diff --git a/aks.def b/aks.def index 8b0f8414..05c2d05a 100644 --- a/aks.def +++ b/aks.def @@ -124,4 +124,12 @@ AKS(QUALIFIER_SHIFT) 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) diff --git a/arcadia.cpp b/arcadia.cpp index cb2bbe98..5aa2ec97 100644 --- a/arcadia.cpp +++ b/arcadia.cpp @@ -21,6 +21,8 @@ #include "arcadia.h" #include "zfile.h" #include "videograb.h" +#include "xwin.h" +#include "drawing.h" /* supported roms * @@ -1012,3 +1014,93 @@ void alg_map_banks(void) 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; + } + } + } +} diff --git a/cfgfile.cpp b/cfgfile.cpp index 2e8dcbf3..46312501 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -2081,6 +2081,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type) 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); @@ -4961,6 +4962,7 @@ static int cfgfile_parse_hardware (struct uae_prefs *p, const TCHAR *option, TCH || 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) @@ -7095,7 +7097,7 @@ void default_prefs (struct uae_prefs *p, bool reset, int type) 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; @@ -7375,7 +7377,7 @@ static void buildin_default_prefs (struct uae_prefs *p) 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; @@ -7732,13 +7734,15 @@ static int bip_cd32 (struct uae_prefs *p, int config, int compa, int romcheck) 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; } diff --git a/include/arcadia.h b/include/arcadia.h index 4f52d52c..6ef31068 100644 --- a/include/arcadia.h +++ b/include/arcadia.h @@ -38,6 +38,10 @@ extern uae_u8 alg_joystick_buttons(uae_u8, uae_u8, uae_u8); 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 */ diff --git a/include/inputdevice.h b/include/inputdevice.h index 1a9a9ba3..232d84b2 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -325,6 +325,7 @@ extern int inputdevice_get_lightpen_id(void); 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 diff --git a/inputdevice.cpp b/inputdevice.cpp index c09ad0f6..878ffcce 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -370,6 +370,8 @@ static int pot_dat_act[NORMAL_JPORTS][2]; 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 @@ -4136,6 +4138,30 @@ static bool inputdevice_handle_inputcode2 (int code, int state, const TCHAR *s) 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; @@ -4649,6 +4675,17 @@ static int handle_input_event2 (int nr, int state, int max, int flags, int extra 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 */ @@ -5043,6 +5080,8 @@ void inputdevice_reset (void) lastmxy_abs[i][1] = 0; } lightpen_trigger2 = 0; + cubo_flag = 0; + alg_flag = 0; } static int getoldport (struct uae_input_device *id) @@ -5689,6 +5728,10 @@ static int iscd32 (int ei) 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; } @@ -8362,6 +8405,8 @@ void inputdevice_acquire (int allmode) // 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) @@ -9362,3 +9407,42 @@ void clear_inputstate (void) 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); + } +} diff --git a/inputevents.def b/inputevents.def index fd007769..aac56185 100644 --- a/inputevents.def +++ b/inputevents.def @@ -250,8 +250,6 @@ DEFEVENT(KEY_NP_MUL,_T("Numpad Multiply"),AM_K,0,0,AK_NPMUL) 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) @@ -296,8 +294,12 @@ DEFEVENT(KEY_0E,_T("Keycode 0x0E"),AM_K,0,0,0x0e) 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) @@ -423,6 +425,16 @@ DEFEVENT(SPC_ALG_RTRIGGER,_T("American Laser Games Right Trigger"),AM_K,0,0,AKS_ 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) diff --git a/od-win32/serial_win32.cpp b/od-win32/serial_win32.cpp index d134103d..69a9efc0 100644 --- a/od-win32/serial_win32.cpp +++ b/od-win32/serial_win32.cpp @@ -393,6 +393,9 @@ static void checksend(void) 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); @@ -533,6 +536,15 @@ void serial_hsynchandler (void) } } #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) { -- 2.47.3