]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Preliminary CDTV-CR emulation.
authorToni Wilen <twilen@winuae.net>
Sun, 12 Oct 2014 15:37:33 +0000 (18:37 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 12 Oct 2014 15:37:33 +0000 (18:37 +0300)
cdtvcr.cpp [new file with mode: 0644]
include/cdtvcr.h [new file with mode: 0644]
include/memory.h
include/options.h
include/uae/api.h
main.cpp
od-win32/resources/resource.h
od-win32/resources/winuae.rc
od-win32/win32gui.cpp
rommgr.cpp

diff --git a/cdtvcr.cpp b/cdtvcr.cpp
new file mode 100644 (file)
index 0000000..ba8b36e
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+* UAE - The Un*x Amiga Emulator
+*
+* CDTV-CR emulation
+*
+* Copyright 2014 Toni Wilen
+*
+*
+*/
+
+#define CDTVCR_DEBUG 1
+
+#include "sysconfig.h"
+#include "sysdeps.h"
+
+#include "options.h"
+#include "memory.h"
+#include "newcpu.h"
+#include "debug.h"
+#include "zfile.h"
+#include "gui.h"
+#include "cdtvcr.h"
+
+#define CDTVCR_MASK 0xffff
+
+#define CDTVCR_RAM_OFFSET 0x1000
+#define CDTVCR_RAM_SIZE 4096
+#define CDTVCR_RAM_MASK (CDTVCR_RAM_SIZE - 1)
+
+#define CDTVCR_CLOCK 0xc10
+
+static uae_u8 cdtvcr_ram[CDTVCR_RAM_SIZE];
+
+static void cdtvcr_battram_reset (void)
+{
+       struct zfile *f;
+       int v;
+
+       memset (cdtvcr_ram, 0, CDTVCR_RAM_SIZE);
+       f = zfile_fopen (currprefs.flashfile, _T("rb+"), ZFD_NORMAL);
+       if (!f) {
+               f = zfile_fopen (currprefs.flashfile, _T("wb"), 0);
+               if (f) {
+                       zfile_fwrite (cdtvcr_ram, CDTVCR_RAM_SIZE, 1, f);
+                       zfile_fclose (f);
+               }
+               return;
+       }
+       v = zfile_fread (cdtvcr_ram, 1, CDTVCR_RAM_SIZE, f);
+       if (v < CDTVCR_RAM_SIZE)
+               zfile_fwrite (cdtvcr_ram + v, 1, CDTVCR_RAM_SIZE - v, f);
+       zfile_fclose (f);
+}
+
+static void cdtvcr_battram_write (int addr, int v)
+{
+       struct zfile *f;
+       int offset = addr & CDTVCR_RAM_MASK;
+
+       if (offset >= CDTVCR_RAM_SIZE)
+               return;
+       gui_flicker_led (LED_MD, 0, 2);
+       if (cdtvcr_ram[offset] == v)
+               return;
+       cdtvcr_ram[offset] = v;
+       f = zfile_fopen (currprefs.flashfile, _T("rb+"), ZFD_NORMAL);
+       if (!f)
+               return;
+       zfile_fseek (f, offset, SEEK_SET);
+       zfile_fwrite (cdtvcr_ram + offset, 1, 1, f);
+       zfile_fclose (f);
+}
+
+static uae_u8 cdtvcr_battram_read (int addr)
+{
+       uae_u8 v;
+       int offset;
+       offset = addr & CDTVCR_RAM_MASK;
+       if (offset >= CDTVCR_RAM_SIZE)
+               return 0;
+       gui_flicker_led (LED_MD, 0, 1);
+       v = cdtvcr_ram[offset];
+       return v;
+}
+
+static void cdtvcr_bput2 (uaecptr addr, uae_u32 b)
+{
+       addr &= CDTVCR_MASK;
+       if (addr >= CDTVCR_RAM_OFFSET && addr < CDTVCR_RAM_OFFSET + CDTVCR_RAM_SIZE) {
+               addr -= CDTVCR_RAM_OFFSET;
+               cdtvcr_battram_write(addr, b);
+       }
+}
+static uae_u8 cdtvcr_bget2 (uaecptr addr)
+{
+       uae_u8 v = 0;
+       addr &= CDTVCR_MASK;
+       if (addr >= CDTVCR_RAM_OFFSET && addr < CDTVCR_RAM_OFFSET + CDTVCR_RAM_SIZE) {
+               addr -= CDTVCR_RAM_OFFSET;
+               v = cdtvcr_battram_read(addr);
+       } else if (addr == 0x9dc) {
+               v = 'C';
+       } else if (addr == 0x9dd) {
+               v = 'D';
+       } else if (addr == 0x9de) {
+               v = 'T';
+       } else if (addr == 0x9df) {
+               v = 'V';
+       } else if (addr >= CDTVCR_CLOCK && addr < CDTVCR_CLOCK + 0x20) {
+               int reg = addr - CDTVCR_CLOCK;
+               int days, mins, ticks;
+               int tickcount = currprefs.ntscmode ? 60 : 50;
+               struct timeval tv;
+               struct mytimeval mtv;
+               gettimeofday (&tv, NULL);
+               tv.tv_sec -= _timezone;
+               mtv.tv_sec = tv.tv_sec;
+               mtv.tv_usec = tv.tv_usec;
+               timeval_to_amiga(&mtv, &days, &mins, &ticks, tickcount);
+               switch (reg)
+               {
+                       case 0:
+                       case 1:
+                       v = 0;
+                       break;
+                       case 2:
+                       v = days >> 8;
+                       break;
+                       case 3:
+                       v = days;
+                       break;
+                       case 4:
+                       v = mins / 60;
+                       break;
+                       case 5:
+                       v = mins % 60;
+                       break;
+                       case 6:
+                       v = ticks / tickcount;
+                       break;
+                       case 7:
+                       v = ticks % tickcount;
+                       break;
+                       case 8:
+                       v = tickcount;
+                       break;
+
+               }
+
+       }
+       return v;
+}
+
+static uae_u32 REGPARAM2 cdtvcr_lget (uaecptr addr)
+{
+       uae_u32 v;
+#ifdef JIT
+       special_mem |= S_READ;
+#endif
+       v = (cdtvcr_bget2 (addr) << 24) | (cdtvcr_bget2 (addr + 1) << 16) |
+               (cdtvcr_bget2 (addr + 2) << 8) | (cdtvcr_bget2 (addr + 3));
+#if CDTVCR_DEBUG
+       write_log (_T("cdtvcr_lget %08X=%08X PC=%08X\n"), addr, v, M68K_GETPC);
+#endif
+       return v;
+}
+
+static uae_u32 REGPARAM2 cdtvcr_wgeti (uaecptr addr)
+{
+       uae_u32 v = 0xffff;
+#ifdef JIT
+       special_mem |= S_READ;
+#endif
+       return v;
+}
+static uae_u32 REGPARAM2 cdtvcr_lgeti (uaecptr addr)
+{
+       uae_u32 v = 0xffff;
+#ifdef JIT
+       special_mem |= S_READ;
+#endif
+       return v;
+}
+
+static uae_u32 REGPARAM2 cdtvcr_wget (uaecptr addr)
+{
+       uae_u32 v;
+#ifdef JIT
+       special_mem |= S_READ;
+#endif
+       v = (cdtvcr_bget2 (addr) << 8) | cdtvcr_bget2 (addr + 1);
+#if CDTVCR_DEBUG
+       write_log (_T("cdtvcr_wget %08X=%04X PC=%08X\n"), addr, v, M68K_GETPC);
+#endif
+       return v;
+}
+
+static uae_u32 REGPARAM2 cdtvcr_bget (uaecptr addr)
+{
+       uae_u32 v;
+#ifdef JIT
+       special_mem |= S_READ;
+#endif
+       v = cdtvcr_bget2 (addr);
+       return v;
+}
+
+static void REGPARAM2 cdtvcr_lput (uaecptr addr, uae_u32 l)
+{
+#ifdef JIT
+       special_mem |= S_WRITE;
+#endif
+#if CDTVCR_DEBUG
+       write_log (_T("cdtvcr_lput %08X=%08X PC=%08X\n"), addr, l, M68K_GETPC);
+#endif
+       cdtvcr_bput2 (addr, l >> 24);
+       cdtvcr_bput2 (addr + 1, l >> 16);
+       cdtvcr_bput2 (addr + 2, l >> 8);
+       cdtvcr_bput2 (addr + 3, l);
+}
+
+static void REGPARAM2 cdtvcr_wput (uaecptr addr, uae_u32 w)
+{
+#ifdef JIT
+       special_mem |= S_WRITE;
+#endif
+#if CDTVCR_DEBUG
+       write_log (_T("cdtvcr_wput %08X=%04X PC=%08X\n"), addr, w & 65535, M68K_GETPC);
+#endif
+       cdtvcr_bput2 (addr, w >> 8);
+       cdtvcr_bput2 (addr + 1, w);
+}
+
+static void REGPARAM2 cdtvcr_bput (uaecptr addr, uae_u32 b)
+{
+#ifdef JIT
+       special_mem |= S_WRITE;
+#endif
+       cdtvcr_bput2 (addr, b);
+}
+
+
+addrbank cdtvcr_bank = {
+       cdtvcr_lget, cdtvcr_wget, cdtvcr_bget,
+       cdtvcr_lput, cdtvcr_wput, cdtvcr_bput,
+       default_xlate, default_check, NULL, NULL, _T("CDTV-CR"),
+       cdtvcr_lgeti, cdtvcr_wgeti, ABFLAG_IO
+};
+
+void cdtvcr_reset(void)
+{
+       cdtvcr_battram_reset();
+}
+
+void cdtvcr_free(void)
+{
+}
diff --git a/include/cdtvcr.h b/include/cdtvcr.h
new file mode 100644 (file)
index 0000000..dca99fe
--- /dev/null
@@ -0,0 +1,3 @@
+
+void cdtvcr_reset(void);
+void cdtvcr_free(void);
index 069c532b3f7796d128b730c9f5ccdfb19628f20e..6d983f13aa01f58abfd4a32ed672c3e193834517 100644 (file)
@@ -328,6 +328,7 @@ extern addrbank gayle_bank;
 extern addrbank gayle2_bank;
 extern addrbank mbres_bank;
 extern addrbank akiko_bank;
+extern addrbank cdtvcr_bank;
 extern addrbank cardmem_bank;
 extern addrbank bogomem_bank;
 extern addrbank z3fastmem_bank;
@@ -412,6 +413,7 @@ extern void memory_hardreset (int);
 extern void memory_clear (void);
 extern void free_fastmemory (int);
 extern void set_roms_modified (void);
+extern void reload_roms(void);
 
 #define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr))
 #define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr))
index c7de3effbbc9dccbe15071470b3b04b22f7e9cdc..5ed5384cf83627f5819dc598db1d16aa61564b2e 100644 (file)
@@ -179,7 +179,7 @@ struct uaedev_config_data
        int unitnum; // scsi unit number (if tape currently)
 };
 
