From: Toni Wilen Date: Sat, 14 Sep 2019 07:26:15 +0000 (+0300) Subject: Scala MM dongle emulation. X-Git-Tag: 4300~119 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=de12b997ace115632a4f6ae4a86a8ebbef8b3584;p=francis%2Fwinuae.git Scala MM dongle emulation. --- diff --git a/cfgfile.cpp b/cfgfile.cpp index e2d5ac9d..8b604244 100644 --- a/cfgfile.cpp +++ b/cfgfile.cpp @@ -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 }; diff --git a/dongle.cpp b/dongle.cpp index e85aa77c..76929ff2 100644 --- a/dongle.cpp +++ b/dongle.cpp @@ -26,8 +26,10 @@ #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; } diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index ef55766a..f571be67 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -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());