]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
American Laser Games emulation.
authorToni Wilen <twilen@winuae.net>
Sun, 27 Nov 2016 11:35:32 +0000 (13:35 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 27 Nov 2016 11:35:32 +0000 (13:35 +0200)
arcadia.cpp
cia.cpp
include/arcadia.h
include/keyboard.h
include/rommgr.h
inputdevice.cpp
inputevents.def
memory.cpp
od-win32/serial_win32.cpp
rommgr.cpp

index b39da181ae3929d999c13dd45f034c554d536736..76703538b1aa0d7ca823ce698b0de226c990d318 100644 (file)
@@ -20,6 +20,7 @@
 #include "debug.h"
 #include "arcadia.h"
 #include "zfile.h"
+#include "videograb.h"
 
 /* supported roms
 *
@@ -490,18 +491,23 @@ int arcadia_map_banks (void)
        return 1;
 }
 
+void alg_vsync(void);
 void arcadia_vsync (void)
 {
-       static int cnt;
+       if (alg_flag)
+               alg_vsync();
 
-       cnt--;
-       if (cnt > 0)
-               return;
-       cnt = 50;
-       if (!nvwrite)
-               return;
-       nvram_write ();
-       nvwrite = 0;
+       if (arcadia_bios) {
+               static int cnt;
+               cnt--;
+               if (cnt > 0)
+                       return;
+               cnt = 50;
+               if (!nvwrite)
+                       return;
+               nvram_write ();
+               nvwrite = 0;
+       }
 }
 
 uae_u8 arcadia_parport (int port, uae_u8 pra, uae_u8 dra)
@@ -545,3 +551,404 @@ struct romdata *scan_arcadia_rom (TCHAR *path, int cnt)
        }
        return rd;
 }
+
+// American Laser Games
+
+/*
+
+Port 1:
+- Joy Up = Service mode
+- Joy Down = Start
+- Joy Left = Left Coin
+- Joy Right = Right Coin
+
+Port 2:
+- Light Gun
+- 2nd button = player select (output)
+- 3rd button = trigger
+- Joy Up = holster
+
+*/
+
+
+int alg_flag;
+
+#define ALG_NVRAM_SIZE 4096
+#define ALG_NVRAM_MASK (ALG_NVRAM_SIZE - 1)
+static uae_u8 algmemory[ALG_NVRAM_SIZE];
+static int algmemory_modified;
+static int algmemory_initialized;
+
+static void alg_nvram_write (void)
+{
+       struct zfile *f = zfile_fopen (currprefs.flashfile, _T("rb+"), ZFD_NORMAL);
+       if (!f) {
+               f = zfile_fopen (currprefs.flashfile, _T("wb"), 0);
+               if (!f)
+                       return;
+       }
+       zfile_fwrite (algmemory, ALG_NVRAM_SIZE, 1, f);
+       zfile_fclose (f);
+}
+
+static void alg_nvram_read (void)
+{
+       struct zfile *f;
+
+       f = zfile_fopen (currprefs.flashfile, _T("rb"), ZFD_NORMAL);
+       memset (algmemory, 0, ALG_NVRAM_SIZE);
+       if (!f)
+               return;
+       zfile_fread (algmemory, ALG_NVRAM_SIZE, 1, f);
+       zfile_fclose (f);
+}
+
+static uae_u32 REGPARAM2 alg_lget (uaecptr addr)
+{
+       return 0;
+}
+static uae_u32 REGPARAM2 alg_wget (uaecptr addr)
+{
+       return 0;
+}
+
+static uae_u32 REGPARAM2 alg_bget (uaecptr addr)
+{
+       uaecptr addr2 = addr;
+       addr >>= 1;
+       addr &= ALG_NVRAM_MASK;
+       uae_u8 v = algmemory[addr];
+       //write_log(_T("ALG BGET %08X %04X %02X %08X\n"), addr2, addr, v, M68K_GETPC);
+       return v;
+}
+
+static void REGPARAM2 alg_lput (uaecptr addr, uae_u32 l)
+{
+}
+static void REGPARAM2 alg_wput (uaecptr addr, uae_u32 w)
+{
+}
+
+static void REGPARAM2 alg_bput (uaecptr addr, uae_u32 b)
+{
+       uaecptr addr2 = addr;
+       addr >>= 1;
+       addr &= ALG_NVRAM_MASK;
+       //write_log(_T("ALG BPUT %08X %04X %02X %08X\n"), addr2, addr, b & 255, M68K_GETPC);
+       if (algmemory[addr] != b) {
+               algmemory[addr] = b;
+               algmemory_modified = 100;
+       }
+}
+
+static addrbank alg_ram_bank = {
+       alg_lget, alg_wget, alg_bget,
+       alg_lput, alg_wput, alg_bput,
+       default_xlate, default_check, NULL, NULL, _T("ALG RAM"),
+       dummy_lgeti, dummy_wgeti, ABFLAG_RAM | ABFLAG_SAFE, S_READ, S_WRITE,
+       NULL, 65536
+};
+
+static int ld_mode;
+static uae_u32 ld_address, ld_value;
+static int ld_direction;
+#define LD_MODE_SEARCH 1
+#define LD_MODE_PLAY 2
+#define LD_MODE_STILL 3
+#define LD_MODE_STOP 4
+
+#define ALG_SER_BUF_SIZE 16
+static uae_u8 alg_ser_buf[ALG_SER_BUF_SIZE];
+static int ser_buf_offset;
+static int ld_wait_ack;
+static int ld_audio;
+static int ld_vsync;
+
+static void sb(uae_u8 v)
+{
+       if (ser_buf_offset < ALG_SER_BUF_SIZE) {
+               alg_ser_buf[ser_buf_offset++] = v;
+       }
+}
+static void ack(void)
+{
+       ld_wait_ack = 1;
+       sb(0x0a); // ACK
+}
+
+void alg_serial_read(uae_u16 w)
+{
+       w &= 0xff;
+       switch (w)
+       {
+       case 0x30: // '0'
+       case 0x31:
+       case 0x32:
+       case 0x33:
+       case 0x34:
+       case 0x35:
+       case 0x36:
+       case 0x37:
+       case 0x38:
+       case 0x39: // '9'
+       {
+               uae_u8 v = w - 0x30;
+               ld_value *= 10;
+               ld_value += v;
+               ack();
+       }
+       break;
+       case 0x3a: // F-PLAY ':'
+       ld_mode = LD_MODE_PLAY;
+       ld_direction = 0;
+       pausevideograb(0);
+       ack();
+       break;
+       case 0x3b: // Fast foward play ';'
+       ld_mode = LD_MODE_PLAY;
+       ld_direction = 1;
+       ack();
+       break;
+       case 0x3f: // STOP '?'
+       pausevideograb(1);
+       ld_direction = 0;
+       ld_mode = LD_MODE_STOP;
+       ack();
+       break;
+       case 0x40: // '@'
+       if (ld_mode == LD_MODE_SEARCH) {
+               ld_address = ld_value;
+               getsetpositionvideograb(ld_address);
+               ld_mode = LD_MODE_STILL;
+               ld_direction = 0;
+               ack();
+               sb(0x01); // COMPLETION
+       }
+       break;
+       case 0x4a: // R-PLAY 'J'
+       ld_mode = LD_MODE_PLAY;
+       pausevideograb(1);
+       ld_direction = -1;
+       ack();
+       break;
+       case 0x4b: // Fast reverse play 'K'
+       ld_mode = LD_MODE_PLAY;
+       pausevideograb(1);
+       ld_direction = -2;
+       ack();
+       break;
+       case 0x4f: // STILL 'O'
+       ld_mode = LD_MODE_STILL;
+       ld_direction = 0;
+       pausevideograb(1);
+       ack();
+       break;
+       case 0x43: // SEARCH 'C'
+       ack();
+       ld_mode = LD_MODE_SEARCH;
+       ld_direction = 0;
+       pausevideograb(1);
+       ld_value = 0;
+       break;
+       case 0x46: // CH-1 ON 'F'
+       ack();
+       ld_audio |= 1;
+       setvolumevideograb(32768);
+       break;
+       case 0x48: // CH-2 ON 'H'
+       ack();
+       ld_audio |= 2;
+       setvolumevideograb(32768);
+       break;
+       case 0x47: // CH-1 OFF 'G'
+       ack();
+       ld_audio &= ~1;
+       if (!ld_audio)
+               setvolumevideograb(0);
+       break;
+       case 0x49: // CH-2 OFF 'I'
+       ack();
+       ld_audio &= ~2;
+       if (!ld_audio)
+               setvolumevideograb(0);
+       break;
+       case 0x50: // INDEX ON 'P'
+       ack();
+       break;
+       case 0x51: // INDEX OFF 'O'
+       ack();
+       break;
+       case 0x60: // ADDR INQ '`'
+       {
+               if (isvideograb() && ld_direction == 0) {
+                       ld_address = (uae_u32)getsetpositionvideograb(-1);
+               }
+               uae_u32 v = ld_address;
+               uae_u32 m = 10000;
+               for (int i = 0; i < 5; i++) {
+                       uae_u8 vv = ((v / m) % 10) + '0';
+                       sb(vv);
+                       m /= 10;
+               }
+       }
+       break;
+       case 0x67: // STATUS INQ 'g'
+       sb(0x80);
+       sb(0x00);
+       sb(0x40);
+       sb((ld_mode == LD_MODE_SEARCH ? 0x02 : 0x00));
+       sb((ld_mode == LD_MODE_PLAY ? 0x01 : 0x00) | (ld_mode == LD_MODE_STILL ? 0x20 : 0x00) | (ld_mode == LD_MODE_STOP ? 0x40 : 0x00) | (ld_direction < 0 ? 0x80 : 0x00));
+       break;
+       }
+}
+
+bool alg_ld_active(void)
+{
+       return ld_mode == LD_MODE_PLAY || ld_mode == LD_MODE_STILL;
+}
+
+static void alg_vsync(void)
+{
+       ld_wait_ack = 0;
+       ld_vsync++;
+       if (ld_mode == LD_MODE_PLAY) {
+               if (ld_direction < 0) {
+                       if (ld_address > 0) {
+                               ld_address -= (-ld_direction);
+                               if ((ld_vsync & 15) == 0) {
+                                       if (isvideograb()) {
+                                               getsetpositionvideograb(ld_address);
+                                       }
+                               }
+                       }
+               } else {
+                       ld_address += 1 + ld_direction;
+                       if (ld_direction > 0) {
+                               if ((ld_vsync & 15) == 0) {
+                                       if (isvideograb()) {
+                                               getsetpositionvideograb(ld_address);
+                                       }
+                               }
+                       }
+               }
+       }
+       if (algmemory_modified > 0) {
+               algmemory_modified--;
+               if (algmemory_modified == 0) {
+                       alg_nvram_write();
+               }
+       }
+       if (isvideograb()) {
+               isvideograb_status();
+       }
+}
+
+int alg_serial_write(void)
+{
+       if (ser_buf_offset > 0) {
+               uae_u16 v = alg_ser_buf[0];
+               if (v == 0x0a && ld_wait_ack)
+                       return -1;
+               ser_buf_offset--;
+               memmove(alg_ser_buf, alg_ser_buf + 1, ser_buf_offset);
+               return v;
+       }
+       return -1;
+}
+
+/*
+
+Port 1:
+
+- Joy Up = Service mode
+- Joy Down = Left Start
+- 3rd button = Right Start
+- Joy Left = Left Coin
+- Joy Right = Right Coin
+
+Port 2:
+
+- Light gun (player 0/1)
+- 2nd button = Player select (output)
+- 3rd button = Trigger (player 0/1)
+- Joy Up = Holster (player 0/1)
+
+*/
+
+static uae_u16 alg_potgo;
+
+uae_u16 alg_potgor(uae_u16 potgo)
+{
+       alg_potgo = potgo;
+
+       // 2nd button output and high = player 2.
+       int ply = (alg_potgo & 0x4000) && (alg_potgo & 0x8000) ? 1 : 0;
+
+       potgo |= (0x1000 | 0x0100);
+       // trigger
+       if (((alg_flag & 128) && ply == 1) || ((alg_flag & 64) && ply == 0))
+               potgo &= ~0x1000;
+       // right start
+       if (alg_flag & 8)
+               potgo &= ~0x0100;
+
+       return potgo;
+}
+uae_u16 alg_joydat(int joy, uae_u16 v)
+{
+       if (!alg_flag)
+               return v;
+       int ply = (alg_potgo & 0x4000) && (alg_potgo & 0x8000) ? 1 : 0;
+       v = 0;
+       if (joy == 0) {
+
+               // left coin
+               if (alg_flag & 16)
+                       v |= 0x0200;
+               // right coin
+               if (alg_flag & 32)
+                       v |= 0x0002;
+
+               // service
+               if (alg_flag & 2)
+                       v |= (v & 0x0200) ? 0x0000 : 0x0100;
+               else
+                       v |= (v & 0x0200) ? 0x0100 : 0x0000;
+               // start
+               if (alg_flag & 4)
+                       v |= (v & 0x0002) ? 0x0000: 0x0001;
+               else
+                       v |= (v & 0x0002) ? 0x0001: 0x0000;
+
+       } else if (joy == 1) {
+
+               // holster
+               if (((alg_flag & 512) && ply == 0) || ((alg_flag & 256) && ply == 1))
+                       v |= (v & 0x0200) ? 0x0000 : 0x0100;
+               else
+                       v |= (v & 0x0200) ? 0x0100 : 0x0000;
+
+       }
+       return v;
+}
+uae_u8 alg_joystick_buttons(uae_u8 pra, uae_u8 dra, uae_u8 v)
+{
+       return v;
+}
+
+
+void alg_map_banks(void)
+{
+       alg_flag = 1;
+       if (!algmemory_initialized) {
+               alg_nvram_read();
+               algmemory_initialized = 1;
+       }
+       map_banks(&alg_ram_bank, 0xf4, 4, 0);
+       pausevideograb(1);
+       ld_audio = 0;
+       ld_mode = 0;
+       ld_wait_ack = 0;
+       ld_direction = 0;
+       ser_buf_offset = 0;
+}
diff --git a/cia.cpp b/cia.cpp
index e07a762990ba5e1273b1f1da604077c03a13dfc1..28800054dc45c83852ffe76c3c1d7b96dcc6f07e 100644 (file)
--- a/cia.cpp
+++ b/cia.cpp
@@ -1018,26 +1018,29 @@ static uae_u8 ReadCIAA (unsigned int addr)
 
        switch (reg) {
        case 0:
+       {
 #ifdef ACTION_REPLAY
                action_replay_cia_access(false);
 #endif
-               tmp = DISK_status_ciaa() & 0x3c;
-               tmp |= handle_joystick_buttons (ciaapra, ciaadra);
-               tmp |= (ciaapra | (ciaadra ^ 3)) & 0x03;
-               tmp = dongle_cia_read (0, reg, tmp);
+               uae_u8 v = DISK_status_ciaa() & 0x3c;
+               v |= handle_joystick_buttons (ciaapra, ciaadra);
+               v |= (ciaapra | (ciaadra ^ 3)) & 0x03;
+               v = dongle_cia_read (0, reg, v);
+               v = alg_joystick_buttons(ciaapra, ciaadra, v);
 #if DONGLE_DEBUG > 0
                if (notinrom())
-                       write_log (_T("BFE001 R %02X %s\n"), tmp, debuginfo(0));
+                       write_log (_T("BFE001 R %02X %s\n"), v, debuginfo(0));
 #endif
 
                if (inputrecord_debug & 2) {
                        if (input_record > 0)
-                               inprec_recorddebug_cia (tmp, div10, m68k_getpc ());
+                               inprec_recorddebug_cia (v, div10, m68k_getpc ());
                        else if (input_play > 0)
-                               inprec_playdebug_cia (tmp, div10, m68k_getpc ());
+                               inprec_playdebug_cia (v, div10, m68k_getpc ());
                }
 
-               return tmp;
+               return v;
+       }
        case 1:
 #ifdef PARALLEL_PORT
                if (isprinter () > 0) {
index d82a3b20361c4a4b64fa879ebc82a08c715aa000..57f051fba4a0e41384e0d2d412ec522d6cb0e02e 100644 (file)
@@ -3,12 +3,10 @@
 
 #ifdef ARCADIA
 
-extern void arcadia_init (void);
 extern int is_arcadia_rom (const TCHAR *path);
 extern int arcadia_map_banks (void);
 extern void arcadia_unmap (void);
 extern void arcadia_vsync (void);
-extern void arcadia_reset (void);
 extern uae_u8 arcadia_parport (int port, uae_u8 pra, uae_u8 dra);
 extern struct romdata *scan_arcadia_rom (TCHAR*, int);
 
@@ -28,6 +26,16 @@ extern int arcadia_flag, arcadia_coin[2];
 #define ARCADIA_BIOS 1
 #define ARCADIA_GAME 2
 
+extern int alg_flag;
+extern void alg_map_banks(void);
+extern void alg_serial_read(uae_u16 v);
+extern int alg_serial_write(void);
+extern bool alg_ld_active(void);
+
+extern uae_u16 alg_potgor(uae_u16);
+extern uae_u16 alg_joydat(int, uae_u16);
+extern uae_u8 alg_joystick_buttons(uae_u8, uae_u8, uae_u8);
+
 #endif /* ARCADIA */
 
 #endif /* UAE_ARCADIA_H */
index da39da8982d8ec2d6c6a3a08b73616d6d7615bab..ff031ce15c55faaa39888f05e16a9e1563eb5be1 100644 (file)
@@ -164,8 +164,12 @@ enum aks { AKS_ENTERGUI = 0x200,
     AKS_STATESAVEDIALOG, AKS_STATERESTOREDIALOG,
     AKS_DECREASEREFRESHRATE,
     AKS_INCREASEREFRESHRATE,
-    AKS_ARCADIADIAGNOSTICS, AKS_ARCADIAPLY1, AKS_ARCADIAPLY2, AKS_ARCADIACOIN1, AKS_ARCADIACOIN2,
-    AKS_TOGGLEMOUSEGRAB, AKS_SWITCHINTERPOL,
+
+       AKS_ARCADIADIAGNOSTICS, AKS_ARCADIAPLY1, AKS_ARCADIAPLY2, AKS_ARCADIACOIN1, AKS_ARCADIACOIN2,
+       AKS_ALGSERVICE, AKS_ALGLSTART, AKS_ALGRSTART, AKS_ALGLCOIN, AKS_ALGRCOIN,
+       AKS_ALGLTRIGGER, AKS_ALGRTRIGGER, AKS_ALGLHOLSTER, AKS_ALGRHOLSTER,
+    
+       AKS_TOGGLEMOUSEGRAB, AKS_SWITCHINTERPOL,
     AKS_INPUT_CONFIG_1,AKS_INPUT_CONFIG_2,AKS_INPUT_CONFIG_3,AKS_INPUT_CONFIG_4,
        AKS_SWAPJOYPORTS,
        AKS_PASTE,
index 5fa4af7b2a493caf1e0246095828f2ce6600d7cc..6771402447d34b8b04b7a0111d1d085f3cfa040e 100644 (file)
@@ -16,6 +16,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_ARCADIAGAME    0x00004000
 #define ROMTYPE_CD32CART       0x00008000
 #define ROMTYPE_SPECIALKICK    0x00010000
+#define ROMTYPE_ALG                    0x00020000
 
 #define ROMTYPE_CPUBOARD       0x00040000
 #define ROMTYPE_CB_A3001S1     0x00040001
index c0c6e28a4da6f9e2ac7a09de71f8e3d5a55072ca..d4033705fa940b95d219e1e67db88de10fed5854 100644 (file)
@@ -3014,6 +3014,7 @@ uae_u16 JOY0DAT (void)
        readinput ();
        v = getjoystate (0);
        v = dongle_joydat (0, v);
+       v = alg_joydat(0, v);
        return v;
 }
 
@@ -3023,6 +3024,7 @@ uae_u16 JOY1DAT (void)
        readinput ();
        v = getjoystate (1);
        v = dongle_joydat (1, v);
+       v = alg_joydat(1, v);
 
        if (inputrecord_debug & 2) {
                if (input_record > 0)
@@ -3224,6 +3226,7 @@ static void cap_check (void)
                        * NOTE: 3rd party mice may not have pullups! */
                        if (dong < 0 && (is_mouse_pullup (joy) && mouse_port[joy] && digital_port[joy][i]) && charge == 0)
                                charge = 2;
+
                        /* emulate pullup resistor if button mapped because there too many broken
                        * programs that read second button in input-mode (and most 2+ button pads have
                        * pullups)
@@ -3334,13 +3337,16 @@ static uae_u16 handle_joystick_potgor (uae_u16 potgor)
                        if (cd32_shifter[i] >= 2 && (joybutton[i] & ((1 << JOYBUTTON_CD32_PLAY) << (cd32_shifter[i] - 2))))
                                potgor &= ~p9dat;
 
-               } else  {
+               } else  if (alg_flag) {
+
+                       potgor = alg_potgor(potgo_value);
+
+               } else {
 
                        potgor &= ~p5dat;
                        if (pot_cap[i][0] > 100)
                                potgor |= p5dat;
 
-
                        if (!cd32_pad_enabled[i] || !cd32padmode (p5dir, p5dat)) {
                                potgor &= ~p9dat;
                                if (pot_cap[i][1] > 100)
@@ -3865,6 +3871,43 @@ static bool inputdevice_handle_inputcode2 (int code, int state)
                if (state)
                        arcadia_coin[1]++;
                break;
+
+       case AKS_ALGSERVICE:
+               alg_flag &= ~2;
+               alg_flag |= state ? 2 : 0;
+               break;
+       case AKS_ALGLSTART:
+               alg_flag &= ~4;
+               alg_flag |= state ? 4 : 0;
+               break;
+       case AKS_ALGRSTART:
+               alg_flag &= ~8;
+               alg_flag |= state ? 8 : 0;
+               break;
+       case AKS_ALGLCOIN:
+               alg_flag &= ~16;
+               alg_flag |= state ? 16 : 0;
+               break;
+       case AKS_ALGRCOIN:
+               alg_flag &= ~32;
+               alg_flag |= state ? 32 : 0;
+               break;
+       case AKS_ALGLTRIGGER:
+               alg_flag &= ~64;
+               alg_flag |= state ? 64 : 0;
+               break;
+       case AKS_ALGRTRIGGER:
+               alg_flag &= ~128;
+               alg_flag |= state ? 128 : 0;
+               break;
+       case AKS_ALGLHOLSTER:
+               alg_flag &= ~256;
+               alg_flag |= state ? 256 : 0;
+               break;
+       case AKS_ALGRHOLSTER:
+               alg_flag &= ~512;
+               alg_flag |= state ? 512 : 0;
+               break;
        }
 #endif
        if (!state) {
@@ -4641,7 +4684,7 @@ void inputdevice_vsync (void)
        if (mouseedge_alive > 0)
                mouseedge_alive--;
 #ifdef ARCADIA
-       if (arcadia_bios)
+       if (arcadia_bios || alg_flag)
                arcadia_vsync ();
 #endif
        if (mouseedge ())
index cd2a3156495c0019cae4b0c60dea6a62eefcf315..8302cc64e898bf25427037f3b3c0afd35bbc2746 100644 (file)
@@ -395,7 +395,6 @@ DEFEVENT(SPC_RTG_1,_T("RTG Display #2"),AM_K,0,0,AKS_RTG_1)
 DEFEVENT(SPC_RTG_2,_T("RTG Display #3"),AM_K,0,0,AKS_RTG_2)
 DEFEVENT(SPC_RTG_3,_T("RTG Display #4"),AM_K,0,0,AKS_RTG_3)
 
-
 DEFEVENT(SPC_INPUT_CONFIG1,_T("Select Input Configuration #1"),AM_K,0,0,AKS_INPUT_CONFIG_1)
 DEFEVENT(SPC_INPUT_CONFIG2,_T("Select Input Configuration #2"),AM_K,0,0,AKS_INPUT_CONFIG_2)
 DEFEVENT(SPC_INPUT_CONFIG3,_T("Select Input Configuration #3"),AM_K,0,0,AKS_INPUT_CONFIG_3)
@@ -407,6 +406,16 @@ DEFEVENT(SPC_ARCADIA_PLAYER2,_T("Arcadia player 2"),AM_K,0,0,AKS_ARCADIAPLY2)
 DEFEVENT(SPC_ARCADIA_COIN1,_T("Arcadia coin player 1"),AM_K,0,0,AKS_ARCADIACOIN1)
 DEFEVENT(SPC_ARCADIA_COIN2,_T("Arcadia coin player 2"),AM_K,0,0,AKS_ARCADIACOIN2)
 
+DEFEVENT(SPC_ALG_SERVICE,_T("American Laser Games Service"),AM_K,0,0,AKS_ALGSERVICE)
+DEFEVENT(SPC_ALG_LSTART,_T("American Laser Games Left Start"),AM_K,0,0,AKS_ALGLSTART)
+DEFEVENT(SPC_ALG_RSTART,_T("American Laser Games Right Start"),AM_K,0,0,AKS_ALGRSTART)
+DEFEVENT(SPC_ALG_LCOIN,_T("American Laser Games Left Coin"),AM_K,0,0,AKS_ALGLCOIN)
+DEFEVENT(SPC_ALG_RCOIN,_T("American Laser Games Right Coin"),AM_K,0,0,AKS_ALGRCOIN)
+DEFEVENT(SPC_ALG_LTRIGGER,_T("American Laser Games Left Trigger"),AM_K,0,0,AKS_ALGLTRIGGER)
+DEFEVENT(SPC_ALG_RTRIGGER,_T("American Laser Games Right Trigger"),AM_K,0,0,AKS_ALGRTRIGGER)
+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_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 b8d4c1788bda6a493c854c99128bd6fc7f31f9e1..d3cbbbaba2c935f4166aaa9eb906b509193db85c 100644 (file)
@@ -884,6 +884,7 @@ static int extendedkickmem_type;
 #define EXTENDED_ROM_CDTV 2
 #define EXTENDED_ROM_KS 3
 #define EXTENDED_ROM_ARCADIA 4
+#define EXTENDED_ROM_ALG 5
 
 static void REGPARAM3 extendedkickmem_lput (uaecptr, uae_u32) REGPARAM;
 static void REGPARAM3 extendedkickmem_wput (uaecptr, uae_u32) REGPARAM;
@@ -1168,6 +1169,44 @@ void a3000_fakekick (int map)
        protect_roms (true);
 }
 
+static bool is_alg_rom(const TCHAR *name)
+{
+       struct romdata *rd = getromdatabypath(name);
+       if (!rd)
+               return false;
+       return  (rd->type & ROMTYPE_ALG) != 0;
+}
+
+static void descramble_alg(uae_u8 *data, int size)
+{
+       uae_u8 *tbuf = xmalloc(uae_u8, size);
+       memcpy(tbuf, data, size);
+       for (int mode = 0; mode < 3; mode++) {
+               if ((data[8] == 0x4a && data[9] == 0xfc))
+                       break;
+               for (int s = 0; s < size; s++) {
+                       int d = s;
+                       if (mode == 0) {
+                               if (s & 0x2000)
+                                       d ^= 0x1000;
+                               if (s & 0x8000)
+                                       d ^= 0x4000;
+                       } else if (mode == 1) {
+                               if (s & 0x2000)
+                                       d ^= 0x1000;
+                       } else {
+                               if ((~s) & 0x2000)
+                                       d ^= 0x1000;
+                               if (s & 0x8000)
+                                       d ^= 0x4000;
+                               d ^= 0x20000;
+                       }
+                       data[d] = tbuf[s];
+               }
+       }
+       xfree(tbuf);
+}
+
 static const uae_char *kickstring = "exec.library";
 
 static int read_kickstart (struct zfile *f, uae_u8 *mem, int size, int dochecksum, int noalias)
@@ -1276,6 +1315,10 @@ static bool load_extendedkickstart (const TCHAR *romextfile, int type)
                extendedkickmem_type = EXTENDED_ROM_ARCADIA;
                return false;
        }
+       if (is_alg_rom(romextfile)) {
+               type = EXTENDED_ROM_ALG;
+
+       }
        f = read_rom_name (romextfile);
        if (!f) {
                notify_user (NUMSG_NOEXTROM);
@@ -1311,9 +1354,16 @@ static bool load_extendedkickstart (const TCHAR *romextfile, int type)
                        mapped_malloc (&extendedkickmem_bank);
                        extendedkickmem_bank.start = 0xe00000;
                        break;
+               case EXTENDED_ROM_ALG:
+                       extendedkickmem_bank.label = _T("rom_f0");
+                       mapped_malloc(&extendedkickmem_bank);
+                       extendedkickmem_bank.start = 0xf00000;
+                       break;
                }
                if (extendedkickmem_bank.baseaddr) {
                        read_kickstart (f, extendedkickmem_bank.baseaddr, extendedkickmem_bank.allocated_size, 0, 1);
+                       if (extendedkickmem_type == EXTENDED_ROM_ALG)
+                               descramble_alg(extendedkickmem_bank.baseaddr, 262144);
                        extendedkickmem_bank.mask = extendedkickmem_bank.allocated_size - 1;
                        ret = true;
                }
@@ -2312,6 +2362,7 @@ void memory_reset (void)
        int bnk, bnk_end;
        bool gayleorfatgary;
 
+       alg_flag = 0;
        need_hardreset = false;
        rom_write_enabled = true;
        /* Use changed_prefs, as m68k_reset is called later.  */
@@ -2474,6 +2525,10 @@ void memory_reset (void)
                map_banks_set(&extendedkickmem_bank, 0xE0, 8, 0);
                break;
 #endif
+       case EXTENDED_ROM_ALG:
+               map_banks_set(&extendedkickmem_bank, 0xF0, 4, 0);
+               alg_map_banks();
+               break;
        }
 
 #ifdef AUTOCONFIG
index 666c2e8654286c71c15c5eac2b632bb2ad58a5f9..aa20471efc390232fea09a1771e39df4c67a86de 100644 (file)
@@ -23,6 +23,7 @@
 #include "cia.h"
 #include "serial.h"
 #include "enforcer.h"
+#include "arcadia.h"
 
 #include "parser.h"
 
@@ -385,6 +386,11 @@ static void checksend(void)
        if (data_in_sershift != 1 && data_in_sershift != 2)
                return;
 
+#ifdef ARCADIA
+       if (alg_flag) {
+               alg_serial_read(serdatshift);
+       }
+#endif
 #ifdef SERIAL_MAP
        if (sermap_data && sermap_enabled)
                shmem_serial_send(serdatshift);
@@ -513,6 +519,17 @@ void serial_hsynchandler (void)
 #ifdef AHI
        extern void hsyncstuff(void);
        hsyncstuff();
+#endif
+#ifdef ARCADIA
+       if (alg_flag && !data_in_serdatr) {
+               int ch = alg_serial_write();
+               if (ch >= 0) {
+                       serdatr = ch | 0x100;
+                       data_in_serdatr = 1;
+                       serdatr_last_got = 0;
+                       serial_check_irq ();
+               }
+       }
 #endif
        if (seriallog && !data_in_serdatr && gotlogwrite) {
                int ch = read_log();
index 67854fe179d702cebb0433e9588f81a65fff92c4..e93a41782947545e8ce2829e47c65543d8cea4af 100644 (file)
@@ -95,7 +95,7 @@ struct romdata *getromdatabypath (const TCHAR *path)
        return NULL;
 }
 
-#define NEXT_ROM_ID 175
+#define NEXT_ROM_ID 199
 
 #define ALTROM(id,grp,num,size,flags,crc32,a,b,c,d,e) \
 { _T("X"), 0, 0, 0, 0, 0, size, id, 0, 0, flags, (grp << 16) | num, 0, NULL, crc32, a, b, c, d, e },
@@ -556,6 +556,127 @@ static struct romdata roms[] = {
        { _T("Arcadia Leader Board Golf v2.5"), 0, 0, 0, 0, _T("ARCADIA\0"), 0, 86, 0, 0, ROMTYPE_ARCADIAGAME, 0, 2 },
        { _T("Arcadia Aaargh"), 0, 0, 0, 0, _T("ARCADIA\0"), 0, 88, 0, 0, ROMTYPE_ARCADIAGAME, 0, 2 },
 
+       // maddog_01.dat, maddog_02.dat
+       { _T("American Laser Games Mad Dog McCree v1C"), 0, 0, 0, 0, _T("ALG\0"), 131072, 175, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x48fd863c, 0x9bf6f337,0x585122a5,0x97c19d71,0x224e3b68,0x347a98de },
+       ALTROMPN(175, 1, 1, 65536, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xf64014ec, 0xd343a2cb, 0x5d899215, 0x3b8c916f, 0x39b11d3d, 0xb736543d)
+       ALTROMPN(175, 1, 2, 65536, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x04572557, 0x3dfe2ce9, 0x4ced8701, 0xa3e73ed5, 0x869b6fbe, 0x1c8b3286)
+       // md_2.02_u1.bin, md_2.02_u2.bin
+       { _T("American Laser Games Mad Dog McCree v2.02"), 0, 0, 0, 0, _T("ALG\0"), 262144, 176, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x65181234, 0x321fe70a,0xb0986712,0xe4c6cc17,0x0fe48f1d,0x491ba069 },
+       ALTROMPN(176, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xf46e1242, 0x2960bc18,0x00b22eea,0x50036ae4,0x3fd3cb2a,0xb7dcf8a4)
+       ALTROMPN(176, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xa49890d1, 0x148f78fb,0x426f5b91,0x2e8c3836,0xa149bfcb,0x966da477)
+       // md_2.03_1.bin, md_2.03_2.bin
+       { _T("American Laser Games Mad Dog McCree v2.03"), 0, 0, 0, 0, _T("ALG\0"), 262144, 177, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xbf0878ad, 0x7ff88de7,0x3fd5245e,0x346cca21,0xd0765de1,0x8ba28877 },
+       ALTROMPN(177, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xa50d3c04, 0x4cf100fd,0xb5b2f223,0x6539fd0e,0xc33b3db1,0x9c64a6b8)
+       ALTROMPN(177, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x6f5b8f2d, 0xbbf32bb2,0x7a998d53,0x744411d7,0x5efdbdb7,0x30855809)
+       // md2_01.bin, md2_02.bin
+       { _T("American Laser Games Mad Dog II: The Lost Gold v2.02"), 0, 0, 0, 0, _T("ALG\0"), 262144, 178, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x992f9a53, 0xf039a74c,0xc63e1465,0xb3036d4c,0x030df1ef,0x5ba03ff4 },
+       ALTROMPN(178, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xaddffa51, 0x665e9d93,0xddfa6b2e,0xa5d006b4,0x1bf7eac3,0x294244cc)
+       ALTROMPN(178, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x4092227f, 0x6e5393aa,0x5e64b598,0x87260f48,0x3c509600,0x84de7bd1)
+       // md2_1.10_u1.bin, md2_1.10_u2.bin
+       { _T("American Laser Games Mad Dog II: The Lost Gold v1.10"), 0, 0, 0, 0, _T("ALG\0"), 262144, 179, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xc3230ece, 0x4dd60b21,0xf7ab65cd,0x77304753,0x6a4ff2eb,0x75b0778c },
+       ALTROMPN(179, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x0e113b2c, 0x739d777f,0x3cb92fbc,0x730c6c1b,0x664d8741,0x21d191b1)
+       ALTROMPN(179, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x61808612, 0x1a0a301e,0x79585a81,0xe6cf4673,0x7068970f,0xb8a205fa)
+       // md2_01_v.2.04.bin, md2_02_v.2.04.bin
+       { _T("American Laser Games Mad Dog II: The Lost Gold v2.04"), 0, 0, 0, 0, _T("ALG\0"), 262144, 180, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x1b9ddae6, 0xd52cc668,0xe4876294,0x5c4d9033,0x71d8a0b1,0x323b4464 },
+       ALTROMPN(180, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x361bd99c, 0x5de6ef38,0xe334e19f,0x509227de,0x7880306a,0xc984ec23)
+       ALTROMPN(180, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x0e1227f4, 0xbfd9081b,0xb7d2bcbb,0x77357839,0xf292ce61,0x36e9b228)
+       // md2_1.0_1.bin, md2_1.0_2.bin
+       { _T("American Laser Games Mad Dog II: The Lost Gold v1.00"), 0, 0, 0, 0, _T("ALG\0"), 262144, 181, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x348b1a05, 0xece8f1ec,0x4d97f98d,0xb1279ed5,0x28cb0fca,0x51c167bb },
+       ALTROMPN(181, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x0ce8db97, 0xdd4c09db,0x59bb8c6c,0xaba935b1, 0xb28babe2, 0x8ba8516b)
+       ALTROMPN(181, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x97272a1d, 0x10901464,0x7c491f01,0x9ffb2109, 0x1c7d0b89, 0xe1755b75)
+       // sp_14_u1.bin, sp_14_u2.bin
+       { _T("American Laser Games Space Pirates v1.4"), 0, 0, 0, 0, _T("ALG\0"), 262144, 182, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x69e09b90, 0xda3cba84,0x1c37222f,0xc45b4704,0x997072ad,0x1e9a1f8e },
+       ALTROMPN(182, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x4102988c, 0x969d4668,0xbe50990c,0x7debf9ed,0x4e8b8c6e,0x422acdf5)
+       ALTROMPN(182, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x30390ab0, 0x80fa14d8,0x81902258,0x398225bd,0xfd71ed5e,0x9e2d6c91)
+       // sp_01.dat, sp_02.dat
+       { _T("American Laser Games Space Pirates v2.2"), 0, 0, 0, 0, _T("ALG\0"), 262144, 183, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x09c2cfcb, 0x93ad6a25,0x77fa7870,0x971890f2,0x6af11382, 0xa433f80b },
+       ALTROMPN(183, 1, 1, 131072, ROMTYPE_EVEN  | ROMTYPE_8BIT, NULL, 0x10d162a2, 0x26833d5b,0xe1057be8,0x639c00a7,0xbe18be33,0x404ea751)
+       ALTROMPN(183, 1, 2, 131072, ROMTYPE_ODD | ROMTYPE_8BIT, NULL, 0xc0975188, 0xfd7643dc,0x972e7861,0x249ab7e7,0x61999759,0x84888ae4)
+       // johnny_01.bin, johnny_02.bin
+       { _T("American Laser Games Who Shot Johnny Rock? v1.6"), 0, 0, 0, 0, _T("ALG\0"), 131072, 184, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xaeda7df4, 0xa612c4b9,0x2bd81ab9,0x564e58da,0x9a6a4d81,0x93c59acf },
+       ALTROMPN(184, 1, 1, 65536, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x046569b3, 0xefe5a8b2,0xbe1c5556,0x95f2a91c,0x88951d35,0x45f1b915)
+       ALTROMPN(184, 1, 2, 65536, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xedde1745, 0x573b79f8,0x808fedaa,0xbf3b7623,0x50a91579,0x2d26c1bc)
+       // wsjr151.bin,wsjr152.bin
+       { _T("American Laser Games Who Shot Johnny Rock? v1.5"), 0, 0, 0, 0, _T("ALG\0"), 131072, 185, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x50eb4827, 0x72568673,0x4163aa16,0xdad3177,0xbd720187,0x125a63ec },
+       ALTROMPN(185, 1, 1, 65536, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x8ab626dd, 0xe45561f7,0x7fc279b7,0x1dc1dd2e,0x15a0870c,0xb5c1cd89)
+       ALTROMPN(185, 1, 2, 65536, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x9beeb1d7, 0x3fe0265e,0x5d36103d,0x3d9557d7,0x5e5e3728,0xe0b30da7)
+       // gg_1.dat,gg_2.dat
+       { _T("American Laser Games Gallagher's Gallery v2.2"), 0, 0, 0, 0, _T("ALG\0"), 262144, 186, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xcbe791de, 0x17aa6f16,0x7e138409,0xe1ef039e,0x928fee5a,0xf43e91cb },
+       ALTROMPN(186, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x855c9d82, 0x96711aaa,0x02f309ca,0xcd3e8d8e,0xfbe95cfc,0x811aba96)
+       ALTROMPN(186, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x3793b211, 0xdccb1d9c,0x5e2d6a4d,0x249426ae,0x6348e9fc,0x9b72e665)
+       // gg_21_rom1.bin,gg_21_rom2.bin
+       { _T("American Laser Games Gallagher's Gallery v2.1"), 0, 0, 0, 0, _T("ALG\0"), 262144, 187, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x9bfe35bb, 0x76c8cad8,0xd0f4758f,0x1adc0fc9,0x7cb6ad30,0x44b54d47 },
+       ALTROMPN(187, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x70f887e5, 0xcd6cedc8,0x5bbe6767,0x4dfd140f,0xed901877,0x8f8cd8db)
+       ALTROMPN(187, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x4109f39e, 0x42d06de4,0x2c56f21e,0x4899b4c4,0x252baabb,0x51f24fda)
+       // fd_131_u1.bin,fd_131_u2.bin
+       { _T("American Laser Games Fast Draw Showdown v1.31"), 0, 0, 0, 0, _T("ALG\0"), 262144, 188, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x6977addf, 0xdc845431,0xbb1a39bd,0x615afe5f,0x7cb7c8d0,0x3433ef8c },
+       ALTROMPN(188, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xe1ed7982, 0xf7562c6e,0x0ce6bf1a,0x9885cc59,0x3e08c250,0x9f82bbe1)
+       ALTROMPN(188, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xb7c79ab3, 0x6eca1bc9,0x590c22a0,0x04fb8590,0x1e5c7d41,0xf5b14ee2)
+       // fast_01.bin,fast_02.bin
+       { _T("American Laser Games Fast Draw Showdown v1.30"), 0, 0, 0, 0, _T("ALG\0"), 262144, 189, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x47772e36, 0x5af67b5e,0xa56b2337,0xfdd427fb,0xd82d478f,0xb1994dbc },
+       ALTROMPN(189, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x0d76a2da, 0xd396371a,0xe1b9b0b6,0xe6bc6f1f,0x85c4b97b,0xfc5dc34d)
+       ALTROMPN(189, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x4c4eb71e, 0x3bd487c5,0x46b6c807,0x70a5fc88,0x0dcb1039,0x5ca431a2)
+       // lbh_101_u1.bin,lbh_101_u2.bin
+       { _T("American Laser Games The Last Bounty Hunter v1.01"), 0, 0, 0, 0, _T("ALG\0"), 262144, 190, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xd2a5a539, 0xb97c799b,0x53355b55,0x4dfbf335,0x6f20fd2b,0xa5998806 },
+       ALTROMPN(190, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xb21c5c42, 0x9ac856cd,0xf2c9538c,0xc4ae55f0,0x79f33737,0x6d3361c0)
+       ALTROMPN(190, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xf13b25d2, 0xe2f663c2,0x3b03592f,0x482ef5e1,0xdf87b651,0x937a500d)
+       // bounty_01.bin,bounty_02.bin
+       { _T("American Laser Games The Last Bounty Hunter v0.06"), 0, 0, 0, 0, _T("ALG\0"), 262144, 191, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xce600734, 0xe52aea03,0x080dcd08,0x8d4b61ed,0xe46de9c7,0xfc4dd74e },
+       ALTROMPN(191, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x2727ef1d, 0xf5342139,0x0b65c21a,0x7666ff9d,0x0f53ebf2,0xa463d836)
+       ALTROMPN(191, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x977566b2, 0x937e079e,0x992ecb59,0x30b17c10,0x24c326e1,0x0962642b)
+       // cp_151_u1.bin,cp_151_u2.bin
+       { _T("American Laser Games Crime Patrol v1.51"), 0, 0, 0, 0, _T("ALG\0"), 262144, 192, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xcada2bed, 0xc5da9d82,0x7864feff,0x75d87dd1,0x9ec06529,0x7d2b318b },
+       ALTROMPN(192, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xaefd6e09, 0x351e665e,0x2e636804,0x7a5cc80d,0x0f9d876b,0xca068b6a)
+       ALTROMPN(192, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xf2270cee, 0x1e735373,0x723c3cff,0xb6dd04d5,0xc30c08e7,0x57deae61)
+       // cp01.dat,cp02.dat
+       { _T("American Laser Games Crime Patrol v1.4"), 0, 0, 0, 0, _T("ALG\0"), 262144, 193, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x51ba3153, 0x55086ba0,0xef41c6d6,0x41041b73,0x047cad38,0xaf2a21f3 },
+       ALTROMPN(193, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xa39a8b50, 0x55ca317e,0xf13c3a42,0xf12d68c4,0x80e6cc2d,0x4459f6a4)
+       ALTROMPN(193, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xe41fd2e8, 0x1cd9875f,0xb4133ba4,0xe3616271,0x975dc736,0xb343f156)
+       // cp_1.20_u1.bin,cp_1.20_u2.bin
+       { _T("American Laser Games Crime Patrol v1.2"), 0, 0, 0, 0, _T("ALG\0"), 262144, 194, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x63e9f444, 0x6f2624a5,0x6a672f97,0xc751ae51,0xb4b834a5,0x097a855a },
+       ALTROMPN(194, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x475e847a, 0x82fd1608,0x35758cd5,0x1ea22f90,0xb08921a4,0x0409f94d)
+       ALTROMPN(194, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x814f5777, 0x341a1d7b,0x64112af3,0xe8243bdb,0xfec72e7f,0xa85aa903)
+       // cp2_1.3_1.bin, cp2_1.3_2.bin
+       { _T("American Laser Games Crime Patrol 2: Drug Wars v1.3"), 0, 0, 0, 0, _T("ALG\0"), 262144, 195, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x57d1f606, 0xffbee51c,0x9c52a9c6,0x6440cbf8,0x34144321,0x75036282 },
+       ALTROMPN(195, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xdbdaa79a, 0x99804490,0x9d5c93e3,0xbd1baafe,0xfab818fd,0xb7b3f55e)
+       ALTROMPN(195, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0xe653395d, 0x8f6c86d9,0x8a52b7d8,0x5ae285fd,0x841167cd,0x07979318)
+       // cp2_1.dat, cp2_2.dat
+       { _T("American Laser Games Crime Patrol 2: Drug Wars v1.1"), 0, 0, 0, 0, _T("ALG\0"), 262144, 196, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x49c751db, 0x789679f9,0xa3fe3aa0,0xf9b8bb35,0x1f3ea632,0xe429408d },
+       ALTROMPN(196, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xf4e5251e, 0xe0c91343,0xa98193d4,0x87c40e7a,0x85f542b2,0xa7a88f03)
+       ALTROMPN(196, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x47879042, 0x8bb6c541,0xe4e8e450,0x8da8d4b9,0x3600176a,0x2e7a1f41)
+       // platoonv4u1.bin,platoonv4u2.bin
+       { _T("Nova Platoon V.3.1 US"), 0, 0, 0, 0, _T("ALG\0"), 262144, 197, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0xad975c96, 0x9565207f,0x6684baa8,0xe5c85c34,0x740a3f60,0x75d3a7b5 },
+       ALTROMPN(197, 1, 1, 131072, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x09a133cf, 0x9b3ff630,0x35be8576,0xc88fb284,0xa25c2da5,0xdb0d5160)
+       ALTROMPN(197, 1, 2, 131072, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x8b33263e, 0xa1df3823,0x6321af90,0xb522e2a7,0x83984fdf,0x02e4c597)
+       // zb_u2.bin,zb_u3.bin
+       { _T("Web Picmatic Zorton Brothers (Los Justicieros)"), 0, 0, 0, 0, _T("ALG\0"), 131072, 198, 0, 0, ROMTYPE_ALG, 0, 0, NULL,
+       0x9cda09ae, 0x3353ae63,0x64b3d0b1,0x006db48e,0xa2bdc7b5,0x4946bbb9 },
+       ALTROMPN(198, 1, 1, 65536, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0xf59cfc4a, 0x9fadf7f1,0xe23d6b4e,0x828bf2b3,0xde919d08,0x7c690a3f)
+       ALTROMPN(198, 1, 2, 65536, ROMTYPE_ODD  | ROMTYPE_8BIT, NULL, 0x938b25cb, 0xd0114bbc,0x588dcfce,0x6a469013,0xd0e35afb,0x93e38af5)
+
        { NULL }
 
 };
@@ -1701,7 +1822,7 @@ int configure_rom (struct uae_prefs *p, const int *rom, int msg)
        }
        if (rd->type & (ROMTYPE_KICK | ROMTYPE_KICKCD32))
                _tcscpy (p->romfile, path);
-       if (rd->type & (ROMTYPE_EXTCD32 | ROMTYPE_EXTCDTV | ROMTYPE_ARCADIABIOS))
+       if (rd->type & (ROMTYPE_EXTCD32 | ROMTYPE_EXTCDTV | ROMTYPE_ARCADIABIOS | ROMTYPE_ALG))
                _tcscpy (p->romextfile, path);
        if (rd->type & ROMTYPE_CD32CART) {
                _tcscpy(p->cartfile, path);