]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Autoconfig reorganisation.
authorToni Wilen <twilen@winuae.net>
Wed, 27 Aug 2014 18:10:05 +0000 (21:10 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 27 Aug 2014 18:10:05 +0000 (21:10 +0300)
a2065.cpp
a2091.cpp
cd32_fmv.cpp
cd32_fmv_genlock.cpp
cdtv.cpp
expansion.cpp
gfxboard.cpp
include/cd32_fmv.h
include/memory.h

index b9358d20cbb869e8722c06998fa893bf17e762e1..0439f23285f528c3fe3adc8100ed17ebbf0b8fad 100644 (file)
--- 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)
index 4580f9a71d4768b87fa4447fcdd4446048f794b6..04864dd02f9a5d256aa343bdf7e8a76ed9b8ce15 100644 (file)
--- 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) {
index 0a28f95ba4fa88f04cb7aae336584a02a165d462..f85eb0e33e3fc8bb973ee3f93a6bdf602719dfef 100644 (file)
@@ -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;
 }
index b00979bfda9b140c5bb9f54a7438242778f3f50b..988d0621a91f82797a1c22b33bfec77965cf2c52 100644 (file)
@@ -11,6 +11,7 @@
 #include "sysdeps.h"
 
 #include "options.h"
+#include "memory.h"
 #include "cd32_fmv.h"
 #include "xwin.h"
 
index 939449d250390ecf302f26d5751cb44c7f6a8818..e8f4eccb3d58647178267f0228d2835ddf23601d 100644 (file)
--- 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)
index 3858a44db0b5e7374259633afc8e84dc8ce54146..f563d11bcfac92a6c4d86814083388c8ad2336d6 100644 (file)
@@ -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
index 3a88e8250e2e9b65e929f21323d863c2f256ea7d..61e52ad4c027e0ade95f06caafa9dfeda71da873 100644 (file)
@@ -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;
        }
 }
index 3f8f542f5d8f51d00a797d6e100265ac5bf9ee84..ea57d2f99503a8b07cf95ca056a812f6a1113d85 100644 (file)
@@ -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);
index 37c04347e436ff921be01771c1a7337e1f347ec5..c7f088185970b2dd8a4342800b3ae8f8b3299633 100644 (file)
@@ -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;