#include "uae.h"
#include "rommgr.h"
#include "cpuboard.h"
+#include "autoconf.h"
#include "qemuvga/qemuuaeglue.h"
#include "qemuvga/queue.h"
static struct pci_bridge *bridges[PCI_BRIDGE_MAX + 1];
static int last_bridge_index;
+static struct pci_board_state *hsyncs[MAX_PCI_BOARDS + 1];
extern addrbank pci_config_bank, pci_io_bank, pci_mem_bank, pci_bridge_bank;
return pci;
}
-static void pci_board_add(struct pci_bridge *pcib, const struct pci_board *pci, int index)
+static void pci_board_add(struct pci_bridge *pcib, const struct pci_board *pci, int slot, int func)
{
- struct pci_board_state *pcibs = &pcib->boards[index];
+ struct pci_board_state *pcibs = &pcib->boards[pcib->slot_cnt];
+ pcib->slot_cnt++;
pcibs->board = pci;
- pcibs->index = index;
+ pcibs->slot = slot;
+ pcibs->func = func;
pcibs->bridge = pcib;
memset(pcibs->config_data, 0, sizeof pcibs->config_data);
for (int i = 0; i < MAX_PCI_BARS; i++) {
}
if (pci->init)
pci->init(pcibs);
+ if (pci->hsync) {
+ for (int i = 0; i < MAX_PCI_BOARDS; i++) {
+ if (hsyncs[i] == NULL) {
+ hsyncs[i] = pcibs;
+ break;
+ }
+ }
+ }
}
void pci_free(void)
pci_bridge_free(bridges[i]);
bridges[i] = NULL;
}
+ for (int i = 0; i < MAX_PCI_BOARDS; i++) {
+ hsyncs[i] = NULL;
+ }
+ uae_int_requested &= ~(0x10 | 0x100);
}
-
void pci_reset(void)
{
pci_free();
}
+void pci_hsync(void)
+{
+ for (int i = 0; i < MAX_PCI_BOARDS; i++) {
+ if (hsyncs[i])
+ hsyncs[i]->board->hsync(hsyncs[i]);
+ }
+}
+
void pci_rethink(void)
{
+ uae_int_requested &= ~(0x10 | 0x100);
for (int i = 0; i < PCI_BRIDGE_MAX; i++) {
struct pci_bridge *pcib = bridges[i];
if (!pcib)
const struct pci_config *c = pcibs->board->config;
if (c->interruptpin) {
if ((pcibs->config_data[5] & (1 << 3)) && !(pcibs->config_data[6] & (1 << (10 - 8)))) {
- pcib->irq |= 1 << (pcibs->board->config->interruptpin - 1);
+ pcib->irq |= 1 << (c->interruptpin - 1);
}
}
}
}
- if (pcib->irq & pcib->intena)
- INTREQ_0(0x8000 | pcib->intreq_mask);
+ if (pcib->irq & pcib->intena) {
+ uae_int_requested |= pcib->intreq_mask;
+ }
}
}
d[0x2e] = c->subsystenvendor >> 8;
d[0x2f] = c->subsystenvendor;
+ d[0x3c] = c->max_latency;
+ d[0x3d] = c->min_grant;
d[0x3e] = c->interruptpin;
}
int idx = pcib->get_index(addr);
if (idx < 0)
return NULL;
- struct pci_board_state *pcibs = &pcib->boards[idx];
- if (!pcibs->board) {
-#if PCI_DEBUG_CONFIG
- write_log(_T("- Empty slot %d\n"), idx);
-#endif
- return NULL;
+ int slot = idx & 0xff;
+ int func = (idx >> 8) & 0xff;
+ for (int i = 0; i < MAX_PCI_BOARDS; i++) {
+ struct pci_board_state *pcibs = &pcib->boards[i];
+ if (pcibs->slot == slot && pcibs->func == func && pcibs->board)
+ return pcibs;
}
- return pcibs;
+ return NULL;
}
static int stored_board, stored_bar;
for (int i = 0; i < MAX_PCI_BOARDS; i++) {
struct pci_board_state *pcibs = &pcib->boards[i];
for (int j = 0; j < MAX_PCI_BARS; j++) {
- if (pcibs2->bar_enabled[j] && addr2 >= pcibs->bar_start[j] && addr2 <= pcibs->bar_end[j]) {
+ if (pcibs->bar_enabled[j] && addr2 >= pcibs->bar_start[j] && addr2 <= pcibs->bar_end[j]) {
*bar = j;
stored_board = i;
stored_bar = j;
addr -= pcib->io_offset;
addr &= (pcibs->bar_size[bar] & ~1) - 1;
#if PCI_DEBUG_IO
- write_log(_T("get_pci_io %08x=%08x %c:%d PC=%08x\n"), *addrp, addr, size < 0 ? 'W' : 'R', size < 0 ? -size : size, M68K_GETPC);
+ write_log(_T("get_pci_io %08x=%08x %c:%d PC=%08x "), *addrp, addr, size < 0 ? 'W' : 'R', size < 0 ? -size : size, M68K_GETPC);
#endif
*addrp = addr;
return &pcibs->board->bars[bar];
return NULL;
*endianswap = pcib->endian_swap_config;
#if PCI_DEBUG_CONFIG
- write_log(_T("- Board %d (%s)\n"), pcibs->index, pcibs->board->label);
+ write_log(_T("- Board %d/%d (%s)\n"), pcibs->slot, pcibs->func, pcibs->board->label);
#endif
create_config_data(pcibs);
return pcibs->config_data;
pcibs->bar_enabled[i] = true;
#if PCI_DEBUG_CONFIG
if (pcibs->bar_old[i] != pcibs->bar_start[i]) {
- write_log(_T("Board %d ('%s') BAR%d: %08x-%08x\n"), pcibs->index, pci->label, i, pcibs->bar_start[i], pcibs->bar_end[i]);
+ write_log(_T("Board %d/%d ('%s') BAR%d: %08x-%08x\n"), pcibs->slot, pcibs->func, pci->label, i, pcibs->bar_start[i], pcibs->bar_end[i]);
}
#endif
} else {
pcibs->bar_enabled[i] = false;
#if PCI_DEBUG_CONFIG
if (pcibs->bar_old[i] != pcibs->bar_start[i]) {
- write_log(_T("Board %d ('%s') BAR%d: %08x-%08x\n"), pcibs->index, pci->label, i, pcibs->bar_start[i], pcibs->bar_end[i]);
+ write_log(_T("Board %d/%d ('%s') BAR%d: %08x-%08x\n"), pcibs->slot, pcibs->func, pci->label, i, pcibs->bar_start[i], pcibs->bar_end[i]);
}
#endif
}
const pci_addrbank *a = get_pci_io(&addr, &pcibs, &endianswap, 4);
if (a && a->lget) {
v = a->lget(pcibs, addr);
+#if PCI_DEBUG_IO
+ write_log(_T("-> %08x\n"), v);
+#endif
if (endianswap)
v = endianswap_long(v);
+ } else {
+#if PCI_DEBUG_IO
+ write_log(_T("-> X\n"), v);
+#endif
}
return v;
}
if (a && a->wget) {
if (endianswap) {
v = a->wget(pcibs, addr ^ (endianswap > 0 ? 2 : 0));
+#if PCI_DEBUG_IO
+ write_log(_T("-> %04x\n"), v);
+#endif
v = endianswap_word(v);
} else {
v = a->wget(pcibs, addr);
+#if PCI_DEBUG_IO
+ write_log(_T("-> %04x\n"), v);
+#endif
}
+ } else {
+#if PCI_DEBUG_IO
+ write_log(_T("-> X\n"), v);
+#endif
}
return v;
}
if (a && a->bget) {
if (endianswap) {
v = a->bget(pcibs, beswap(endianswap, addr));
+#if PCI_DEBUG_IO
+ write_log(_T("-> %02x\n"), v);
+#endif
} else {
v = a->bget(pcibs, addr);
+#if PCI_DEBUG_IO
+ write_log(_T("-> %02x\n"), v);
+#endif
}
+ } else {
+#if PCI_DEBUG_IO
+ write_log(_T("-> X\n"), v);
+#endif
}
return v;
}
b = endianswap_long(b);
a->lput(pcibs, addr, b);
}
+#if PCI_DEBUG_IO
+ write_log(_T("<- %08x\n"), b);
+#endif
}
static void REGPARAM2 pci_io_wput(uaecptr addr, uae_u32 b)
{
a->wput(pcibs, addr, b);
}
}
+#if PCI_DEBUG_IO
+ write_log(_T("<- %04x\n"), b);
+#endif
}
static void REGPARAM2 pci_io_bput(uaecptr addr, uae_u32 b)
{
a->bput(pcibs, addr, b);
}
}
+#if PCI_DEBUG_IO
+ write_log(_T("<- %02x\n"), b);
+#endif
}
static uae_u32 REGPARAM2 pci_mem_lget(uaecptr addr)
#ifdef JIT
special_mem |= S_READ;
#endif
- uae_u8 v = 0;
+ uae_u8 v = 0xff;
struct pci_bridge *pcib = get_pci_bridge_2(addr);
if (!pcib)
return v;
int offset = addr & 0x7fffff;
if (offset == 0) {
v = pcib->window;
+ v |= 8; // id
}
if (offset == 4) {
v = pcib->irq | (pcib->intena << 4);
}
} else {
- int offset = addr & 0xffff;
- if (offset == 11) {
+ int offset = addr & 0x1f;
+ v = 0;
+ if (offset == 2) {
+ v = 0x20;
+ } else if (offset == 11) {
v = pcib->irq | (pcib->intena << 4);
}
}
#ifdef JIT
special_mem |= S_READ;
#endif
- uae_u16 v = 0;
+ uae_u16 v = 0xffff;
#if PCI_DEBUG_BRIDGE
write_log(_T("pci_bridge_wget_2 %08x PC=%08x\n"), addr, M68K_GETPC);
#endif
return v;
if (pcib->configured_2) {
if (pcib->bank_2_zorro == 2) {
- int offset = addr & 0xffff;
+ int offset = addr & 0x1f;
+ v = 0;
if (offset == 2) {
- v = pcib->window;
+ v = 0x2080; // id
+ } else if (offset == 10) {
+ v = pcib->irq | (pcib->intena << 4);
}
}
}
#ifdef JIT
special_mem |= S_READ;
#endif
- uae_u32 v = 0;
+ uae_u32 v = 0xffffffff;
#if PCI_DEBUG_BRIDGE
write_log(_T("pci_bridge_lget_2 %08x PC=%08x\n"), addr, M68K_GETPC);
#endif
pci_bridge_lget_2, pci_bridge_wget_2, ABFLAG_IO | ABFLAG_SAFE
};
+void pci_write_dma(struct pci_board_state *pcibs, uaecptr addr, uae_u8 *p, int size)
+{
+}
+void pci_read_dma(struct pci_board_state *pcibs, uaecptr addr, uae_u8 *p, int size)
+{
+ while (size > 0) {
+ *p++ = get_byte(addr);
+ addr++;
+ size--;
+ }
+}
+
static void pci_dump_out(const TCHAR *txt, int log)
{
if (log > 0)
for (int i = 0; i < MAX_PCI_BOARDS; i++) {
struct pci_board_state *pcibs = &pcib->boards[i];
for (int j = 0; j < MAX_PCI_BARS; j++) {
- if (pcibs->bar_size[i] && (pcibs->bar_start[j] || pcibs->bar_end[j]) && (pcibs->bar_size[j] & 1) == type) {
+ if (pcibs->bar_size[j] && (pcibs->bar_start[j] || pcibs->bar_end[j]) && (pcibs->bar_size[j] & 1) == type) {
TCHAR txt[256];
_stprintf(txt, _T(" - %08X - %08X: BAR%d %s\n"), pcibs->bar_start[j], pcibs->bar_end[j], j, pcibs->board->label);
pci_dump_out(txt, log);
{
for (int i = 0; i < PCI_BRIDGE_MAX; i++) {
TCHAR txt[256];
- uae_u8 slots[MAX_PCI_BOARDS] = { 0 };
uaecptr start, end;
struct pci_bridge *pcib = bridges[i];
if (!pcib)
pci_dump_out(txt, log);
pci_dump_region(&pci_config_bank, &start, &end);
if (start) {
+ struct pci_board_state *oldpcibs = NULL;
int previdx = -1;
_stprintf(txt, _T("%08X - %08X: Configuration space\n"), start, end - 1);
pci_dump_out(txt, log);
while (start < end) {
- int idx = pcib->get_index(start);
- if (idx >= 0 && idx != previdx && slots[idx] == 0) {
- struct pci_board_state *pcibs = &pcib->boards[idx];
+ struct pci_board_state *pcibs = get_pci_board_state_config(pcib, start);
+ if (pcibs && pcibs != oldpcibs) {
const struct pci_board *pci = pcibs->board;
if (pcibs->board) {
- _stprintf(txt, _T(" - Slot %d: [%04X/%04X] %s IO=%d MEM=%d\n"),
- idx, pci->config->vendor, pci->config->device, pci->label,
+ _stprintf(txt, _T(" - %08x Card %d/%d: [%04X/%04X] %s IO=%d MEM=%d\n"),
+ start, pcibs->slot, pcibs->func, pci->config->vendor, pci->config->device, pci->label,
pcibs->io_map_active, pcibs->memory_map_active);
} else {
- _stprintf(txt, _T(" - Slot %d: <none>\n"), idx);
+ int idx = pcib->get_index(start);
+ _stprintf(txt, _T(" - Slot %d: <none>\n"), idx & 0xff);
}
pci_dump_out(txt, log);
- previdx = idx;
- slots[idx] = 1;
+ oldpcibs = pcibs;
}
start += 256;
}
static const struct pci_config ncr_53c815_pci_config =
{
- 0x1000, 0x0004, 0, 0, 0, 0x010000, 0, 0, 0, 1, { 256 | 1, 1024 | 0, 0, 0, 0, 0, 32768 | 0 }
+ 0x1000, 0x0004, 0, 0, 0, 0x010000, 0, 0, 0, 1, 0, 0, { 256 | 1, 1024 | 0, 0, 0, 0, 0, 32768 | 0 }
};
static const struct pci_board ncr_53c815_pci_board =
{
_T("NCR53C815"),
- &ncr_53c815_pci_config, NULL, NULL, NULL, pci_irq_callback,
+ &ncr_53c815_pci_config, NULL, NULL, NULL, NULL, pci_irq_callback,
{
{ wildfire_lget, wildfire_wget, wildfire_bget, wildfire_lput, wildfire_wput, wildfire_bput },
{ wildfire_lget, wildfire_wget, wildfire_bget, wildfire_lput, wildfire_wput, wildfire_bput },
static void add_pci_devices(struct pci_bridge *pcib)
{
- if (currprefs.ne2000pciname[0])
- pci_board_add(pcib, &ne2000_pci_board, 0);
-
- //pci_board_add(pcib, &ncr_53c815_pci_board, 1);
+ int slot = 0;
+
+ if (currprefs.ne2000pciname[0]) {
+ pci_board_add(pcib, &ne2000_pci_board, slot++, 0);
+ }
+
+ if (currprefs.sound_fm801) {
+ pci_board_add(pcib, &fm801_pci_board, slot, 0);
+ pci_board_add(pcib, &fm801_pci_board_func1, slot, 1);
+ slot++;
+ }
+
+ if (currprefs.sound_es1370) {
+ pci_board_add(pcib, &es1370_pci_board, slot++, 0);
+ }
+
+ //pci_board_add(pcib, &solo1_pci_board, slot++, 0);
+
+ //pci_board_add(pcib, &ncr_53c815_pci_board, 1, 0);
}
// Wildfire
pcib->endian_swap_io = 0;
pcib->endian_swap_memory = 0;
pcib->intena = 0xff; // controlled by bridge config bits, bit unknown.
- pcib->intreq_mask = 0x2000;
+ pcib->intreq_mask = 0x100;
pcib->get_index = dkb_wildfire_get_index;
pcib->baseaddress = 0x80000000;
pcib->baseaddress_end = 0xffffffff;
pcib->configured = -1;
- pci_board_add(pcib, &ncr_53c815_pci_board, 0);
+ pci_board_add(pcib, &ncr_53c815_pci_board, 0, 0);
map_banks(&pci_config_bank, 0x80000000 >> 16, 0x10000000 >> 16, 0);
map_banks(&pci_mem_bank, 0x90000000 >> 16, 0x30000000 >> 16, 0);
map_banks(&pci_io_bank, 0xc0000000 >> 16, 0x30000000 >> 16, 0);
return -1;
int slot = (addr & 0xf000) >> 13;
if (slot > 3)
- slot = -1;
+ return -1;
+ slot |= ((addr >> 8) & 7) << 8;
return slot;
}
pcib->endian_swap_io = -1;
pcib->endian_swap_memory = -1;
pcib->intena = 0xff;
- pcib->intreq_mask = 0x0008;
+ pcib->intreq_mask = 0x10;
pcib->get_index = prometheus_get_index;
pcib->bank = &pci_bridge_bank;
pcib->bank_zorro = 3;
int slot = -1;
struct pci_bridge *pcib = get_pci_bridge(addr);
- if ((addr & 0xfffc0700) == 0xfffc0000) {
+ if ((addr & 0xfffc1000) == 0xfffc0000) {
int v = (addr & 0x3f000) >> 13;
slot = countbit(v);
+ slot |= ((addr >> 8) & 7) << 8;
}
return slot;
}
bridges[PCI_BRIDGE_GREX] = pcib;
pcib->label = _T("G-REX");
pcib->intena = 0;
- pcib->intreq_mask = 0x0008;
+ pcib->intreq_mask = 0x10;
pcib->get_index = grex_get_index;
pcib->baseaddress = 0x80000000;
pcib->baseaddress_end = 0xffffffff;
bridges[PCI_BRIDGE_XVISION] = pcib;
pcib->label = _T("CBVision");
pcib->intena = 0;
- pcib->intreq_mask = 0x0008;
+ pcib->intreq_mask = 0x10;
pcib->get_index = xvision_get_index;
pcib->baseaddress = 0xe0000000;
pcib->baseaddress_end = 0xffffffff;
// Mediator
+// Mediator 4000MK2
static const uae_u8 autoconfig_mediator_4000mk2_256m[16] = { 0x84,0xa1,0x20,0x00,0x08,0x9e,0x00,0x00,0x00,0x00,0x00,0x00 };
static const uae_u8 autoconfig_mediator_4000mk2_512m[16] = { 0x85,0xa1,0x20,0x00,0x08,0x9e,0x00,0x00,0x00,0x00,0x00,0x00 };
static const uae_u8 autoconfig_mediator_4000mk2_2[16] = { 0x88,0x21,0x20,0x00,0x08,0x9e,0x00,0x00,0x00,0x00,0x00,0x00 };
+// Mediator 1200 TX
static const uae_u8 autoconfig_mediator_1200tx_1[16] = { 0xca,0x3c,0x00,0x00,0x08,0x9e,0x00,0x00,0x00,0x00,0x00,0x00 };
static const uae_u8 autoconfig_mediator_1200tx_2_4m[16] = { 0xc7,0xbc,0x00,0x00,0x08,0x9e,0x00,0x00,0x00,0x00,0x00,0x00 };
static const uae_u8 autoconfig_mediator_1200tx_2_8m[16] = { 0xc0,0xbc,0x00,0x00,0x08,0x9e,0x00,0x00,0x00,0x00,0x00,0x00 };
+// Mediator 1200
+static const uae_u8 autoconfig_mediator_1200_1[16] = { 0xca, 0x20, 0x00, 0x00, 0x08, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+static const uae_u8 autoconfig_mediator_1200_2_4m[16] = { 0xcf, 0xa0, 0x00, 0x00, 0x08, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+static const uae_u8 autoconfig_mediator_1200_2_8m[16] = { 0xc8, 0xa0, 0x00, 0x00, 0x08, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+struct mediator_autoconfig
+{
+ const uae_u8 *io;
+ const uae_u8 *mem_small;
+ const uae_u8 *mem_large;
+};
+
+#define MED_1200 0
+#define MED_1200TX 1
+#define MED_4000MK2 2
+
+static struct mediator_autoconfig mediator_ac[] =
+{
+ { autoconfig_mediator_1200_1, autoconfig_mediator_1200_2_4m, autoconfig_mediator_1200_2_8m },
+ { autoconfig_mediator_1200tx_1, autoconfig_mediator_1200tx_2_4m, autoconfig_mediator_1200tx_2_8m },
+ { autoconfig_mediator_4000mk2_2, autoconfig_mediator_4000mk2_256m, autoconfig_mediator_4000mk2_512m }
+};
+
+
static int mediator_get_index_1200(uaecptr addr)
{
struct pci_bridge *pcib = get_pci_bridge(addr);
offset -= 0x10000;
int slot = offset / 0x800;
if (slot >= 6)
- slot = -1;
+ return -1;
+ slot |= ((offset >> 8) & 7) << 8;
return slot;
}
offset -= 0x800000;
int slot = offset / 0x800;
if (slot >= 6)
- slot = -1;
+ return -1;
+ slot |= ((offset >> 8) & 7) << 8;
return slot;
}
pcib->endian_swap_io = -1;
pcib->endian_swap_memory = -1;
pcib->intena = 0;
- pcib->intreq_mask = 0x0008;
+ pcib->intreq_mask = 0x10;
pcib->get_index = mediator_get_index_1200;
pcib->bank = &pci_bridge_bank;
pcib->bank_2 = &pci_bridge_bank_2;
mediator_set_window_offset(pcib, 0);
}
-static addrbank *mediator_pci_init_1200_1(struct romconfig *rc)
+static addrbank *mediator_pci_init_1200_1(struct romconfig *rc, struct mediator_autoconfig *m_ac)
{
struct pci_bridge *pcib;
if (!(rc->device_settings & 2)) {
return &expamem_null;
}
memset(pcib->acmemory_2, 0xff, sizeof pcib->acmemory_2);
- for (int i = 0; i < sizeof autoconfig_mediator_1200tx_1; i++) {
- ew(pcib->acmemory_2, i * 4, autoconfig_mediator_1200tx_1[i]);
+ for (int i = 0; i < 16; i++) {
+ ew(pcib->acmemory_2, i * 4, m_ac->io[i]);
}
return &pci_bridge_bank_2;
}
-static addrbank *mediator_pci_init_1200_2(struct romconfig *rc)
+static addrbank *mediator_pci_init_1200_2(struct romconfig *rc, struct mediator_autoconfig *m_ac)
{
struct pci_bridge *pcib;
if (!(rc->device_settings & 2)) {
add_pci_devices(pcib);
}
memset(pcib->acmemory, 0xff, sizeof pcib->acmemory);
- const uae_u8 *ac = (rc->device_settings & 1) ? autoconfig_mediator_1200tx_2_8m : autoconfig_mediator_1200tx_2_4m;
+ const uae_u8 *ac = (rc->device_settings & 1) ? m_ac->mem_large : m_ac->mem_small;
for (int i = 0; i < 16; i++) {
ew(pcib->acmemory, i * 4, ac[i]);
}
pcib->endian_swap_io = -1;
pcib->endian_swap_memory = -1;
pcib->intena = 0;
- pcib->intreq_mask = 0x0008;
+ pcib->intreq_mask = 0x10;
pcib->get_index = mediator_get_index_4000;
pcib->bank = &pci_bridge_bank;
pcib->bank_2 = &pci_bridge_bank_2;
mediator_set_window_offset(pcib, 0);
}
-static addrbank *mediator_pci_init_4000_1(struct romconfig *rc)
+static addrbank *mediator_pci_init_4000_1(struct romconfig *rc, struct mediator_autoconfig *m_ac)
{
struct pci_bridge *pcib;
if (!(rc->device_settings & 2)) {
return &expamem_null;
}
memset(pcib->acmemory_2, 0xff, sizeof pcib->acmemory_2);
- for (int i = 0; i < sizeof autoconfig_mediator_4000mk2_2; i++) {
- ew(pcib->acmemory_2, i * 4, autoconfig_mediator_4000mk2_2[i]);
+ for (int i = 0; i < 16; i++) {
+ ew(pcib->acmemory_2, i * 4, m_ac->io[i]);
}
return &pci_bridge_bank_2;
}
-static addrbank *mediator_pci_init_4000_2(struct romconfig *rc)
+static addrbank *mediator_pci_init_4000_2(struct romconfig *rc, struct mediator_autoconfig *m_ac)
{
struct pci_bridge *pcib;
if (!(rc->device_settings & 2)) {
add_pci_devices(pcib);
}
memset(pcib->acmemory, 0xff, sizeof pcib->acmemory);
- const uae_u8 *ac = (rc->device_settings & 1) ? autoconfig_mediator_4000mk2_512m : autoconfig_mediator_4000mk2_256m;
+ const uae_u8 *ac = (rc->device_settings & 1) ? m_ac->mem_large : m_ac->mem_small;
for (int i = 0; i < 16; i++) {
ew(pcib->acmemory, i * 4, ac[i]);
}
addrbank *mediator_init(struct romconfig *rc)
{
+ struct mediator_autoconfig *ac;
switch (rc->subtype)
{
case 0:
+ ac = &mediator_ac[MED_1200];
if (rc->device_settings & 2)
- return mediator_pci_init_1200_2(rc);
+ return mediator_pci_init_1200_2(rc, ac);
else
- return mediator_pci_init_1200_1(rc);
+ return mediator_pci_init_1200_1(rc, ac);
case 1:
+ ac = &mediator_ac[MED_1200TX];
+ if (rc->device_settings & 2)
+ return mediator_pci_init_1200_2(rc, ac);
+ else
+ return mediator_pci_init_1200_1(rc, ac);
+ case 2:
+ ac = &mediator_ac[MED_4000MK2];
if (rc->device_settings & 2)
- return mediator_pci_init_4000_2(rc);
+ return mediator_pci_init_4000_2(rc, ac);
else
- return mediator_pci_init_4000_1(rc);
+ return mediator_pci_init_4000_1(rc, ac);
}
return &expamem_null;
}
addrbank *mediator_init2(struct romconfig *rc)
{
+ struct mediator_autoconfig *ac;
switch (rc->subtype)
{
case 0:
+ ac = &mediator_ac[MED_1200];
if (rc->device_settings & 2)
- return mediator_pci_init_1200_1(rc);
+ return mediator_pci_init_1200_1(rc, ac);
else
- return mediator_pci_init_1200_2(rc);
+ return mediator_pci_init_1200_2(rc, ac);
case 1:
+ ac = &mediator_ac[MED_1200TX];
+ if (rc->device_settings & 2)
+ return mediator_pci_init_1200_1(rc, ac);
+ else
+ return mediator_pci_init_1200_2(rc, ac);
+ case 2:
+ ac = &mediator_ac[MED_4000MK2];
if (rc->device_settings & 2)
- return mediator_pci_init_4000_1(rc);
+ return mediator_pci_init_4000_1(rc, ac);
else
- return mediator_pci_init_4000_2(rc);
+ return mediator_pci_init_4000_2(rc, ac);
}
return &expamem_null;
}