-enum { CP_GENERIC = 1, CP_CDTV, CP_CD32, CP_A500, CP_A500P, CP_A600, CP_A1000,
+enum { CP_GENERIC = 1, CP_CDTV, CP_CDTVCR, CP_CD32, CP_A500, CP_A500P, CP_A600, CP_A1000,
        CP_A1200, CP_A2000, CP_A3000, CP_A3000T, CP_A4000, CP_A4000T };
 
 #define IDE_A600A1200 1
@@ -452,6 +452,7 @@ struct uae_prefs {
        int cs_deniserev;
        int cs_mbdmac;
        bool cs_cdtvscsi;
+       bool cs_cdtvcr;
        bool cs_df0idhw;
        bool cs_slowmemisfast;
        bool cs_resetwarning;
index c72f35d8aa05ce04ac0cd77181cd08234f92729d..732ae0e66517c0ab178aae05ce4c9d04140f99d4 100644 (file)
 #define UAECALL
 #endif
 
+/* Helpers to make it easy to import functions from plugins. */
+
+#ifdef UAE
+
+#define UAE_DECLARE_IMPORT_FUNCTION(return_type, function_name, ...) \
+       typedef return_type (UAECALL * function_name ## _function)(__VA_ARGS__); \
+       extern function_name ## _function function_name;
+
+#define UAE_IMPORT_FUNCTION(handle, function_name) \
+{ \
+       function_name = (function_name ## _function) uae_dlsym( \
+               handle, #function_name); \
+       if (function_name) { \
+               write_log("Imported " #function_name "\n"); \
+       } else { \
+               write_log("WARNING: Could not import " #function_name "\n"); \
+       } \
+}
+
+#define UAE_DECLARE_EXPORT_FUNCTION(return_type, function_name, ...) \
+       typedef return_type (UAECALL * function_name ## _function)(__VA_ARGS__); \
+       return_type UAECALL function_name(__VA_ARGS__);
+
+#define UAE_EXPORT_FUNCTION(handle, function_name) \
+{ \
+       void *ptr = uae_dlsym(handle, #function_name); \
+       if (ptr) { \
+               *((function_name ## _function *) ptr) = function_name; \
+               write_log("Exported " #function_name "\n"); \
+       } else { \
+               write_log("WARNING: Could not export " #function_name "\n"); \
+       } \
+}
+
+#else
+
+#define UAE_DECLARE_IMPORT_FUNCTION(return_type, function_name, ...) \
+       return_type UAECALL function_name(__VA_ARGS__);
+
+#define UAE_DECLARE_EXPORT_FUNCTION(return_type, function_name, ...) \
+       typedef return_type (UAECALL * function_name ## _function)(__VA_ARGS__); \
+       extern function_name ## _function function_name;
+
+#endif
+
+/**
+ * Used in both UAE and plugin code to define storage for the function
+ * imported from the other module.
+ */
+#define UAE_DEFINE_IMPORT_FUNCTION(function_name) \
+    function_name ## _function function_name = NULL;
+
 #endif /* UAE_API_H */
index 582f54d72562c02c72ff46c5d65323ffc540c105..ef1049b50f126c401fb1588d224f433c4061a54d 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -40,6 +40,7 @@
 #include "akiko.h"
 #include "cd32_fmv.h"
 #include "cdtv.h"
+#include "cdtvcr.h"
 #include "savestate.h"
 #include "filesys.h"
 #include "parallel.h"
@@ -992,7 +993,8 @@ void do_leave_program (void)
        serial_exit ();
 #endif
 #ifdef CDTV
-       cdtv_free ();
+       cdtv_free();
+       cdtvcr_free();
 #endif
 #ifdef A2091
        a2091_free ();
@@ -1094,6 +1096,9 @@ void virtualdevice_init (void)
 #ifdef NCR9X
        ncr9x_init();
 #endif
+#ifdef CDTV
+       cdtvcr_reset();
+#endif
 }
 
 static int real_main2 (int argc, TCHAR **argv)
index 7c9e93616c805905ce5025a722e00fae724a7254..f24134c9616f5fea399de01a277c9c300c092fe8 100644 (file)
 #define IDS_QS_MODEL_A3000              1010
 #define IDS_QS_MODEL_A4000              1011
 #define IDS_QS_MODEL_A4000T             1012
+#define IDS_QS_MODEL_CDTVCR             1013
 #define IDC_RESOLUTION                  1021
 #define IDC_SERIAL                      1022
 #define IDC_REFRESHRATE                 1022
index 042260098b47333898e47976035659aa4ec19223..9839c16175c5114cf255381233e19f884c15032d 100644 (file)
@@ -1826,7 +1826,7 @@ END
 
 STRINGTABLE
 BEGIN
-    IDS_QS_MODELS           "A500\nA500+\nA600\nA1000\nA1200\nA3000\nA4000\nCD32\nCDTV\nArcadia Multi Select system\nExpanded WinUAE example configuration"
+    IDS_QS_MODELS           "A500\nA500+\nA600\nA1000\nA1200\nA3000\nA4000\nCD32\nCDTV\nCDTV-CR\nArcadia Multi Select system\nExpanded WinUAE example configuration"
     IDS_QS_MODEL_A500       "1.3 ROM, OCS, 512 KB Chip + 512 KB Slow RAM (most common)\nThis configuration is capable of running most games and demos produced for first-generation hardware. Only few exceptions need a different configuration (e.g. the oldest games tend to be incompatible with this configuration).\n1.3 ROM, ECS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nLater hardware revision of the A500. Nearly 100% compatible with the previous configuration.\n1.3 ROM, ECS Agnus, 1 MB Chip RAM\nFew newer games and demos require this configuration.\n1.3 ROM, OCS Agnus, 512 KB Chip RAM\nVery old (e.g. pre-1988) games and demos may require this configuration.\n1.2 ROM, OCS Agnus, 512 KB Chip RAM\nAs available for the A1000, and installed on the first A500 and A2000 series. Some very old programs only work correctly with this configuration. Note: This system ROM version can only boot from floppy disk (no hard disk boot support).\n1.2 ROM, OCS Agnus, 512 KB Chip RAM + 512 KB Slow RAM\nThis configuration adds expansion memory to the first A500 produced. Try this if your game does not work with newer configurations, but works with the previous one. It could add some features to the game, including faster loading times. Note: This system ROM version can only boot from floppy disk (no hard disk boot support)."
     IDS_QS_MODEL_A500P      "Basic non-expanded configuration\nThe A500+ adds an ECS Agnus chip, 1 MB of Chip RAM and a 2.0 ROM to the A500. Many A500 games and demos don't work properly on an A500+.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n"
     IDS_QS_MODEL_A600       "Basic non-expanded configuration\nThe A600 is smaller than the A500+ and has an updated 2.0 ROM.\n2 MB Chip RAM expanded configuration\n\n4 MB Fast RAM expanded configuration\n"
@@ -1843,6 +1843,7 @@ BEGIN
     IDS_QS_MODEL_A3000      "1.4 ROM, 2MB Chip + 8MB Fast\n\n2.04 ROM, 2MB Chip + 8MB Fast\n\n3.1 ROM, 2MB Chip + 8MB Fast\n"
     IDS_QS_MODEL_A4000      "68030, 3.1 ROM, 2MB Chip + 8MB Fast\n\n68040, 3.1 ROM, 2MB Chip + 8MB Fast\n"
     IDS_QS_MODEL_A4000T     "A4000T (test)\nA4000T"
+    IDS_QS_MODEL_CDTVCR     "CDTV-CR\nCDTV-CR"
 END
 
 STRINGTABLE
index 90c45beed4e65acc5ecf9dcf1ea4d13904837a41..4c3349790f9cb52340e19b134ec85e9ac735f05f 100644 (file)
@@ -1644,6 +1644,7 @@ static void show_rom_list (void)
                17, -1, -1, // A4000T
                18, -1, 19, -1, -1, // CD32
                20, 21, 22, -1, 6, 32, -1, -1, // CDTV
+               9, 10, -1, 107, -1, -1, // CDTV-CR
                49, 50, 75, 51, 76, 77, -1, 5, 4, -1, -2, // ARCADIA
 
                53, 54, 55, 56, -1, -1, // A590/A2091
@@ -1679,7 +1680,7 @@ static void show_rom_list (void)
        };
 
        p1 = _T("A500 Boot ROM 1.2\0A500 Boot ROM 1.3\0A500+\0A600\0A1000\0A1200\0A3000\0A4000\0A4000T\0")
-               _T("CD32\0CDTV\0Arcadia Multi Select\0")
+               _T("CD32\0CDTV\0CDTV-CR\0Arcadia Multi Select\0")
 
                _T("A590/A2091 SCSI\0A4091 SCSI\0Fastlane\0Oktagon 2008\0")
                _T("CD32 Full Motion Video\0")
@@ -5556,6 +5557,7 @@ static struct amigamodels amodels[] = {
        { 0, }, //{ 1, IDS_QS_MODEL_A4000T }, // "Amiga 4000T"
        { 3, IDS_QS_MODEL_CD32 }, // "CD32"
        { 4, IDS_QS_MODEL_CDTV }, // "CDTV"
+       { 4, IDS_QS_MODEL_CDTVCR }, // "CDTVCR"
        { 4, IDS_QS_MODEL_ARCADIA }, // "Arcadia"
        { 1, IDS_QS_MODEL_UAE }, // "Expanded UAE example configuration"
        { -1 }
@@ -5574,7 +5576,7 @@ static void load_quickstart (HWND hDlg, int romcheck)
        workprefs.nr_floppies = quickstart_floppy;
        quickstart_ok = built_in_prefs (&workprefs, quickstart_model, quickstart_conf, quickstart_compa, romcheck);
        workprefs.ntscmode = quickstart_ntsc != 0;
-       quickstart_cd = workprefs.floppyslots[1].dfxtype == DRV_NONE && (quickstart_model == 8 || quickstart_model == 9);
+       quickstart_cd = workprefs.floppyslots[1].dfxtype == DRV_NONE && (quickstart_model == 8 || quickstart_model == 9 || quickstart_model == 10);
        enable_for_quickstart (hDlg);
        addfloppytype (hDlg, 0);
        addfloppytype (hDlg, 1);
@@ -7105,6 +7107,7 @@ static INT_PTR CALLBACK ChipsetDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPAR
                WIN32GUI_LoadUIString(IDS_GENERIC, buffer, sizeof buffer / sizeof (TCHAR));
                SendDlgItemMessage (hDlg, IDC_CS_EXT, CB_ADDSTRING, 0, (LPARAM)buffer);
                SendDlgItemMessage (hDlg, IDC_CS_EXT, CB_ADDSTRING, 0, (LPARAM)_T("CDTV"));
+               SendDlgItemMessage (hDlg, IDC_CS_EXT, CB_ADDSTRING, 0, (LPARAM)_T("CDTV-CR"));
                SendDlgItemMessage(hDlg, IDC_CS_EXT, CB_ADDSTRING, 0, (LPARAM)_T("CD32"));
                SendDlgItemMessage(hDlg, IDC_CS_EXT, CB_ADDSTRING, 0, (LPARAM)_T("A500"));
                SendDlgItemMessage (hDlg, IDC_CS_EXT, CB_ADDSTRING, 0, (LPARAM)_T("A500+"));
index c84a026887517a71135e244874c94fb9b18bf6d1..0f7be49c5dba043c203d57748defc5c578b50a57 100644 (file)
@@ -93,7 +93,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 107
+#define NEXT_ROM_ID 108
 
 static struct romheader romheaders[] = {
        { _T("Freezer Cartridges"), 1 },
@@ -213,6 +213,8 @@ static struct romdata roms[] = {
        0x30b54232, 0xED7E461D,0x1FFF3CDA,0x321631AE,0x42B80E3C,0xD4FA5EBB },
        ALTROM(21, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, 0x48e4d74f,0x54946054,0x2269e410,0x36018402,0xe1f6b855,0xfd89092b)
        ALTROM(21, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, 0x8a54f362,0x03df800f,0x032046fd,0x892f6e7e,0xec08b76d,0x33981e8c)
+       { _T("CDTV-CR extended ROM v3.32"), 3, 32, 3, 32, _T("CDTVCR\0"), 262144, 107, 0, 0, ROMTYPE_EXTCDTV, 0, 0, NULL,
+       0x581a85cf, 0xd6b8d3f2,0x854eba9b,0x2d514579,0x9529e8b3,0x3b85e0b4 },
 
        { _T("A1000 bootstrap ROM"), 0, 0, 0, 0, _T("A1000\0"), 65536, 24, 0, 0, ROMTYPE_KICK, 0, 0, NULL,
        0x0b1ad2d0, 0xBA93B8B8,0x5CA0D83A,0x68225CC3,0x3B95050D,0x72D2FDD7 },
@@ -313,11 +315,11 @@ static struct romdata roms[] = {
        ALTROMPN(104, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x888da4cf, 0x6ae85f3a, 0x65331ba4, 0xaaba67ae, 0x34763d70, 0x2bde0495)
        ALTROMPN(104, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xaf1f47db, 0x28d5bed0, 0xbc517d46, 0x500e8159, 0x723e0b64, 0x4733c26a)
        { _T("A2620/A2630 -07 ROM"), 0, 0, 0, 0, _T("A2620\0A2630\0"), 65536, 105, 0, 0, ROMTYPE_CPUBOARD, 0, 0, _T("390282-07/390283-07"),
-       0x169d80e9, 0x41f518cb,0x41c1dc1f,0xcc6363832,0x0676af5,0x4969010c, NULL, NULL },
+       0x169d80e9, 0x41f518cb,0x41c1dc1f,0xcc636383,0x20676af5,0x4969010c, NULL, NULL },
        ALTROMPN(105, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, _T("390282-07"), 0xf2904058, 0x33695119, 0x5fdf5d56, 0x095a696b, 0x0ba2641d, 0x334845df)
        ALTROMPN(105, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, _T("390283-07"), 0xf697d458, 0x09fe260b, 0x03784e87, 0x3351dbec, 0x5146a455, 0x814383d1)
        { _T("A2620/A2630 -06 ROM"), 0, 0, 0, 0, _T("A2620\0A2630\0"), 65536, 106, 0, 0, ROMTYPE_CPUBOARD, 0, 0, _T("390282-06/390283-06"),
-       0xeb31fd9e, 0x2d6a5c68,0x1040f98d,0x7e63ad089,0x0da9e83,0x2b5c704d, NULL, NULL },
+       0xeb31fd9e, 0x2d6a5c68,0x1040f98d,0x7e63ad08,0x90da9e83,0x2b5c704d, NULL, NULL },
        ALTROMPN(106, 1, 1, 32768, ROMTYPE_ODD  | ROMTYPE_8BIT, _T("390282-06"), 0xd6ae582c, 0x47b3dea3, 0x31db76e6, 0x1380a3d6, 0x9f191657, 0xdd1cd4b3)
        ALTROMPN(106, 1, 2, 32768, ROMTYPE_EVEN | ROMTYPE_8BIT, _T("390283-06"), 0xcd379634, 0x65e251e2, 0xf6961c8e, 0x33a86c3d, 0x01248f70, 0xa159823b)