]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
A1000 512k WOM hack emulation
authorToni Wilen <twilen@winuae.net>
Mon, 17 Mar 2025 16:34:59 +0000 (18:34 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 17 Mar 2025 16:34:59 +0000 (18:34 +0200)
cia.cpp
expansion.cpp
include/cia.h
include/rommgr.h
memory.cpp

diff --git a/cia.cpp b/cia.cpp
index 8f76e7dc7cc658686bba1fdcbdd1155b19f9d8f0..b34100e2982161e65d8548eccc0d4f63a12e4619 100644 (file)
--- a/cia.cpp
+++ b/cia.cpp
@@ -1390,6 +1390,11 @@ static void check_led(void)
        }
 }
 
+bool get_power_led(void)
+{
+       return led;
+}
+
 static void bfe001_change(void)
 {
        uae_u8 v = cia[0].pra;
index a2a8685246e08ed40ceb050a4d101861c16f7d22..06472315edcf4d57e35b80131d7df3423822ffa3 100644 (file)
@@ -470,8 +470,10 @@ static void call_card_init(int index)
        memset(aci->autoconfig_raw, 0xff, sizeof aci->autoconfig_raw);
        if (cd->initnum) {
                ok = cd->initnum(aci);
-       } else {
+       } else if (cd->initrc) {
                ok = cd->initrc(aci);
+       } else {
+               ok = true;
        }
        if (ok) {
                ab = NULL;
@@ -2942,7 +2944,11 @@ static void expansion_init_cards(struct uae_prefs *p)
                        ok = cd->initnum(aci);
                } else {
                        aci->rc = cd->rc;
-                       ok = cd->initrc(aci);
+                       if (cd->initrc) {
+                               ok = cd->initrc(aci);
+                       } else {
+                               ok = true;
+                       }
                }
                if (cd->flags & CARD_FLAG_CHILD)
                        aci->parent_of_previous = true;
@@ -3061,7 +3067,11 @@ static void expansion_parse_cards(struct uae_prefs *p, bool log)
                        ok = cd->initnum(aci);
                } else {
                        aci->rc = cd->rc;
-                       ok = cd->initrc(aci);
+                       if (cd->initrc) {
+                               ok = cd->initrc(aci);
+                       } else {
+                               ok = true;
+                       }
                }
                if (aci->last_high_ram > expamem_highmem_pointer) {
                        expamem_highmem_pointer = aci->last_high_ram;
@@ -5352,6 +5362,12 @@ const struct expansionromtype expansionroms[] = {
                false, EXPANSIONTYPE_INTERNAL
        },
 #endif
+       {
+               _T("a1000wom512k"), _T("A1000 512k WOM"), _T("J�rg Huth"),
+               NULL, NULL, NULL, NULL, ROMTYPE_512KWOM | ROMTYPE_NOT, 0, 0, BOARD_NONAUTOCONFIG_BEFORE, true,
+               NULL, 0,
+               false, EXPANSIONTYPE_INTERNAL
+       },
 
        /* PCI Bridgeboards */
 
index 9dd2f61b6548c02a541a1c2a14c6c4061b17183b..60e59c6292ca84849c94b6f9ada11a9260b31637 100644 (file)
@@ -38,4 +38,6 @@ extern void rtc_hardreset(void);
 
 extern void keyboard_connected(bool);
 
+bool get_power_led(void);
+
 #endif /* UAE_CIA_H */
index cb4b211a68d2460c2e4af6757cb09238652e7576..31e6a864ca5a6ca0635d42bb1711be99d57c443e 100644 (file)
@@ -217,6 +217,7 @@ extern int decode_cloanto_rom_do(uae_u8 *mem, int size, int real_size);
 #define ROMTYPE_MERLIN         0x00100093
 #define ROMTYPE_KBMCU          0x00100094
 #define ROMTYPE_RIPPLE         0x00100095
+#define ROMTYPE_512KWOM                0x00100096
 
 #define ROMTYPE_NOT                    0x00800000
 #define ROMTYPE_QUAD           0x01000000
index e4cd4be77acce3962a44d0ccafdf78fff3e47eea..c6e96088bf29414bd0310b8912ce0d22a0e18b2b 100644 (file)
@@ -1049,6 +1049,7 @@ uae_u16 kickstart_version;
 *
 */
 static int a1000_kickstart_mode;
+static uaecptr a1000_kickstart_size;
 static uae_u8 *a1000_bootrom;
 static void a1000_handle_kickstart (int mode)
 {
@@ -1057,12 +1058,15 @@ static void a1000_handle_kickstart (int mode)
        protect_roms (false);
        if (mode == 0) {
                a1000_kickstart_mode = 0;
-               memcpy (kickmem_bank.baseaddr, kickmem_bank.baseaddr + ROM_SIZE_256, ROM_SIZE_256);
-               kickstart_version = (kickmem_bank.baseaddr[ROM_SIZE_256 + 12] << 8) | kickmem_bank.baseaddr[ROM_SIZE_256 + 13];
+               if (a1000_kickstart_size == ROM_SIZE_256) {
+                       memcpy (kickmem_bank.baseaddr, kickmem_bank.baseaddr + ROM_SIZE_256, ROM_SIZE_256);
+               }
+               kickstart_version = (kickmem_bank.baseaddr[a1000_kickstart_size + 12] << 8) | kickmem_bank.baseaddr[a1000_kickstart_size + 13];
+               kickmem_bank.baseaddr_direct_r = kickmem_bank.baseaddr;
        } else {
                a1000_kickstart_mode = 1;
-               memcpy (kickmem_bank.baseaddr, a1000_bootrom, ROM_SIZE_256);
                kickstart_version = 0;
+               kickmem_bank.baseaddr_direct_r = NULL;
        }
        if (kickstart_version == 0xffff)
                kickstart_version = 0;
@@ -1083,10 +1087,32 @@ static uae_u32 REGPARAM3 kickmem_bget(uaecptr) REGPARAM;
 MEMORY_CHECK(kickmem);
 MEMORY_XLATE(kickmem);
 
+extern bool get_power_led(void);
+
+static uaecptr get_a1000_addr(uaecptr addr)
+{
+       bool led = get_power_led();
+       addr -= led && a1000_kickstart_size == ROM_SIZE_512 ? ROM_SIZE_256 : 0;
+       return addr;
+}
+
 static uae_u32 REGPARAM2 kickmem_lget(uaecptr addr)
 {
-       addr &= kickmem_bank.mask;
-       uae_u32 m = do_get_mem_long((uae_u32*)(kickmem_bank.baseaddr + addr));
+       uae_u32 *p;
+       if (a1000_kickstart_mode) {
+               if (addr >= 0x1000000 - ROM_SIZE_256) {
+                       addr = get_a1000_addr(addr);
+                       addr &= kickmem_bank.mask;
+                       p = (uae_u32*)(kickmem_bank.baseaddr + addr);
+               } else {
+                       addr &= kickmem_bank.mask;
+                       p = (uae_u32*)(a1000_bootrom + addr);
+               }
+       } else {
+               addr &= kickmem_bank.mask;
+               p = (uae_u32*)(kickmem_bank.baseaddr + addr);
+       }
+       uae_u32 m = do_get_mem_long(p);
 #ifdef DEBUGGER
        if (debug_dma) {
                record_rom_access(kickmem_bank.start + addr, m, 4, false);
@@ -1096,8 +1122,21 @@ static uae_u32 REGPARAM2 kickmem_lget(uaecptr addr)
 }
 static uae_u32 REGPARAM2 kickmem_wget(uaecptr addr)
 {
-       addr &= kickmem_bank.mask;
-       uae_u16 m = do_get_mem_word((uae_u16*)(kickmem_bank.baseaddr + addr));
+       uae_u16 *p;
+       if (a1000_kickstart_mode) {
+               if (addr >= 0x1000000 - ROM_SIZE_256) {
+                       addr = get_a1000_addr(addr);
+                       addr &= kickmem_bank.mask;
+                       p = (uae_u16*)(kickmem_bank.baseaddr + addr);
+               } else {
+                       addr &= kickmem_bank.mask;
+                       p = (uae_u16*)(a1000_bootrom + addr);
+               }
+       } else {
+               addr &= kickmem_bank.mask;
+               p = (uae_u16*)(kickmem_bank.baseaddr + addr);
+       }
+       uae_u16 m = do_get_mem_word(p);
 #ifdef DEBUGGER
        if (debug_dma) {
                record_rom_access(kickmem_bank.start + addr, m, 2, false);
@@ -1107,8 +1146,21 @@ static uae_u32 REGPARAM2 kickmem_wget(uaecptr addr)
 }
 static uae_u32 REGPARAM2 kickmem_bget(uaecptr addr)
 {
-       addr &= kickmem_bank.mask;
-       uae_u8 m = kickmem_bank.baseaddr[addr];
+       uae_u8 *p;
+       if (a1000_kickstart_mode) {
+               if (addr >= 0x1000000 - ROM_SIZE_256) {
+                       addr = get_a1000_addr(addr);
+                       addr &= kickmem_bank.mask;
+                       p = (uae_u8*)(kickmem_bank.baseaddr + addr);
+               } else {
+                       addr &= kickmem_bank.mask;
+                       p = (uae_u8*)(a1000_bootrom + addr);
+               }
+       } else {
+               addr &= kickmem_bank.mask;
+               p = (uae_u8*)(kickmem_bank.baseaddr + addr);
+       }
+       uae_u8 m = *p;
 #ifdef DEBUGGER
        if (debug_dma) {
                record_rom_access(kickmem_bank.start + addr, m, 1, false);
@@ -1127,7 +1179,7 @@ static void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b)
 #endif
        if (currprefs.rom_readwrite && rom_write_enabled) {
                addr &= kickmem_bank.mask;
-               m = (uae_u32 *)(kickmem_bank.baseaddr + addr);
+               m = (uae_u32*)(kickmem_bank.baseaddr + addr);
                do_put_mem_long (m, b);
 #if 0
                if (addr == ROM_SIZE_512-4) {
@@ -1136,10 +1188,11 @@ static void REGPARAM2 kickmem_lput (uaecptr addr, uae_u32 b)
                }
 #endif
        } else if (a1000_kickstart_mode) {
-               if (addr >= 0xfc0000) {
+               if (addr >= 0x1000000 - ROM_SIZE_256) {
+                       addr = get_a1000_addr(addr);
                        addr &= kickmem_bank.mask;
-                       m = (uae_u32 *)(kickmem_bank.baseaddr + addr);
-                       do_put_mem_long (m, b);
+                       m = (uae_u32*)(kickmem_bank.baseaddr + addr);
+                       do_put_mem_long(m, b);
                        return;
                } else
                        a1000_handle_kickstart (0);
@@ -1161,9 +1214,10 @@ static void REGPARAM2 kickmem_wput (uaecptr addr, uae_u32 b)
                m = (uae_u16 *)(kickmem_bank.baseaddr + addr);
                do_put_mem_word (m, b);
        } else if (a1000_kickstart_mode) {
-               if (addr >= 0xfc0000) {
+               if (addr >= 0x1000000 - ROM_SIZE_256) {
+                       addr = get_a1000_addr(addr);
                        addr &= kickmem_bank.mask;
-                       m = (uae_u16 *)(kickmem_bank.baseaddr + addr);
+                       m = (uae_u16*)(kickmem_bank.baseaddr + addr);
                        do_put_mem_word (m, b);
                        return;
                } else
@@ -1184,12 +1238,14 @@ static void REGPARAM2 kickmem_bput (uaecptr addr, uae_u32 b)
                addr &= kickmem_bank.mask;
                kickmem_bank.baseaddr[addr] = b;
        } else if (a1000_kickstart_mode) {
-               if (addr >= 0xfc0000) {
+               if (addr >= 0x1000000 - ROM_SIZE_256) {
+                       addr = get_a1000_addr(addr);
                        addr &= kickmem_bank.mask;
                        kickmem_bank.baseaddr[addr] = b;
                        return;
-               } else
+               } else {
                        a1000_handle_kickstart (0);
+               }
        } else if (currprefs.illegal_mem) {
                write_log (_T("Illegal kickmem bput at %08x PC=%08x\n"), addr, M68K_GETPC);
        }
@@ -1688,18 +1744,25 @@ static int read_kickstart(struct zfile *f, uae_u8 *mem, int size, int dochecksum
        if (size <= 256)
                return size;
 
-       if (currprefs.cs_a1000ram && i < ROM_SIZE_256) {
-               int off = 0;
-               if (!a1000_bootrom)
-                       a1000_bootrom = xcalloc(uae_u8, ROM_SIZE_256);
-               while (off + i < ROM_SIZE_256) {
-                       memcpy(a1000_bootrom + off, kickmem_bank.baseaddr, i);
-                       off += i;
+       if (currprefs.cs_a1000ram) {
+               if (!a1000_bootrom) {
+                       a1000_kickstart_size = ROM_SIZE_256;
+                       if (is_board_enabled(&currprefs, ROMTYPE_512KWOM, 0)) {
+                               a1000_kickstart_size = ROM_SIZE_512;
+                       }
+                       a1000_bootrom = xcalloc(uae_u8, ROM_SIZE_256 + 4);
+               }
+               if (i <= ROM_SIZE_256) {
+                       int off = 0;
+                       while (off + i < ROM_SIZE_256) {
+                               memcpy(a1000_bootrom + off, kickmem_bank.baseaddr, i);
+                               off += i;
+                       }
+                       memset(kickmem_bank.baseaddr, 0, kickmem_bank.allocated_size);
+                       a1000_handle_kickstart(1);
+                       dochecksum = 0;
+                       i = ROM_SIZE_512;
                }
-               memset(kickmem_bank.baseaddr, 0, kickmem_bank.allocated_size);
-               a1000_handle_kickstart(1);
-               dochecksum = 0;
-               i = ROM_SIZE_512;
        }
 
        for (j = 0; j < 256 && i >= ROM_SIZE_256; j++) {