]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Squirrel/Surf Squirrel emulation.
authorToni Wilen <twilen@winuae.net>
Wed, 7 Aug 2019 18:18:39 +0000 (21:18 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 7 Aug 2019 18:18:39 +0000 (21:18 +0300)
expansion.cpp
gayle.cpp
include/ncr9x_scsi.h
include/rommgr.h
ncr9x_scsi.cpp

index 101c07676d716d98f092bdd7918f7913890f56ca..b5cd76eefefaca4370370d6929fbb38b323574dd 100644 (file)
@@ -5261,6 +5261,12 @@ const struct expansionromtype expansionroms[] = {
                NULL, 0,
                false, EXPANSIONTYPE_SCSI
        },
+       {
+               _T("surfsquirrel"), _T("Surf Squirrel"), _T("HiSoft"),
+               NULL, gayle_init_board_io_pcmcia, NULL, NULL, ROMTYPE_SSQUIRREL | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
+               NULL, 0,
+               false, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_PCMCIA,
+       },
        {
                _T("adide"), _T("AdIDE"), _T("ICD"),
                NULL, adide_init, NULL, adide_add_ide_unit, ROMTYPE_ADIDE | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
index b3b125e0b41622c824a6b62c5bbde182c721a711..c2c1cd0c6f0daf22b6111e62683da9782e1ef218 100644 (file)
--- a/gayle.cpp
+++ b/gayle.cpp
@@ -26,6 +26,7 @@
 #include "threaddep/thread.h"
 #include "a2091.h"
 #include "ncr_scsi.h"
+#include "ncr9x_scsi.h"
 #include "blkdev.h"
 #include "scsi.h"
 #include "ide.h"
@@ -40,6 +41,7 @@
 #define PCMCIA_IDE 2
 #define PCMCIA_NE2000 3
 #define PCMCIA_ARCHOSHD 4
+#define PCMCIA_SURFSQUIRREL 5
 
 /*
 600000 to 9FFFFF       4 MB    Credit Card memory if CC present
@@ -156,6 +158,7 @@ static int pcmcia_type;
 static uae_u8 pcmcia_configuration[20];
 static int pcmcia_configured;
 static int pcmcia_delayed_insert, pcmcia_delayed_insert_count;
+static int external_card_int;
 
 static int gayle_id_cnt;
 static uae_u8 gayle_irq, gayle_int, gayle_cs, gayle_cs_mask, gayle_cfg;
@@ -241,6 +244,7 @@ void rethink_gayle (void)
        gayle_irq |= checkgayleideirq();
        gayle_irq |= checkpcmciaideirq();
        gayle_irq |= checkpcmciane2000irq();
+       gayle_irq |= external_card_int;
        mask = gayle_int & gayle_irq;
        if (mask & (GAYLE_IRQ_IDE | GAYLE_IRQ_WR))
                lev2 = 1;
@@ -264,6 +268,20 @@ void rethink_gayle (void)
                safe_interrupt_set(IRQ_SOURCE_GAYLE, 0, true);
 }
 
+void pcmcia_interrupt_set(int level)
+{
+       if (level) {
+               if (!external_card_int)
+                       write_log("PCMCIA IRQ ACTIVE\n");
+               external_card_int |= GAYLE_INT_IRQ;
+       } else {
+               if (external_card_int)
+                       write_log("PCMCIA IRQ INACTIVE\n");
+               external_card_int &= ~GAYLE_INT_IRQ;
+       }
+       rethink_gayle();
+}
+
 static void gayle_cs_change (uae_u8 mask, int onoff)
 {
        int changed = 0;
@@ -288,6 +306,7 @@ static void gayle_cs_change (uae_u8 mask, int onoff)
 
 static void card_trigger (int insert)
 {
+       external_card_int = 0;
        if (insert) {
                if (pcmcia_card) {
                        gayle_cs_change (GAYLE_CS_CCDET, 1);
@@ -1094,6 +1113,16 @@ static uae_u32 gayle_attr_read (uaecptr addr)
                        }
                        return v;
                }
+       } else if (pcmcia_type == PCMCIA_SURFSQUIRREL) {
+               if ((addr & 0x20600) == 0x20400) {
+                       int reg = (addr >> 12) & 15;
+                       v = squirrel_ncr9x_scsi_get(reg, 0);
+                       return v;
+               }
+               if ((addr & 0x20600) == 0x20200) {
+                       v = squirrel_ncr9x_scsi_get(16, 0);
+                       return v;
+               }
        }
        v = pcmcia_attrs[addr / 2];
        return v;
@@ -1154,7 +1183,15 @@ static void gayle_attr_write (uaecptr addr, uae_u32 v)
                                        ne2000->bars[0].bput(ne2000_board_state, reg, v);
                                }
                        }
-                }
+               } else if (pcmcia_type == PCMCIA_SURFSQUIRREL) {
+                       if ((addr & 0x20400) == 0x20400) {
+                               int reg = (addr >> 12) & 15;
+                               squirrel_ncr9x_scsi_put(reg, v, 0);
+                       }
+                       if ((addr & 0x20600) == 0x20200) {
+                               squirrel_ncr9x_scsi_put(16, v, 0);
+                       }
+               }
        }
 }
 
@@ -1419,6 +1456,7 @@ static int freepcmcia (int reset)
 
        gayle_cfg = 0;
        gayle_cs = 0;
+       external_card_int = 0;
        return 1;
 }
 
@@ -1528,6 +1566,26 @@ static int initpcmcia (const TCHAR *path, int readonly, int type, int reset, str
                }
                ide_initialize(archoshd, 0);
 
+       } else if (type == PCMCIA_SURFSQUIRREL) {
+
+               pcmcia_disk->hfd.drive_empty = 0;
+               pcmcia_common_size = 0;
+               pcmcia_readonly = 1;
+               pcmcia_type = type;
+               pcmcia_common_size = 0;
+               pcmcia_attrs_size = 0x40000;
+               pcmcia_attrs = xcalloc(uae_u8, pcmcia_attrs_size);
+               pcmcia_card = 1;
+
+               struct romconfig *rc = get_device_romconfig(&currprefs, ROMTYPE_SSQUIRREL, 0);
+               if (rc) {
+                       ncr_squirrel_init(rc, 0xa00000);
+               }
+
+               if (reset && path) {
+                       squirrel_add_scsi_unit(0, uci, rc);
+               }
+
        }
 
        if (pcmcia_card && !(gayle_cs & GAYLE_CS_DIS)) {
@@ -1972,6 +2030,9 @@ static void pcmcia_card_check(int changecheck, int insertdev)
                                                        if (ucd)
                                                                readonly = ucd->ci.readonly;
                                                        break;
+                                                       case ROMTYPE_SSQUIRREL:
+                                                       pcmcia_type = PCMCIA_SURFSQUIRREL;
+                                                       break;
                                                }
                                                if (ucd) {
                                                        // insert (disk type)
index 7b05d9d0868c71251cb6f09086ebd05ce44b2f5e..6d9b2aff8cd216c3ac1574818a3677a4950e99e3 100644 (file)
@@ -21,6 +21,7 @@ extern void scram5394_add_scsi_unit(int ch, struct uaedev_config_info *ci, struc
 extern void rapidfire_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void alf3_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 extern void typhoon2scsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+extern void squirrel_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
 
 extern bool ncr_fastlane_autoconfig_init(struct autoconfig_info *aci);
 extern bool ncr_oktagon_autoconfig_init(struct autoconfig_info *aci);
@@ -47,6 +48,11 @@ uae_u32 golemfast_ncr9x_scsi_get(uaecptr addr, int devnum);
 void golemfast_ncr9x_scsi_put(uaecptr addr, uae_u32 v, int devnum);
 void ncr_golemfast_autoconfig_init(struct romconfig*, uaecptr);
 
+uae_u32 squirrel_ncr9x_scsi_get(uaecptr addr, int devnum);
+void squirrel_ncr9x_scsi_put(uaecptr addr, uae_u32 v, int devnum);
+void ncr_squirrel_init(struct romconfig *, uaecptr);
+void pcmcia_interrupt_set(int);
+
 #define BLIZZARD_2060_SCSI_OFFSET 0x1ff00
 #define BLIZZARD_2060_DMA_OFFSET 0x1fff0
 #define BLIZZARD_2060_LED_OFFSET 0x1ffe0
index f4d67fbce27c14788434c32f1d96ab2a08ebdbc8..a94fb62e21ffcbd2e11c1c34dadcf4f8165e139f 100644 (file)
@@ -190,6 +190,7 @@ extern int decode_cloanto_rom_do (uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_ARCHOSHD       0x0010007f
 #define ROMTYPE_PCMCIASRAM     0x00100080
 #define ROMTYPE_PCMCIAIDE      0x00100081
+#define ROMTYPE_SSQUIRREL      0x00100082
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index 0b4235952e598936405fec362038a9a14e5d755b..a4d709457f11f1371fb970c3a5bd4987a6f0a3e2 100644 (file)
@@ -99,6 +99,7 @@ struct ncr9x_state
        bool chipirq, boardirq, boardirqlatch;
        bool intena;
        bool irq6;
+       bool pcmcia;
        void (*irq_func)(struct ncr9x_state*);
        int led;
        uaecptr dma_ptr;
@@ -171,6 +172,7 @@ static struct ncr9x_state *ncr_golemfast_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ncr9x_state *ncr_scram5394_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ncr9x_state *ncr_rapidfire_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ncr9x_state *ncr_trifecta_scsi[MAX_DUPLICATE_EXPANSION_BOARDS];
+static struct ncr9x_state *ncr_squirrel_scsi;
 
 static struct ncr9x_state *ncr_units[MAX_NCR9X_UNITS + 1];
 
@@ -250,7 +252,10 @@ void ncr9x_rethink(void)
 {
        for (int i = 0; ncr_units[i]; i++) {
                if (ncr_units[i]->boardirq) {
-                       safe_interrupt_set(IRQ_SOURCE_NCR9X, i, ncr_units[i]->irq6);
+                       if (ncr_units[i]->pcmcia)
+                               pcmcia_interrupt_set(1);
+                       else
+                               safe_interrupt_set(IRQ_SOURCE_NCR9X, i, ncr_units[i]->irq6);
                }
        }
 }
@@ -263,6 +268,8 @@ static void set_irq2(struct ncr9x_state *ncr)
        }
        if (!ncr->chipirq && ncr->boardirq) {
                ncr->boardirq = false;
+               if (ncr->pcmcia)
+                       pcmcia_interrupt_set(0);
        }
 }
 
@@ -855,6 +862,17 @@ static void ncr9x_io_bput3(struct ncr9x_state *ncr, uaecptr addr, uae_u32 val, i
                        return;
                }
 
+       } else if (ncr == ncr_squirrel_scsi) {
+
+               reg_shift = 0;
+               if (addr >= 16) {
+                       ncr->data = val;
+                       ncr->data_valid_r = true;
+                       esp_dma_enable(ncr->devobject.lsistate, 1);
+                       return;
+               }
+
+
        } else if (isncr(ncr, ncr_masoboshi_scsi)) {
 
                if (addr >= 0xf000 && addr < 0xf800)
@@ -1265,6 +1283,16 @@ static uae_u32 ncr9x_io_bget3(struct ncr9x_state *ncr, uaecptr addr, int *reg)
                        return v;
                }
 
+       } else if (ncr == ncr_squirrel_scsi) {
+
+               reg_shift = 0;
+               if (addr >= 16) {
+                       esp_dma_enable(ncr->devobject.lsistate, 1);
+                       v = ncr->data;
+                       ncr->data_valid_w = false;
+                       return v;
+               }
+
        } else if (isncr(ncr, ncr_masoboshi_scsi)) {
 
                if (addr == MASOBOSHI_ESP_ADDR + 3 * 2 && (ncr->states[0] & 0x80))
@@ -1849,6 +1877,16 @@ void golemfast_ncr9x_scsi_put(uaecptr addr, uae_u32 v, int devnum)
        ncr9x_io_bput(ncr_golemfast_scsi[devnum], addr, v);
 }
 
+uae_u32 squirrel_ncr9x_scsi_get(uaecptr addr, int devnum)
+{
+       return ncr9x_io_bget(ncr_squirrel_scsi, addr);
+}
+void squirrel_ncr9x_scsi_put(uaecptr addr, uae_u32 v, int devnum)
+{
+       ncr9x_io_bput(ncr_squirrel_scsi, addr, v);
+}
+
+
 static void ew(struct ncr9x_state *ncr, int addr, uae_u8 value)
 {
        if (addr == 00 || addr == 02 || addr == 0x40 || addr == 0x42) {
@@ -1877,6 +1915,20 @@ void ncr9x_reset(void)
        }
 }
 
+void ncr_squirrel_init(struct romconfig *rc, uaecptr baseaddress)
+{
+       struct ncr9x_state *ncr = getscsi(rc);
+
+       if (!ncr)
+               return;
+
+       ncr->enabled = true;
+       ncr->pcmcia = true;
+       ncr->baseaddress = baseaddress;
+
+       ncr9x_reset_board(ncr);
+}
+
 void ncr_golemfast_autoconfig_init(struct romconfig *rc, uaecptr baseaddress)
 {
        struct ncr9x_state *ncr = getscsi(rc);
@@ -2508,4 +2560,10 @@ void typhoon2scsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct ro
        esp_dma_enable(ncr_typhoon2_scsi->devobject.lsistate, 1);
 }
 
+void squirrel_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+       ncr9x_add_scsi_unit(&ncr_squirrel_scsi, ch, ci, rc);
+       ncr9x_esp_scsi_init(ncr_squirrel_scsi, fake2_dma_read, fake2_dma_write, set_irq2, 0);
+       esp_dma_enable(ncr_squirrel_scsi->devobject.lsistate, 1);
+}
 #endif