From 02d7daa62cd37ed1b2835ac3f27945657be0a5e2 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Mon, 17 Mar 2025 18:34:59 +0200 Subject: [PATCH] A1000 512k WOM hack emulation --- cia.cpp | 5 ++ expansion.cpp | 22 +++++++-- include/cia.h | 2 + include/rommgr.h | 1 + memory.cpp | 119 ++++++++++++++++++++++++++++++++++++----------- 5 files changed, 118 insertions(+), 31 deletions(-) diff --git a/cia.cpp b/cia.cpp index 8f76e7dc..b34100e2 100644 --- 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; diff --git a/expansion.cpp b/expansion.cpp index a2a86852..06472315 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -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 */ diff --git a/include/cia.h b/include/cia.h index 9dd2f61b..60e59c62 100644 --- a/include/cia.h +++ b/include/cia.h @@ -38,4 +38,6 @@ extern void rtc_hardreset(void); extern void keyboard_connected(bool); +bool get_power_led(void); + #endif /* UAE_CIA_H */ diff --git a/include/rommgr.h b/include/rommgr.h index cb4b211a..31e6a864 100644 --- a/include/rommgr.h +++ b/include/rommgr.h @@ -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 diff --git a/memory.cpp b/memory.cpp index e4cd4be7..c6e96088 100644 --- a/memory.cpp +++ b/memory.cpp @@ -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++) { -- 2.47.3