]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Scala MM dongle emulation.
authorToni Wilen <twilen@winuae.net>
Sat, 14 Sep 2019 07:26:15 +0000 (10:26 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 14 Sep 2019 07:26:15 +0000 (10:26 +0300)
cfgfile.cpp
dongle.cpp
od-win32/win32gui.cpp

index e2d5ac9d94d6eecc0a9a99b61bd6845ea39fd0bf..8b604244432a7f04496459508ffdf28b7c7092d2 100644 (file)
@@ -209,6 +209,7 @@ static const TCHAR *dongles[] =
        _T("none"),
        _T("robocop 3"), _T("leaderboard"), _T("b.a.t. ii"), _T("italy'90 soccer"), _T("dames grand maitre"),
        _T("rugby coach"), _T("cricket captain"), _T("leviathan"), _T("musicmaster"),
+       _T("logistics"), _T("scala red"), _T("scala green"),
        NULL
 };
 static const TCHAR *cdmodes[] = { _T("disabled"), _T(""), _T("image"), _T("ioctl"), _T("spti"), _T("aspi"), 0 };
index e85aa77cdb9a26b0869e35da65ed805467472d69..76929ff2cce22ff9b20df03ccb40e9a51a3148e0 100644 (file)
 #define LEVIATHAN 8
 #define MUSICMASTER 9
 #define LOGISTIX 10
+#define SCALA_RED 11
+#define SCALA_GREEN 12
 
-static int flag;
+static int dflag;
 static unsigned int cycles;
 
 /*
@@ -79,13 +81,25 @@ Music Master
 - first JOY1DAT AND 0x0303 must be zero.
 - following JOY1DAT AND 0x0303 reads must be nonzero.
 
+Scala MM (Green)
+
+- 470nF Capacitor between fire button and second button pin
+- Drives firebutton high, then low
+- Polls POTGOR second button pin, it must go low between about 30000-150000 DMA cycles.
+
+Scala MM (Red)
+
+- 10uF Capacitor between fire button and second button pin
+- Drives firebutton high, then low
+- Polls POTGOR second button pin, it must go low between about ?? DMA cycles.
+
 */
 
 static uae_u8 oldcia[2][16];
 
 void dongle_reset (void)
 {
-       flag = 0;
+       dflag = 0;
        memset (oldcia, 0, sizeof oldcia);
 }
 
@@ -97,9 +111,9 @@ uae_u8 dongle_cia_read (int cia, int reg, uae_u8 extra, uae_u8 val)
        {
        case BAT2:
                if (cia == 1 && reg == 0) {
-                       if (!flag || get_cycles () > cycles + CYCLE_UNIT * 200) {
+                       if (!dflag || get_cycles () > cycles + CYCLE_UNIT * 200) {
                                val &= ~0x10;
-                               flag = 0;
+                               dflag = 0;
                        } else {
                                val |= 0x10;
                        }
@@ -115,22 +129,31 @@ void dongle_cia_write (int cia, int reg, uae_u8 extra, uae_u8 val)
                return;
        switch (currprefs.dongle)
        {
+       case SCALA_GREEN:
+       case SCALA_RED:
+               if (cia == 0 && reg == 0) {
+                       if ((val & 0x80) != dflag) {
+                               dflag = val & 0x80;
+                               cycles = get_cycles();
+                       }
+               }
+               break;
        case ROBOCOP3:
                if (cia == 0 && reg == 0 && (val & 0x80))
-                       flag ^= 1;
+                       dflag ^= 1;
                break;
        case BAT2:
                if (cia == 1 && reg == 0 && !(val & 0x80)) {
-                       flag = 1;
+                       dflag = 1;
                        cycles = get_cycles ();
                }
                break;
        case MUSICMASTER:
                if (cia == 0 && reg == 0) {
                        if (!(val & 0x80) && (extra & 0x80)) {
-                               flag = 1;
+                               dflag = 1;
                        } else {
-                               flag = 0;
+                               dflag = 0;
                        }
                }
                break;
@@ -149,7 +172,7 @@ uae_u16 dongle_joydat (int port, uae_u16 val)
        switch (currprefs.dongle)
        {
        case ROBOCOP3:
-               if (port == 1 && flag)
+               if (port == 1 && dflag)
                        val += 0x100;
                break;
        case LEADERBOARD:
@@ -173,20 +196,20 @@ uae_u16 dongle_joydat (int port, uae_u16 val)
        case CRICKETCAPTAIN:
                if (port == 0) {
                        val &= ~0x0003;
-                       if (flag == 0)
+                       if (dflag == 0)
                                val |= 0x0001;
                        else
                                val |= 0x0002;
                }
-               flag ^= 1;
+               dflag ^= 1;
                break;
        case MUSICMASTER:
-               if (port == 1 && !flag) {
+               if (port == 1 && !dflag) {
                        val = 0;
-               } else if (port == 1 && flag == 1) {
+               } else if (port == 1 && dflag == 1) {
                        val = 0;
-                       flag++;
-               } else if (port == 1 && flag == 2) {
+                       dflag++;
+               } else if (port == 1 && dflag == 2) {
                        val = 0x0303;
                }
                break;
@@ -203,7 +226,7 @@ void dongle_potgo (uae_u16 val)
        case ITALY90:
        case LOGISTIX:
        case DAMESGRANDMAITRE:
-               flag = (uaerand () & 7) - 3;
+               dflag = (uaerand () & 7) - 3;
                break;
        }
 
@@ -218,6 +241,16 @@ uae_u16 dongle_potgor (uae_u16 val)
        case LOGISTIX:
                val |= 1 << 14;
                break;
+       case SCALA_RED:
+       case SCALA_GREEN:
+               if ((dflag & 1) || get_cycles() >= cycles + CYCLE_UNIT * 80000 * (currprefs.dongle == SCALA_RED ? 21 : 1)) {
+                       if (dflag & 0x80)
+                               val |= 1 << 14;
+                       else
+                               val &= ~(1 << 14);
+                       dflag |= 1;
+               }
+               break;
        }
        return val;
 }
@@ -252,7 +285,7 @@ int dongle_analogjoy (int joy, int axis)
 
        }
        if (v >= 0) {
-               v += flag;
+               v += dflag;
                if (v < 0)
                        v = 0;
        }
index ef55766a603b49fb6c3a1a5fde0e181e372022d2..f571be67173efe560f4e4b0e1b27fbab09a07199 100644 (file)
@@ -16813,6 +16813,9 @@ static void init_portsdlg (HWND hDlg)
        SendDlgItemMessage(hDlg, IDC_DONGLELIST, CB_ADDSTRING, 0, (LPARAM)_T("Cricket Captain"));
        SendDlgItemMessage(hDlg, IDC_DONGLELIST, CB_ADDSTRING, 0, (LPARAM)_T("Leviathan"));
        SendDlgItemMessage(hDlg, IDC_DONGLELIST, CB_ADDSTRING, 0, (LPARAM)_T("Music Master"));
+       SendDlgItemMessage(hDlg, IDC_DONGLELIST, CB_ADDSTRING, 0, (LPARAM)_T("Logistics/SuperBase"));
+       SendDlgItemMessage(hDlg, IDC_DONGLELIST, CB_ADDSTRING, 0, (LPARAM)_T("Scala MM (Red)"));
+       SendDlgItemMessage(hDlg, IDC_DONGLELIST, CB_ADDSTRING, 0, (LPARAM)_T("Scala MM (Green)"));
 
        SendDlgItemMessage (hDlg, IDC_SERIAL, CB_RESETCONTENT, 0, 0L);
        SendDlgItemMessage (hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)szNone.c_str());