WinUAE/expansion.cpp
2015-09-04 19:53:13 +03:00

3582 lines
92 KiB
C++
Raw Blame History

/*
* UAE - The Un*x Amiga Emulator
*
* AutoConfig (tm) Expansions (ZorroII/III)
*
* Copyright 1996,1997 Stefan Reinauer <stepan@linux.de>
* Copyright 1997 Brian King <Brian_King@Mitel.com>
* - added gfxcard code
*
*/
#include "sysconfig.h"
#include "sysdeps.h"
#include "options.h"
#include "uae.h"
#include "memory.h"
#include "rommgr.h"
#include "custom.h"
#include "newcpu.h"
#include "savestate.h"
#include "zfile.h"
#include "catweasel.h"
#include "cdtv.h"
#include "threaddep/thread.h"
#include "a2091.h"
#include "a2065.h"
#include "gfxboard.h"
#include "cd32_fmv.h"
#include "ncr_scsi.h"
#include "ncr9x_scsi.h"
#include "scsi.h"
#include "debug.h"
#include "gayle.h"
#include "idecontrollers.h"
#include "cpuboard.h"
#include "sndboard.h"
#include "uae/ppc.h"
#include "autoconf.h"
#include "specialmonitors.h"
#include "inputdevice.h"
#include "pci.h"
#include "x86.h"
// More information in first revision HRM Appendix_G
#define BOARD_PROTOAUTOCONFIG 1
#define BOARD_AUTOCONFIG_Z2 2
#define BOARD_AUTOCONFIG_Z3 3
#define BOARD_NONAUTOCONFIG 4
#define BOARD_IGNORE 5
#define EXP_DEBUG 0
#define MAX_EXPANSION_BOARD_SPACE 16
/* ********************************************************** */
/* 00 / 02 */
/* er_Type */
#define Z2_MEM_8MB 0x00 /* Size of Memory Block */
#define Z2_MEM_4MB 0x07
#define Z2_MEM_2MB 0x06
#define Z2_MEM_1MB 0x05
#define Z2_MEM_512KB 0x04
#define Z2_MEM_256KB 0x03
#define Z2_MEM_128KB 0x02
#define Z2_MEM_64KB 0x01
/* extended definitions */
#define Z3_MEM_16MB 0x00
#define Z3_MEM_32MB 0x01
#define Z3_MEM_64MB 0x02
#define Z3_MEM_128MB 0x03
#define Z3_MEM_256MB 0x04
#define Z3_MEM_512MB 0x05
#define Z3_MEM_1GB 0x06
#define chainedconfig 0x08 /* Next config is part of the same card */
#define rom_card 0x10 /* ROM vector is valid */
#define add_memory 0x20 /* Link RAM into free memory list */
/* Type of Expansion Card */
#define protoautoconfig 0x40
#define zorroII 0xc0
#define zorroIII 0x80
/* ********************************************************** */
/* 04 - 06 & 10-16 */
/* Manufacturer */
#define commodore_g 513 /* Commodore Braunschweig (Germany) */
#define commodore 514 /* Commodore West Chester */
#define gvp 2017 /* GVP */
#define ass 2102 /* Advanced Systems & Software */
#define hackers_id 2011 /* Special ID for test cards */
/* Card Type */
#define commodore_a2091 3 /* A2091 / A590 Card from C= */
#define commodore_a2091_ram 10 /* A2091 / A590 Ram on HD-Card */
#define commodore_a2232 70 /* A2232 Multiport Expansion */
#define ass_nexus_scsi 1 /* Nexus SCSI Controller */
#define gvp_series_2_scsi 11
#define gvp_iv_24_gfx 32
/* ********************************************************** */
/* 08 - 0A */
/* er_Flags */
#define Z3_SS_MEM_SAME 0x00
#define Z3_SS_MEM_AUTO 0x01
#define Z3_SS_MEM_64KB 0x02
#define Z3_SS_MEM_128KB 0x03
#define Z3_SS_MEM_256KB 0x04
#define Z3_SS_MEM_512KB 0x05
#define Z3_SS_MEM_1MB 0x06 /* Zorro III card subsize */
#define Z3_SS_MEM_2MB 0x07
#define Z3_SS_MEM_4MB 0x08
#define Z3_SS_MEM_6MB 0x09
#define Z3_SS_MEM_8MB 0x0a
#define Z3_SS_MEM_10MB 0x0b
#define Z3_SS_MEM_12MB 0x0c
#define Z3_SS_MEM_14MB 0x0d
#define Z3_SS_MEM_defunct1 0x0e
#define Z3_SS_MEM_defunct2 0x0f
#define force_z3 0x10 /* *MUST* be set if card is Z3 */
#define ext_size 0x20 /* Use extended size table for bits 0-2 of er_Type */
#define no_shutup 0x40 /* Card cannot receive Shut_up_forever */
#define care_addr 0x80 /* Z2=Adress HAS to be $200000-$9fffff Z3=1->mem,0=io */
/* ********************************************************** */
/* 40-42 */
/* ec_interrupt (unused) */
#define enable_irq 0x01 /* enable Interrupt */
#define reset_card 0x04 /* Reset of Expansion Card - must be 0 */
#define card_int2 0x10 /* READ ONLY: IRQ 2 active */
#define card_irq6 0x20 /* READ ONLY: IRQ 6 active */
#define card_irq7 0x40 /* READ ONLY: IRQ 7 active */
#define does_irq 0x80 /* READ ONLY: Card currently throws IRQ */
/* ********************************************************** */
/* ROM defines (DiagVec) */
#define rom_4bit (0x00<<14) /* ROM width */
#define rom_8bit (0x01<<14)
#define rom_16bit (0x02<<14)
#define rom_never (0x00<<12) /* Never run Boot Code */
#define rom_install (0x01<<12) /* run code at install time */
#define rom_binddrv (0x02<<12) /* run code with binddrivers */
uaecptr ROM_filesys_resname, ROM_filesys_resid;
uaecptr ROM_filesys_diagentry;
uaecptr ROM_hardfile_resname, ROM_hardfile_resid;
uaecptr ROM_hardfile_init;
int uae_boot_rom_type;
int uae_boot_rom_size; /* size = code size only */
static bool chipdone;
/* ********************************************************** */
struct card_data
{
addrbank *(*initrc)(struct romconfig*);
addrbank *(*initnum)(int);
addrbank *(*map)(void);
struct romconfig *rc;
const TCHAR *name;
int flags;
int zorro;
};
static struct card_data cards[MAX_EXPANSION_BOARD_SPACE];
static int ecard, cardno, z3num;
static addrbank *expamem_bank_current;
static uae_u16 uae_id;
/* ********************************************************** */
/* Please note: ZorroIII implementation seems to work different
* than described in the HRM. This claims that ZorroIII config
* address is 0xff000000 while the ZorroII config space starts
* at 0x00e80000. In reality, both, Z2 and Z3 cards are
* configured in the ZorroII config space. Kickstart 3.1 doesn't
* even do a single read or write access to the ZorroIII space.
* The original Amiga include files tell the same as the HRM.
* ZorroIII: If you set ext_size in er_Flags and give a Z2-size
* in er_Type you can very likely add some ZorroII address space
* to a ZorroIII card on a real Amiga. This is not implemented
* yet.
* -- Stefan
*
* Surprising that 0xFF000000 isn't used. Maybe it depends on the
* ROM. Anyway, the HRM says that Z3 cards may appear in Z2 config
* space, so what we are doing here is correct.
* -- Bernd
*/
/* Autoconfig address space at 0xE80000 */
static uae_u8 expamem[65536];
static uae_u8 expamem_lo;
static uae_u16 expamem_hi;
static uaecptr expamem_z3_sum;
uaecptr expamem_z3_pointer;
uaecptr expamem_z2_pointer;
uae_u32 expamem_z3_size;
uae_u32 expamem_z2_size;
static uae_u32 expamem_board_size;
static uae_u32 expamem_board_pointer;
static bool z3hack_override;
void set_expamem_z3_hack_override(bool overridenoz3hack)
{
z3hack_override = overridenoz3hack;
}
bool expamem_z3hack(struct uae_prefs *p)
{
if (z3hack_override)
return false;
#ifdef WITH_PPC
if (regs.halted && ppc_state)
return false;
#endif
return p->z3_mapping_mode == Z3MAPPING_AUTO || p->z3_mapping_mode == Z3MAPPING_UAE || cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD_12xx;
}
/* Ugly hack for >2M chip RAM in single pool
* We can't add it any later or early boot menu
* stops working because it sets kicktag at the end
* of chip ram...
*/
static void addextrachip (uae_u32 sysbase)
{
if (currprefs.chipmem_size <= 0x00200000)
return;
if (sysbase & 0x80000001)
return;
if (!valid_address (sysbase, 1000))
return;
uae_u32 ml = get_long (sysbase + 322);
if (!valid_address (ml, 32))
return;
uae_u32 next;
while ((next = get_long (ml))) {
if (!valid_address (ml, 32))
return;
uae_u32 upper = get_long (ml + 24);
uae_u32 lower = get_long (ml + 20);
if (lower & ~0xffff) {
ml = next;
continue;
}
uae_u16 attr = get_word (ml + 14);
if ((attr & 0x8002) != 2) {
ml = next;
continue;
}
if (upper >= currprefs.chipmem_size)
return;
uae_u32 added = currprefs.chipmem_size - upper;
uae_u32 first = get_long (ml + 16);
put_long (ml + 24, currprefs.chipmem_size); // mh_Upper
put_long (ml + 28, get_long (ml + 28) + added); // mh_Free
uae_u32 next;
while (first) {
next = first;
first = get_long (next);
}
uae_u32 bytes = get_long (next + 4);
if (next + bytes == 0x00200000) {
put_long (next + 4, currprefs.chipmem_size - next);
} else {
put_long (0x00200000 + 0, 0);
put_long (0x00200000 + 4, added);
put_long (next, 0x00200000);
}
return;
}
}
addrbank expamem_null, expamem_none;
DECLARE_MEMORY_FUNCTIONS(expamem);
addrbank expamem_bank = {
expamem_lget, expamem_wget, expamem_bget,
expamem_lput, expamem_wput, expamem_bput,
default_xlate, default_check, NULL, NULL, _T("Autoconfig Z2"),
dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE
};
DECLARE_MEMORY_FUNCTIONS(expamemz3);
static addrbank expamemz3_bank = {
expamemz3_lget, expamemz3_wget, expamemz3_bget,
expamemz3_lput, expamemz3_wput, expamemz3_bput,
default_xlate, default_check, NULL, NULL, _T("Autoconfig Z3"),
dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE
};
static addrbank *expamem_map_clear (void)
{
write_log (_T("expamem_map_clear() got called. Shouldn't happen.\n"));
return NULL;
}
static void expamem_init_clear (void)
{
memset (expamem, 0xff, sizeof expamem);
}
/* autoconfig area is "non-existing" after last device */
static void expamem_init_clear_zero (void)
{
map_banks(&dummy_bank, 0xe8, 1, 0);
if (!currprefs.address_space_24)
map_banks(&dummy_bank, 0xff000000 >> 16, 1, 0);
}
static void expamem_init_clear2 (void)
{
expamem_bank.name = _T("Autoconfig Z2");
expamemz3_bank.name = _T("Autoconfig Z3");
expamem_init_clear_zero ();
ecard = cardno;
}
static addrbank *expamem_init_last (void)
{
expamem_init_clear2 ();
write_log (_T("Memory map after autoconfig:\n"));
memory_map_dump ();
return NULL;
}
static uae_u8 REGPARAM2 expamem_read(int addr)
{
uae_u8 b = (expamem[addr] & 0xf0) | (expamem[addr + 2] >> 4);
if (addr == 0 || addr == 2 || addr == 0x40 || addr == 0x42)
return b;
b = ~b;
return b;
}
static void REGPARAM2 expamem_write(uaecptr addr, uae_u32 value)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
addr &= 0xffff;
if (addr == 00 || addr == 02 || addr == 0x40 || addr == 0x42) {
expamem[addr] = (value & 0xf0);
expamem[addr + 2] = (value & 0x0f) << 4;
} else {
expamem[addr] = ~(value & 0xf0);
expamem[addr + 2] = ~((value & 0x0f) << 4);
}
}
static int REGPARAM2 expamem_type (void)
{
return expamem_read(0) & 0xc0;
}
static void call_card_init(int index)
{
addrbank *ab, *abe;
uae_u8 code;
uae_u32 expamem_z3_pointer_old;
expamem_bank.name = cards[ecard].name ? cards[ecard].name : _T("None");
if (cards[ecard].initnum)
ab = cards[ecard].initnum(0);
else
ab = cards[ecard].initrc(cards[ecard].rc);
expamem_z3_size = 0;
if (ab == &expamem_none) {
expamem_init_clear();
expamem_init_clear_zero();
map_banks(&expamem_bank, 0xE8, 1, 0);
if (!currprefs.address_space_24)
map_banks(&dummy_bank, 0xff000000 >> 16, 1, 0);
expamem_bank_current = NULL;
return;
}
if (ab == &expamem_null) {
expamem_next(NULL, NULL);
return;
}
abe = ab;
if (!abe)
abe = &expamem_bank;
if (abe != &expamem_bank) {
for (int i = 0; i < 16 * 4; i++)
expamem[i] = abe->bget(i);
}
code = expamem_read(0);
if ((code & 0xc0) == zorroII) {
// Z2
code &= 7;
if (code == 0)
expamem_z2_size = 8 * 1024 * 1024;
else
expamem_z2_size = 32768 << code;
expamem_board_size = expamem_z2_size;
expamem_board_pointer = expamem_z2_pointer;
} else if ((code & 0xc0) == zorroIII) {
// Z3
if (expamem_z3_sum < Z3BASE_UAE) {
expamem_z3_sum = currprefs.z3autoconfig_start;
if (currprefs.mbresmem_high_size >= 128 * 1024 * 1024 && expamem_z3_sum == Z3BASE_UAE)
expamem_z3_sum += (currprefs.mbresmem_high_size - 128 * 1024 * 1024) + 16 * 1024 * 1024;
if (!expamem_z3hack(&currprefs))
expamem_z3_sum = Z3BASE_REAL;
if (expamem_z3_sum == Z3BASE_UAE) {
expamem_z3_sum += currprefs.z3chipmem_size;
}
}
expamem_z3_pointer = expamem_z3_sum;
code &= 7;
if (expamem_read(8) & ext_size)
expamem_z3_size = (16 * 1024 * 1024) << code;
else
expamem_z3_size = 16 * 1024 * 1024;
expamem_z3_sum += expamem_z3_size;
expamem_z3_pointer_old = expamem_z3_pointer;
// align 32M boards (FastLane is 32M and needs to be aligned)
if (expamem_z3_size <= 32 * 1024 * 1024)
expamem_z3_pointer = (expamem_z3_pointer + expamem_z3_size - 1) & ~(expamem_z3_size - 1);
expamem_z3_sum += expamem_z3_pointer - expamem_z3_pointer_old;
expamem_board_size = expamem_z3_size;
expamem_board_pointer = expamem_z3_pointer;
} else if ((code & 0xc0) == 0x40) {
// 0x40 = "Box without init/diagnostic code"
// proto autoconfig "box" size.
//expamem_z2_size = (1 << ((code >> 3) & 7)) * 4096;
// much easier this way, all old-style boards were made for
// A1000 and didn't have passthrough connector.
expamem_z2_size = 65536;
expamem_board_size = expamem_z2_size;
expamem_board_pointer = expamem_z2_pointer;
}
if (ab) {
// non-NULL: not using expamem_bank
expamem_bank_current = ab;
if ((cards[ecard].flags & 1) && currprefs.cs_z3autoconfig && !currprefs.address_space_24) {
map_banks(&expamemz3_bank, 0xff000000 >> 16, 1, 0);
map_banks(&dummy_bank, 0xE8, 1, 0);
} else {
map_banks(&expamem_bank, 0xE8, 1, 0);
if (!currprefs.address_space_24)
map_banks(&dummy_bank, 0xff000000 >> 16, 1, 0);
}
} else {
if ((cards[ecard].flags & 1) && currprefs.cs_z3autoconfig && !currprefs.address_space_24) {
map_banks(&expamemz3_bank, 0xff000000 >> 16, 1, 0);
map_banks(&dummy_bank, 0xE8, 1, 0);
expamem_bank_current = &expamem_bank;
} else {
map_banks(&expamem_bank, 0xE8, 1, 0);
if (!currprefs.address_space_24)
map_banks(&dummy_bank, 0xff000000 >> 16, 1, 0);
expamem_bank_current = NULL;
}
}
}
static void boardmessage(addrbank *mapped, bool success)
{
uae_u8 type = expamem_read(0);
int size = expamem_board_size;
TCHAR sizemod = 'K';
size /= 1024;
if (size > 8 * 1024) {
sizemod = 'M';
size /= 1024;
}
write_log (_T("Card %d: Z%d 0x%08x %4d%c %s %s%s\n"),
ecard + 1, (type & 0xc0) == zorroII ? 2 : ((type & 0xc0) == zorroIII ? 3 : 1),
expamem_board_pointer, size, sizemod,
type & rom_card ? _T("ROM") : (type & add_memory ? _T("RAM") : _T("IO ")),
mapped->name,
success ? _T("") : _T(" SHUT UP"));
}
void expamem_shutup(addrbank *mapped)
{
if (mapped)
boardmessage(mapped, false);
}
void expamem_next (addrbank *mapped, addrbank *next)
{
if (mapped)
boardmessage(mapped, true);
expamem_init_clear();
expamem_init_clear_zero();
for (;;) {
++ecard;
if (ecard >= cardno)
break;
struct card_data *ec = &cards[ecard];
if (ec->initrc && ec->zorro == BOARD_NONAUTOCONFIG) {
ec->initrc(cards[ecard].rc);
} else {
call_card_init(ecard);
break;
}
}
if (ecard >= cardno) {
expamem_init_clear2();
expamem_init_last();
}
}
static uae_u32 REGPARAM2 expamem_lget (uaecptr addr)
{
if (expamem_bank_current && expamem_bank_current != &expamem_bank)
return expamem_bank_current->lget(addr);
write_log (_T("warning: Z2 READ.L from address $%08x PC=%x\n"), addr, M68K_GETPC);
return (expamem_wget (addr) << 16) | expamem_wget (addr + 2);
}
static uae_u32 REGPARAM2 expamem_wget (uaecptr addr)
{
if (expamem_bank_current && expamem_bank_current != &expamem_bank)
return expamem_bank_current->wget(addr);
if (expamem_type() != zorroIII) {
if (expamem_bank_current && expamem_bank_current != &expamem_bank)
return expamem_bank_current->bget(addr) << 8;
}
uae_u32 v = (expamem_bget (addr) << 8) | expamem_bget (addr + 1);
if (cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8) {
uae_u32 val = v;
cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8(addr, &val, 2, false);
v = val;
}
write_log (_T("warning: READ.W from address $%08x=%04x PC=%x\n"), addr, v & 0xffff, M68K_GETPC);
return v;
}
static uae_u32 REGPARAM2 expamem_bget (uaecptr addr)
{
uae_u8 b;
#ifdef JIT
special_mem |= S_READ;
#endif
if (!chipdone) {
chipdone = true;
addextrachip (get_long (4));
}
if (expamem_bank_current && expamem_bank_current != &expamem_bank)
return expamem_bank_current->bget(addr);
addr &= 0xFFFF;
b = expamem[addr];
if (cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8) {
uae_u32 val = b;
cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8(addr, &val, 1, false);
b = val;
}
#if EXP_DEBUG
write_log (_T("expamem_bget %x %x\n"), addr, b);
#endif
return b;
}
static void REGPARAM2 expamem_lput (uaecptr addr, uae_u32 value)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
if (expamem_bank_current && expamem_bank_current != &expamem_bank) {
expamem_bank_current->lput(addr, value);
return;
}
write_log (_T("warning: Z2 WRITE.L to address $%08x : value $%08x\n"), addr, value);
}
static void REGPARAM2 expamem_wput (uaecptr addr, uae_u32 value)
{
#if EXP_DEBUG
write_log (_T("expamem_wput %x %x\n"), addr, value);
#endif
#ifdef JIT
special_mem |= S_WRITE;
#endif
value &= 0xffff;
if (cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8) {
if (cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8(addr, &value, 2, true))
return;
}
if (ecard >= cardno)
return;
if (expamem_type () != zorroIII) {
write_log (_T("warning: WRITE.W to address $%08x : value $%x PC=%08x\n"), addr, value, M68K_GETPC);
}
switch (addr & 0xff) {
case 0x48:
// A2630 boot rom writes WORDs to Z2 boards!
if (expamem_type() == zorroII) {
expamem_lo = 0;
expamem_hi = (value >> 8) & 0xff;
expamem_z2_pointer = (expamem_hi | (expamem_lo >> 4)) << 16;
expamem_board_pointer = expamem_z2_pointer;
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), NULL);
return;
}
if (expamem_bank_current && expamem_bank_current != &expamem_bank) {
expamem_bank_current->bput(addr, value >> 8);
return;
}
}
break;
case 0x44:
if (expamem_type() == zorroIII) {
uaecptr addr;
expamem_hi = value & 0xff00;
addr = (expamem_hi | (expamem_lo >> 4)) << 16;
if (!expamem_z3hack(&currprefs)) {
expamem_z3_pointer = addr;
} else {
if (addr != expamem_z3_pointer) {
put_word (regs.regs[11] + 0x20, expamem_z3_pointer >> 16);
put_word (regs.regs[11] + 0x28, expamem_z3_pointer >> 16);
}
}
expamem_board_pointer = expamem_z3_pointer;
}
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), NULL);
return;
}
break;
case 0x4c:
if (cards[ecard].map) {
expamem_next (NULL, NULL);
return;
}
break;
}
if (expamem_bank_current && expamem_bank_current != &expamem_bank)
expamem_bank_current->wput(addr, value);
}
static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value)
{
#if EXP_DEBUG
write_log (_T("expamem_bput %x %x\n"), addr, value);
#endif
#ifdef JIT
special_mem |= S_WRITE;
#endif
value &= 0xff;
if (cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8) {
if (cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].e8(addr, &value, 1, true))
return;
}
if (ecard >= cardno)
return;
if (expamem_type() == protoautoconfig) {
switch (addr & 0xff) {
case 0x22:
expamem_hi = value & 0x7f;
expamem_z2_pointer = 0xe80000 | (expamem_hi * 4096);
expamem_board_pointer = expamem_z2_pointer;
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), NULL);
return;
}
break;
}
} else {
switch (addr & 0xff) {
case 0x48:
if (expamem_type() == zorroII) {
expamem_hi = value & 0xff;
expamem_z2_pointer = (expamem_hi | (expamem_lo >> 4)) << 16;
expamem_board_pointer = expamem_z2_pointer;
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), NULL);
return;
}
} else {
expamem_lo = value & 0xff;
}
break;
case 0x4a:
if (expamem_type () == zorroII)
expamem_lo = value & 0xff;
break;
case 0x4c:
if (cards[ecard].map) {
expamem_next(expamem_bank_current, NULL);
return;
}
break;
}
}
if (expamem_bank_current && expamem_bank_current != &expamem_bank)
expamem_bank_current->bput(addr, value);
}
static uae_u32 REGPARAM2 expamemz3_bget (uaecptr addr)
{
int reg = addr & 0xff;
if (!expamem_bank_current)
return 0;
if (addr & 0x100)
reg += 2;
return expamem_bank_current->bget(reg + 0);
}
static uae_u32 REGPARAM2 expamemz3_wget (uaecptr addr)
{
uae_u32 v = (expamemz3_bget (addr) << 8) | expamemz3_bget (addr + 1);
write_log (_T("warning: Z3 READ.W from address $%08x=%04x PC=%x\n"), addr, v & 0xffff, M68K_GETPC);
return v;
}
static uae_u32 REGPARAM2 expamemz3_lget (uaecptr addr)
{
write_log (_T("warning: Z3 READ.L from address $%08x PC=%x\n"), addr, M68K_GETPC);
return (expamemz3_wget (addr) << 16) | expamemz3_wget (addr + 2);
}
static void REGPARAM2 expamemz3_bput (uaecptr addr, uae_u32 value)
{
int reg = addr & 0xff;
if (!expamem_bank_current)
return;
if (addr & 0x100)
reg += 2;
if (reg == 0x48) {
if (expamem_type() == zorroII) {
expamem_hi = value & 0xff;
expamem_z2_pointer = (expamem_hi | (expamem_lo >> 4)) << 16;
expamem_board_pointer = expamem_z2_pointer;
} else {
expamem_lo = value & 0xff;
}
} else if (reg == 0x4a) {
if (expamem_type() == zorroII)
expamem_lo = value & 0xff;
}
expamem_bank_current->bput(reg, value);
}
static void REGPARAM2 expamemz3_wput (uaecptr addr, uae_u32 value)
{
int reg = addr & 0xff;
if (!expamem_bank_current)
return;
if (addr & 0x100)
reg += 2;
if (reg == 0x44) {
if (expamem_type() == zorroIII) {
uaecptr addr;
expamem_hi = value & 0xff00;
addr = (expamem_hi | (expamem_lo >> 4)) << 16;;
if (!expamem_z3hack(&currprefs)) {
expamem_z3_pointer = addr;
} else {
if (addr != expamem_z3_pointer) {
put_word (regs.regs[11] + 0x20, expamem_z3_pointer >> 16);
put_word (regs.regs[11] + 0x28, expamem_z3_pointer >> 16);
}
}
expamem_board_pointer = expamem_z3_pointer;
}
}
expamem_bank_current->wput(reg, value);
}
static void REGPARAM2 expamemz3_lput (uaecptr addr, uae_u32 value)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
write_log (_T("warning: Z3 WRITE.L to address $%08x : value $%08x\n"), addr, value);
}
#ifdef CD32
static addrbank *expamem_map_cd32fmv (void)
{
return cd32_fmv_init (expamem_z2_pointer);
}
static addrbank *expamem_init_cd32fmv (int devnum)
{
int ids[] = { 23, -1 };
struct romlist *rl = getromlistbyids (ids, NULL);
struct romdata *rd;
struct zfile *z;
expamem_init_clear ();
if (!rl)
return NULL;
write_log (_T("CD32 FMV ROM '%s' %d.%d\n"), rl->path, rl->rd->ver, rl->rd->rev);
rd = rl->rd;
z = read_rom (rd);
if (z) {
zfile_fread (expamem, 128, 1, z);
zfile_fclose (z);
}
return NULL;
}
#endif
/* ********************************************************** */
/*
* Fast Memory
*/
MEMORY_FUNCTIONS(fastmem);
MEMORY_FUNCTIONS_NOJIT(fastmem_nojit);
MEMORY_FUNCTIONS(fastmem2);
MEMORY_FUNCTIONS_NOJIT(fastmem2_nojit);
addrbank fastmem_bank = {
fastmem_lget, fastmem_wget, fastmem_bget,
fastmem_lput, fastmem_wput, fastmem_bput,
fastmem_xlate, fastmem_check, NULL, _T("fast"), _T("Fast memory"),
fastmem_lget, fastmem_wget, ABFLAG_RAM | ABFLAG_THREADSAFE
};
addrbank fastmem_nojit_bank = {
fastmem_nojit_lget, fastmem_nojit_wget, fastmem_bget,
fastmem_nojit_lput, fastmem_nojit_wput, fastmem_bput,
fastmem_nojit_xlate, fastmem_nojit_check, NULL, NULL, _T("Fast memory (nojit)"),
fastmem_nojit_lget, fastmem_nojit_wget, ABFLAG_RAM | ABFLAG_THREADSAFE
};
addrbank fastmem2_bank = {
fastmem2_lget, fastmem2_wget, fastmem2_bget,
fastmem2_lput, fastmem2_wput, fastmem2_bput,
fastmem2_xlate, fastmem2_check, NULL,_T("fast2"), _T("Fast memory 2"),
fastmem2_lget, fastmem2_wget, ABFLAG_RAM | ABFLAG_THREADSAFE
};
addrbank fastmem2_nojit_bank = {
fastmem2_nojit_lget, fastmem2_nojit_wget, fastmem2_nojit_bget,
fastmem2_nojit_lput, fastmem2_nojit_wput, fastmem2_nojit_bput,
fastmem2_nojit_xlate, fastmem2_nojit_check, NULL, NULL, _T("Fast memory #2 (nojit)"),
fastmem2_nojit_lget, fastmem2_nojit_wget, ABFLAG_RAM | ABFLAG_THREADSAFE
};
static addrbank *fastbanks[] =
{
&fastmem_bank,
&fastmem_nojit_bank,
&fastmem2_bank,
&fastmem2_nojit_bank
};
#ifdef CATWEASEL
/*
* Catweasel ZorroII
*/
DECLARE_MEMORY_FUNCTIONS(catweasel);
static uae_u32 catweasel_mask;
static uae_u32 catweasel_start;
static uae_u32 REGPARAM2 catweasel_lget (uaecptr addr)
{
#ifdef JIT
special_mem |= S_READ;
#endif
write_log (_T("catweasel_lget @%08X!\n"),addr);
return 0;
}
static uae_u32 REGPARAM2 catweasel_wget (uaecptr addr)
{
#ifdef JIT
special_mem |= S_READ;
#endif
write_log (_T("catweasel_wget @%08X!\n"),addr);
return 0;
}
static uae_u32 REGPARAM2 catweasel_bget (uaecptr addr)
{
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= catweasel_start & catweasel_mask;
addr &= catweasel_mask;
return catweasel_do_bget (addr);
}
static void REGPARAM2 catweasel_lput (uaecptr addr, uae_u32 l)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
write_log (_T("catweasel_lput @%08X=%08X!\n"),addr,l);
}
static void REGPARAM2 catweasel_wput (uaecptr addr, uae_u32 w)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
write_log (_T("catweasel_wput @%08X=%04X!\n"),addr,w);
}
static void REGPARAM2 catweasel_bput (uaecptr addr, uae_u32 b)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
addr -= catweasel_start & catweasel_mask;
addr &= catweasel_mask;
catweasel_do_bput (addr, b);
}
static int REGPARAM2 catweasel_check (uaecptr addr, uae_u32 size)
{
return 0;
}
static uae_u8 *REGPARAM2 catweasel_xlate (uaecptr addr)
{
write_log (_T("catweasel_xlate @%08X size %08X\n"), addr);
return 0;
}
static addrbank catweasel_bank = {
catweasel_lget, catweasel_wget, catweasel_bget,
catweasel_lput, catweasel_wput, catweasel_bput,
catweasel_xlate, catweasel_check, NULL, NULL, _T("Catweasel"),
dummy_lgeti, dummy_wgeti, ABFLAG_IO
};
static addrbank *expamem_map_catweasel (void)
{
catweasel_start = expamem_z2_pointer;
map_banks_z2(&catweasel_bank, catweasel_start >> 16, 1);
return &catweasel_bank;
}
static addrbank *expamem_init_catweasel (int devnum)
{
uae_u8 productid = cwc.type >= CATWEASEL_TYPE_MK3 ? 66 : 200;
uae_u16 vendorid = cwc.type >= CATWEASEL_TYPE_MK3 ? 4626 : 5001;
catweasel_mask = (cwc.type >= CATWEASEL_TYPE_MK3) ? 0xffff : 0x1ffff;
expamem_init_clear ();
expamem_write (0x00, (cwc.type >= CATWEASEL_TYPE_MK3 ? Z2_MEM_64KB : Z2_MEM_128KB) | zorroII);
expamem_write (0x04, productid);
expamem_write (0x08, 0);
expamem_write (0x10, vendorid >> 8);
expamem_write (0x14, vendorid & 0xff);
expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
expamem_write (0x24, 0x00); /* ser.no. Byte 3 */
expamem_write (0x28, 0x00); /* Rom-Offset hi */
expamem_write (0x2c, 0x00); /* ROM-Offset lo */
expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
return NULL;
}
#endif
#ifdef FILESYS
/*
* Filesystem device ROM
* This is very simple, the Amiga shouldn't be doing things with it.
*/
DECLARE_MEMORY_FUNCTIONS(filesys);
addrbank filesys_bank = {
filesys_lget, filesys_wget, filesys_bget,
filesys_lput, filesys_wput, filesys_bput,
default_xlate, default_check, NULL, _T("filesys"), _T("Filesystem autoconfig"),
dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE | ABFLAG_INDIRECT
};
static uae_u32 filesys_start; /* Determined by the OS */
static uae_u32 REGPARAM2 filesys_lget (uaecptr addr)
{
uae_u8 *m;
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= filesys_start & 65535;
addr &= 65535;
m = filesys_bank.baseaddr + addr;
#if EXP_DEBUG
write_log (_T("filesys_lget %x %x\n"), addr, do_get_mem_long ((uae_u32 *)m));
#endif
return do_get_mem_long ((uae_u32 *)m);
}
static uae_u32 REGPARAM2 filesys_wget (uaecptr addr)
{
uae_u8 *m;
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= filesys_start & 65535;
addr &= 65535;
m = filesys_bank.baseaddr + addr;
#if EXP_DEBUG
write_log (_T("filesys_wget %x %x\n"), addr, do_get_mem_word ((uae_u16 *)m));
#endif
return do_get_mem_word ((uae_u16 *)m);
}
static uae_u32 REGPARAM2 filesys_bget (uaecptr addr)
{
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= filesys_start & 65535;
addr &= 65535;
#if EXP_DEBUG
write_log (_T("filesys_bget %x %x\n"), addr, filesys_bank.baseaddr[addr]);
#endif
return filesys_bank.baseaddr[addr];
}
static void REGPARAM2 filesys_lput (uaecptr addr, uae_u32 l)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
write_log (_T("filesys_lput called PC=%08x\n"), M68K_GETPC);
}
static void REGPARAM2 filesys_wput (uaecptr addr, uae_u32 w)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
write_log (_T("filesys_wput called PC=%08x\n"), M68K_GETPC);
}
static void REGPARAM2 filesys_bput (uaecptr addr, uae_u32 b)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
#if EXP_DEBUG
write_log (_T("filesys_bput %x %x\n"), addr, b);
#endif
}
#endif /* FILESYS */
// experimental hardware uae board
DECLARE_MEMORY_FUNCTIONS(uaeboard);
addrbank uaeboard_bank = {
uaeboard_lget, uaeboard_wget, uaeboard_bget,
uaeboard_lput, uaeboard_wput, uaeboard_bput,
default_xlate, default_check, NULL, _T("uaeboard"), _T("uae x autoconfig board"),
dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE | ABFLAG_INDIRECT
};
static uae_u32 uaeboard_start; /* Determined by the OS */
static uae_u32 REGPARAM2 uaeboard_lget(uaecptr addr)
{
uae_u8 *m;
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= uaeboard_start & 65535;
addr &= 65535;
if (addr == 0x200 || addr == 0x201) {
mousehack_wakeup();
}
m = uaeboard_bank.baseaddr + addr;
#if EXP_DEBUG
write_log(_T("uaeboard_lget %x %x\n"), addr, do_get_mem_long((uae_u32 *)m));
#endif
return do_get_mem_long((uae_u32 *)m);
}
static uae_u32 REGPARAM2 uaeboard_wget(uaecptr addr)
{
uae_u8 *m;
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= uaeboard_start & 65535;
addr &= 65535;
if (addr == 0x200 || addr == 0x201) {
mousehack_wakeup();
}
m = uaeboard_bank.baseaddr + addr;
#if EXP_DEBUG
write_log(_T("uaeboard_wget %x %x\n"), addr, do_get_mem_word((uae_u16 *)m));
#endif
return do_get_mem_word((uae_u16 *)m);
}
static uae_u32 REGPARAM2 uaeboard_bget(uaecptr addr)
{
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= uaeboard_start & 65535;
addr &= 65535;
if (addr == 0x200 || addr == 0x201) {
mousehack_wakeup();
}
#if EXP_DEBUG
write_log(_T("uaeboard_bget %x %x\n"), addr, uaeboard_bank.baseaddr[addr]);
#endif
return uaeboard_bank.baseaddr[addr];
}
static void REGPARAM2 uaeboard_lput(uaecptr addr, uae_u32 l)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
write_log(_T("uaeboard_lput called PC=%08x\n"), M68K_GETPC);
}
static void REGPARAM2 uaeboard_wput(uaecptr addr, uae_u32 w)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
write_log(_T("uaeboard_wput called PC=%08x\n"), M68K_GETPC);
}
static void REGPARAM2 uaeboard_bput(uaecptr addr, uae_u32 b)
{
#ifdef JIT
special_mem |= S_WRITE;
#endif
#if EXP_DEBUG
write_log(_T("uaeboard_bput %x %x\n"), addr, b);
#endif
}
static addrbank *expamem_map_uaeboard(void)
{
uaeboard_start = expamem_z2_pointer;
map_banks_z2(&uaeboard_bank, uaeboard_start >> 16, 1);
return &uaeboard_bank;
}
static addrbank* expamem_init_uaeboard(int devnum)
{
uae_u8 *p = uaeboard_bank.baseaddr;
expamem_init_clear();
expamem_write(0x00, Z2_MEM_64KB | zorroII);
expamem_write(0x08, no_shutup);
expamem_write(0x04, 1);
expamem_write(0x10, 6502 >> 8);
expamem_write(0x14, 6502 & 0xff);
expamem_write(0x18, 0x00); /* ser.no. Byte 0 */
expamem_write(0x1c, 0x00); /* ser.no. Byte 1 */
expamem_write(0x20, 0x00); /* ser.no. Byte 2 */
expamem_write(0x24, 0x01); /* ser.no. Byte 3 */
/* er_InitDiagVec */
expamem_write(0x28, 0x00); /* Rom-Offset hi */
expamem_write(0x2c, 0x00); /* ROM-Offset lo */
memcpy(p, expamem, 0x100);
p += 0x100;
p[0] = 0x00;
p[1] = 0x00;
p[2] = 0x02;
p[3] = 0x00;
return NULL;
}
/*
* Z3fastmem Memory
*/
MEMORY_FUNCTIONS(z3fastmem);
MEMORY_FUNCTIONS(z3fastmem2);
MEMORY_FUNCTIONS(z3chipmem);
addrbank z3fastmem_bank = {
z3fastmem_lget, z3fastmem_wget, z3fastmem_bget,
z3fastmem_lput, z3fastmem_wput, z3fastmem_bput,
z3fastmem_xlate, z3fastmem_check, NULL, _T("z3"), _T("Zorro III Fast RAM"),
z3fastmem_lget, z3fastmem_wget, ABFLAG_RAM | ABFLAG_THREADSAFE
};
addrbank z3fastmem2_bank = {
z3fastmem2_lget, z3fastmem2_wget, z3fastmem2_bget,
z3fastmem2_lput, z3fastmem2_wput, z3fastmem2_bput,
z3fastmem2_xlate, z3fastmem2_check, NULL, _T("z3_2"), _T("Zorro III Fast RAM #2"),
z3fastmem2_lget, z3fastmem2_wget, ABFLAG_RAM | ABFLAG_THREADSAFE
};
addrbank z3chipmem_bank = {
z3chipmem_lget, z3chipmem_wget, z3chipmem_bget,
z3chipmem_lput, z3chipmem_wput, z3chipmem_bput,
z3chipmem_xlate, z3chipmem_check, NULL, _T("z3_chip"), _T("MegaChipRAM"),
z3chipmem_lget, z3chipmem_wget, ABFLAG_RAM | ABFLAG_THREADSAFE
};
/* ********************************************************** */
/*
* Expansion Card (ZORRO II) for 64/128/256/512KB 1/2/4/8MB of Fast Memory
*/
static addrbank *expamem_map_fastcard_2 (int boardnum)
{
uae_u32 start = ((expamem_hi | (expamem_lo >> 4)) << 16);
addrbank *ab = fastbanks[boardnum * 2 + ((start < 0x00A00000) ? 0 : 1)];
uae_u32 size = ab->allocated;
ab->start = start;
if (ab->start) {
map_banks_z2(ab, ab->start >> 16, size >> 16);
}
return ab;
}
static void fastmem_autoconfig(int boardnum, int zorro, uae_u8 type, uae_u32 serial, int allocated)
{
uae_u16 mid = 0;
uae_u8 pid;
uae_u8 flags = care_addr;
DEVICE_MEMORY_CALLBACK dmc = NULL;
struct romconfig *dmc_rc = NULL;
uae_u8 ac[16] = { 0 };
if (boardnum == 1) {
const struct cpuboardsubtype *cst = &cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype];
if (cst->memory_mid) {
mid = cst->memory_mid;
pid = cst->memory_pid;
serial = cst->memory_serial;
}
} else if (boardnum == 0) {
for (int i = 0; expansionroms[i].name; i++) {
const struct expansionromtype *erc = &expansionroms[i];
if (erc->zorro == zorro && cfgfile_board_enabled(&currprefs, erc->romtype, 0)) {
struct romconfig *rc = get_device_romconfig(&currprefs, erc->romtype, 0);
if (erc->subtypes) {
const struct expansionsubromtype *srt = &erc->subtypes[rc->subtype];
if (srt->memory_mid) {
mid = srt->memory_mid;
pid = srt->memory_pid;
serial = srt->memory_serial;
if (!srt->memory_after)
type |= chainedconfig;
}
} else {
if (erc->memory_mid) {
mid = erc->memory_mid;
pid = erc->memory_pid;
serial = erc->memory_serial;
if (!erc->memory_after)
type |= chainedconfig;
}
}
dmc = erc->memory_callback;
dmc_rc = rc;
break;
}
}
}
if (!mid) {
if (zorro <= 2) {
pid = currprefs.maprom && !currprefs.cpuboard_type ? 1 : 81;
} else {
int subsize = (allocated == 0x100000 ? Z3_SS_MEM_1MB
: allocated == 0x200000 ? Z3_SS_MEM_2MB
: allocated == 0x400000 ? Z3_SS_MEM_4MB
: allocated == 0x800000 ? Z3_SS_MEM_8MB
: Z3_SS_MEM_SAME);
pid = currprefs.maprom && !currprefs.cpuboard_type ? 3 : 83;
flags |= force_z3 | (allocated > 0x800000 ? ext_size : subsize);
}
mid = uae_id;
}
ac[0x00 / 4] = type;
ac[0x04 / 4] = pid;
ac[0x08 / 4] = flags;
ac[0x10 / 4] = mid >> 8;
ac[0x14 / 4] = mid;
ac[0x18 / 4] = serial >> 24;
ac[0x1c / 4] = serial >> 16;
ac[0x20 / 4] = serial >> 8;
ac[0x24 / 4] = serial >> 0;
if (dmc && dmc_rc)
dmc(dmc_rc, ac, allocated);
expamem_write(0x00, ac[0x00 / 4]);
expamem_write(0x04, ac[0x04 / 4]);
expamem_write(0x08, ac[0x08 / 4]);
expamem_write(0x10, ac[0x10 / 4]);
expamem_write(0x14, ac[0x14 / 4]);
expamem_write(0x18, ac[0x18 / 4]); /* ser.no. Byte 0 */
expamem_write(0x1c, ac[0x1c / 4]); /* ser.no. Byte 1 */
expamem_write(0x20, ac[0x20 / 4]); /* ser.no. Byte 2 */
expamem_write(0x24, ac[0x24 / 4]); /* ser.no. Byte 3 */
expamem_write(0x28, 0x00); /* ROM-Offset hi */
expamem_write(0x2c, 0x00); /* ROM-Offset lo */
expamem_write(0x40, 0x00); /* Ctrl/Statusreg.*/
}
static const uae_u8 a2630_autoconfig[] = { 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static addrbank *expamem_init_fastcard_2(int boardnum)
{
uae_u8 type = add_memory | zorroII;
int allocated = boardnum ? fastmem2_bank.allocated : fastmem_bank.allocated;
uae_u32 serial = 1;
if (allocated == 0)
return &expamem_null;
expamem_init_clear ();
if (allocated == 65536)
type |= Z2_MEM_64KB;
else if (allocated == 131072)
type |= Z2_MEM_128KB;
else if (allocated == 262144)
type |= Z2_MEM_256KB;
else if (allocated == 524288)
type |= Z2_MEM_512KB;
else if (allocated == 0x100000)
type |= Z2_MEM_1MB;
else if (allocated == 0x200000)
type |= Z2_MEM_2MB;
else if (allocated == 0x400000)
type |= Z2_MEM_4MB;
else if (allocated == 0x800000)
type |= Z2_MEM_8MB;
if (boardnum == 1) {
if (ISCPUBOARD(BOARD_COMMODORE, BOARD_COMMODORE_SUB_A26x0)) {
for (int i = 1; i < 16; i++)
expamem_write(i * 4, a2630_autoconfig[i]);
type &= 7;
type |= a2630_autoconfig[0] & ~7;
expamem_write(0, type);
return NULL;
}
}
fastmem_autoconfig(boardnum, 2, type, serial, allocated);
return NULL;
}
static addrbank *expamem_init_fastcard(int boardnum)
{
return expamem_init_fastcard_2(0);
}
static addrbank *expamem_init_fastcard2(int boardnum)
{
return expamem_init_fastcard_2(1);
}
static addrbank *expamem_map_fastcard (void)
{
return expamem_map_fastcard_2 (0);
}
static addrbank *expamem_map_fastcard2 (void)
{
return expamem_map_fastcard_2 (1);
}
bool expansion_is_next_board_fastram(void)
{
return ecard + 1 < MAX_EXPANSION_BOARD_SPACE && cards[ecard + 1].map == expamem_map_fastcard;
}
/* ********************************************************** */
#ifdef FILESYS
/*
* Filesystem device
*/
static addrbank *expamem_map_filesys (void)
{
uaecptr a;
// Warn if PPC doing autoconfig and UAE expansion enabled
static bool warned;
if (!warned && regs.halted < 0) {
warned = true;
// can't show dialogs from PPC thread, deadlock danger.
regs.halted = -2;
}
filesys_start = expamem_z2_pointer;
map_banks_z2(&filesys_bank, filesys_start >> 16, 1);
/* 68k code needs to know this. */
a = here ();
org (rtarea_base + RTAREA_FSBOARD);
dl (filesys_start + 0x2000);
org (a);
return &filesys_bank;
}
#define FILESYS_DIAGPOINT 0x01e0
#define FILESYS_BOOTPOINT 0x01e6
#define FILESYS_DIAGAREA 0x2000
static addrbank* expamem_init_filesys (int devnum)
{
/* struct DiagArea - the size has to be large enough to store several device ROMTags */
uae_u8 diagarea[] = { 0x90, 0x00, /* da_Config, da_Flags */
0x02, 0x00, /* da_Size */
FILESYS_DIAGPOINT >> 8, FILESYS_DIAGPOINT & 0xff,
FILESYS_BOOTPOINT >> 8, FILESYS_BOOTPOINT & 0xff,
0, 14, // Name offset
0, 0, 0, 0,
'U', 'A', 'E', 0
};
expamem_init_clear ();
expamem_write (0x00, Z2_MEM_64KB | rom_card | zorroII);
expamem_write (0x08, no_shutup);
expamem_write (0x04, currprefs.maprom && !currprefs.cpuboard_type ? 2 : 82);
expamem_write (0x10, uae_id >> 8);
expamem_write (0x14, uae_id & 0xff);
expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
/* er_InitDiagVec */
expamem_write (0x28, 0x20); /* Rom-Offset hi */
expamem_write (0x2c, 0x00); /* ROM-Offset lo */
expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
/* Build a DiagArea */
memcpy (expamem + FILESYS_DIAGAREA, diagarea, sizeof diagarea);
/* Call DiagEntry */
do_put_mem_word ((uae_u16 *)(expamem + FILESYS_DIAGAREA + FILESYS_DIAGPOINT), 0x4EF9); /* JMP */
do_put_mem_long ((uae_u32 *)(expamem + FILESYS_DIAGAREA + FILESYS_DIAGPOINT + 2), ROM_filesys_diagentry);
/* What comes next is a plain bootblock */
do_put_mem_word ((uae_u16 *)(expamem + FILESYS_DIAGAREA + FILESYS_BOOTPOINT), 0x4EF9); /* JMP */
do_put_mem_long ((uae_u32 *)(expamem + FILESYS_DIAGAREA + FILESYS_BOOTPOINT + 2), EXPANSION_bootcode);
memcpy (filesys_bank.baseaddr, expamem, 0x3000);
return NULL;
}
#endif
/*
* Zorro III expansion memory
*/
static addrbank * expamem_map_z3fastmem_2 (addrbank *bank, uaecptr *startp, uae_u32 size, uae_u32 allocated, int chip)
{
int z3fs = expamem_z3_pointer;
int start = *startp;
if (expamem_z3hack(&currprefs)) {
if (z3fs && start != z3fs) {
write_log (_T("WARNING: Z3MEM mapping changed from $%08x to $%08x\n"), start, z3fs);
map_banks(&dummy_bank, start >> 16, size >> 16, allocated);
*startp = z3fs;
map_banks_z3(bank, start >> 16, size >> 16);
}
} else {
map_banks_z3(bank, z3fs >> 16, size >> 16);
start = z3fs;
*startp = z3fs;
}
return bank;
}
static addrbank *expamem_map_z3fastmem (void)
{
return expamem_map_z3fastmem_2 (&z3fastmem_bank, &z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated, 0);
}
static addrbank *expamem_map_z3fastmem2 (void)
{
return expamem_map_z3fastmem_2 (&z3fastmem2_bank, &z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated, 0);
}
static addrbank *expamem_init_z3fastmem_2(int boardnum, addrbank *bank, uae_u32 start, uae_u32 size, uae_u32 allocated)
{
int code = (allocated == 0x100000 ? Z2_MEM_1MB
: allocated == 0x200000 ? Z2_MEM_2MB
: allocated == 0x400000 ? Z2_MEM_4MB
: allocated == 0x800000 ? Z2_MEM_8MB
: allocated == 0x1000000 ? Z3_MEM_16MB
: allocated == 0x2000000 ? Z3_MEM_32MB
: allocated == 0x4000000 ? Z3_MEM_64MB
: allocated == 0x8000000 ? Z3_MEM_128MB
: allocated == 0x10000000 ? Z3_MEM_256MB
: allocated == 0x20000000 ? Z3_MEM_512MB
: Z3_MEM_1GB);
if (allocated < 0x1000000)
code = Z3_MEM_16MB; /* Z3 physical board size is always at least 16M */
expamem_init_clear ();
fastmem_autoconfig(boardnum, 3, add_memory | zorroIII | code, 1, allocated);
map_banks_z3(bank, start >> 16, size >> 16);
return NULL;
}
static addrbank *expamem_init_z3fastmem (int devnum)
{
return expamem_init_z3fastmem_2 (0, &z3fastmem_bank, z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated);
}
static addrbank *expamem_init_z3fastmem2(int devnum)
{
return expamem_init_z3fastmem_2 (1, &z3fastmem2_bank, z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated);
}
#ifdef PICASSO96
/*
* Fake Graphics Card (ZORRO III) - BDK
*/
static addrbank *expamem_map_gfxcard_z3 (void)
{
gfxmem_bank.start = expamem_z3_pointer;
map_banks_z3(&gfxmem_bank, gfxmem_bank.start >> 16, gfxmem_bank.allocated >> 16);
return &gfxmem_bank;
}
static addrbank *expamem_map_gfxcard_z2 (void)
{
gfxmem_bank.start = expamem_z2_pointer;
map_banks_z2(&gfxmem_bank, gfxmem_bank.start >> 16, gfxmem_bank.allocated >> 16);
return &gfxmem_bank;
}
static addrbank *expamem_init_gfxcard (bool z3)
{
int code = (gfxmem_bank.allocated == 0x100000 ? Z2_MEM_1MB
: gfxmem_bank.allocated == 0x200000 ? Z2_MEM_2MB
: gfxmem_bank.allocated == 0x400000 ? Z2_MEM_4MB
: gfxmem_bank.allocated == 0x800000 ? Z2_MEM_8MB
: gfxmem_bank.allocated == 0x1000000 ? Z3_MEM_16MB
: gfxmem_bank.allocated == 0x2000000 ? Z3_MEM_32MB
: gfxmem_bank.allocated == 0x4000000 ? Z3_MEM_64MB
: gfxmem_bank.allocated == 0x8000000 ? Z3_MEM_128MB
: gfxmem_bank.allocated == 0x10000000 ? Z3_MEM_256MB
: gfxmem_bank.allocated == 0x20000000 ? Z3_MEM_512MB
: Z3_MEM_1GB);
int subsize = (gfxmem_bank.allocated == 0x100000 ? Z3_SS_MEM_1MB
: gfxmem_bank.allocated == 0x200000 ? Z3_SS_MEM_2MB
: gfxmem_bank.allocated == 0x400000 ? Z3_SS_MEM_4MB
: gfxmem_bank.allocated == 0x800000 ? Z3_SS_MEM_8MB
: Z3_SS_MEM_SAME);
if (gfxmem_bank.allocated < 0x1000000 && z3)
code = Z3_MEM_16MB; /* Z3 physical board size is always at least 16M */
expamem_init_clear ();
expamem_write (0x00, (z3 ? zorroIII : zorroII) | code);
expamem_write (0x08, care_addr | (z3 ? (force_z3 | (gfxmem_bank.allocated > 0x800000 ? ext_size: subsize)) : 0));
expamem_write (0x04, 96);
expamem_write (0x10, uae_id >> 8);
expamem_write (0x14, uae_id & 0xff);
expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
expamem_write (0x28, 0x00); /* ROM-Offset hi */
expamem_write (0x2c, 0x00); /* ROM-Offset lo */
expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
return NULL;
}
static addrbank *expamem_init_gfxcard_z3(int devnum)
{
return expamem_init_gfxcard (true);
}
static addrbank *expamem_init_gfxcard_z2 (int devnum)
{
return expamem_init_gfxcard (false);
}
#endif
#ifdef SAVESTATE
static size_t fast_filepos, fast2_filepos, z3_filepos, z3_filepos2, z3_fileposchip, p96_filepos;
#endif
void free_fastmemory (int boardnum)
{
if (!boardnum) {
mapped_free (&fastmem_bank);
} else {
mapped_free (&fastmem2_bank);
}
}
static bool mapped_malloc_dynamic (uae_u32 *currpsize, uae_u32 *changedpsize, addrbank *bank, int max, const TCHAR *name)
{
int alloc = *currpsize;
bank->allocated = 0;
bank->baseaddr = NULL;
bank->mask = 0;
if (!alloc)
return false;
while (alloc >= max * 1024 * 1024) {
bank->mask = alloc - 1;
bank->allocated = alloc;
bank->label = name;
if (mapped_malloc (bank)) {
*currpsize = alloc;
*changedpsize = alloc;
return true;
}
write_log (_T("Out of memory for %s, %d bytes.\n"), name, alloc);
alloc /= 2;
}
return false;
}
uaecptr expansion_startaddress(uaecptr addr, uae_u32 size)
{
if (!size)
return addr;
if (size < 16 * 1024 * 1024)
size = 16 * 1024 * 1024;
if (!expamem_z3hack(&currprefs))
return (addr + size - 1) & ~(size - 1);
return addr;
}
static void allocate_expamem (void)
{
currprefs.fastmem_size = changed_prefs.fastmem_size;
currprefs.fastmem2_size = changed_prefs.fastmem2_size;
currprefs.z3fastmem_size = changed_prefs.z3fastmem_size;
currprefs.z3fastmem2_size = changed_prefs.z3fastmem2_size;
currprefs.rtgmem_size = changed_prefs.rtgmem_size;
currprefs.rtgmem_type = changed_prefs.rtgmem_type;
currprefs.z3chipmem_size = changed_prefs.z3chipmem_size;
z3chipmem_bank.start = Z3BASE_UAE;
z3fastmem_bank.start = currprefs.z3autoconfig_start;
if (currprefs.mbresmem_high_size >= 128 * 1024 * 1024)
z3chipmem_bank.start += (currprefs.mbresmem_high_size - 128 * 1024 * 1024) + 16 * 1024 * 1024;
if (!expamem_z3hack(&currprefs))
z3fastmem_bank.start = Z3BASE_REAL;
if (z3fastmem_bank.start == Z3BASE_REAL) {
int z3off = cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype].z3extra;
if (z3off) {
z3fastmem_bank.start += z3off;
z3fastmem_bank.start = expansion_startaddress(z3fastmem_bank.start, currprefs.z3fastmem_size);
}
}
if (z3fastmem_bank.start == Z3BASE_UAE) {
if (currprefs.mbresmem_high_size >= 128 * 1024 * 1024)
z3fastmem_bank.start += (currprefs.mbresmem_high_size - 128 * 1024 * 1024) + 16 * 1024 * 1024;
z3fastmem_bank.start += currprefs.z3chipmem_size;
}
z3fastmem2_bank.start = z3fastmem_bank.start + currprefs.z3fastmem_size;
if (currprefs.z3chipmem_size && z3fastmem_bank.start - z3chipmem_bank.start < currprefs.z3chipmem_size)
currprefs.z3chipmem_size = changed_prefs.z3chipmem_size = 0;
if (fastmem_bank.allocated != currprefs.fastmem_size) {
free_fastmemory (0);
fastmem_bank.allocated = currprefs.fastmem_size;
fastmem_bank.mask = fastmem_bank.allocated - 1;
fastmem_nojit_bank.allocated = fastmem_bank.allocated;
fastmem_nojit_bank.mask = fastmem_bank.mask;
if (fastmem_bank.allocated) {
mapped_malloc (&fastmem_bank);
fastmem_nojit_bank.baseaddr = fastmem_bank.baseaddr;
if (fastmem_bank.baseaddr == 0) {
write_log (_T("Out of memory for fastmem card.\n"));
fastmem_bank.allocated = 0;
fastmem_nojit_bank.allocated = 0;
}
}
memory_hardreset (1);
}
if (fastmem2_bank.allocated != currprefs.fastmem2_size) {
free_fastmemory (1);
fastmem2_bank.allocated = currprefs.fastmem2_size;
fastmem2_bank.mask = fastmem2_bank.allocated - 1;
fastmem2_nojit_bank.allocated = fastmem2_bank.allocated;
fastmem2_nojit_bank.mask = fastmem2_bank.mask;
if (fastmem2_bank.allocated) {
mapped_malloc (&fastmem2_bank);
fastmem2_nojit_bank.baseaddr = fastmem2_bank.baseaddr;
if (fastmem2_bank.baseaddr == 0) {
write_log (_T("Out of memory for fastmem2 card.\n"));
fastmem2_bank.allocated = 0;
fastmem2_nojit_bank.allocated = 0;
}
}
memory_hardreset (1);
}
if (z3fastmem_bank.allocated != currprefs.z3fastmem_size) {
mapped_free (&z3fastmem_bank);
mapped_malloc_dynamic (&currprefs.z3fastmem_size, &changed_prefs.z3fastmem_size, &z3fastmem_bank, 1, _T("z3"));
memory_hardreset (1);
}
if (z3fastmem2_bank.allocated != currprefs.z3fastmem2_size) {
mapped_free (&z3fastmem2_bank);
z3fastmem2_bank.allocated = currprefs.z3fastmem2_size;
z3fastmem2_bank.mask = z3fastmem2_bank.allocated - 1;
if (z3fastmem2_bank.allocated) {
mapped_malloc (&z3fastmem2_bank);
if (z3fastmem2_bank.baseaddr == 0) {
write_log (_T("Out of memory for 32 bit fast memory #2.\n"));
z3fastmem2_bank.allocated = 0;
}
}
memory_hardreset (1);
}
if (z3chipmem_bank.allocated != currprefs.z3chipmem_size) {
mapped_free (&z3chipmem_bank);
mapped_malloc_dynamic (&currprefs.z3chipmem_size, &changed_prefs.z3chipmem_size, &z3chipmem_bank, 16, _T("z3_chip"));
memory_hardreset (1);
}
#ifdef PICASSO96
if (gfxmem_bank.allocated != currprefs.rtgmem_size) {
mapped_free (&gfxmem_bank);
if (currprefs.rtgmem_type < GFXBOARD_HARDWARE)
mapped_malloc_dynamic (&currprefs.rtgmem_size, &changed_prefs.rtgmem_size, &gfxmem_bank, 1, currprefs.rtgmem_type ? _T("z3_gfx") : _T("z2_gfx"));
memory_hardreset (1);
}
#endif
#ifdef SAVESTATE
if (savestate_state == STATE_RESTORE) {
if (fastmem_bank.allocated > 0) {
restore_ram (fast_filepos, fastmem_bank.baseaddr);
if (!fastmem_bank.start) {
// old statefile compatibility support
fastmem_bank.start = 0x00200000;
}
map_banks(&fastmem_bank, fastmem_bank.start >> 16, currprefs.fastmem_size >> 16,
fastmem_bank.allocated);
}
if (fastmem2_bank.allocated > 0) {
restore_ram (fast2_filepos, fastmem2_bank.baseaddr);
map_banks(&fastmem2_bank, fastmem2_bank.start >> 16, currprefs.fastmem2_size >> 16,
fastmem2_bank.allocated);
}
if (z3fastmem_bank.allocated > 0) {
restore_ram (z3_filepos, z3fastmem_bank.baseaddr);
map_banks(&z3fastmem_bank, z3fastmem_bank.start >> 16, currprefs.z3fastmem_size >> 16,
z3fastmem_bank.allocated);
}
if (z3fastmem2_bank.allocated > 0) {
restore_ram (z3_filepos2, z3fastmem2_bank.baseaddr);
map_banks(&z3fastmem2_bank, z3fastmem2_bank.start >> 16, currprefs.z3fastmem2_size >> 16,
z3fastmem2_bank.allocated);
}
if (z3chipmem_bank.allocated > 0) {
restore_ram (z3_fileposchip, z3chipmem_bank.baseaddr);
map_banks(&z3chipmem_bank, z3chipmem_bank.start >> 16, currprefs.z3chipmem_size >> 16,
z3chipmem_bank.allocated);
}
#ifdef PICASSO96
if (gfxmem_bank.allocated > 0 && gfxmem_bank.start > 0) {
restore_ram (p96_filepos, gfxmem_bank.baseaddr);
map_banks(&gfxmem_bank, gfxmem_bank.start >> 16, currprefs.rtgmem_size >> 16,
gfxmem_bank.allocated);
}
#endif
}
#endif /* SAVESTATE */
}
static uaecptr check_boot_rom (int *boot_rom_type)
{
uaecptr b = RTAREA_DEFAULT;
addrbank *ab;
*boot_rom_type = 0;
if (currprefs.boot_rom == 1)
return 0;
*boot_rom_type = 1;
if (currprefs.cs_cdtvcd || currprefs.cs_cdtvscsi || currprefs.uae_hide > 1)
b = RTAREA_BACKUP;
if (currprefs.cs_mbdmac == 1 || currprefs.cpuboard_type)
b = RTAREA_BACKUP;
// CSPPC enables MMU at boot and remaps 0xea0000->0xeffff.
if (ISCPUBOARD(BOARD_BLIZZARD, BOARD_BLIZZARD_SUB_PPC))
b = RTAREA_BACKUP_2;
ab = &get_mem_bank (RTAREA_DEFAULT);
if (ab) {
if (valid_address (RTAREA_DEFAULT, 65536))
b = RTAREA_BACKUP;
}
if (nr_directory_units (NULL))
return b;
if (nr_directory_units (&currprefs))
return b;
if (currprefs.socket_emu)
return b;
if (currprefs.uaeserial)
return b;
if (currprefs.scsi == 1)
return b;
if (currprefs.sana2)
return b;
if (currprefs.input_tablet > 0)
return b;
if (currprefs.rtgmem_size && currprefs.rtgmem_type < GFXBOARD_HARDWARE)
return b;
if (currprefs.win32_automount_removable)
return b;
if (currprefs.chipmem_size > 2 * 1024 * 1024)
return b;
if (currprefs.z3chipmem_size)
return b;
if (currprefs.boot_rom >= 3)
return b;
if (currprefs.boot_rom == 2 && b == 0xf00000) {
*boot_rom_type = -1;
return b;
}
*boot_rom_type = 0;
return 0;
}
uaecptr need_uae_boot_rom (void)
{
uaecptr v;
uae_boot_rom_type = 0;
v = check_boot_rom (&uae_boot_rom_type);
if (!rtarea_base) {
uae_boot_rom_type = 0;
v = 0;
}
return v;
}
static void add_cpu_expansions(int zorro)
{
const struct cpuboardsubtype *cst = &cpuboards[currprefs.cpuboard_type].subtypes[currprefs.cpuboard_subtype];
if (cst->init && cst->initzorro == zorro) {
int idx;
struct boardromconfig *brc = get_device_rom(&currprefs, ROMTYPE_CPUBOARD, 0, &idx);
struct romconfig *rc = &brc->roms[idx];
cards[cardno].flags = cst->initflag;
cards[cardno].name = cst->name;
cards[cardno].initrc = cst->init;
cards[cardno].rc = rc;
cards[cardno].zorro = zorro;
cards[cardno++].map = NULL;
if (cst->init2) {
cards[cardno].flags = cst->initflag;
cards[cardno].name = cst->name;
cards[cardno].initrc = cst->init2;
cards[cardno].zorro = zorro;
cards[cardno++].map = NULL;
}
}
}
static bool add_fastram_after_expansion(int zorro)
{
for (int i = 0; expansionroms[i].name; i++) {
const struct expansionromtype *ert = &expansionroms[i];
if (ert->zorro == zorro) {
for (int j = 0; j < MAX_DUPLICATE_EXPANSION_BOARDS; j++) {
struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, j);
if (rc) {
if (ert->subtypes) {
const struct expansionsubromtype *srt = &ert->subtypes[rc->subtype];
return srt->memory_after;
}
return ert->memory_after;
}
}
}
}
return false;
}
static void add_expansions(int zorro)
{
for (int i = 0; expansionroms[i].name; i++) {
const struct expansionromtype *ert = &expansionroms[i];
if (ert->zorro == zorro) {
for (int j = 0; j < MAX_DUPLICATE_EXPANSION_BOARDS; j++) {
struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, j);
if (rc) {
if (zorro == 1) {
ert->init(rc);
if (ert->init2)
ert->init2(rc);
} else {
cards[cardno].flags = 0;
cards[cardno].name = ert->name;
cards[cardno].initrc = ert->init;
cards[cardno].rc = rc;
cards[cardno].zorro = zorro;
cards[cardno++].map = NULL;
if (ert->init2) {
cards[cardno].flags = 0;
cards[cardno].name = ert->name;
cards[cardno].initrc = ert->init2;
cards[cardno].rc = rc;
cards[cardno].zorro = zorro;
cards[cardno++].map = NULL;
}
}
}
}
}
}
}
void expamem_reset (void)
{
int do_mount = 1;
ecard = 0;
cardno = 0;
chipdone = false;
if (currprefs.uae_hide)
uae_id = commodore;
else
uae_id = hackers_id;
allocate_expamem ();
expamem_bank.name = _T("Autoconfig [reset]");
/* check if Kickstart version is below 1.3 */
if (kickstart_version && do_mount
&& (/* Kickstart 1.0 & 1.1! */
kickstart_version == 0xFFFF
/* Kickstart < 1.3 */
|| kickstart_version < 34))
{
/* warn user */
write_log (_T("Kickstart version is below 1.3! Disabling automount devices.\n"));
do_mount = 0;
}
if (need_uae_boot_rom () == 0)
do_mount = 0;
if (uae_boot_rom_type <= 0)
do_mount = 0;
if (currprefs.cpuboard_type) {
// This may require first 128k slot.
cards[cardno].flags = 1;
cards[cardno].name = _T("CPUBoard");
cards[cardno].initrc = cpuboard_autoconfig_init;
cards[cardno++].map = NULL;
}
// add possible non-autoconfig boards
add_cpu_expansions(BOARD_NONAUTOCONFIG);
bool fastmem_after = false;
if (currprefs.fastmem_autoconfig) {
fastmem_after = add_fastram_after_expansion(BOARD_AUTOCONFIG_Z2);
if (!fastmem_after && fastmem_bank.baseaddr != NULL && (fastmem_bank.allocated <= 262144 || currprefs.chipmem_size <= 2 * 1024 * 1024)) {
cards[cardno].flags = 0;
cards[cardno].name = _T("Z2Fast");
cards[cardno].initnum = expamem_init_fastcard;
cards[cardno++].map = expamem_map_fastcard;
}
if (fastmem2_bank.baseaddr != NULL && (fastmem2_bank.allocated <= 262144 || currprefs.chipmem_size <= 2 * 1024 * 1024)) {
cards[cardno].flags = 0;
cards[cardno].name = _T("Z2Fast2");
cards[cardno].initnum = expamem_init_fastcard2;
cards[cardno++].map = expamem_map_fastcard2;
}
} else {
if (fastmem_bank.baseaddr) {
fastmem_bank.name = _T("Fast memory (non-autoconfig)");
map_banks(&fastmem_bank, 0x00200000 >> 16, fastmem_bank.allocated >> 16, 0);
}
if (fastmem2_bank.baseaddr != NULL) {
fastmem2_bank.name = _T("Fast memory 2 (non-autoconfig)");
map_banks(&fastmem2_bank, (0x00200000 + fastmem_bank.allocated) >> 16, fastmem2_bank.allocated >> 16, 0);
}
}
// immediately after Z2Fast so that they can be emulated as A590/A2091 with fast ram.
add_cpu_expansions(BOARD_AUTOCONFIG_Z2);
add_expansions(BOARD_AUTOCONFIG_Z2);
if (fastmem_after && currprefs.fastmem_autoconfig) {
if (fastmem_bank.baseaddr != NULL && (fastmem_bank.allocated <= 262144 || currprefs.chipmem_size <= 2 * 1024 * 1024)) {
cards[cardno].flags = 0;
cards[cardno].name = _T("Z2Fast");
cards[cardno].initnum = expamem_init_fastcard;
cards[cardno++].map = expamem_map_fastcard;
}
}
#ifdef CDTV
if (currprefs.cs_cdtvcd && !currprefs.cs_cdtvcr) {
cards[cardno].flags = 0;
cards[cardno].name = _T("CDTV DMAC");
cards[cardno].initrc = cdtv_init;
cards[cardno++].map = NULL;
}
#endif
#ifdef CD32
if (currprefs.cs_cd32cd && currprefs.fastmem_size == 0 && currprefs.chipmem_size <= 0x200000 && currprefs.cs_cd32fmv) {
cards[cardno].flags = 0;
cards[cardno].name = _T("CD32MPEG");
cards[cardno].initnum = expamem_init_cd32fmv;
cards[cardno++].map = expamem_map_cd32fmv;
}
#endif
#ifdef A2065
if (currprefs.a2065name[0]) {
cards[cardno].flags = 0;
cards[cardno].name = _T("A2065");
cards[cardno].initnum = a2065_init;
cards[cardno++].map = NULL;
}
#endif
#ifdef FILESYS
if (do_mount) {
cards[cardno].flags = 0;
cards[cardno].name = _T("UAEFS");
cards[cardno].initnum = expamem_init_filesys;
cards[cardno++].map = expamem_map_filesys;
}
if (currprefs.uaeboard) {
cards[cardno].flags = 0;
cards[cardno].name = _T("UAEBOARD");
cards[cardno].initnum = expamem_init_uaeboard;
cards[cardno++].map = expamem_map_uaeboard;
}
#endif
#ifdef CATWEASEL
if (currprefs.catweasel && catweasel_init ()) {
cards[cardno].flags = 0;
cards[cardno].name = _T("CWMK2");
cards[cardno].initnum = expamem_init_catweasel;
cards[cardno++].map = expamem_map_catweasel;
}
#endif
#ifdef PICASSO96
if (currprefs.rtgmem_type == GFXBOARD_UAE_Z2 && gfxmem_bank.baseaddr != NULL) {
cards[cardno].flags = 4;
cards[cardno].name = _T("Z2RTG");
cards[cardno].initnum = expamem_init_gfxcard_z2;
cards[cardno++].map = expamem_map_gfxcard_z2;
}
#endif
#ifdef GFXBOARD
if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE && gfxboard_get_configtype(currprefs.rtgmem_type) <= 2) {
cards[cardno].flags = 4;
if (currprefs.rtgmem_type == GFXBOARD_A2410) {
cards[cardno].name = _T("Gfxboard A2410");
cards[cardno++].initnum = tms_init;
} else {
cards[cardno].name = _T("Gfxboard VRAM Zorro II");
cards[cardno++].initnum = gfxboard_init_memory;
if (gfxboard_num_boards (currprefs.rtgmem_type) == 3) {
cards[cardno].flags = 0;
cards[cardno].name = _T("Gfxboard VRAM Zorro II Extra");
cards[cardno++].initnum = gfxboard_init_memory_p4_z2;
}
if (gfxboard_is_registers (currprefs.rtgmem_type)) {
cards[cardno].flags = 0;
cards[cardno].name = _T ("Gfxboard Registers");
cards[cardno++].initnum = gfxboard_init_registers;
}
}
}
#endif
#ifdef WITH_TOCCATA
if (currprefs.sound_toccata) {
cards[cardno].flags = 0;
cards[cardno].name = _T("Toccata");
cards[cardno++].initnum = sndboard_init;
}
#endif
if (currprefs.monitoremu == MONITOREMU_FIRECRACKER24) {
cards[cardno].flags = 0;
cards[cardno].name = _T("FireCracker24");
cards[cardno++].initnum = specialmonitor_autoconfig_init;
}
/* Z3 boards last */
if (!currprefs.address_space_24) {
add_cpu_expansions(BOARD_AUTOCONFIG_Z3);
if (z3fastmem_bank.baseaddr != NULL) {
z3num = 0;
cards[cardno].flags = 2 | 1;
cards[cardno].name = _T("Z3Fast");
cards[cardno].initnum = expamem_init_z3fastmem;
cards[cardno++].map = expamem_map_z3fastmem;
if (expamem_z3hack(&currprefs))
map_banks_z3(&z3fastmem_bank, z3fastmem_bank.start >> 16, currprefs.z3fastmem_size >> 16);
if (z3fastmem2_bank.baseaddr != NULL) {
cards[cardno].flags = 2 | 1;
cards[cardno].name = _T("Z3Fast2");
cards[cardno].initnum = expamem_init_z3fastmem2;
cards[cardno++].map = expamem_map_z3fastmem2;
if (expamem_z3hack(&currprefs))
map_banks_z3(&z3fastmem2_bank, z3fastmem2_bank.start >> 16, currprefs.z3fastmem2_size >> 16);
}
}
if (z3chipmem_bank.baseaddr != NULL)
map_banks_z3(&z3chipmem_bank, z3chipmem_bank.start >> 16, currprefs.z3chipmem_size >> 16);
#ifdef PICASSO96
if (currprefs.rtgmem_type == GFXBOARD_UAE_Z3 && gfxmem_bank.baseaddr != NULL) {
cards[cardno].flags = 4 | 1;
cards[cardno].name = _T("Z3RTG");
cards[cardno].initnum = expamem_init_gfxcard_z3;
cards[cardno++].map = expamem_map_gfxcard_z3;
}
#endif
#ifdef GFXBOARD
if (currprefs.rtgmem_type >= GFXBOARD_HARDWARE && gfxboard_get_configtype(currprefs.rtgmem_type) == 3) {
cards[cardno].flags = 4 | 1;
cards[cardno].name = _T ("Gfxboard VRAM Zorro III");
cards[cardno++].initnum = gfxboard_init_memory;
cards[cardno].flags = 1;
cards[cardno].name = _T ("Gfxboard Registers");
cards[cardno++].initnum = gfxboard_init_registers;
}
#endif
add_expansions(BOARD_AUTOCONFIG_Z3);
}
add_expansions(BOARD_NONAUTOCONFIG);
expamem_z3_pointer = 0;
expamem_z3_sum = 0;
expamem_z2_pointer = 0;
if (cardno == 0 || savestate_state)
expamem_init_clear_zero ();
else
call_card_init(0);
}
void expansion_init (void)
{
if (savestate_state != STATE_RESTORE) {
fastmem_bank.allocated = 0;
fastmem_bank.mask = fastmem_bank.start = 0;
fastmem_bank.baseaddr = NULL;
fastmem_nojit_bank.allocated = 0;
fastmem_nojit_bank.mask = fastmem_nojit_bank.start = 0;
fastmem_nojit_bank.baseaddr = NULL;
fastmem2_bank.allocated = 0;
fastmem2_bank.mask = fastmem2_bank.start = 0;
fastmem2_bank.baseaddr = NULL;
fastmem2_nojit_bank.allocated = 0;
fastmem2_nojit_bank.mask = fastmem2_nojit_bank.start = 0;
fastmem2_nojit_bank.baseaddr = NULL;
#ifdef PICASSO96
gfxmem_bank.allocated = 0;
gfxmem_bank.mask = gfxmem_bank.start = 0;
gfxmem_bank.baseaddr = NULL;
#endif
#ifdef CATWEASEL
catweasel_mask = catweasel_start = 0;
#endif
z3fastmem_bank.allocated = 0;
z3fastmem_bank.mask = z3fastmem_bank.start = 0;
z3fastmem_bank.baseaddr = NULL;
z3fastmem2_bank.allocated = 0;
z3fastmem2_bank.mask = z3fastmem2_bank.start = 0;
z3fastmem2_bank.baseaddr = NULL;
z3chipmem_bank.allocated = 0;
z3chipmem_bank.mask = z3chipmem_bank.start = 0;
z3chipmem_bank.baseaddr = NULL;
}
#ifdef FILESYS
filesys_start = 0;
#endif
allocate_expamem ();
#ifdef FILESYS
filesys_bank.allocated = 0x10000;
if (!mapped_malloc (&filesys_bank)) {
write_log (_T("virtual memory exhausted (filesysory)!\n"));
exit (0);
}
#endif
if (currprefs.uaeboard) {
uaeboard_bank.allocated = 0x10000;
mapped_malloc(&uaeboard_bank);
}
}
void expansion_cleanup (void)
{
mapped_free (&fastmem_bank);
fastmem_nojit_bank.baseaddr = NULL;
mapped_free (&fastmem2_bank);
fastmem2_nojit_bank.baseaddr = NULL;
mapped_free (&z3fastmem_bank);
mapped_free (&z3fastmem2_bank);
mapped_free (&z3chipmem_bank);
#ifdef PICASSO96
if (currprefs.rtgmem_type < GFXBOARD_HARDWARE)
mapped_free (&gfxmem_bank);
#endif
#ifdef FILESYS
mapped_free (&filesys_bank);
#endif
if (currprefs.uaeboard) {
mapped_free(&uaeboard_bank);
}
#ifdef CATWEASEL
catweasel_free ();
#endif
}
static void clear_bank (addrbank *ab)
{
if (!ab->baseaddr || !ab->allocated)
return;
memset (ab->baseaddr, 0, ab->allocated > 0x800000 ? 0x800000 : ab->allocated);
}
void expansion_clear (void)
{
clear_bank (&fastmem_bank);
clear_bank (&fastmem2_bank);
clear_bank (&z3fastmem_bank);
clear_bank (&z3fastmem2_bank);
clear_bank (&z3chipmem_bank);
clear_bank (&gfxmem_bank);
}
#ifdef SAVESTATE
/* State save/restore code. */
uae_u8 *save_fram (int *len, int num)
{
if (num) {
*len = fastmem2_bank.allocated;
return fastmem2_bank.baseaddr;
} else {
*len = fastmem_bank.allocated;
return fastmem_bank.baseaddr;
}
}
uae_u8 *save_zram (int *len, int num)
{
if (num < 0) {
*len = z3chipmem_bank.allocated;
return z3chipmem_bank.baseaddr;
}
*len = num ? z3fastmem2_bank.allocated : z3fastmem_bank.allocated;
return num ? z3fastmem2_bank.baseaddr : z3fastmem_bank.baseaddr;
}
uae_u8 *save_pram (int *len)
{
*len = gfxmem_bank.allocated;
return gfxmem_bank.baseaddr;
}
void restore_fram (int len, size_t filepos, int num)
{
if (num) {
fast2_filepos = filepos;
changed_prefs.fastmem2_size = len;
} else {
fast_filepos = filepos;
changed_prefs.fastmem_size = len;
}
}
static void restore_fram2 (int len, size_t filepos)
{
fast2_filepos = filepos;
changed_prefs.fastmem2_size = len;
}
void restore_zram (int len, size_t filepos, int num)
{
if (num == -1) {
z3_fileposchip = filepos;
changed_prefs.z3chipmem_size = len;
} else if (num == 1) {
z3_filepos2 = filepos;
changed_prefs.z3fastmem2_size = len;
} else {
z3_filepos = filepos;
changed_prefs.z3fastmem_size = len;
}
}
void restore_pram (int len, size_t filepos)
{
p96_filepos = filepos;
changed_prefs.rtgmem_size = len;
}
uae_u8 *save_expansion (int *len, uae_u8 *dstptr)
{
uae_u8 *dst, *dstbak;
if (dstptr)
dst = dstbak = dstptr;
else
dstbak = dst = xmalloc (uae_u8, 6 * 4);
save_u32 (fastmem_bank.start);
save_u32 (z3fastmem_bank.start);
save_u32 (gfxmem_bank.start);
save_u32 (rtarea_base);
save_u32 (fastmem_bank.start);
*len = 4 + 4 + 4 + 4 + 4;
return dstbak;
}
uae_u8 *restore_expansion (uae_u8 *src)
{
fastmem_bank.start = restore_u32 ();
z3fastmem_bank.start = restore_u32 ();
gfxmem_bank.start = restore_u32 ();
rtarea_base = restore_u32 ();
fastmem2_bank.start = restore_u32 ();
if (rtarea_base != 0 && rtarea_base != RTAREA_DEFAULT && rtarea_base != RTAREA_BACKUP && rtarea_base != RTAREA_BACKUP_2)
rtarea_base = 0;
return src;
}
#endif /* SAVESTATE */
void add_cpuboard_unit(int unit, struct uaedev_config_info *uci, struct romconfig *rc);
#if 0
static const struct expansionsubromtype a2090_sub[] = {
{
_T("A2090a"), _T("a2090a"),
0, 0, 0,
{ 0 },
},
{
_T("A2090a + 1M RAM"), _T("a2090a_2"),
0, 0, 0,
{ 0 },
},
{
NULL
}
};
#endif
static const struct expansionsubromtype a2091_sub[] = {
{
_T("DMAC-01"), _T("dmac01"), 0,
commodore, commodore_a2091_ram, 0, true,
{ 0 }
},
{
_T("DMAC-02"), _T("dmac02"), 0,
commodore, commodore_a2091_ram, 0, true,
{ 0 }
},
{
NULL
}
};
static const struct expansionsubromtype gvp1_sub[] = {
{
_T("Impact A2000-1/X"), _T("a2000-1"), 0,
1761, 8, 0, false,
{ 0 }
},
{
_T("Impact A2000-HC"), _T("a2000-hc"), 0,
1761, 8, 0, false,
{ 0 }
},
{
_T("Impact A2000-HC+2"), _T("a2000-hc+"), 0,
1761, 8, 0, false,
{ 0 }
},
{
NULL
}
};
static const struct expansionsubromtype masoboshi_sub[] = {
{
_T("MC-302"), _T("mc-302"), 0,
2157, 3, 0, false,
{ 0 }
},
{
_T("MC-702"), _T("mc-702"), 0,
2157, 3, 0, false,
{ 0 }
},
{
NULL
}
};
static const struct expansionsubromtype rochard_sub[] = {
{
_T("IDE"), _T("ide"), 0,
2144, 2, 0, false,
{ 0 }
},
{
_T("IDE+SCSI"), _T("scsi"), 0,
2144, 2, 0, false,
{ 0 }
},
{
NULL
}
};
static const struct expansionsubromtype supra_sub[] = {
{
_T("A500 ByteSync/XP"), _T("bytesync"), ROMTYPE_NONE | ROMTYPE_SUPRA,
1056, 9, 0, false,
{ 0xd1, 13, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
{
_T("A2000 Word Sync"), _T("wordsync"), ROMTYPE_NONE | ROMTYPE_SUPRA,
1056, 9, 0, false,
{ 0xd1, 12, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
{
_T("A500 Autoboot"), _T("500"), ROMTYPE_NONE | ROMTYPE_SUPRA,
1056, 5, 0, false,
{ 0xd1, 8, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
{
_T("Non Autoboot (4x4)"), _T("4x4"), ROMTYPE_NOT | ROMTYPE_SUPRA,
1056, 2, 0, false,
{ 0xc1, 1, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
},
{
_T("A2000 DMA"), _T("dma"), ROMTYPE_NONE | ROMTYPE_SUPRADMA,
1056, 2, 0, false,
{ 0xd1, 3, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00 },
},
{
NULL
}
};
static const struct expansionsubromtype mediator_sub[] = {
{
_T("1200"), _T("1200"), ROMTYPE_NOT | ROMTYPE_MEDIATOR
},
{
_T("1200TX"), _T("1200tx"), ROMTYPE_NOT | ROMTYPE_MEDIATOR
},
{
_T("4000MK2"), _T("4000mkii"), ROMTYPE_NOT | ROMTYPE_MEDIATOR
},
{
NULL
}
};
static const struct expansionboardsettings mediator_settings[] = {
{
_T("Full PCI DMA"),
_T("fulldma")
},
{
_T("Win Size"),
_T("winsize")
},
{
_T("Swap Config"),
_T("swapconfig")
},
{
NULL
}
};
static const struct expansionboardsettings bridge_settings[] = {
{
_T("Full PCI DMA"),
_T("fulldma")
},
{
NULL
}
};
static const struct expansionboardsettings x86at286_bridge_settings[] = {
{
// 14
_T("Default video\0") _T("Monochrome\0") _T("Color\0"),
_T("video\0") _T("mono\0") _T("color\0"),
true, false, 14
},
{
// 15
_T("Keyboard lock"),
_T("keylock"),
false
},
{ // 16 - 18
_T("Memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0"),
_T("memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0"),
true, false, 0
},
{ // 19 - 20
_T("CPU core\0") _T("DOSBox simple\0") _T("DOSBox normal\0") _T("DOSBox full\0") _T("DOSBox auto\0"),
_T("cpu\0") _T("dbsimple\0") _T("dbnormal\0") _T("dbfull\0") _T("dbauto\0"),
true, false, 0
},
{ // 22
_T("FPU"),
_T("fpu"),
false, false, 1
},
{ // 23 - 25
_T("CPU Arch\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
_T("cpuarch\0") _T("auto") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
true, false, 0
},
{
NULL
}
};
static const struct expansionboardsettings x86at386_bridge_settings[] = {
{
// 15
_T("Keyboard lock"),
_T("keylock"),
false, false, 15
},
{ // 16 - 18
_T("Memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0") _T("64M\0"),
_T("memory\0") _T("1M\0") _T("2M\0") _T("4M\0") _T("8M\0") _T("16M\0") _T("32M\0") _T("64M\0"),
true, false, 0
},
{ // 19 - 20
_T("CPU core\0") _T("DOSBox simple\0") _T("DOSBox normal\0") _T("DOSBox full\0") _T("DOSBox auto\0"),
_T("cpu\0") _T("dbsimple\0") _T("dbnormal\0") _T("dbfull\0") _T("dbauto\0"),
true, false, 0
},
{ // 22
_T("FPU"),
_T("fpu"),
false, false, 1
},
{ // 23 - 25
_T("CPU Arch\0") _T("auto\0") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
_T("cpuarch\0") _T("auto\0") _T("386\0") _T("386_prefetch\0") _T("386_slow\0") _T("486_slow\0") _T("486_prefetch\0") _T("pentium_slow\0"),
true, false, 0
},
{
NULL
}
};
static const struct expansionboardsettings x86_bridge_settings[] = {
{
// 2-3
_T("Memory (SW1:3-4)\0") _T("128K\0") _T("256K\0") _T("512K\0") _T("640K\0"),
_T("memory\0") _T("128k\0") _T("256k\0") _T("512k\0") _T("640k\0"),
true, false, 2
},
{
// 4-5
_T("Default video (J1)\0") _T("Monochrome\0") _T("Color 40x25\0") _T("Color 80x25\0") _T("None\0"),
_T("video\0") _T("mono\0") _T("color40\0") _T("color80\0") _T("none\0"),
true, false, 0
},
{ // 19 - 21
_T("CPU core\0") _T("Fake86\0") _T("DOSBox simple\0") _T("DOSBox normal\0") _T("DOSBox full\0") _T("DOSBox auto\0"),
_T("cpu\0") _T("fake86\0") _T("dbsimple\0") _T("dbnormal\0") _T("dbfull\0") _T("dbauto\0"),
true, false, 19 - 6
},
{ // 22
_T("FPU (DOSBox CPU only)"),
_T("fpu")
},
{
NULL
}
};
static const struct expansionboardsettings x86_bridge_sidecar_settings[] = {
{
// 0
_T("System Diagnostics (SW1:1)"),
_T("diagnostics"),
},
{
// 1
_T("8037 installed (SW1:2)"),
_T("fpu"),
},
{
// 2-3
_T("Memory (SW1:3-4)\0") _T("128K\0") _T("256K\0") _T("512K\0") _T("640K\0"),
_T("memory\0") _T("128k\0") _T("256k\0") _T("512k\0") _T("640k\0"),
true
},
{
// 4-5
_T("Default video (SW1:5-6)\0") _T("Monochrome\0") _T("Color 40x25\0") _T("Color 80x25\0") _T("None\0"),
_T("video\0") _T("mono\0") _T("color40\0") _T("color80\0") _T("none\0"),
true
},
{
// 6-7
_T("Floppy drives (SW1:7-8)\0") _T("1\0") _T("2\0") _T("3\0") _T("4\0"),
_T("floppy\0") _T("floppy1\0") _T("floppy2\0") _T("floppy3\0") _T("floppy4\0"),
true
},
{
// 8
_T("Disable mono video emulation (SW2:1)"),
_T("mono_card")
},
{
// 9
_T("Disable color video emulation (SW2:2)"),
_T("color_card")
},
{
// 10-11
_T("Address sector (SW2:3-4)\0") _T("A0000-AFFFF (1)\0") _T("A0000-AFFFF (2)\0") _T("D0000-DFFFF\0") _T("E0000-EFFFF\0"),
_T("memory\0") _T("sector_a0000_1\0") _T("sector_a0000_2\0") _T("sector_d0000\0") _T("sector_e0000\0"),
true
},
{
// 12
_T("Disable parallel port emulation (J11)"),
_T("parport_card")
},
{ // 19 - 22
_T("CPU core\0") _T("Fake86\0") _T("DOSBox simple\0") _T("DOSBox normal\0") _T("DOSBox full\0") _T("DOSBox auto\0"),
_T("cpu\0") _T("fake86\0") _T("dbsimple\0") _T("dbnormal\0") _T("dbfull\0") _T("dbauto\0"),
true, false, 19 - 13
},
{
NULL
}
};
static const struct expansionboardsettings x86_athdxt_settings[] = {
{
_T("ROM Address\0") _T("0xCC000\0") _T("0xDC000\0") _T("0xEC000\0"),
_T("baseaddress\0") _T("0xcc000\0") _T("0xdc000\0") _T("0xec000\0"),
true
},
{
NULL
}
};
static void fastlane_memory_callback(struct romconfig *rc, uae_u8 *ac, int size)
{
struct zfile *z = read_device_from_romconfig(rc, NULL);
if (z) {
// load autoconfig data from rom file
uae_u8 act[16] = { 0 };
zfile_fseek(z, 0x80, SEEK_SET);
zfile_fread(act, 1, 16, z);
zfile_fclose(z);
for(int i = 1; i < 16; i++) {
ac[i] = ~act[i];
act[i] = ~act[i];
}
// don't overwrite uae configured memory size
ac[0] = (ac[0] & 7) | (act[0] & 0xf8);
ac[2] = (ac[2] & 0x0f) | (act[2] & 0xf0);
}
}
static void hda506_memory_callback(struct romconfig *rc, uae_u8 *ac, int size)
{
if (currprefs.cs_a1000ram)
ac[1] = 1;
else
ac[1] = 2;
}
static void nexus_memory_callback(struct romconfig *rc, uae_u8 *ac, int size)
{
if (rc->device_settings & 1)
ac[0] &= ~(1 << 5);
if (size <= 2 * 1024 * 1024)
ac[1] = 2;
else if (size <= 4 * 1024 * 1024)
ac[1] = 4;
else
ac[1] = 8;
}
static const struct expansionboardsettings nexus_settings[] = {
{
_T("MEM TEST"),
_T("memtest")
},
{
NULL
}
};
static const struct expansionboardsettings adscsi2000_settings[] = {
{
_T("Cache (B)"),
_T("B")
},
{
NULL
}
};
static const struct expansionboardsettings warpengine_settings[] = {
{
_T("Jumper H"),
_T("jumper_h")
},
{
_T("Jumper J"),
_T("jumper_j")
},
{
_T("Jumper K"),
_T("jumper_k")
},
{
NULL
}
};
static const struct expansionboardsettings a4091_settings[] = {
{
_T("Fast Bus"),
_T("fastbus"),
},
{
_T("Delayed autoboot"),
_T("delayedautoboot")
},
{
_T("Syncronous mode"),
_T("syncmode")
},
{
_T("Termination"),
_T("term")
},
{
_T("LUN"),
_T("lun")
},
{
NULL
}
};
const struct expansionromtype expansionroms[] = {
{
_T("cpuboard"), _T("Accelerator"), _T("Accelerator"),
NULL, NULL, add_cpuboard_unit, ROMTYPE_CPUBOARD, 0, 0, 0, true,
NULL, 0,
false, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE
},
{
_T("grex"), _T("G-REX"), _T("DCE"),
grex_init, NULL, NULL, ROMTYPE_GREX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_PCI_BRIDGE
},
{
_T("mediator"), _T("Mediator"), _T("Elbox"),
mediator_init, mediator_init2, NULL, ROMTYPE_MEDIATOR | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z3, false,
mediator_sub, 0,
false, EXPANSIONTYPE_PCI_BRIDGE,
0, 0, 0, false, NULL,
false,
mediator_settings
},
{
_T("prometheus"), _T("Prometheus"), _T("Matay"),
prometheus_init, NULL, NULL, ROMTYPE_PROMETHEUS | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z3, false,
NULL, 0,
false, EXPANSIONTYPE_PCI_BRIDGE,
0, 0, 0, false, NULL,
false,
bridge_settings
},
{
_T("apollo"), _T("Apollo 500/2000"), _T("3-State"),
apollo_init_hd, NULL, apollo_add_scsi_unit, ROMTYPE_APOLLOHD, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE,
8738, 0, 0
},
{
_T("add500"), _T("ADD-500"), _T("Archos"),
add500_init, NULL, add500_add_scsi_unit, ROMTYPE_ADD500, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
8498, 27, 0, true, NULL
},
{
_T("blizzardscsikitiv"), _T("SCSI Kit IV"), _T("Blizzard"),
NULL, NULL, cpuboard_ncr9x_add_scsi_unit, ROMTYPE_BLIZKIT4, 0, 0, 0, true,
NULL, 0,
false, EXPANSIONTYPE_SCSI
},
{
_T("oktagon2008"), _T("Oktagon 2008"), _T("BSC/Alfa Data"),
ncr_oktagon_autoconfig_init, NULL, oktagon_add_scsi_unit, ROMTYPE_OKTAGON, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI
},
{
_T("alfapower"), _T("AlfaPower/AT-Bus 2008"), _T("BSC/Alfa Data"),
alf_init, NULL, alf_add_ide_unit, ROMTYPE_ALFA, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_IDE,
2092, 8, 0
},
{
_T("alfapowerplus"), _T("AlfaPower Plus"), _T("BSC/Alfa Data"),
alf_init, NULL, alf_add_ide_unit, ROMTYPE_ALFAPLUS, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_IDE,
2092, 8, 0
},
{
_T("cltda1000scsi"), _T("A1000/A2000 SCSI"), _T("C-Ltd"),
cltda1000scsi_init, NULL, cltda1000scsi_add_scsi_unit, ROMTYPE_CLTDSCSI | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
0, 0, 0, false, NULL,
false, NULL,
{ 0xc1, 0x0c, 0x00, 0x00, 0x03, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
},
{
_T("a2090a"), _T("A2090a"), _T("Commodore"),
a2090_init, NULL, a2090_add_scsi_unit, ROMTYPE_A2090 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY
},
{
_T("a2091"), _T("A590/A2091"), _T("Commodore"),
a2091_init, NULL, a2091_add_scsi_unit, ROMTYPE_A2091 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
a2091_sub, 1,
true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_CUSTOM_SECONDARY,
0, 0, 0, true, NULL
},
{
_T("a4091"), _T("A4091"), _T("Commodore"),
ncr710_a4091_autoconfig_init, NULL, a4091_add_scsi_unit, ROMTYPE_A4091, 0, 0, BOARD_AUTOCONFIG_Z3, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
0, 0, 0, false, NULL,
true, a4091_settings
},
{
_T("dataflyerscsiplus"), _T("DataFlyer SCSI+"), _T("Expansion Systems"),
dataflyer_init, NULL, dataflyer_add_scsi_unit, ROMTYPE_DATAFLYER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_SCSI
},
{
_T("gvp1"), _T("GVP Series I"), _T("Great Valley Products"),
gvp_init_s1, NULL, gvp_s1_add_scsi_unit, ROMTYPE_GVPS1 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, BOARD_AUTOCONFIG_Z2, false,
gvp1_sub, 1,
true, EXPANSIONTYPE_SCSI
},
{
_T("gvp"), _T("GVP Series II"), _T("Great Valley Products"),
gvp_init_s2, NULL, gvp_s2_add_scsi_unit, ROMTYPE_GVPS2 | ROMTYPE_NONE, ROMTYPE_GVPS12, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI,
2017, 10, 0
},
{
_T("vector"), _T("Vector Falcon 8000"), _T("HK-Computer"),
vector_init, NULL, vector_add_scsi_unit, ROMTYPE_VECTOR, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI
},
{
_T("adide"), _T("AdIDE"), _T("ICD"),
adide_init, NULL, adide_add_ide_unit, ROMTYPE_ADIDE | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_IDE
},
{
_T("adscsi2000"), _T("AdSCSI Advantage 2000"), _T("ICD"),
adscsi_init, NULL, adscsi_add_scsi_unit, ROMTYPE_ADSCSI, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
0, 0, 0, false, NULL,
true,
adscsi2000_settings
},
{
_T("kommos"), _T("A500/A2000 SCSI"), _T("J<EFBFBD>rgen Kommos"),
kommos_init, NULL, kommos_add_scsi_unit, ROMTYPE_KOMMOS, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_SCSI
},
{
_T("golem"), _T("Golem"), _T("Kupke"),
golem_init, NULL, golem_add_scsi_unit, ROMTYPE_GOLEM, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI,
2079, 3, 0
},
{
_T("paradox"), _T("Paradox SCSI"), _T("Mainhattan Data"),
paradox_init, NULL, paradox_add_scsi_unit, ROMTYPE_PARADOX | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_PARALLEL_ADAPTER
},
{
_T("mtecat"), _T("AT 500"), _T("M-Tec"),
mtec_init, NULL, mtec_add_ide_unit, ROMTYPE_MTEC, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_IDE
},
{
_T("masoboshi"), _T("MasterCard"), _T("Masoboshi"),
masoboshi_init, NULL, masoboshi_add_idescsi_unit, ROMTYPE_MASOBOSHI | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
masoboshi_sub, 0,
true, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE
},
{
_T("stardrive"), _T("StarDrive"), _T("Microbotics"),
stardrive_init, NULL, stardrive_add_scsi_unit, ROMTYPE_STARDRIVE | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
1010, 0, 0, false, NULL,
false, NULL,
{ 0xc1, 2, 0x00, 0x00, 0x03, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
},
{
_T("fastlane"), _T("Fastlane"), _T("Phase 5"),
ncr_fastlane_autoconfig_init, NULL, fastlane_add_scsi_unit, ROMTYPE_FASTLANE, 0, 0, BOARD_AUTOCONFIG_Z3, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
8512, 10, 0, false, fastlane_memory_callback
},
{
_T("ptnexus"), _T("Nexus"), _T("Preferred Technologies"),
ptnexus_init, NULL, ptnexus_add_scsi_unit, ROMTYPE_PTNEXUS | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
2102, 4, 0, false, nexus_memory_callback,
false, nexus_settings,
{ 0xd1, 0x01, 0x00, 0x00, 0x08, 0x36, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
{
_T("protar"), _T("A500 HD"), _T("Protar"),
protar_init, NULL, protar_add_ide_unit, ROMTYPE_PROTAR, 0, 0, BOARD_AUTOCONFIG_Z2, false,
NULL, 0,
true, EXPANSIONTYPE_SCSI,
4149, 51, 0
},
{
_T("rochard"), _T("RocHard RH800C"), _T("Roctec"),
rochard_init, NULL, rochard_add_idescsi_unit, ROMTYPE_ROCHARD | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
rochard_sub, 0,
true, EXPANSIONTYPE_IDE | EXPANSIONTYPE_SCSI | EXPANSIONTYPE_IDE_PORT_DOUBLED,
2144, 2, 0
},
{
_T("supradrive"), _T("SupraDrive"), _T("Supra Corporation"),
supra_init, NULL, supra_add_scsi_unit, ROMTYPE_SUPRA | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, false,
supra_sub, 0,
true, EXPANSIONTYPE_SCSI
},
#if 0 /* driver is MIA, 3rd party ScottDevice driver is not enough for full implementation. */
{
_T("microforge"), _T("Hard Disk"), _T("Micro Forge"),
microforge_init, NULL, microforge_add_scsi_unit, ROMTYPE_MICROFORGE | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI
},
#endif
{
_T("omtiadapter"), _T("OMTI-Adapter"), _T("C't"),
omtiadapter_init, NULL, omtiadapter_scsi_unit, ROMTYPE_OMTIADAPTER | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("alf1"), _T("A.L.F."), _T("Elaborate Bytes"),
alf1_init, NULL, alf1_add_scsi_unit, ROMTYPE_ALF1 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("promigos"), _T("Promigos"), _T("Flesch und H<>rnemann"),
promigos_init, NULL, promigos_add_scsi_unit, ROMTYPE_PROMIGOS | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("tecmar"), _T("T-Card/T-Disk"), _T("Tecmar"),
tecmar_init, NULL, tecmar_add_scsi_unit, ROMTYPE_TECMAR | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI
},
{
_T("system2000"), _T("System 2000"), _T("Vortex"),
system2000_init, NULL, system2000_add_scsi_unit, ROMTYPE_SYSTEM2000 | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
{
_T("xebec"), _T("9720H"), _T("Xebec"),
xebec_init, NULL, xebec_add_scsi_unit, ROMTYPE_XEBEC | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_SASI | EXPANSIONTYPE_SCSI
},
#if 0
{
_T("kronos"), _T("Kronos"), _T("C-Ltd"),
kronos_init, kronos_add_scsi_unit, ROMTYPE_KRONOS, 0, 0, 2, false,
NULL, 0,
false, EXPANSIONTYPE_SCSI,
0, 0, 0,
{ 0xd1, 4, 0x00, 0x00, 0x03, 0xec, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
},
#endif
{
_T("hda506"), _T("HDA-506"), _T("Spirit Technology"),
hda506_init, NULL, hda506_add_scsi_unit, ROMTYPE_HDA506 | ROMTYPE_NOT, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI,
0, 0, 0, false, NULL,
false, NULL,
{ 0xc1, 0x04, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
},
{
_T("amax"), _T("AMAX ROM dongle"), _T("ReadySoft"),
NULL, 0, NULL, NULL, NULL, ROMTYPE_AMAX | ROMTYPE_NONE, 0, 0, 0, false
},
#if 0
{
_T("x86_xt_hd"), _T("x86 XT"), _T("x86"),
x86_xt_hd_init, NULL, x86_add_xt_hd_unit, ROMTYPE_X86_HD | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_CUSTOM | EXPANSIONTYPE_SCSI
},
#endif
{
_T("x86athdprimary"), _T("AT IDE Primary"), _T("x86"),
x86_at_hd_init_1, NULL, x86_add_at_hd_unit_1, ROMTYPE_X86_AT_HD1 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_IDE
},
{
_T("x86athdsecondary"), _T("AT IDE Secondary"), _T("x86"),
x86_at_hd_init_2, NULL, x86_add_at_hd_unit_2, ROMTYPE_X86_AT_HD2 | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_IDE
},
{
_T("x86athdxt"), _T("XTIDE Universal BIOS HD"), _T("x86"),
x86_at_hd_init_xt, NULL, x86_add_at_hd_unit_xt, ROMTYPE_X86_XT_IDE | ROMTYPE_NONE, 0, 0, BOARD_NONAUTOCONFIG, true,
NULL, 0,
false, EXPANSIONTYPE_IDE,
0, 0, 0, false, NULL,
false,
x86_athdxt_settings
},
{
_T("a1060"), _T("A1060 Sidecar"), _T("Commodore"),
a1060_init, NULL, NULL, ROMTYPE_A1060 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_X86_BRIDGE,
0, 0, 0, false, NULL,
false,
x86_bridge_sidecar_settings
},
{
_T("a2088"), _T("A2088"), _T("Commodore"),
a2088xt_init, NULL, NULL, ROMTYPE_A2088 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_X86_BRIDGE,
0, 0, 0, false, NULL,
false,
x86_bridge_settings
},
{
_T("a2088t"), _T("A2088T"), _T("Commodore"),
a2088t_init, NULL, NULL, ROMTYPE_A2088T | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_X86_BRIDGE,
0, 0, 0, false, NULL,
false,
x86_bridge_settings
},
{
_T("a2286"), _T("A2286"), _T("Commodore"),
a2286_init, NULL, NULL, ROMTYPE_A2286 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_X86_BRIDGE,
0, 0, 0, false, NULL,
false,
x86at286_bridge_settings
},
{
_T("a2386"), _T("A2386SX"), _T("Commodore"),
a2386_init, NULL, NULL, ROMTYPE_A2386 | ROMTYPE_NONE, 0, 0, BOARD_AUTOCONFIG_Z2, true,
NULL, 0,
false, EXPANSIONTYPE_X86_BRIDGE,
0, 0, 0, false, NULL,
false,
x86at386_bridge_settings
},
// only here for rom selection
{
_T("picassoiv"), _T("Picasso IV"), _T("Village Tronic"),
NULL, NULL, NULL, ROMTYPE_PICASSOIV | ROMTYPE_NONE, 0, 0, BOARD_IGNORE, true,
NULL, 0,
false, EXPANSIONTYPE_RTG,
},
{
_T("x86vga"), _T("x86 VGA"), _T("x86"),
NULL, NULL, NULL, ROMTYPE_x86_VGA | ROMTYPE_NONE, 0, 0, BOARD_IGNORE, true,
NULL, 0,
false, EXPANSIONTYPE_RTG,
},
{
NULL
}
};
static const struct expansionboardsettings blizzardboard_settings[] = {
{
_T("MapROM"),
_T("maprom")
},
{
NULL
}
};
static const struct cpuboardsubtype gvpboard_sub[] = {
{
_T("A3001 Series I"),
_T("A3001SI"),
ROMTYPE_CB_A3001S1, 0,
gvp_add_ide_unit, EXPANSIONTYPE_IDE | EXPANSIONTYPE_24BIT,
BOARD_MEMORY_Z2,
8 * 1024 * 1024,
0,
gvp_ide_rom_autoconfig_init, NULL, BOARD_AUTOCONFIG_Z2, 0
},
{
_T("A3001 Series II"),
_T("A3001SII"),
0, 0,
gvp_add_ide_unit, EXPANSIONTYPE_IDE | EXPANSIONTYPE_24BIT,
BOARD_MEMORY_Z2,
8 * 1024 * 1024,
0,
gvp_ide_rom_autoconfig_init, gvp_ide_controller_autoconfig_init, BOARD_AUTOCONFIG_Z2, 0
},
{
_T("A530"),
_T("GVPA530"),
ROMTYPE_GVPS2, 0,
gvp_s2_add_accelerator_scsi_unit, EXPANSIONTYPE_SCSI | EXPANSIONTYPE_24BIT,
BOARD_MEMORY_Z2,
8 * 1024 * 1024,
0,
gvp_init_accelerator, NULL, BOARD_AUTOCONFIG_Z2, 1,
NULL, NULL,
2017, 9, 0, false
},
{
_T("G-Force 030"),
_T("GVPGFORCE030"),
ROMTYPE_GVPS2, ROMTYPE_GVPS12,
gvp_s2_add_accelerator_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_25BITMEM,
128 * 1024 * 1024,
0,
gvp_init_accelerator, NULL, BOARD_AUTOCONFIG_Z2, 1
},
{
_T("Tek Magic 2040/2060"),
_T("TekMagic"),
ROMTYPE_CB_TEKMAGIC, 0,
tekmagic_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024
},
{
NULL
}
};
static const struct cpuboardsubtype blizzardboard_sub[] = {
{
_T("Blizzard 1230 IV"),
_T("Blizzard1230IV"),
ROMTYPE_CB_BLIZ1230, 0,
NULL, 0,
BOARD_MEMORY_BLIZZARD_12xx,
256 * 1024 * 1024,
0,
NULL, NULL, 0, 0,
blizzardboard_settings
},
{
_T("Blizzard 1260"),
_T("Blizzard1260"),
ROMTYPE_CB_BLIZ1260, 0,
NULL, 0,
BOARD_MEMORY_BLIZZARD_12xx,
256 * 1024 * 1024,
0,
NULL, NULL, 0, 0,
blizzardboard_settings
},
{
_T("Blizzard 2060"),
_T("Blizzard2060"),
ROMTYPE_CB_BLIZ2060, 0,
cpuboard_ncr9x_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024,
0,
NULL, NULL, 0, 0,
blizzardboard_settings
},
{
_T("Blizzard PPC"),
_T("BlizzardPPC"),
ROMTYPE_CB_BLIZPPC, 0,
blizzardppc_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_BLIZZARD_PPC,
256 * 1024 * 1024
},
{
NULL
}
};
static const struct cpuboardsubtype cyberstormboard_sub[] = {
{
_T("CyberStorm MK I"),
_T("CyberStormMK1"),
ROMTYPE_CB_CSMK1, 0,
cpuboard_ncr9x_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024
},
{
_T("CyberStorm MK II"),
_T("CyberStormMK2"),
ROMTYPE_CB_CSMK2, 0,
cpuboard_ncr9x_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024
},
{
_T("CyberStorm MK III"),
_T("CyberStormMK3"),
ROMTYPE_CB_CSMK3, 0,
cyberstorm_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024
},
{
_T("CyberStorm PPC"),
_T("CyberStormPPC"),
ROMTYPE_CB_CSPPC, 0,
cyberstorm_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024
},
{
NULL
}
};
static const struct cpuboardsubtype warpengine_sub[] = {
{
_T("Warp Engine A4000"),
_T("WarpEngineA4000"),
ROMTYPE_CB_WENGINE, 0,
warpengine_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024,
0x01000000,
ncr710_warpengine_autoconfig_init, NULL, BOARD_AUTOCONFIG_Z3, 1,
warpengine_settings
},
{
NULL
}
};
static const struct expansionboardsettings mtec_settings[] = {
{
_T("SCSI disabled"),
_T("scsioff")
},
{
NULL
}
};
static const struct cpuboardsubtype mtec_sub[] = {
{
_T("E-Matrix 530"),
_T("e-matrix530"),
ROMTYPE_CB_EMATRIX, 0,
ematrix_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_EMATRIX,
128 * 1024 * 1024,
0,
ncr_ematrix_autoconfig_init, NULL, BOARD_AUTOCONFIG_Z2, 1,
mtec_settings
},
{
NULL
}
};
static const struct expansionboardsettings a26x0board_settings[] = {
{
_T("OSMODE (J304)"),
_T("j304")
},
{
NULL
}
};
static const struct cpuboardsubtype commodore_sub[] = {
{
_T("A2620/A2630"),
_T("A2630"),
ROMTYPE_CB_A26x0, 0,
NULL, 0,
BOARD_MEMORY_25BITMEM,
128 * 1024 * 1024,
0,
NULL, NULL, 0, 0,
a26x0board_settings,
cpuboard_io_special
},
{
NULL
}
};
static const struct cpuboardsubtype dbk_sub[] = {
{
_T("1230/1240"),
_T("DKB12x0"),
ROMTYPE_CB_DKB12x0, 0,
cpuboard_dkb_add_scsi_unit, EXPANSIONTYPE_SCSI,
0,
128 * 1024 * 1024,
0,
ncr_dkb_autoconfig_init, NULL, BOARD_AUTOCONFIG_Z2, 0
},
{
_T("Wildfire"),
_T("wildfire"),
ROMTYPE_CB_DBK_WF, 0,
wildfire_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024,
0,
dkb_wildfire_pci_init, NULL, BOARD_NONAUTOCONFIG, 0
},
{
NULL
}
};
static const struct cpuboardsubtype fusionforty_sub[] = {
{
_T("Fusion Forty"),
_T("FusionForty"),
ROMTYPE_CB_FUSION, 0,
NULL, 0,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024
},
{
NULL
}
};
static const struct cpuboardsubtype apollo_sub[] = {
{
_T("Apollo 1240/1260"),
_T("Apollo"),
ROMTYPE_CB_APOLLO, 0,
apollo_add_scsi_unit, EXPANSIONTYPE_SCSI,
BOARD_MEMORY_HIGHMEM,
128 * 1024 * 1024,
0,
apollo_init_cpu, NULL, 2, 0
},
{
NULL
}
};
static const struct cpuboardsubtype kupkeboard_sub[] = {
{
_T("Golem 030"),
_T("golem030"),
ROMTYPE_CB_GOLEM030, 0,
NULL, 0,
BOARD_MEMORY_25BITMEM,
16 * 1024 * 1024
},
{
NULL
}
};
static const struct cpuboardsubtype icboard_sub[] = {
{
_T("ACA 500"),
_T("aca500"),
ROMTYPE_CB_ACA500, 0,
NULL, EXPANSIONTYPE_24BIT
},
{
NULL
}
};
static const struct cpuboardsubtype dummy_sub[] = {
{ NULL }
};
const struct cpuboardtype cpuboards[] = {
{
-1,
_T("-"),
dummy_sub, 0
},
{
BOARD_ACT,
_T("ACT"),
apollo_sub, 0
},
{
BOARD_COMMODORE,
_T("Commodore"),
commodore_sub, 0
},
{
BOARD_DKB,
_T("DKB"),
dbk_sub, 0
},
{
BOARD_GVP,
_T("Great Valley Products"),
gvpboard_sub, 0
},
{
BOARD_KUPKE,
_T("Kupke"),
kupkeboard_sub, 0
},
{
BOARD_MACROSYSTEM,
_T("MacroSystem"),
warpengine_sub, 0
},
{
BOARD_MTEC,
_T("M-Tec"),
mtec_sub, 0
},
{
BOARD_BLIZZARD,
_T("Phase 5 - Blizzard"),
blizzardboard_sub, 0
},
{
BOARD_CYBERSTORM,
_T("Phase 5 - CyberStorm"),
cyberstormboard_sub, 0
},
{
BOARD_RCS,
_T("RCS Management"),
fusionforty_sub, 0
},
#if 0
{
BOARD_IC,
_T("Individual Computers"),
icboard_sub, 0
},
#endif
{
NULL
}
};