From: Toni Wilen Date: Wed, 27 Aug 2014 18:10:05 +0000 (+0300) Subject: Autoconfig reorganisation. X-Git-Tag: 3000~76 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=90d5697733678f19a41ec240b432b74753a228cd;p=francis%2Fwinuae.git Autoconfig reorganisation. --- diff --git a/a2065.cpp b/a2065.cpp index b9358d20..0439f232 100644 --- a/a2065.cpp +++ b/a2065.cpp @@ -859,15 +859,13 @@ static void REGPARAM2 a2065_bput (uaecptr addr, uae_u32 b) addr &= 65535; if (addr == 0x48 && !configured) { map_banks (&a2065_bank, b, 0x10000 >> 16, 0x10000); - write_log (_T("A2065 Z2 autoconfigured at %02X0000\n"), b); configured = b; - expamem_next (); + expamem_next(&a2065_bank, NULL); return; } if (addr == 0x4c && !configured) { - write_log (_T("A2065 DMAC AUTOCONFIG SHUT-UP!\n")); configured = 0xff; - expamem_next (); + expamem_shutup(&a2065_bank); return; } if (!configured) diff --git a/a2091.cpp b/a2091.cpp index 4580f9a7..04864dd0 100644 --- a/a2091.cpp +++ b/a2091.cpp @@ -1630,17 +1630,16 @@ static void REGPARAM2 dmac_bput (struct wd_state *wd, uaecptr addr, uae_u32 b) b &= 0xff; addr &= 65535; if (wd->autoconfig) { + addrbank *ab = wd == &wd_a2091 ? &dmaca2091_bank : &dmaca2091_2_bank; if (addr == 0x48 && !wd->configured) { - map_banks (wd == &wd_a2091 ? &dmaca2091_bank : &dmaca2091_2_bank, b, 0x10000 >> 16, 0x10000); - write_log (_T("%s Z2 autoconfigured at %02X0000\n"), wd->name, b); + map_banks (ab, b, 0x10000 >> 16, 0x10000); wd->configured = 1; - expamem_next (); + expamem_next (ab, NULL); return; } if (addr == 0x4c && !wd->configured) { - write_log (_T("%s DMAC AUTOCONFIG SHUT-UP!\n"), wd->name); wd->configured = 1; - expamem_next (); + expamem_shutup(ab); return; } if (!wd->configured) @@ -2294,10 +2293,8 @@ addrbank *a2091_init (int devnum) int slotsize; struct romlist *rl; - if (devnum > 0 && !wd->enabled) { - expamem_next(); - return NULL; - } + if (devnum > 0 && !wd->enabled) + return &expamem_null; init_scsi(wd); wd->configured = 0; @@ -2331,8 +2328,8 @@ addrbank *a2091_init (int devnum) wd->rom = xmalloc (uae_u8, slotsize); wd->rom_size = 16384; wd->rom_mask = wd->rom_size - 1; - if (_tcscmp (currprefs.a2091romfile, _T(":NOROM"))) { - struct zfile *z = read_rom_name (devnum && currprefs.a2091romfile2[0] ? currprefs.a2091romfile2 : currprefs.a2091romfile); + if (_tcscmp (currprefs.a2091rom.roms[0].romfile, _T(":NOROM"))) { + struct zfile *z = read_rom_name (devnum && currprefs.a2091rom.roms[1].romfile[0] ? currprefs.a2091rom.roms[1].romfile : currprefs.a2091rom.roms[0].romfile); if (!z) { rl = getromlistbyids (roms); if (rl) { diff --git a/cd32_fmv.cpp b/cd32_fmv.cpp index 0a28f95b..f85eb0e3 100644 --- a/cd32_fmv.cpp +++ b/cd32_fmv.cpp @@ -1491,7 +1491,7 @@ void cd32_fmv_free(void) l64111_reset(); } -void cd32_fmv_init (uaecptr start) +addrbank *cd32_fmv_init (uaecptr start) { struct zfile *z; @@ -1499,7 +1499,7 @@ void cd32_fmv_init (uaecptr start) write_log (_T("CD32 FMV mapped @$%x\n"), start); if (start != fmv_start) { write_log(_T("CD32 FMV invalid base address!\n")); - return; + return &fmv_rom_bank; } z = read_rom_name(currprefs.cartfile); if (!z) { @@ -1526,7 +1526,7 @@ void cd32_fmv_init (uaecptr start) } if (!fmv_rom_bank.baseaddr) { write_log(_T("CD32 FMV without ROM is not supported.\n")); - return; + return &fmv_rom_bank; } if (!audioram) audioram = xmalloc(uae_u8, 262144); @@ -1551,4 +1551,5 @@ void cd32_fmv_init (uaecptr start) map_banks(&fmv_ram_bank, (fmv_start + RAM_BASE) >> 16, fmv_ram_size >> 16, 0); map_banks(&fmv_bank, (fmv_start + IO_BASE) >> 16, (RAM_BASE - IO_BASE) >> 16, 0); cd32_fmv_reset(); + return &fmv_rom_bank; } diff --git a/cd32_fmv_genlock.cpp b/cd32_fmv_genlock.cpp index b00979bf..988d0621 100644 --- a/cd32_fmv_genlock.cpp +++ b/cd32_fmv_genlock.cpp @@ -11,6 +11,7 @@ #include "sysdeps.h" #include "options.h" +#include "memory.h" #include "cd32_fmv.h" #include "xwin.h" diff --git a/cdtv.cpp b/cdtv.cpp index 939449d2..e8f4eccb 100644 --- a/cdtv.cpp +++ b/cdtv.cpp @@ -1482,15 +1482,13 @@ static void REGPARAM2 dmac_bput (uaecptr addr, uae_u32 b) b &= 0xff; if (addr == 0x48) { map_banks (&dmac_bank, b, 0x10000 >> 16, 0x10000); - write_log (_T("CDTV DMAC autoconfigured at %02X0000\n"), b); configured = b; - expamem_next (); + expamem_next(&dmac_bank, NULL); return; } if (addr == 0x4c) { - write_log (_T("CDTV DMAC AUTOCONFIG SHUT-UP!\n")); configured = -1; - expamem_next (); + expamem_shutup(&dmac_bank); return; } if (configured <= 0) diff --git a/expansion.cpp b/expansion.cpp index 3858a44d..f563d11b 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -29,6 +29,7 @@ #include "gfxboard.h" #include "cd32_fmv.h" #include "ncr_scsi.h" +#include "ncr9x_scsi.h" #include "debug.h" #include "gayle.h" #include "cpuboard.h" @@ -141,7 +142,7 @@ static bool chipdone; /* ********************************************************** */ static addrbank* (*card_init[MAX_EXPANSION_BOARDS]) (void); -static void (*card_map[MAX_EXPANSION_BOARDS]) (void); +static addrbank* (*card_map[MAX_EXPANSION_BOARDS]) (void); static const TCHAR *card_name[MAX_EXPANSION_BOARDS]; static int card_flags[MAX_EXPANSION_BOARDS]; @@ -176,6 +177,13 @@ 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; bool expamem_z3hack(struct uae_prefs *p) { @@ -253,9 +261,10 @@ static addrbank expamemz3_bank = { dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE }; -static void expamem_map_clear (void) +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) @@ -286,24 +295,94 @@ static addrbank *expamem_init_last (void) 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 int REGPARAM2 expamem_type (void) +{ + return expamem_read(0) & 0xc0; +} + static void call_card_init(int index) { - addrbank *ab; + addrbank *ab, *abe; + uae_u8 code; + uae_u32 expamem_z3_pointer_old; expamem_bank.name = card_name[ecard] ? card_name[ecard] : _T("None"); ab = (*card_init[ecard]) (); + expamem_z3_size = 0; if (ab == &expamem_null) { - expamem_next(); + 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) == 0xc0) { + 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 (expamem_z3_sum < 0x10000000) { + expamem_z3_sum = currprefs.z3autoconfig_start; + if (currprefs.mbresmem_high_size == 128 * 1024 * 1024) + expamem_z3_sum += 16 * 1024 * 1024; + if (!expamem_z3hack(&currprefs)) + expamem_z3_sum = 0x40000000; + if (expamem_z3_sum == 0x10000000) { + 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; + } + if (ab) { // non-NULL: not using expamem_bank + expamem_bank_current = ab; if ((card_flags[ecard] & 1) && currprefs.cs_z3autoconfig) { map_banks(&expamemz3_bank, 0xff000000 >> 16, 1, 0); map_banks(&dummy_bank, 0xE8, 1, 0); - expamem_bank_current = ab; } else { - map_banks(ab, 0xE8, 1, 0); + map_banks(&expamem_bank, 0xE8, 1, 0); if (currprefs.address_space_24) map_banks(&dummy_bank, 0xff000000 >> 16, 1, 0); } @@ -316,12 +395,41 @@ static void call_card_init(int index) map_banks(&expamem_bank, 0xE8, 1, 0); if (currprefs.address_space_24) map_banks(&dummy_bank, 0xff000000 >> 16, 1, 0); + expamem_bank_current = NULL; } } } -void expamem_next (void) +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 : 3, + expamem_board_pointer, size, sizemod, + type & rom_card ? _T("ROM") : (type & add_memory ? _T("RAM") : _T("IO ")), + mapped->name, + success ? _T("ok") : _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(); ++ecard; @@ -332,19 +440,19 @@ void expamem_next (void) } } -static int REGPARAM2 expamem_type (void) -{ - return ((expamem[0] | expamem[2] >> 4) & 0xc0); -} 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); uae_u32 v = (expamem_bget (addr) << 8) | expamem_bget (addr + 1); write_log (_T("warning: READ.W from address $%08x=%04x PC=%x\n"), addr, v & 0xffff, M68K_GETPC); return v; @@ -360,6 +468,8 @@ static uae_u32 REGPARAM2 expamem_bget (uaecptr addr) 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]; #ifdef EXP_DEBUG @@ -388,6 +498,10 @@ 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); } @@ -407,51 +521,31 @@ static void REGPARAM2 expamem_wput (uaecptr addr, uae_u32 value) } else { switch (addr & 0xff) { case 0x44: - if (expamem_type () == zorroIII) { - if (expamem_z3hack(&currprefs)) { - uae_u32 p2 = value; - // +Bernd Roesch & Toni Wilen - if ((card_flags[ecard] & 2) && (expamem[0] & add_memory)) { - // Z3 RAM expansion - p2 = 0; - while (!p2 && z3num < 2) { - if (z3num == 0 && currprefs.z3fastmem_size) - p2 = z3fastmem_bank.start >> 16; - else if (z3num == 1 && currprefs.z3fastmem2_size) - p2 = z3fastmem2_bank.start >> 16; - if (!p2) - z3num++; - } - z3num++; - } else if (card_flags[ecard] & 4) { - // Z3 P96 RAM - if (gfxmem_bank.start & 0xff000000) - p2 = gfxmem_bank.start >> 16; - } - if (value != p2) { - put_word (regs.regs[11] + 0x20, p2); - put_word (regs.regs[11] + 0x28, p2); - } - // -Bernd Roesch - expamem_hi = p2; - expamem_lo = 0; - (*card_map[ecard]) (); + 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 { - expamem_lo = 0; - expamem_hi = value & 0xff00; - (*card_map[ecard]) (); + 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); + } } - write_log (_T(" Card %d (Zorro%s) done.\n"), ecard + 1, expamem_type () == 0xc0 ? _T("II") : _T("III")); - expamem_next (); + expamem_board_pointer = expamem_z3_pointer; } + if (card_map[ecard]) + expamem_next((*card_map[ecard])(), NULL); break; case 0x4c: - write_log (_T(" Card %d (Zorro%s) had no success.\n"), ecard + 1, expamem_type () == 0xc0 ? _T("II") : _T("III")); - expamem_hi = expamem_lo = 0; - (*card_map[ecard]) (); + if (card_map[ecard]) + expamem_next (NULL, NULL); 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) @@ -466,35 +560,31 @@ static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value) return; value &= 0xff; switch (addr & 0xff) { - case 0x30: - case 0x32: - expamem_hi = 0; - expamem_lo = 0; - expamem_write (0x48, 0x00); - break; - case 0x48: - if (expamem_type () == zorroII) { - expamem_hi = value; - (*card_map[ecard]) (); - write_log (_T(" Card %d (Zorro%s) done.\n"), ecard + 1, expamem_type () == 0xc0 ? _T("II") : _T("III")); - expamem_next (); - } else if (expamem_type() == zorroIII) - expamem_lo = value; + if (expamem_type() == zorroII) { + expamem_hi = value & 0xff; + expamem_z2_pointer = (expamem_hi | (expamem_lo >> 4)) << 16; + expamem_board_pointer = expamem_z2_pointer; + if (card_map[ecard]) + expamem_next((*card_map[ecard]) (), NULL); + } else { + expamem_lo = value & 0xff; + } break; case 0x4a: if (expamem_type () == zorroII) - expamem_lo = value; + expamem_lo = value & 0xff; break; case 0x4c: - expamem_hi = expamem_lo = 0; - (*card_map[ecard]) (); - write_log (_T(" Card %d (Zorro%s) had no success.\n"), ecard + 1, expamem_type () == 0xc0 ? _T("II") : _T("III")); - expamem_next (); + if (card_map[ecard]) + expamem_next(expamem_bank_current, NULL); break; } + + if (expamem_bank_current && expamem_bank_current != &expamem_bank) + expamem_bank_current->bput(addr, value); } static uae_u32 REGPARAM2 expamemz3_bget (uaecptr addr) @@ -503,40 +593,69 @@ static uae_u32 REGPARAM2 expamemz3_bget (uaecptr addr) if (!expamem_bank_current) return 0; if (addr & 0x100) - return expamem_bank_current->bget(reg + 2); - else - return expamem_bank_current->bget(reg + 0); + 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) - expamem_bank_current->bput(reg + 2, value); - else - expamem_bank_current->bput(reg + 0, value); + 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) - expamem_bank_current->wput(reg + 2, value); - else - expamem_bank_current->wput(reg + 0, value); + 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) { @@ -548,10 +667,9 @@ static void REGPARAM2 expamemz3_lput (uaecptr addr, uae_u32 value) #ifdef CD32 -static void expamem_map_cd32fmv (void) +static addrbank *expamem_map_cd32fmv (void) { - uaecptr start = ((expamem_hi | (expamem_lo >> 4)) << 16); - cd32_fmv_init (start); + return cd32_fmv_init (expamem_z2_pointer); } static addrbank *expamem_init_cd32fmv (void) @@ -704,13 +822,11 @@ static addrbank catweasel_bank = { dummy_lgeti, dummy_wgeti, ABFLAG_IO }; -static void expamem_map_catweasel (void) +static addrbank *expamem_map_catweasel (void) { - catweasel_start = ((expamem_hi | (expamem_lo >> 4)) << 16); - if (catweasel_start) { - map_banks (&catweasel_bank, catweasel_start >> 16, 1, 0); - write_log (_T("Catweasel MK%d: mapped @$%08x\n"), cwc.type, catweasel_start); - } + catweasel_start = expamem_z2_pointer; + map_banks (&catweasel_bank, catweasel_start >> 16, 1, 0); + return &catweasel_bank; } static addrbank *expamem_init_catweasel (void) @@ -756,7 +872,7 @@ 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 Area"), + default_xlate, default_check, NULL, _T("filesys"), _T("Filesystem autoconfig"), dummy_lgeti, dummy_wgeti, ABFLAG_IO | ABFLAG_SAFE | ABFLAG_INDIRECT }; @@ -866,25 +982,22 @@ addrbank z3chipmem_bank = { * Expansion Card (ZORRO II) for 64/128/256/512KB 1/2/4/8MB of Fast Memory */ -static void expamem_map_fastcard_2 (int boardnum) +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)]; ab->start = start; if (ab->start) { map_banks (ab, ab->start >> 16, ab->allocated >> 16, 0); - if (ab->allocated <= 524288) - write_log (_T("%s: mapped @$%08x: %dKB fast memory\n"), ab->name, ab->start, ab->allocated >> 10); - else - write_log (_T("%s: mapped @$%08x: %dMB fast memory\n"), ab->name, ab->start, ab->allocated >> 20); } + return ab; } static addrbank *expamem_init_fastcard_2 (int boardnum) { - uae_u16 mid = (currprefs.a2091 || currprefs.uae_hide) ? commodore : uae_id; - uae_u8 pid = (currprefs.a2091 || currprefs.uae_hide) ? commodore_a2091_ram : (currprefs.maprom && !currprefs.cpuboard_type ? 1 : 81); - uae_u8 type = add_memory | zorroII | (currprefs.a2091 && !boardnum ? chainedconfig : 0); + uae_u16 mid = (currprefs.a2091rom.enabled || currprefs.uae_hide) ? commodore : uae_id; + uae_u8 pid = (currprefs.a2091rom.enabled || currprefs.uae_hide) ? commodore_a2091_ram : (currprefs.maprom && !currprefs.cpuboard_type ? 1 : 81); + uae_u8 type = add_memory | zorroII | (currprefs.a2091rom.enabled && !boardnum ? chainedconfig : 0); int allocated = boardnum ? fastmem2_bank.allocated : fastmem_bank.allocated; expamem_init_clear (); @@ -926,13 +1039,13 @@ static addrbank *expamem_init_fastcard_2 (int boardnum) return NULL; } -static void expamem_map_fastcard (void) +static addrbank *expamem_map_fastcard (void) { - expamem_map_fastcard_2 (0); + return expamem_map_fastcard_2 (0); } -static void expamem_map_fastcard2 (void) +static addrbank *expamem_map_fastcard2 (void) { - expamem_map_fastcard_2 (1); + return expamem_map_fastcard_2 (1); } static addrbank *expamem_init_fastcard(void) { @@ -951,18 +1064,18 @@ static addrbank *expamem_init_fastcard2(void) * Filesystem device */ -static void expamem_map_filesys (void) +static addrbank *expamem_map_filesys (void) { uaecptr a; - filesys_start = ((expamem_hi | (expamem_lo >> 4)) << 16); + filesys_start = expamem_z2_pointer; map_banks (&filesys_bank, filesys_start >> 16, 1, 0); - write_log (_T("Filesystem: mapped memory @$%08x.\n"), filesys_start); /* 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 @@ -1019,9 +1132,9 @@ static addrbank* expamem_init_filesys (void) * Zorro III expansion memory */ -static void expamem_map_z3fastmem_2 (addrbank *bank, uaecptr *startp, uae_u32 size, uae_u32 allocated, int chip) +static addrbank * expamem_map_z3fastmem_2 (addrbank *bank, uaecptr *startp, uae_u32 size, uae_u32 allocated, int chip) { - int z3fs = ((expamem_hi | (expamem_lo >> 4)) << 16); + int z3fs = expamem_z3_pointer; int start = *startp; if (expamem_z3hack(&currprefs)) { @@ -1036,17 +1149,16 @@ static void expamem_map_z3fastmem_2 (addrbank *bank, uaecptr *startp, uae_u32 si start = z3fs; *startp = z3fs; } - write_log (_T("Z3MEM (32bit): mapped @$%08x: %d MB Zorro III %s memory \n"), - start, allocated / 0x100000, chip ? _T("chip") : _T("fast")); + return bank; } -static void expamem_map_z3fastmem (void) +static addrbank *expamem_map_z3fastmem (void) { - expamem_map_z3fastmem_2 (&z3fastmem_bank, &z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated, 0); + return expamem_map_z3fastmem_2 (&z3fastmem_bank, &z3fastmem_bank.start, currprefs.z3fastmem_size, z3fastmem_bank.allocated, 0); } -static void expamem_map_z3fastmem2 (void) +static addrbank *expamem_map_z3fastmem2 (void) { - expamem_map_z3fastmem_2 (&z3fastmem2_bank, &z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated, 0); + return expamem_map_z3fastmem_2 (&z3fastmem2_bank, &z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated, 0); } static addrbank *expamem_init_z3fastmem_2(addrbank *bank, uae_u32 start, uae_u32 size, uae_u32 allocated) @@ -1108,13 +1220,11 @@ static addrbank *expamem_init_z3fastmem2(void) * Fake Graphics Card (ZORRO III) - BDK */ -static void expamem_map_gfxcard (void) +static addrbank *expamem_map_gfxcard (void) { - gfxmem_bank.start = (expamem_hi | (expamem_lo >> 4)) << 16; - if (gfxmem_bank.start) { - map_banks (&gfxmem_bank, gfxmem_bank.start >> 16, gfxmem_bank.allocated >> 16, gfxmem_bank.allocated); - write_log (_T("%sUAEGFX-card: mapped @$%08x, %d MB RTG RAM\n"), currprefs.rtgmem_type ? _T("Z3") : _T("Z2"), gfxmem_bank.start, gfxmem_bank.allocated / 0x100000); - } + gfxmem_bank.start = expamem_z3_pointer; + map_banks (&gfxmem_bank, gfxmem_bank.start >> 16, gfxmem_bank.allocated >> 16, gfxmem_bank.allocated); + return &gfxmem_bank; } static addrbank *expamem_init_gfxcard (bool z3) @@ -1232,7 +1342,7 @@ static void allocate_expamem (void) currprefs.z3chipmem_size = changed_prefs.z3chipmem_size; z3chipmem_bank.start = 0x10000000; - z3fastmem_bank.start = currprefs.z3fastmem_start; + z3fastmem_bank.start = currprefs.z3autoconfig_start; if (currprefs.mbresmem_high_size == 128 * 1024 * 1024) z3chipmem_bank.start += 16 * 1024 * 1024; if (!expamem_z3hack(&currprefs)) @@ -1455,6 +1565,22 @@ static addrbank *expamem_init_a4091_2(void) { return ncr710_a4091_autoconfig_init (1); } +static addrbank *expamem_init_fastlane(void) +{ + return ncr_fastlane_autoconfig_init (0); +} +static addrbank *expamem_init_fastlane_2(void) +{ + return ncr_fastlane_autoconfig_init (1); +} +static addrbank *expamem_init_oktagon(void) +{ + return ncr_oktagon_autoconfig_init (0); +} +static addrbank *expamem_init_oktagon_2(void) +{ + return ncr_oktagon_autoconfig_init (1); +} static addrbank *expamem_init_warpengine(void) { return ncr710_warpengine_autoconfig_init(); @@ -1536,7 +1662,7 @@ void expamem_reset (void) } // immediately after Z2Fast so that they can be emulated as A590/A2091 with fast ram. #ifdef A2091 - if (currprefs.a2091) { + if (currprefs.a2091rom.enabled) { card_flags[cardno] = 0; card_name[cardno] = _T("A2091"); card_init[cardno] = expamem_init_a2091; @@ -1546,6 +1672,16 @@ void expamem_reset (void) card_map[cardno++] = NULL; } #endif +#ifdef NCR + if (currprefs.oktagonrom.enabled) { + card_name[cardno] = _T("Oktagon 2008"); + card_init[cardno] = expamem_init_oktagon; + card_map[cardno++] = NULL; + card_name[cardno] = _T("Oktagon 2008 #2"); + card_init[cardno] = expamem_init_oktagon_2; + card_map[cardno++] = NULL; + } +#endif #ifdef CDTV if (currprefs.cs_cdtvcd) { card_flags[cardno] = 0; @@ -1662,15 +1798,26 @@ void expamem_reset (void) } #endif #ifdef NCR - if (currprefs.a4091) { + if (currprefs.a4091rom.enabled) { card_flags[cardno] = 1; card_name[cardno] = _T("A4091"); card_init[cardno] = expamem_init_a4091; card_map[cardno++] = NULL; + card_flags[cardno] = 1; card_name[cardno] = _T("A4091 #2"); card_init[cardno] = expamem_init_a4091_2; card_map[cardno++] = NULL; } + if (currprefs.fastlanerom.enabled) { + card_flags[cardno] = 1; + card_name[cardno] = _T("Fastlane"); + card_init[cardno] = expamem_init_fastlane; + card_map[cardno++] = NULL; + card_flags[cardno] = 1; + card_name[cardno] = _T("Fastlane #2"); + card_init[cardno] = expamem_init_fastlane_2; + card_map[cardno++] = NULL; + } #endif if (cardno > 0 && cardno < MAX_EXPANSION_BOARDS) { card_flags[cardno] = 0; @@ -1679,6 +1826,8 @@ void expamem_reset (void) card_map[cardno++] = expamem_map_clear; } + expamem_z3_pointer = 0; + expamem_z3_sum = 0; if (cardno == 0 || savestate_state) expamem_init_clear_zero (); else diff --git a/gfxboard.cpp b/gfxboard.cpp index 3a88e825..61e52ad4 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -1258,16 +1258,14 @@ static void REGPARAM2 gfxboard_wput_mem_autoconfig (uaecptr addr, uae_u32 b) } else { map_banks (&gfxboard_bank_memory, gfxmem_bank.start >> 16, board->banksize >> 16, currprefs.rtgmem_size); } - write_log (_T("%s autoconfigured at 0x%04X0000\n"), gfxboard_bank_memory.name, gfxmem_bank.start >> 16); configured_mem = gfxmem_bank.start >> 16; gfxboardmem_start = gfxmem_bank.start; - expamem_next (); + expamem_next (&gfxboard_bank_memory, NULL); return; } if (addr == 0x4c) { - write_log (_T("%s AUTOCONFIG SHUT-UP!\n"), gfxboard_bank_memory.name); configured_mem = 0xff; - expamem_next (); + expamem_shutup(&gfxboard_bank_memory); return; } } @@ -1281,8 +1279,10 @@ static void REGPARAM2 gfxboard_bput_mem_autoconfig (uaecptr addr, uae_u32 b) addr &= 65535; if (addr == 0x48) { if (!board->z3) { + addrbank *ab; if (ISP4()) { - map_banks (&gfxboard_bank_nbsmemory, b, 0x00200000 >> 16, 0x00200000); + ab = &gfxboard_bank_nbsmemory; + map_banks (ab, b, 0x00200000 >> 16, 0x00200000); if (configured_mem == 0) { configured_mem = b; gfxboardmem_start = b << 16; @@ -1291,23 +1291,22 @@ static void REGPARAM2 gfxboard_bput_mem_autoconfig (uaecptr addr, uae_u32 b) gfxboard_bank_memory.bput = gfxboard_bput_mem; } } else { + ab = &gfxboard_bank_memory; gfxboard_bank_memory.bget = gfxboard_bget_mem; gfxboard_bank_memory.bput = gfxboard_bput_mem; - map_banks (&gfxboard_bank_memory, b, board->banksize >> 16, currprefs.rtgmem_size); + map_banks (ab, b, board->banksize >> 16, currprefs.rtgmem_size); configured_mem = b; gfxboardmem_start = b << 16; } - expamem_next (); - write_log (_T("%s autoconfigured at 0x00%02X0000\n"), gfxboard_bank_memory.name, b); + expamem_next (ab, NULL); } else { expamem_lo = b & 0xff; } return; } if (addr == 0x4c) { - write_log (_T("%s AUTOCONFIG SHUT-UP!\n"), gfxboard_bank_memory.name); configured_mem = 0xff; - expamem_next (); + expamem_shutup(&gfxboard_bank_memory); return; } } @@ -1483,6 +1482,7 @@ static uae_u32 REGPARAM2 gfxboard_bget_regs_autoconfig (uaecptr addr) static void REGPARAM2 gfxboard_bput_regs_autoconfig (uaecptr addr, uae_u32 b) { + addrbank *ab; #ifdef JIT special_mem |= S_WRITE; #endif @@ -1492,20 +1492,20 @@ static void REGPARAM2 gfxboard_bput_regs_autoconfig (uaecptr addr, uae_u32 b) gfxboard_bank_registers.bget = gfxboard_bget_regs; gfxboard_bank_registers.bput = gfxboard_bput_regs; if (p4z2) { - map_banks (&gfxboard_bank_special, b, gfxboard_bank_special.allocated >> 16, gfxboard_bank_special.allocated); + ab = &gfxboard_bank_special; + map_banks (ab, b, gfxboard_bank_special.allocated >> 16, gfxboard_bank_special.allocated); } else { - map_banks (&gfxboard_bank_registers, b, gfxboard_bank_registers.allocated >> 16, gfxboard_bank_registers.allocated); + ab = &gfxboard_bank_registers; + map_banks (ab, b, gfxboard_bank_registers.allocated >> 16, gfxboard_bank_registers.allocated); } - write_log (_T("%s autoconfigured at 0x00%02X0000\n"), gfxboard_bank_registers.name, b); configured_regs = b; init_board (); - expamem_next (); + expamem_next (ab, NULL); return; } if (addr == 0x4c) { - write_log (_T("%s AUTOCONFIG SHUT-UP!\n"), gfxboard_bank_registers.name); configured_regs = 0xff; - expamem_next (); + expamem_next (NULL, NULL); return; } } diff --git a/include/cd32_fmv.h b/include/cd32_fmv.h index 3f8f542f..ea57d2f9 100644 --- a/include/cd32_fmv.h +++ b/include/cd32_fmv.h @@ -1,5 +1,5 @@ -extern void cd32_fmv_init (uaecptr); +extern addrbank *cd32_fmv_init (uaecptr); extern void cd32_fmv_reset(void); extern void cd32_fmv_free(void); extern void rethink_cd32fmv(void); diff --git a/include/memory.h b/include/memory.h index 37c04347..c7f08818 100644 --- a/include/memory.h +++ b/include/memory.h @@ -69,7 +69,7 @@ extern uaecptr rtarea_base; extern uae_u8* baseaddr[]; -enum { ABFLAG_UNK = 0, ABFLAG_RAM = 1, ABFLAG_ROM = 2, ABFLAG_ROMIN = 4, ABFLAG_IO = 8, ABFLAG_NONE = 16, ABFLAG_SAFE = 32, ABFLAG_INDIRECT = 64, ABFLAG_NOALLOC = 128 }; +enum { ABFLAG_UNK = 0, ABFLAG_RAM = 1, ABFLAG_ROM = 2, ABFLAG_ROMIN = 4, ABFLAG_IO = 8, ABFLAG_NONE = 16, ABFLAG_SAFE = 32, ABFLAG_INDIRECT = 64, ABFLAG_NOALLOC = 128, ABFLAG_RTG = 256 }; typedef struct { /* These ones should be self-explanatory... */ mem_get_func lget, wget, bget; @@ -330,8 +330,11 @@ extern void rtarea_init_mem (void); extern void rtarea_setup (void); extern void expamem_init (void); extern void expamem_reset (void); -extern void expamem_next (void); +extern void expamem_next (addrbank *mapped, addrbank *next); +extern void expamem_shutup (addrbank *mapped); extern bool expamem_z3hack(struct uae_prefs*); +extern uaecptr expamem_z3_pointer, expamem_z2_pointer; +extern uae_u32 expamem_z3_size, expamem_z2_size; extern uae_u32 last_custom_value1;