// ROM expansion board diagrom call
// 00F83B7C 3.1 A4000
+// 00F83B7C 3.0 A1200
// 00F83C96 3.1 A1200
// 00FC4E28 1.3
{
return ISCPUBOARDP(p, BOARD_IVS, BOARD_IVS_SUB_VECTOR);
}
+static bool is_12gauge(struct uae_prefs *p)
+{
+ return ISCPUBOARDP(p, BOARD_CSA, BOARD_CSA_SUB_12GAUGE);
+}
static bool is_magnum40(struct uae_prefs *p)
{
return ISCPUBOARDP(p, BOARD_CSA, BOARD_CSA_SUB_MAGNUM40);
if (is_magnum40(&currprefs)) {
map_banks(&blizzardio_bank, 0x0c0c0000 >> 16, 0x10000 >> 16, 0);
}
+ if (is_12gauge(&currprefs)) {
+ map_banks(&cpuboardmem1_bank, cpuboardmem1_bank.start >> 16, 0x01000000 >> 16, (cpuboard_size / 2) >> 16);
+ map_banks(&cpuboardmem2_bank, cpuboardmem2_bank.start >> 16, 0x01000000 >> 16, (cpuboard_size / 2) >> 16);
+ }
if (is_blizzard1230mk2(&currprefs) || is_blizzard1230mk3(&currprefs)) {
map_banks(&blizzardram_bank, blizzardram_bank.start >> 16, cpuboard_size >> 16, 0);
cpuboardmem2_bank.mask = cpuboard_size - 1;
mapped_malloc(&cpuboardmem2_bank);
+ } else if (is_12gauge(&currprefs)) {
+
+ cpuboardmem1_bank.start = 0x08000000;
+ cpuboardmem1_bank.reserved_size = cpuboard_size / 2;
+ cpuboardmem1_bank.mask = cpuboardmem1_bank.reserved_size - 1;
+
+ cpuboardmem2_bank.start = 0x09000000;
+ cpuboardmem2_bank.reserved_size = cpuboard_size / 2;
+ cpuboardmem2_bank.mask = cpuboardmem2_bank.reserved_size - 1;
+
+ if (cpuboard_size) {
+ cpuboardmem1_bank.label = _T("*");
+ mapped_malloc(&cpuboardmem1_bank);
+ cpuboardmem2_bank.label = _T("*");
+ mapped_malloc(&cpuboardmem2_bank);
+ }
+
}
+
if (!cpuboardmem1_bank.baseaddr)
cpuboardmem1_bank.reserved_size = 0;
if (!cpuboardmem2_bank.baseaddr)
return false;
}
+bool cpuboard_fc_check(uaecptr addr, uae_u32 *v, int size, bool write)
+{
+ if (!currprefs.cpuboard_type)
+ return false;
+
+ if (is_12gauge(&currprefs)) {
+ if ((addr == 0xc0000 || addr == 0xc0001) && size == 0) {
+ uae_u8 val = 0;
+ if (!write) {
+ if (addr == 0xc0000)
+ val = 0x00;
+ if (addr == 0xc0001)
+ val = 0x40; // bit 6 set = scsi driver at base+$c000 (0 = $8000000)
+ *v = val;
+ }
+ if (write)
+ write_log(_T("12GAUGE W %08x = %02x\n"), addr, (*v) & 0xff);
+ else
+ write_log(_T("12GAUGE R %08x = %02x\n"), addr, (*v) & 0xff);
+ return true;
+ }
+ return false;
+ }
+
+ return false;
+}
+
static void fixserial(struct uae_prefs *p, uae_u8 *rom, int size)
{
uae_u8 value1 = rom[16];
case BOARD_CSA:
switch(p->cpuboard_subtype)
{
+ case BOARD_CSA_SUB_12GAUGE:
+ aci->addrbank = &expamem_null;
+ return true;
case BOARD_CSA_SUB_MAGNUM40:
aci->addrbank = &expamem_null;
return true;
ncr710_magnum40_autoconfig_init, NULL, BOARD_AUTOCONFIG_Z2, 1,
magnum40_settings, NULL
},
+ {
+ _T("Twelve Gauge"),
+ _T("twelvegauge"),
+ ROMTYPE_CB_12GAUGE, 0,
+ twelvegauge_add_scsi_unit, EXPANSIONTYPE_SCSI,
+ BOARD_MEMORY_CUSTOM_32,
+ 32 * 1024 * 1024,
+ 0,
+ twelvegauge_init, NULL, BOARD_AUTOCONFIG_Z2, 1,
+ NULL, NULL
+ },
{
NULL
}
irc2ir (true);
if (getv == 1) {
+ const char *srcbx = !(flags & GF_FC) ? srcb : "sfc_nommu_get_byte";
+ const char *srcwx = !(flags & GF_FC) ? srcw : "sfc_nommu_get_word";
+ const char *srclx = !(flags & GF_FC) ? srcl : "sfc_nommu_get_long";
start_brace ();
if (using_mmu) {
if (flags & GF_FC) {
}
} else if (using_ce020 || using_prefetch_020) {
switch (size) {
- case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = %s (%sa);\n", name, srcb, name); count_read++; break;
- case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = %s (%sa);\n", name, srcw, name); count_read++; break;
- case sz_long: insn_n_cycles += 8; printf ("\tuae_s32 %s = %s (%sa);\n", name, srcl, name); count_read += 2; break;
+ case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = %s (%sa);\n", name, srcbx, name); count_read++; break;
+ case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = %s (%sa);\n", name, srcwx, name); count_read++; break;
+ case sz_long: insn_n_cycles += 8; printf ("\tuae_s32 %s = %s (%sa);\n", name, srclx, name); count_read += 2; break;
default: term ();
}
} else if (using_ce || using_prefetch) {
switch (size) {
- case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = %s (%sa);\n", name, srcb, name); count_read++; break;
- case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = %s (%sa);\n", name, srcw, name); count_read++; break;
+ case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = %s (%sa);\n", name, srcbx, name); count_read++; break;
+ case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = %s (%sa);\n", name, srcwx, name); count_read++; break;
case sz_long: {
insn_n_cycles += 8;
if ((flags & GF_REVERSE) && mode == Apdi)
- printf("\tuae_s32 %s = %s (%sa + 2); %s |= %s (%sa) << 16;\n", name, srcw, name, name, srcw, name);
+ printf("\tuae_s32 %s = %s (%sa + 2); %s |= %s (%sa) << 16;\n", name, srcwx, name, name, srcw, name);
else
- printf("\tuae_s32 %s = %s (%sa) << 16; %s |= %s (%sa + 2);\n", name, srcw, name, name, srcw, name);
+ printf("\tuae_s32 %s = %s (%sa) << 16; %s |= %s (%sa + 2);\n", name, srcwx, name, name, srcw, name);
count_read += 2;
break;
}
}
} else {
switch (size) {
- case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = %s (%sa);\n", name, srcb, name); count_read++; break;
- case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = %s (%sa);\n", name, srcw, name); count_read++; break;
- case sz_long: insn_n_cycles += 8; printf ("\tuae_s32 %s = %s (%sa);\n", name, srcl, name); count_read += 2; break;
+ case sz_byte: insn_n_cycles += 4; printf ("\tuae_s8 %s = %s (%sa);\n", name, srcbx, name); count_read++; break;
+ case sz_word: insn_n_cycles += 4; printf ("\tuae_s16 %s = %s (%sa);\n", name, srcwx, name); count_read++; break;
+ case sz_long: insn_n_cycles += 8; printf ("\tuae_s32 %s = %s (%sa);\n", name, srclx, name); count_read += 2; break;
default: term ();
}
}
case absl:
case PC16:
case PC8r:
+ {
+ const char *dstbx = !(flags & GF_FC) ? dstb : "dfc_nommu_put_byte";
+ const char *dstwx = !(flags & GF_FC) ? dstw : "dfc_nommu_put_word";
+ const char *dstlx = !(flags & GF_FC) ? dstl : "dfc_nommu_put_long";
if (!(flags & GF_NOFAULTPC))
gen_set_fault_pc ();
if (using_mmu) {
} else if (using_ce020 || using_prefetch_020) {
switch (size) {
case sz_byte:
- printf ("\t%s (%sa, %s);\n", dstb, to, from);
+ printf ("\t%s (%sa, %s);\n", dstbx, to, from);
count_write++;
break;
case sz_word:
if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
term ();
- printf ("\t%s (%sa, %s);\n", dstw, to, from);
+ printf ("\t%s (%sa, %s);\n", dstwx, to, from);
count_write++;
break;
case sz_long:
if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
term ();
- printf ("\t%s (%sa, %s);\n", dstl, to, from);
+ printf ("\t%s (%sa, %s);\n", dstlx, to, from);
count_write += 2;
break;
default:
switch (size) {
case sz_byte:
insn_n_cycles += 4;
- printf ("\t%s (%sa, %s);\n", dstb, to, from);
+ printf ("\t%s (%sa, %s);\n", dstbx, to, from);
count_write++;
break;
case sz_word:
insn_n_cycles += 4;
if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
term ();
- printf ("\t%s (%sa, %s);\n", dstw, to, from);
+ printf ("\t%s (%sa, %s);\n", dstwx, to, from);
count_write++;
break;
case sz_long:
if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
term ();
if (store_dir)
- printf ("\t%s (%sa + 2, %s); %s (%sa, %s >> 16);\n", dstw, to, from, dstw, to, from);
+ printf ("\t%s (%sa + 2, %s); %s (%sa, %s >> 16);\n", dstwx, to, from, dstwx, to, from);
else
- printf ("\t%s (%sa, %s >> 16); %s (%sa + 2, %s);\n", dstw, to, from, dstw, to, from);
+ printf ("\t%s (%sa, %s >> 16); %s (%sa + 2, %s);\n", dstwx, to, from, dstwx, to, from);
count_write += 2;
break;
default:
}
}
break;
+ }
case imm:
case imm0:
case imm1:
#define BOARD_CSA 14
#define BOARD_CSA_SUB_MAGNUM40 0
+#define BOARD_CSA_SUB_12GAUGE 1
#define BOARD_HARDITAL 15
#define BOARD_HARDITAL_SUB_TQM 0
extern uae_u32 get_word_icache040(uaecptr addr);
extern uae_u32 get_long_icache040(uaecptr addr);
+extern uae_u32 sfc_nommu_get_byte(uaecptr);
+extern uae_u32 sfc_nommu_get_word(uaecptr);
+extern uae_u32 sfc_nommu_get_long(uaecptr);
+extern void dfc_nommu_put_byte(uaecptr, uae_u32);
+extern void dfc_nommu_put_word(uaecptr, uae_u32);
+extern void dfc_nommu_put_long(uaecptr, uae_u32);
+
extern void (*x_do_cycles)(unsigned long);
extern void (*x_do_cycles_pre)(unsigned long);
extern void (*x_do_cycles_post)(unsigned long, uae_u32);
bool execute_other_cpu(int until);
void execute_other_cpu_single(void);
+uae_u32 process_cpu_indirect_memory_read(uae_u32 addr, int size);
+void process_cpu_indirect_memory_write(uae_u32 addr, uae_u32 data, int size);
+
#endif /* UAE_NEWCPU_H */
#define ROMTYPE_CB_A1230S2 0x0004001c
#define ROMTYPE_CB_TYPHOON2 0x0004001d
#define ROMTYPE_CB_QUIKPAK 0x0004001e
+#define ROMTYPE_CB_12GAUGE 0x0004001f
#define ROMTYPE_FREEZER 0x00080000
#define ROMTYPE_AR 0x00080001
void ivsvector_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
bool ivsvector_init(struct autoconfig_info *aci);
+void twelvegauge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
+bool twelvegauge_init(struct autoconfig_info *aci);
+
void soft_scsi_free(void);
void soft_scsi_reset(void);
regs.irc = x_get_word (pc + 2);
}
}
+
+extern bool cpuboard_fc_check(uaecptr addr, uae_u32 *v, int size, bool write);
+
+uae_u32 sfc_nommu_get_byte(uaecptr addr)
+{
+ uae_u32 v;
+ if (!cpuboard_fc_check(addr, &v, 0, false))
+ v = x_get_byte(addr);
+ return v;
+}
+uae_u32 sfc_nommu_get_word(uaecptr addr)
+{
+ uae_u32 v;
+ if (!cpuboard_fc_check(addr, &v, 1, false))
+ v = x_get_word(addr);
+ return v;
+}
+uae_u32 sfc_nommu_get_long(uaecptr addr)
+{
+ uae_u32 v;
+ if (!cpuboard_fc_check(addr, &v, 2, false))
+ v = x_get_long(addr);
+ return v;
+}
+void dfc_nommu_put_byte(uaecptr addr, uae_u32 v)
+{
+ if (!cpuboard_fc_check(addr, &v, 0, true))
+ x_put_byte(addr, v);
+}
+void dfc_nommu_put_word(uaecptr addr, uae_u32 v)
+{
+ if (!cpuboard_fc_check(addr, &v, 1, true))
+ x_put_word(addr, v);
+}
+void dfc_nommu_put_long(uaecptr addr, uae_u32 v)
+{
+ if (!cpuboard_fc_check(addr, &v, 2, true))
+ x_put_long(addr, v);
+}
ALTROMPN(225, 1, 2, 8192, ROMTYPE_EVEN | ROMTYPE_8BIT, NULL, 0x7989684f, 0x9dc4d885, 0x242bf7eb, 0xe75a01b2, 0x483c9e3c, 0x8013896b)
{ _T("CSA Magnum 040"), 0, 0, 0, 0, _T("MAGNUM040\0"), 65536, 226, 0, 0, ROMTYPE_CB_MAGNUM40, 0, 0, NULL,
0xb94e805b, 0x4c1859ba,0x7ea2cedb,0xf5251bed,0xfbb76e6c,0x0617300e },
+ { _T("CSA Twelve Gauge"), 0, 0, 0, 0, _T("12GAUGE\0"), 32768, 241, 0, 0, ROMTYPE_CB_12GAUGE, 0, 0, NULL,
+ 0x2a74074d, 0xc1f29093,0x491339cd,0xdc81f994,0x0f0965df,0xa3a193f2 },
{ _T("Hardital TQM"), 0, 0, 0, 0, _T("TQM\0"), 32768, 228, 0, 0, ROMTYPE_CB_TQM, 0, 0, NULL,
0x3bc9b90c, 0x24fa6ab8, 0x5ca64ae6, 0x43851a85, 0xa473ff0c, 0x5a48f272, NULL, NULL },
{ _T("MacroSystem Falcon 040 (No SCSI)"), 0, 0, 0, 0, _T("FALCON040\0"), 131072, 229, 0, 0, ROMTYPE_CB_FALCON40, 0, 0, NULL,
#define NCR5380_EVESHAMREF 38
#define OMTI_PROFEX 39
#define NCR5380_FASTTRAK 40
-#define NCR_LAST 41
+#define NCR5380_12GAUGE 41
+#define NCR_LAST 42
extern int log_scsiemu;
// sasi
bool active_select;
bool wait_select;
+
+ // 12 Gauge needs this (Driver has buggy BSY test)
+ bool busy_delayed_hack;
+ int busy_delayed_hack_cnt;
};
break;
case 4:
{
+ uae_u8 oldv = v;
uae_u8 t = raw_scsi_get_signal_phase(r);
v = 0;
if (t & SCSI_IO_BUSY)
v |= r->bus_phase << 2;
if (scsi->regs[1] & 0x80)
v |= 0x80;
+
+ scsi->regs[reg] = v;
+ if (scsi->busy_delayed_hack && !(v & (1 << 6)) && (oldv & (1 << 6))) {
+ scsi->busy_delayed_hack_cnt = 2;
+ }
+ if (scsi->busy_delayed_hack_cnt > 0) {
+ scsi->busy_delayed_hack_cnt--;
+ v |= 1 << 6;
+ }
}
break;
case 5:
return addr & 7;
}
+static int twelvegauge_reg(struct soft_scsi *ncr, uaecptr addr)
+{
+ if (addr & 0x8000)
+ return -1;
+ if (!(addr & 0x2000))
+ return -1;
+ if (addr & 0x100)
+ return 8;
+ return (addr >> 4) & 7;
+}
+
static uae_u8 read_684xx_dma(struct soft_scsi *ncr, uaecptr addr)
{
uae_u8 val = 0;
v = ncr->rom[addr & 0x7fff];
}
+ } else if (ncr->type == NCR5380_12GAUGE) {
+
+ reg = twelvegauge_reg(ncr, addr);
+ if (reg >= 0) {
+ v = ncr5380_bget(ncr, reg);
+ } else {
+ v = ncr->rom[addr & 0x7fff];
+ }
+
}
#if NCR5380_DEBUG > 1
reg = fasttrak_reg(ncr, addr);
if (reg >= 0)
ncr5380_bput(ncr, reg, val);
+
+ } else if (ncr->type == NCR5380_12GAUGE) {
+
+ reg = twelvegauge_reg(ncr, addr);
+ if (reg >= 0)
+ ncr5380_bput(ncr, reg, val);
}
#if NCR5380_DEBUG > 1
generic_soft_scsi_add(ch, ci, rc, NCR5380_PHOENIXBOARD, 65536, 32768, ROMTYPE_PHOENIXB);
}
+void twelvegauge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
+{
+ generic_soft_scsi_add(ch, ci, rc, NCR5380_12GAUGE, 65536, 65536, ROMTYPE_CB_12GAUGE);
+}
+
+bool twelvegauge_init(struct autoconfig_info *aci)
+{
+ const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_CB_12GAUGE);
+ if (!aci->doinit) {
+ load_rom_rc(aci->rc, ROMTYPE_CB_12GAUGE, 32768, 0, aci->autoconfig_raw, 128, 0);
+ return true;
+ }
+
+ struct soft_scsi *scsi = getscsi(aci->rc);
+ if (!scsi)
+ return false;
+
+ scsi->intena = true;
+ scsi->busy_delayed_hack = true;
+
+ load_rom_rc(aci->rc, ROMTYPE_CB_12GAUGE, 32768, 0, scsi->rom, 32768, 0);
+ memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
+
+ aci->addrbank = scsi->bank;
+
+ return true;
+}
+
void ivsvector_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
generic_soft_scsi_add(ch, ci, rc, NCR5380_IVSVECTOR, 65536, 65536, ROMTYPE_CB_VECTOR);