mirror of
https://github.com/captain-amygdala/pistorm.git
synced 2026-05-05 15:34:20 +00:00
Plug some read/write mappings directly into Musashi
This commit is contained in:
4
m68k.h
4
m68k.h
@@ -199,6 +199,10 @@ void m68k_write_memory_8(unsigned int address, unsigned int value);
|
||||
void m68k_write_memory_16(unsigned int address, unsigned int value);
|
||||
void m68k_write_memory_32(unsigned int address, unsigned int value);
|
||||
|
||||
/* PiStorm speed hax */
|
||||
void m68k_add_ram_range(uint32_t addr, uint32_t upper, unsigned char *ptr);
|
||||
void m68k_add_rom_range(uint32_t addr, uint32_t upper, unsigned char *ptr);
|
||||
|
||||
/* Special call to simulate undocumented 68k behavior when move.l with a
|
||||
* predecrement destination mode is executed.
|
||||
* To simulate real 68k behavior, first write the high word to
|
||||
|
||||
47
m68kcpu.c
47
m68kcpu.c
@@ -45,6 +45,15 @@ extern unsigned char m68ki_cycles[][0x10000];
|
||||
extern void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */
|
||||
extern void m68ki_build_opcode_table(void);
|
||||
|
||||
static unsigned char read_ranges;
|
||||
static unsigned int read_addr[8];
|
||||
static unsigned int read_upper[8];
|
||||
static unsigned char *read_data[8];
|
||||
static unsigned char write_ranges;
|
||||
static unsigned int write_addr[8];
|
||||
static unsigned int write_upper[8];
|
||||
static unsigned char *write_data[8];
|
||||
|
||||
#include "m68kops.h"
|
||||
#include "m68kcpu.h"
|
||||
|
||||
@@ -1165,6 +1174,44 @@ void m68k_set_context(void* src)
|
||||
if(src) m68ki_cpu = *(m68ki_cpu_core*)src;
|
||||
}
|
||||
|
||||
void m68k_add_ram_range(uint32_t addr, uint32_t upper, unsigned char *ptr)
|
||||
{
|
||||
if (read_ranges + 1 < 8) {
|
||||
read_addr[read_ranges] = addr;
|
||||
read_upper[read_ranges] = upper;
|
||||
read_data[read_ranges] = ptr;
|
||||
read_ranges++;
|
||||
printf("[MUSASHI] Mapped read range %d: %.8X-%.8X (%p)\n", read_ranges, addr, upper, ptr);
|
||||
}
|
||||
else {
|
||||
printf("Can't Musashi map more than eight RAM/ROM read ranges.\n");
|
||||
}
|
||||
if (write_ranges + 1 < 8) {
|
||||
write_addr[write_ranges] = addr;
|
||||
write_upper[write_ranges] = upper;
|
||||
write_data[write_ranges] = ptr;
|
||||
write_ranges++;
|
||||
printf("[MUSASHI] Mapped write range %d: %.8X-%.8X (%p)\n", write_ranges, addr, upper, ptr);
|
||||
}
|
||||
else {
|
||||
printf("Can't Musashi map more than eight RAM write ranges.\n");
|
||||
}
|
||||
}
|
||||
|
||||
void m68k_add_rom_range(uint32_t addr, uint32_t upper, unsigned char *ptr)
|
||||
{
|
||||
if (read_ranges + 1 < 8) {
|
||||
read_addr[read_ranges] = addr;
|
||||
read_upper[read_ranges] = upper;
|
||||
read_data[read_ranges] = ptr;
|
||||
read_ranges++;
|
||||
printf("[MUSASHI] Mapped read range %d: %.8X-%.8X (%p)\n", read_ranges, addr, upper, ptr);
|
||||
}
|
||||
else {
|
||||
printf("Can't Musashi map more than eight RAM/ROM read ranges.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* ======================================================================== */
|
||||
/* ============================== MAME STUFF ============================== */
|
||||
/* ======================================================================== */
|
||||
|
||||
50
m68kcpu.h
50
m68kcpu.h
@@ -40,6 +40,7 @@ extern "C" {
|
||||
#include "m68k.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <endian.h>
|
||||
|
||||
#include <setjmp.h>
|
||||
|
||||
@@ -1124,6 +1125,16 @@ static inline uint m68ki_read_imm_32(void)
|
||||
* These functions will also check for address error and set the function
|
||||
* code if they are enabled in m68kconf.h.
|
||||
*/
|
||||
|
||||
static unsigned char read_ranges;
|
||||
static unsigned int read_addr[8];
|
||||
static unsigned int read_upper[8];
|
||||
static unsigned char *read_data[8];
|
||||
static unsigned char write_ranges;
|
||||
static unsigned int write_addr[8];
|
||||
static unsigned int write_upper[8];
|
||||
static unsigned char *write_data[8];
|
||||
|
||||
static inline uint m68ki_read_8_fc(uint address, uint fc)
|
||||
{
|
||||
(void)fc;
|
||||
@@ -1134,6 +1145,12 @@ static inline uint m68ki_read_8_fc(uint address, uint fc)
|
||||
address = pmmu_translate_addr(address);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < read_ranges; i++) {
|
||||
if(address >= read_addr[i] && address < read_upper[i]) {
|
||||
return read_data[i][address];
|
||||
}
|
||||
}
|
||||
|
||||
return m68k_read_memory_8(ADDRESS_68K(address));
|
||||
}
|
||||
static inline uint m68ki_read_16_fc(uint address, uint fc)
|
||||
@@ -1147,6 +1164,12 @@ static inline uint m68ki_read_16_fc(uint address, uint fc)
|
||||
address = pmmu_translate_addr(address);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < read_ranges; i++) {
|
||||
if(address >= read_addr[i] && address < read_upper[i]) {
|
||||
return be16toh(((unsigned short *)(read_data[i] + (address - read_addr[i])))[0]);
|
||||
}
|
||||
}
|
||||
|
||||
return m68k_read_memory_16(ADDRESS_68K(address));
|
||||
}
|
||||
static inline uint m68ki_read_32_fc(uint address, uint fc)
|
||||
@@ -1160,6 +1183,12 @@ static inline uint m68ki_read_32_fc(uint address, uint fc)
|
||||
address = pmmu_translate_addr(address);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < read_ranges; i++) {
|
||||
if(address >= read_addr[i] && address < read_upper[i]) {
|
||||
return be32toh(((unsigned int *)(read_data[i] + (address - read_addr[i])))[0]);
|
||||
}
|
||||
}
|
||||
|
||||
return m68k_read_memory_32(ADDRESS_68K(address));
|
||||
}
|
||||
|
||||
@@ -1173,6 +1202,13 @@ static inline void m68ki_write_8_fc(uint address, uint fc, uint value)
|
||||
address = pmmu_translate_addr(address);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < write_ranges; i++) {
|
||||
if(address >= write_addr[i] && address < write_upper[i]) {
|
||||
write_data[i][address] = (unsigned char)value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m68k_write_memory_8(ADDRESS_68K(address), value);
|
||||
}
|
||||
static inline void m68ki_write_16_fc(uint address, uint fc, uint value)
|
||||
@@ -1186,6 +1222,13 @@ static inline void m68ki_write_16_fc(uint address, uint fc, uint value)
|
||||
address = pmmu_translate_addr(address);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < write_ranges; i++) {
|
||||
if(address >= write_addr[i] && address < write_upper[i]) {
|
||||
((short *)(read_data[i] + (address - read_addr[i])))[0] = htobe16(value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m68k_write_memory_16(ADDRESS_68K(address), value);
|
||||
}
|
||||
static inline void m68ki_write_32_fc(uint address, uint fc, uint value)
|
||||
@@ -1199,6 +1242,13 @@ static inline void m68ki_write_32_fc(uint address, uint fc, uint value)
|
||||
address = pmmu_translate_addr(address);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < write_ranges; i++) {
|
||||
if(address >= write_addr[i] && address < write_upper[i]) {
|
||||
((int *)(read_data[i] + (address - read_addr[i])))[0] = htobe32(value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
m68k_write_memory_32(ADDRESS_68K(address), value);
|
||||
}
|
||||
|
||||
|
||||
@@ -180,9 +180,10 @@ void autoconfig_write_memory_z3_8(struct emulator_config *cfg, unsigned int addr
|
||||
|
||||
if (done) {
|
||||
nib_latch = 0;
|
||||
printf("Address of Z3 autoconf RAM assigned to $%.8x\n", ac_base[ac_z3_current_pic]);
|
||||
printf("Address of Z3 autoconf RAM assigned to $%.8x [B]\n", ac_base[ac_z3_current_pic]);
|
||||
cfg->map_offset[index] = ac_base[ac_z3_current_pic];
|
||||
cfg->map_high[index] = cfg->map_offset[index] + cfg->map_size[index];
|
||||
m68k_add_ram_range(cfg->map_offset[index], cfg->map_high[index], cfg->map_data[index]);
|
||||
ac_z3_current_pic++;
|
||||
if (ac_z3_current_pic == ac_z3_pic_count) {
|
||||
ac_z3_done = 1;
|
||||
@@ -201,7 +202,7 @@ void autoconfig_write_memory_z3_16(struct emulator_config *cfg, unsigned int add
|
||||
|
||||
switch(address & 0xFF) {
|
||||
case AC_Z3_REG_WR_ADDR_HI:
|
||||
// This is, as far as I know, the only regiter it should write a 16-bit value to.
|
||||
// This is, as far as I know, the only register it should write a 16-bit value to.
|
||||
ac_base[ac_z3_current_pic] = (ac_base[ac_z3_current_pic] & 0x00000000) | (val << 16);
|
||||
done = 1;
|
||||
break;
|
||||
@@ -212,8 +213,10 @@ void autoconfig_write_memory_z3_16(struct emulator_config *cfg, unsigned int add
|
||||
}
|
||||
|
||||
if (done) {
|
||||
printf("Address of Z3 autoconf RAM assigned to $%.8x\n", ac_base[ac_z3_current_pic]);
|
||||
printf("Address of Z3 autoconf RAM assigned to $%.8x [W]\n", ac_base[ac_z3_current_pic]);
|
||||
cfg->map_offset[index] = ac_base[ac_z3_current_pic];
|
||||
cfg->map_high[index] = cfg->map_offset[index] + cfg->map_size[index];
|
||||
m68k_add_ram_range(cfg->map_offset[index], cfg->map_high[index], cfg->map_data[index]);
|
||||
ac_z3_current_pic++;
|
||||
if (ac_z3_current_pic == ac_z3_pic_count)
|
||||
ac_z3_done = 1;
|
||||
@@ -300,6 +303,7 @@ void autoconfig_write_memory_8(struct emulator_config *cfg, unsigned int address
|
||||
printf("Address of Z2 autoconf RAM assigned to $%.8x\n", ac_base[ac_z2_current_pic]);
|
||||
cfg->map_offset[index] = ac_base[ac_z2_current_pic];
|
||||
cfg->map_high[index] = cfg->map_offset[index] + cfg->map_size[index];
|
||||
m68k_add_ram_range(cfg->map_offset[index], cfg->map_high[index], cfg->map_data[index]);
|
||||
printf("Z2 PIC %d at $%.8lX-%.8lX, Size: %d MB\n", ac_z2_current_pic, cfg->map_offset[index], cfg->map_high[index], cfg->map_size[index] / SIZE_MEGA);
|
||||
ac_z2_current_pic++;
|
||||
if (ac_z2_current_pic == ac_z2_pic_count) {
|
||||
|
||||
@@ -138,7 +138,6 @@ void adjust_ranges_amiga(struct emulator_config *cfg) {
|
||||
}
|
||||
|
||||
int setup_platform_amiga(struct emulator_config *cfg) {
|
||||
if (cfg) {}
|
||||
printf("Performing setup for Amiga platform.\n");
|
||||
// Look for Z2 autoconf Fast RAM by id
|
||||
int index = get_named_mapped_item(cfg, z2_autoconf_id);
|
||||
@@ -205,6 +204,11 @@ int setup_platform_amiga(struct emulator_config *cfg) {
|
||||
}
|
||||
}
|
||||
|
||||
index = get_named_mapped_item(cfg, "cpu_slot_ram");
|
||||
if (index != -1) {
|
||||
m68k_add_ram_range((uint32_t)cfg->map_offset[index], (uint32_t)cfg->map_high[index], cfg->map_data[index]);
|
||||
}
|
||||
|
||||
adjust_ranges_amiga(cfg);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user