From: Toni Wilen Date: Wed, 7 Aug 2019 18:18:39 +0000 (+0300) Subject: Squirrel/Surf Squirrel emulation. X-Git-Tag: 4300~168 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=fe02ac3ea3c043f4912acf57de345dd46c809b5b;p=francis%2Fwinuae.git Squirrel/Surf Squirrel emulation. --- diff --git a/expansion.cpp b/expansion.cpp index 101c0767..b5cd76ee 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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, diff --git a/gayle.cpp b/gayle.cpp index b3b125e0..c2c1cd0c 100644 --- 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) diff --git a/include/ncr9x_scsi.h b/include/ncr9x_scsi.h index 7b05d9d0..6d9b2aff 100644 --- a/include/ncr9x_scsi.h +++ b/include/ncr9x_scsi.h @@ -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 diff --git a/include/rommgr.h b/include/rommgr.h index f4d67fbc..a94fb62e 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -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 diff --git a/ncr9x_scsi.cpp b/ncr9x_scsi.cpp index 0b423595..a4d70945 100644 --- a/ncr9x_scsi.cpp +++ b/ncr9x_scsi.cpp @@ -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