Revision: 45667
http://sourceforge.net/p/vice-emu/code/45667
Author: gpz
Date: 2025-05-10 23:46:26 +0000 (Sat, 10 May 2025)
Log Message:
-----------
instead of performing arithmetics on array pointers directly, set them up indirectly. this gets rid of the long standing array out of bounds access warnings. needs a bit of testing perhaps :)
Modified Paths:
--------------
trunk/vice/src/c128/c128mem.c
trunk/vice/src/c128/c128mem.h
trunk/vice/src/c128/c128meminit.c
trunk/vice/src/c64/c64mem.c
trunk/vice/src/c64/c64mem.h
trunk/vice/src/c64/c64meminit.c
trunk/vice/src/c64/c64memsc.c
trunk/vice/src/c64/cart/ltkernal.c
trunk/vice/src/c64/cart/magicvoice.c
trunk/vice/src/c64/vsidmem.c
trunk/vice/src/c64/vsidmeminit.c
trunk/vice/src/scpu64/scpu64mem.c
trunk/vice/src/scpu64/scpu64mem.h
trunk/vice/src/scpu64/scpu64meminit.c
Modified: trunk/vice/src/c128/c128mem.c
===================================================================
--- trunk/vice/src/c128/c128mem.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c128/c128mem.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -1536,11 +1536,18 @@
mem_read_tab[base][index] = read_func;
}
+/* set c128 base */
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr)
{
mem_read_base_tab[base][index] = mem_ptr;
}
+/* add actual pointer */
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr)
+{
+ mem_read_base_tab[base][index] += addr;
+}
+
void mem_read_limit_set(unsigned int base, unsigned int index, uint32_t limit)
{
mem_read_limit_tab[base][index] = limit;
@@ -1672,6 +1679,8 @@
/* Setup character generator ROM at $D000-$DFFF (memory configs 1, 2,
3, 9, 10, 11, 26, 27). */
for (i = 0xd0; i <= 0xdf; i++) {
+ uintptr_t addr = 0 - 0xd000;
+
mem_read_tab[base + 1][i] = chargen_read;
mem_read_tab[base + 2][i] = chargen_read;
mem_read_tab[base + 3][i] = chargen_read;
@@ -1680,6 +1689,7 @@
mem_read_tab[base + 11][i] = chargen_read;
mem_read_tab[base + 26][i] = chargen_read;
mem_read_tab[base + 27][i] = chargen_read;
+#if 0
mem_read_base_tab[base + 1][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[base + 2][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[base + 3][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
@@ -1688,6 +1698,25 @@
mem_read_base_tab[base + 11][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[base + 26][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[base + 27][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
+#else
+ mem_read_base_set(base + 1, i, (uint8_t*)addr);
+ mem_read_base_set(base + 2, i, (uint8_t*)addr);
+ mem_read_base_set(base + 3, i, (uint8_t*)addr);
+ mem_read_base_set(base + 9, i, (uint8_t*)addr);
+ mem_read_base_set(base + 10, i, (uint8_t*)addr);
+ mem_read_base_set(base + 11, i, (uint8_t*)addr);
+ mem_read_base_set(base + 26, i, (uint8_t*)addr);
+ mem_read_base_set(base + 27, i, (uint8_t*)addr);
+
+ mem_read_addr_set(base + 1, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(base + 2, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(base + 3, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(base + 9, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(base + 10, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(base + 11, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(base + 26, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(base + 27, i, (uintptr_t)mem_chargen_rom);
+#endif
}
c64meminit(base);
Modified: trunk/vice/src/c128/c128mem.h
===================================================================
--- trunk/vice/src/c128/c128mem.h 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c128/c128mem.h 2025-05-10 23:46:26 UTC (rev 45667)
@@ -65,6 +65,7 @@
void mem_set_write_hook(int config, int page, store_func_t *f);
void mem_read_tab_set(unsigned int base, unsigned int index, read_func_ptr_t read_func);
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr);
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr);
void mem_read_limit_set(unsigned int base, unsigned int index, uint32_t limit);
uint8_t ram_read(uint16_t addr);
Modified: trunk/vice/src/c128/c128meminit.c
===================================================================
--- trunk/vice/src/c128/c128meminit.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c128/c128meminit.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -100,7 +100,12 @@
if ((j & 0x2) == 0) {
mem_read_tab_set(j + base, i, basic_lo_read);
mem_set_write_hook(j + base, i, basic_lo_store);
+#if 0
mem_read_base_set(j + base, i, c128memrom_basic_rom - 0x4000);
+#else
+ mem_read_base_set(j + base, i, (uint8_t*)(0 - 0x4000));
+ mem_read_addr_set(j + base, i, (uintptr_t)c128memrom_basic_rom);
+#endif
mem_read_limit_set(j + base, i, 0x40007fff - 2);
} else {
mem_read_tab_set(j + base, i, ram_read);
@@ -116,7 +121,12 @@
case 0:
mem_read_tab_set(j + base, i, basic_hi_read);
mem_set_write_hook(j + base, i, basic_hi_store);
+#if 0
mem_read_base_set(j + base, i, c128memrom_basic_rom - 0x4000);
+#else
+ mem_read_base_set(j + base, i, (uint8_t*)(0 - 0x4000));
+ mem_read_addr_set(j + base, i, (uintptr_t)c128memrom_basic_rom);
+#endif
mem_read_limit_set(j + base, i, 0x8000bfff - 2);
break;
case 1:
@@ -144,7 +154,12 @@
case 0:
mem_read_tab_set(j + base, i, editor_read);
mem_set_write_hook(j + base, i, editor_store);
+#if 0
mem_read_base_set(j + base, i, c128memrom_basic_rom - 0x4000);
+#else
+ mem_read_base_set(j + base, i, (uint8_t*)(0 - 0x4000));
+ mem_read_addr_set(j + base, i, (uintptr_t)c128memrom_basic_rom);
+#endif
mem_read_limit_set(j + base, i, 0xc000cfff - 2);
break;
case 1:
@@ -279,7 +294,12 @@
case 0:
mem_read_tab_set(j + base, i, hi_read);
mem_set_write_hook(j + base, i, hi_store);
+#if 0
mem_read_base_set(j + base, i, c128memrom_kernal_trap_rom - 0xe000);
+#else
+ mem_read_base_set(j + base, i, (uint8_t*)(0 - 0xe000));
+ mem_read_addr_set(j + base, i, (uintptr_t)c128memrom_kernal_trap_rom);
+#endif
mem_read_limit_set(j + base, i, 0xe000feff - 2);
break;
case 1:
Modified: trunk/vice/src/c64/c64mem.c
===================================================================
--- trunk/vice/src/c64/c64mem.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/c64mem.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -797,11 +797,20 @@
mem_read_tab[base][index] = read_func;
}
+
+/* set c64 base */
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr)
{
mem_read_base_tab[base][index] = mem_ptr;
}
+/* add actual pointer */
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr)
+{
+ mem_read_base_tab[base][index] += addr;
+}
+
+
void mem_read_limit_set(unsigned int base, unsigned int index, uint32_t limit)
{
mem_read_limit_tab[base][index] = limit;
@@ -883,6 +892,8 @@
/* Setup character generator ROM at $D000-$DFFF (memory configs 1, 2, 3, 9, 10, 11, 26, 27). */
for (i = 0xd0; i <= 0xdf; i++) {
+ uintptr_t addr = 0 - 0xd000;
+
mem_read_tab[1][i] = chargen_read;
mem_read_tab[2][i] = chargen_read;
mem_read_tab[3][i] = chargen_read;
@@ -891,6 +902,7 @@
mem_read_tab[11][i] = chargen_read;
mem_read_tab[26][i] = chargen_read;
mem_read_tab[27][i] = chargen_read;
+#if 0
mem_read_base_tab[1][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[2][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[3][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
@@ -899,6 +911,25 @@
mem_read_base_tab[11][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[26][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[27][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
+#else
+ mem_read_base_set(1, i, (uint8_t*)addr);
+ mem_read_base_set(2, i, (uint8_t*)addr);
+ mem_read_base_set(3, i, (uint8_t*)addr);
+ mem_read_base_set(9, i, (uint8_t*)addr);
+ mem_read_base_set(10, i, (uint8_t*)addr);
+ mem_read_base_set(11, i, (uint8_t*)addr);
+ mem_read_base_set(26, i, (uint8_t*)addr);
+ mem_read_base_set(27, i, (uint8_t*)addr);
+
+ mem_read_addr_set(1, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(2, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(3, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(9, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(10, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(11, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(26, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(27, i, (uintptr_t)mem_chargen_rom);
+#endif
}
c64meminit(0);
Modified: trunk/vice/src/c64/c64mem.h
===================================================================
--- trunk/vice/src/c64/c64mem.h 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/c64mem.h 2025-05-10 23:46:26 UTC (rev 45667)
@@ -65,6 +65,7 @@
void mem_set_write_hook(int config, int page, store_func_t *f);
void mem_read_tab_set(unsigned int base, unsigned int index, read_func_ptr_t read_func);
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr);
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr);
void mem_read_limit_set(unsigned int base, unsigned int index, uint32_t limit);
void mem_store_without_ultimax(uint16_t addr, uint8_t value);
Modified: trunk/vice/src/c64/c64meminit.c
===================================================================
--- trunk/vice/src/c64/c64meminit.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/c64meminit.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -138,14 +138,28 @@
if (board != BOARD_MAX) {
/* Setup BASIC ROM at $A000-$BFFF (memory configs 3, 7, 11, 15). */
for (i = 0xa0; i <= 0xbf; i++) {
+ uintptr_t addr = 0 - 0xa000;
+
mem_read_tab_set(base + 3, i, c64memrom_basic64_read);
mem_read_tab_set(base + 7, i, c64memrom_basic64_read);
mem_read_tab_set(base + 11, i, c64memrom_basic64_read);
mem_read_tab_set(base + 15, i, c64memrom_basic64_read);
+#if 0
mem_read_base_set(base + 3, i, c64memrom_basic64_rom - 0xa000);
mem_read_base_set(base + 7, i, c64memrom_basic64_rom - 0xa000);
mem_read_base_set(base + 11, i, c64memrom_basic64_rom - 0xa000);
mem_read_base_set(base + 15, i, c64memrom_basic64_rom - 0xa000);
+#else
+ mem_read_base_set(base + 3, i, (uint8_t*)addr);
+ mem_read_base_set(base + 7, i, (uint8_t*)addr);
+ mem_read_base_set(base + 11, i, (uint8_t*)addr);
+ mem_read_base_set(base + 15, i, (uint8_t*)addr);
+
+ mem_read_addr_set(base + 3, i, (uintptr_t)c64memrom_basic64_rom);
+ mem_read_addr_set(base + 7, i, (uintptr_t)c64memrom_basic64_rom);
+ mem_read_addr_set(base + 11, i, (uintptr_t)c64memrom_basic64_rom);
+ mem_read_addr_set(base + 15, i, (uintptr_t)c64memrom_basic64_rom);
+#endif
}
}
@@ -201,6 +215,7 @@
/* Setup Kernal ROM at $E000-$FFFF (memory configs 2, 3, 6, 7, 10,
11, 14, 15, 26, 27, 30, 31). */
for (i = 0xe0; i <= 0xff; i++) {
+ uintptr_t addr = 0 - 0xe000;
mem_read_tab_set(base + 2, i, c64memrom_kernal64_read);
mem_read_tab_set(base + 3, i, c64memrom_kernal64_read);
mem_read_tab_set(base + 6, i, c64memrom_kernal64_read);
@@ -213,6 +228,7 @@
mem_read_tab_set(base + 27, i, c64memrom_kernal64_read);
mem_read_tab_set(base + 30, i, c64memrom_kernal64_read);
mem_read_tab_set(base + 31, i, c64memrom_kernal64_read);
+#if 0
mem_read_base_set(base + 2, i, c64memrom_kernal64_trap_rom - 0xe000);
mem_read_base_set(base + 3, i, c64memrom_kernal64_trap_rom - 0xe000);
mem_read_base_set(base + 6, i, c64memrom_kernal64_trap_rom - 0xe000);
@@ -225,6 +241,33 @@
mem_read_base_set(base + 27, i, c64memrom_kernal64_trap_rom - 0xe000);
mem_read_base_set(base + 30, i, c64memrom_kernal64_trap_rom - 0xe000);
mem_read_base_set(base + 31, i, c64memrom_kernal64_trap_rom - 0xe000);
+#else
+ mem_read_base_set(base + 2, i, (uint8_t*)addr);
+ mem_read_base_set(base + 3, i, (uint8_t*)addr);
+ mem_read_base_set(base + 6, i, (uint8_t*)addr);
+ mem_read_base_set(base + 7, i, (uint8_t*)addr);
+ mem_read_base_set(base + 10, i, (uint8_t*)addr);
+ mem_read_base_set(base + 11, i, (uint8_t*)addr);
+ mem_read_base_set(base + 14, i, (uint8_t*)addr);
+ mem_read_base_set(base + 15, i, (uint8_t*)addr);
+ mem_read_base_set(base + 26, i, (uint8_t*)addr);
+ mem_read_base_set(base + 27, i, (uint8_t*)addr);
+ mem_read_base_set(base + 30, i, (uint8_t*)addr);
+ mem_read_base_set(base + 31, i, (uint8_t*)addr);
+
+ mem_read_addr_set(base + 2, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 3, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 6, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 7, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 10, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 11, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 14, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 15, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 26, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 27, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 30, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+ mem_read_addr_set(base + 31, i, (uintptr_t)c64memrom_kernal64_trap_rom);
+#endif
}
}
Modified: trunk/vice/src/c64/c64memsc.c
===================================================================
--- trunk/vice/src/c64/c64memsc.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/c64memsc.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -753,11 +753,19 @@
mem_read_tab[base][index] = read_func;
}
+/* set c64 base */
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr)
{
mem_read_base_tab[base][index] = mem_ptr;
}
+/* add actual pointer */
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr)
+{
+ mem_read_base_tab[base][index] += addr;
+}
+
+
void mem_read_limit_set(unsigned int base, unsigned int index, uint32_t limit)
{
mem_read_limit_tab[base][index] = limit;
@@ -822,8 +830,11 @@
}
}
+ uintptr_t addr = 0 - 0xd000;
+
/* Setup character generator ROM at $D000-$DFFF (memory configs 1, 2, 3, 9, 10, 11, 26, 27). */
for (i = 0xd0; i <= 0xdf; i++) {
+#if 0
mem_read_tab[1][i] = chargen_read;
mem_read_tab[2][i] = chargen_read;
mem_read_tab[3][i] = chargen_read;
@@ -840,6 +851,52 @@
mem_read_base_tab[11][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[26][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[27][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
+#endif
+ mem_read_tab_set(1, i, chargen_read);
+ mem_read_tab_set(2, i, chargen_read);
+ mem_read_tab_set(3, i, chargen_read);
+ mem_read_tab_set(9, i, chargen_read);
+ mem_read_tab_set(10, i, chargen_read);
+ mem_read_tab_set(11, i, chargen_read);
+ mem_read_tab_set(26, i, chargen_read);
+ mem_read_tab_set(27, i, chargen_read);
+#if 0
+ mem_read_base_set(1, i, mem_chargen_rom);
+ mem_read_base_set(2, i, mem_chargen_rom);
+ mem_read_base_set(3, i, mem_chargen_rom);
+ mem_read_base_set(9, i, mem_chargen_rom);
+ mem_read_base_set(10, i, mem_chargen_rom);
+ mem_read_base_set(11, i, mem_chargen_rom);
+ mem_read_base_set(26, i, mem_chargen_rom);
+ mem_read_base_set(27, i, mem_chargen_rom);
+
+ mem_read_addr_set(1, i, addr);
+ mem_read_addr_set(2, i, addr);
+ mem_read_addr_set(3, i, addr);
+ mem_read_addr_set(9, i, addr);
+ mem_read_addr_set(10, i, addr);
+ mem_read_addr_set(11, i, addr);
+ mem_read_addr_set(26, i, addr);
+ mem_read_addr_set(27, i, addr);
+#else
+ mem_read_base_set(1, i, (uint8_t*)addr);
+ mem_read_base_set(2, i, (uint8_t*)addr);
+ mem_read_base_set(3, i, (uint8_t*)addr);
+ mem_read_base_set(9, i, (uint8_t*)addr);
+ mem_read_base_set(10, i, (uint8_t*)addr);
+ mem_read_base_set(11, i, (uint8_t*)addr);
+ mem_read_base_set(26, i, (uint8_t*)addr);
+ mem_read_base_set(27, i, (uint8_t*)addr);
+
+ mem_read_addr_set(1, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(2, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(3, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(9, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(10, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(11, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(26, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(27, i, (uintptr_t)mem_chargen_rom);
+#endif
}
c64meminit(0);
Modified: trunk/vice/src/c64/cart/ltkernal.c
===================================================================
--- trunk/vice/src/c64/cart/ltkernal.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/cart/ltkernal.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -988,7 +988,12 @@
if ((ltk_ramh && (p & 2)) || (ltk_ramh && ltk_freeze )) {
*base = export_ram0 + 0x2000 - 0xe000;
} else if (p & 2) {
+#if 0
*base = c64memrom_kernal64_trap_rom - 0xe000;
+#else
+ *base = (uint8_t*)(0 - 0xe000);
+ *base += (uintptr_t)c64memrom_kernal64_trap_rom;
+#endif
} else {
/* include RAM to speed things up */
*base = mem_ram;
Modified: trunk/vice/src/c64/cart/magicvoice.c
===================================================================
--- trunk/vice/src/c64/cart/magicvoice.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/cart/magicvoice.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -1286,7 +1286,9 @@
return CART_READ_THROUGH; /* "passthrough" */
} else {
if (mv_romE000_enabled) {
- *base = (uint8_t *)(mv_rom - (uint8_t *)0xc000);
+ /* *base = (uint8_t *)(mv_rom - (uint8_t *)0xc000); */
+ *base = (uint8_t *)(0 - 0xc000);
+ *base += (uintptr_t)(mv_rom);
*start = 0xe000;
*limit = 0xfffd;
return CART_READ_VALID;
@@ -1306,7 +1308,9 @@
return CART_READ_THROUGH_NO_ULTIMAX; /* "passthrough" */
} else {
if (mv_romA000_enabled) {
- *base = (uint8_t *)(mv_rom - (uint8_t *)0xa000);
+ /* *base = (uint8_t *)(mv_rom - (uint8_t *)0xa000); */
+ *base = (uint8_t *)(0 - 0xa000);
+ *base += (uintptr_t)(mv_rom);
*start = 0xa000;
*limit = 0xbffd;
return CART_READ_VALID;
Modified: trunk/vice/src/c64/vsidmem.c
===================================================================
--- trunk/vice/src/c64/vsidmem.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/vsidmem.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -439,11 +439,20 @@
mem_read_tab[base][index] = read_func;
}
+
+/* set c64 base */
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr)
{
mem_read_base_tab[base][index] = mem_ptr;
}
+/* add actual pointer */
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr)
+{
+ mem_read_base_tab[base][index] += addr;
+}
+
+
void mem_read_limit_set(unsigned int base, unsigned int index, uint32_t limit)
{
mem_read_limit_tab[base][index] = limit;
@@ -501,6 +510,8 @@
/* Setup character generator ROM at $D000-$DFFF (memory configs 1, 2, 3, 9, 10, 11, 25, 26, 27). */
for (i = 0xd0; i <= 0xdf; i++) {
+ uintptr_t addr = 0 - 0xd000;
+
mem_read_tab[1][i] = chargen_read;
mem_read_tab[2][i] = chargen_read;
mem_read_tab[3][i] = chargen_read;
@@ -510,6 +521,7 @@
mem_read_tab[25][i] = chargen_read;
mem_read_tab[26][i] = chargen_read;
mem_read_tab[27][i] = chargen_read;
+#if 0
mem_read_base_tab[1][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[2][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[3][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
@@ -519,6 +531,25 @@
mem_read_base_tab[25][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[26][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
mem_read_base_tab[27][i] = (uint8_t *)(mem_chargen_rom - (uint8_t *)0xd000);
+#else
+ mem_read_base_set(1, i, (uint8_t*)addr);
+ mem_read_base_set(2, i, (uint8_t*)addr);
+ mem_read_base_set(3, i, (uint8_t*)addr);
+ mem_read_base_set(9, i, (uint8_t*)addr);
+ mem_read_base_set(10, i, (uint8_t*)addr);
+ mem_read_base_set(11, i, (uint8_t*)addr);
+ mem_read_base_set(26, i, (uint8_t*)addr);
+ mem_read_base_set(27, i, (uint8_t*)addr);
+
+ mem_read_addr_set(1, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(2, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(3, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(9, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(10, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(11, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(26, i, (uintptr_t)mem_chargen_rom);
+ mem_read_addr_set(27, i, (uintptr_t)mem_chargen_rom);
+#endif
}
c64meminit(0);
Modified: trunk/vice/src/c64/vsidmeminit.c
===================================================================
--- trunk/vice/src/c64/vsidmeminit.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/c64/vsidmeminit.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -116,10 +116,19 @@
/* Setup BASIC ROM at $A000-$BFFF (memory configs 3 and 7). */
for (i = 0xa0; i <= 0xbf; i++) {
+ uintptr_t addr = 0 - 0xa000;
mem_read_tab_set(base + 3, i, c64memrom_basic64_read);
mem_read_tab_set(base + 7, i, c64memrom_basic64_read);
+#if 0
mem_read_base_set(base + 3, i, c64memrom_basic64_rom - 0xa000);
mem_read_base_set(base + 7, i, c64memrom_basic64_rom - 0xa000);
+#else
+ mem_read_base_set(base + 3, i, (uint8_t*)addr);
+ mem_read_base_set(base + 7, i, (uint8_t*)addr);
+
+ mem_read_addr_set(base + 3, i, (uintptr_t)c64memrom_basic64_rom);
+ mem_read_addr_set(base + 7, i, (uintptr_t)c64memrom_basic64_rom);
+#endif
}
/* Setup I/O at $D000-$DFFF (memory configs 5, 6, 7). */
@@ -164,13 +173,27 @@
/* Setup Kernal ROM at $E000-$FFFF (memory configs 2, 3, 6, 7). */
for (i = 0xe0; i <= 0xff; i++) {
+ uintptr_t addr = 0 - 0xe000;
+
mem_read_tab_set(base + 2, i, c64memrom_kernal64_read);
mem_read_tab_set(base + 3, i, c64memrom_kernal64_read);
mem_read_tab_set(base + 6, i, c64memrom_kernal64_read);
mem_read_tab_set(base + 7, i, c64memrom_kernal64_read);
+#if 0
mem_read_base_set(base + 2, i, c64memrom_kernal64_rom - 0xe000);
mem_read_base_set(base + 3, i, c64memrom_kernal64_rom - 0xe000);
mem_read_base_set(base + 6, i, c64memrom_kernal64_rom - 0xe000);
mem_read_base_set(base + 7, i, c64memrom_kernal64_rom - 0xe000);
+#else
+ mem_read_base_set(base + 2, i, (uint8_t*)addr);
+ mem_read_base_set(base + 3, i, (uint8_t*)addr);
+ mem_read_base_set(base + 6, i, (uint8_t*)addr);
+ mem_read_base_set(base + 7, i, (uint8_t*)addr);
+
+ mem_read_addr_set(base + 2, i, (uintptr_t)c64memrom_kernal64_rom);
+ mem_read_addr_set(base + 3, i, (uintptr_t)c64memrom_kernal64_rom);
+ mem_read_addr_set(base + 6, i, (uintptr_t)c64memrom_kernal64_rom);
+ mem_read_addr_set(base + 7, i, (uintptr_t)c64memrom_kernal64_rom);
+#endif
}
}
Modified: trunk/vice/src/scpu64/scpu64mem.c
===================================================================
--- trunk/vice/src/scpu64/scpu64mem.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/scpu64/scpu64mem.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -1280,11 +1280,18 @@
mem_read_tab[base][index] = read_func;
}
+/* set c64 base */
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr)
{
mem_read_base_tab[base][index] = mem_ptr;
}
+/* add actual pointer */
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr)
+{
+ mem_read_base_tab[base][index] += addr;
+}
+
void mem_initialize_memory(void)
{
int i, j, l;
Modified: trunk/vice/src/scpu64/scpu64mem.h
===================================================================
--- trunk/vice/src/scpu64/scpu64mem.h 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/scpu64/scpu64mem.h 2025-05-10 23:46:26 UTC (rev 45667)
@@ -125,6 +125,7 @@
void mem_set_write_hook(int config, int page, store_func_t *f);
void mem_read_tab_set(unsigned int base, unsigned int index, read_func_ptr_t read_func);
void mem_read_base_set(unsigned int base, unsigned int index, uint8_t *mem_ptr);
+void mem_read_addr_set(unsigned int base, unsigned int index, uintptr_t addr);
void mem_store_without_ultimax(uint16_t addr, uint8_t value);
uint8_t mem_read_without_ultimax(uint16_t addr);
Modified: trunk/vice/src/scpu64/scpu64meminit.c
===================================================================
--- trunk/vice/src/scpu64/scpu64meminit.c 2025-05-10 17:30:53 UTC (rev 45666)
+++ trunk/vice/src/scpu64/scpu64meminit.c 2025-05-10 23:46:26 UTC (rev 45667)
@@ -277,7 +277,12 @@
break;
case KT:
mem_read_tab_set(k, j, ram1_read);
+#if 0
mem_read_base_set(k, j, mem_trap_ram - 0xe000);
+#else
+ mem_read_base_set(k, j, (uint8_t*)(0 - 0xe000));
+ mem_read_addr_set(k, j, (uintptr_t)mem_trap_ram);
+#endif
/* write hook preset, ram */
break;
case KS:
@@ -413,7 +418,12 @@
break;
case CR:
mem_read_tab_set(k, j, chargen_read);
+#if 0
mem_read_base_set(k, j, mem_chargen_rom - 0xd000);
+#else
+ mem_read_base_set(k, j, (uint8_t*)(0 - 0xd000));
+ mem_read_addr_set(k, j, (uintptr_t)mem_chargen_rom);
+#endif
/* write hook preset, ram */
break;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|