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,
#include "threaddep/thread.h"
#include "a2091.h"
#include "ncr_scsi.h"
+#include "ncr9x_scsi.h"
#include "blkdev.h"
#include "scsi.h"
#include "ide.h"
#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
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;
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;
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;
static void card_trigger (int insert)
{
+ external_card_int = 0;
if (insert) {
if (pcmcia_card) {
gayle_cs_change (GAYLE_CS_CCDET, 1);
}
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;
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);
+ }
+ }
}
}
gayle_cfg = 0;
gayle_cs = 0;
+ external_card_int = 0;
return 1;
}
}
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)) {
if (ucd)
readonly = ucd->ci.readonly;
break;
+ case ROMTYPE_SSQUIRREL:
+ pcmcia_type = PCMCIA_SURFSQUIRREL;
+ break;
}
if (ucd) {
// insert (disk type)
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);
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
#define ROMTYPE_ARCHOSHD 0x0010007f
#define ROMTYPE_PCMCIASRAM 0x00100080
#define ROMTYPE_PCMCIAIDE 0x00100081
+#define ROMTYPE_SSQUIRREL 0x00100082
#define ROMTYPE_NOT 0x00800000
#define ROMTYPE_QUAD 0x01000000
bool chipirq, boardirq, boardirqlatch;
bool intena;
bool irq6;
+ bool pcmcia;
void (*irq_func)(struct ncr9x_state*);
int led;
uaecptr dma_ptr;
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];
{
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);
}
}
}
}
if (!ncr->chipirq && ncr->boardirq) {
ncr->boardirq = false;
+ if (ncr->pcmcia)
+ pcmcia_interrupt_set(0);
}
}
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)
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))
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) {
}
}
+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);
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