]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Cubo CD32 dip switches and partial touch screen emulation.
authorToni Wilen <twilen@winuae.net>
Sun, 10 Sep 2017 15:38:11 +0000 (18:38 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 10 Sep 2017 15:38:11 +0000 (18:38 +0300)
aks.def
arcadia.cpp
cfgfile.cpp
include/arcadia.h
include/inputdevice.h
inputdevice.cpp
inputevents.def
od-win32/serial_win32.cpp

diff --git a/aks.def b/aks.def
index 8b0f8414f0d1dccddf56cfe0427f928bfb2c7cb2..05c2d05a95ba145ad96f9252467d159dbf40ff9b 100644 (file)
--- 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)
index cb2bbe9855beebd783a1c79253c7fa7417a2a616..5aa2ec974331776fec91a08e4010d65b71cac43f 100644 (file)
@@ -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;
+                       }
+               }
+       }
+}
index 2e8dcbf3edd79429eff0880bef3b2e6e7d91a3fc..463125012f4dd82f1fa6ce2692b30747f7150f64 100644 (file)
@@ -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;
 }
index 4f52d52c9d73655262249123408faabdd64d1a08..6ef31068a97dbe94444c1a1cb1cfb8691fa530c8 100644 (file)
@@ -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 */
index 1a9a9ba3abbf1fa1fcafa0debf746810a1533085..232d84b2b6e3e72e265fba3c167f308d7c8b9028 100644 (file)
@@ -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
index c09ad0f64696375fea293511214e951b42d62dcb..878ffcce7decd73924ecab1e07012d196d246e92 100644 (file)
@@ -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);
+       }
+}
index fd007769c29ab7fa8dc00152ed2745cfeb9222e1..aac56185ee4f048a8cc16558fce7bbdd9ee7de3f 100644 (file)
@@ -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)
index d134103dbc180f23997c518fe4663a4b9979f9f4..69a9efc01bba6274fc5f701220a92c94052f8102 100644 (file)
@@ -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) {