2018-12-03 12:26:02 +01:00
|
|
|
/*****************************************************************************\
|
|
|
|
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
|
|
|
This file is licensed under the Snes9x License.
|
|
|
|
For further information, consult the LICENSE file in the root directory.
|
|
|
|
\*****************************************************************************/
|
2010-01-27 23:08:56 +01:00
|
|
|
|
|
|
|
/*****
|
|
|
|
* SPC7110 emulator - version 0.03 (2008-08-10)
|
|
|
|
* Copyright (c) 2008, byuu and neviksti
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
|
|
* copyright notice and this permission notice appear in all copies.
|
|
|
|
*
|
|
|
|
* The software is provided "as is" and the author disclaims all warranties
|
|
|
|
* with regard to this software including all implied warranties of
|
|
|
|
* merchantibility and fitness, in no event shall the author be liable for
|
|
|
|
* any special, direct, indirect, or consequential damages or any damages
|
|
|
|
* whatsoever resulting from loss of use, data or profits, whether in an
|
|
|
|
* action of contract, negligence or other tortious action, arising out of
|
|
|
|
* or in connection with the use or performance of this software.
|
|
|
|
*****/
|
|
|
|
|
|
|
|
|
|
|
|
#include <limits>
|
|
|
|
|
|
|
|
#include "snes9x.h"
|
2008-08-06 03:09:59 +02:00
|
|
|
#include "memmap.h"
|
2010-01-27 23:08:56 +01:00
|
|
|
#include "srtc.h"
|
2008-08-06 03:09:59 +02:00
|
|
|
#include "display.h"
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
#define memory_cartrom_size() Memory.CalculatedSize
|
|
|
|
#define memory_cartrom_read(a) Memory.ROM[(a)]
|
|
|
|
#define memory_cartrtc_read(a) RTCData.reg[(a)]
|
|
|
|
#define memory_cartrtc_write(a, b) { RTCData.reg[(a)] = (b); }
|
|
|
|
#define cartridge_info_spc7110rtc Settings.SPC7110RTC
|
|
|
|
#define cpu_regs_mdr OpenBus
|
|
|
|
|
|
|
|
#define _SPC7110EMU_CPP_
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
#include <stdint.h>
|
|
|
|
#include "port.h"
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
#include "spc7110emu.h"
|
|
|
|
#include "spc7110emu.cpp"
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
SPC7110 s7emu;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2008-09-10 07:57:37 +02:00
|
|
|
static void SetSPC7110SRAMMap (uint8);
|
|
|
|
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
void S9xInitSPC7110 (void)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
s7emu.power();
|
|
|
|
memset(RTCData.reg, 0, 20);
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
void S9xResetSPC7110 (void)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
s7emu.reset();
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
static void SetSPC7110SRAMMap (uint8 newstate)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
if (newstate & 0x80)
|
2009-11-30 09:14:38 +01:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
Memory.Map[0x006] = (uint8 *) Memory.MAP_HIROM_SRAM;
|
|
|
|
Memory.Map[0x007] = (uint8 *) Memory.MAP_HIROM_SRAM;
|
|
|
|
Memory.Map[0x306] = (uint8 *) Memory.MAP_HIROM_SRAM;
|
|
|
|
Memory.Map[0x307] = (uint8 *) Memory.MAP_HIROM_SRAM;
|
2009-11-30 09:14:38 +01:00
|
|
|
}
|
2008-08-06 03:09:59 +02:00
|
|
|
else
|
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
Memory.Map[0x006] = (uint8 *) Memory.MAP_RONLY_SRAM;
|
|
|
|
Memory.Map[0x007] = (uint8 *) Memory.MAP_RONLY_SRAM;
|
|
|
|
Memory.Map[0x306] = (uint8 *) Memory.MAP_RONLY_SRAM;
|
|
|
|
Memory.Map[0x307] = (uint8 *) Memory.MAP_RONLY_SRAM;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
uint8 * S9xGetBasePointerSPC7110 (uint32 address)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
uint32 i;
|
|
|
|
|
|
|
|
switch (address & 0xf00000)
|
2009-11-30 09:14:38 +01:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
case 0xd00000:
|
|
|
|
i = s7emu.dx_offset;
|
2008-08-06 03:09:59 +02:00
|
|
|
break;
|
2010-01-27 23:08:56 +01:00
|
|
|
|
|
|
|
case 0xe00000:
|
|
|
|
i = s7emu.ex_offset;
|
2008-08-06 03:09:59 +02:00
|
|
|
break;
|
2010-01-27 23:08:56 +01:00
|
|
|
|
|
|
|
case 0xf00000:
|
|
|
|
i = s7emu.fx_offset;
|
2008-08-06 03:09:59 +02:00
|
|
|
break;
|
2010-01-27 23:08:56 +01:00
|
|
|
|
2008-08-06 03:09:59 +02:00
|
|
|
default:
|
2010-01-27 23:08:56 +01:00
|
|
|
i = 0;
|
2008-08-06 03:09:59 +02:00
|
|
|
break;
|
|
|
|
}
|
2010-01-27 23:08:56 +01:00
|
|
|
|
|
|
|
i += address & 0x0f0000;
|
2009-11-30 09:14:38 +01:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
return (&Memory.ROM[i]);
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
uint8 S9xGetSPC7110Byte (uint32 address)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
uint32 i;
|
2009-11-30 09:14:38 +01:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
switch (address & 0xf00000)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
case 0xd00000:
|
|
|
|
i = s7emu.dx_offset;
|
|
|
|
break;
|
2009-11-30 09:14:38 +01:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
case 0xe00000:
|
|
|
|
i = s7emu.ex_offset;
|
|
|
|
break;
|
2009-11-30 09:14:38 +01:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
case 0xf00000:
|
|
|
|
i = s7emu.fx_offset;
|
|
|
|
break;
|
2009-11-30 09:14:38 +01:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
default:
|
|
|
|
i = 0;
|
|
|
|
break;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
i += address & 0x0fffff;
|
2009-11-30 09:14:38 +01:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
return (Memory.ROM[i]);
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
uint8 S9xGetSPC7110 (uint16 address)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
if (!Settings.SPC7110RTC && address > 0x483f)
|
|
|
|
return (OpenBus);
|
|
|
|
|
|
|
|
return (s7emu.mmio_read(address));
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
void S9xSetSPC7110 (uint8 byte, uint16 address)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
if (!Settings.SPC7110RTC && address > 0x483f)
|
|
|
|
return;
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
if (address == 0x4830)
|
|
|
|
SetSPC7110SRAMMap(byte);
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
s7emu.mmio_write(address, byte);
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
void S9xSPC7110PreSaveState (void)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
s7snap.r4801 = s7emu.r4801;
|
|
|
|
s7snap.r4802 = s7emu.r4802;
|
|
|
|
s7snap.r4803 = s7emu.r4803;
|
|
|
|
s7snap.r4804 = s7emu.r4804;
|
|
|
|
s7snap.r4805 = s7emu.r4805;
|
|
|
|
s7snap.r4806 = s7emu.r4806;
|
|
|
|
s7snap.r4807 = s7emu.r4807;
|
|
|
|
s7snap.r4808 = s7emu.r4808;
|
|
|
|
s7snap.r4809 = s7emu.r4809;
|
|
|
|
s7snap.r480a = s7emu.r480a;
|
|
|
|
s7snap.r480b = s7emu.r480b;
|
|
|
|
s7snap.r480c = s7emu.r480c;
|
|
|
|
|
|
|
|
s7snap.r4811 = s7emu.r4811;
|
|
|
|
s7snap.r4812 = s7emu.r4812;
|
|
|
|
s7snap.r4813 = s7emu.r4813;
|
|
|
|
s7snap.r4814 = s7emu.r4814;
|
|
|
|
s7snap.r4815 = s7emu.r4815;
|
|
|
|
s7snap.r4816 = s7emu.r4816;
|
|
|
|
s7snap.r4817 = s7emu.r4817;
|
|
|
|
s7snap.r4818 = s7emu.r4818;
|
|
|
|
|
|
|
|
s7snap.r481x = s7emu.r481x;
|
|
|
|
|
|
|
|
s7snap.r4814_latch = s7emu.r4814_latch ? TRUE : FALSE;
|
|
|
|
s7snap.r4815_latch = s7emu.r4815_latch ? TRUE : FALSE;
|
|
|
|
|
|
|
|
s7snap.r4820 = s7emu.r4820;
|
|
|
|
s7snap.r4821 = s7emu.r4821;
|
|
|
|
s7snap.r4822 = s7emu.r4822;
|
|
|
|
s7snap.r4823 = s7emu.r4823;
|
|
|
|
s7snap.r4824 = s7emu.r4824;
|
|
|
|
s7snap.r4825 = s7emu.r4825;
|
|
|
|
s7snap.r4826 = s7emu.r4826;
|
|
|
|
s7snap.r4827 = s7emu.r4827;
|
|
|
|
s7snap.r4828 = s7emu.r4828;
|
|
|
|
s7snap.r4829 = s7emu.r4829;
|
|
|
|
s7snap.r482a = s7emu.r482a;
|
|
|
|
s7snap.r482b = s7emu.r482b;
|
|
|
|
s7snap.r482c = s7emu.r482c;
|
|
|
|
s7snap.r482d = s7emu.r482d;
|
|
|
|
s7snap.r482e = s7emu.r482e;
|
|
|
|
s7snap.r482f = s7emu.r482f;
|
|
|
|
|
|
|
|
s7snap.r4830 = s7emu.r4830;
|
|
|
|
s7snap.r4831 = s7emu.r4831;
|
|
|
|
s7snap.r4832 = s7emu.r4832;
|
|
|
|
s7snap.r4833 = s7emu.r4833;
|
|
|
|
s7snap.r4834 = s7emu.r4834;
|
|
|
|
|
|
|
|
s7snap.dx_offset = (uint32) s7emu.dx_offset;
|
|
|
|
s7snap.ex_offset = (uint32) s7emu.ex_offset;
|
|
|
|
s7snap.fx_offset = (uint32) s7emu.fx_offset;
|
|
|
|
|
|
|
|
s7snap.r4840 = s7emu.r4840;
|
|
|
|
s7snap.r4841 = s7emu.r4841;
|
|
|
|
s7snap.r4842 = s7emu.r4842;
|
|
|
|
|
|
|
|
s7snap.rtc_state = (int32) s7emu.rtc_state;
|
|
|
|
s7snap.rtc_mode = (int32) s7emu.rtc_mode;
|
|
|
|
s7snap.rtc_index = (uint32) s7emu.rtc_index;
|
|
|
|
|
|
|
|
s7snap.decomp_mode = (uint32) s7emu.decomp.decomp_mode;
|
|
|
|
s7snap.decomp_offset = (uint32) s7emu.decomp.decomp_offset;
|
|
|
|
|
|
|
|
for (int i = 0; i < SPC7110_DECOMP_BUFFER_SIZE; i++)
|
|
|
|
s7snap.decomp_buffer[i] = s7emu.decomp.decomp_buffer[i];
|
|
|
|
|
|
|
|
s7snap.decomp_buffer_rdoffset = (uint32) s7emu.decomp.decomp_buffer_rdoffset;
|
|
|
|
s7snap.decomp_buffer_wroffset = (uint32) s7emu.decomp.decomp_buffer_wroffset;
|
|
|
|
s7snap.decomp_buffer_length = (uint32) s7emu.decomp.decomp_buffer_length;
|
|
|
|
|
|
|
|
for (int i = 0; i < 32; i++)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
s7snap.context[i].index = s7emu.decomp.context[i].index;
|
|
|
|
s7snap.context[i].invert = s7emu.decomp.context[i].invert;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
}
|
2008-09-10 07:57:37 +02:00
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
void S9xSPC7110PostLoadState (int version)
|
2008-09-10 07:57:37 +02:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
s7emu.r4801 = s7snap.r4801;
|
|
|
|
s7emu.r4802 = s7snap.r4802;
|
|
|
|
s7emu.r4803 = s7snap.r4803;
|
|
|
|
s7emu.r4804 = s7snap.r4804;
|
|
|
|
s7emu.r4805 = s7snap.r4805;
|
|
|
|
s7emu.r4806 = s7snap.r4806;
|
|
|
|
s7emu.r4807 = s7snap.r4807;
|
|
|
|
s7emu.r4808 = s7snap.r4808;
|
|
|
|
s7emu.r4809 = s7snap.r4809;
|
|
|
|
s7emu.r480a = s7snap.r480a;
|
|
|
|
s7emu.r480b = s7snap.r480b;
|
|
|
|
s7emu.r480c = s7snap.r480c;
|
|
|
|
|
|
|
|
s7emu.r4811 = s7snap.r4811;
|
|
|
|
s7emu.r4812 = s7snap.r4812;
|
|
|
|
s7emu.r4813 = s7snap.r4813;
|
|
|
|
s7emu.r4814 = s7snap.r4814;
|
|
|
|
s7emu.r4815 = s7snap.r4815;
|
|
|
|
s7emu.r4816 = s7snap.r4816;
|
|
|
|
s7emu.r4817 = s7snap.r4817;
|
|
|
|
s7emu.r4818 = s7snap.r4818;
|
|
|
|
|
|
|
|
s7emu.r481x = s7snap.r481x;
|
|
|
|
|
|
|
|
s7emu.r4814_latch = s7snap.r4814_latch ? true : false;
|
|
|
|
s7emu.r4815_latch = s7snap.r4815_latch ? true : false;
|
|
|
|
|
|
|
|
s7emu.r4820 = s7snap.r4820;
|
|
|
|
s7emu.r4821 = s7snap.r4821;
|
|
|
|
s7emu.r4822 = s7snap.r4822;
|
|
|
|
s7emu.r4823 = s7snap.r4823;
|
|
|
|
s7emu.r4824 = s7snap.r4824;
|
|
|
|
s7emu.r4825 = s7snap.r4825;
|
|
|
|
s7emu.r4826 = s7snap.r4826;
|
|
|
|
s7emu.r4827 = s7snap.r4827;
|
|
|
|
s7emu.r4828 = s7snap.r4828;
|
|
|
|
s7emu.r4829 = s7snap.r4829;
|
|
|
|
s7emu.r482a = s7snap.r482a;
|
|
|
|
s7emu.r482b = s7snap.r482b;
|
|
|
|
s7emu.r482c = s7snap.r482c;
|
|
|
|
s7emu.r482d = s7snap.r482d;
|
|
|
|
s7emu.r482e = s7snap.r482e;
|
|
|
|
s7emu.r482f = s7snap.r482f;
|
|
|
|
|
|
|
|
s7emu.r4830 = s7snap.r4830;
|
|
|
|
s7emu.r4831 = s7snap.r4831;
|
|
|
|
s7emu.r4832 = s7snap.r4832;
|
|
|
|
s7emu.r4833 = s7snap.r4833;
|
|
|
|
s7emu.r4834 = s7snap.r4834;
|
|
|
|
|
|
|
|
s7emu.dx_offset = (unsigned) s7snap.dx_offset;
|
|
|
|
s7emu.ex_offset = (unsigned) s7snap.ex_offset;
|
|
|
|
s7emu.fx_offset = (unsigned) s7snap.fx_offset;
|
|
|
|
|
|
|
|
s7emu.r4840 = s7snap.r4840;
|
|
|
|
s7emu.r4841 = s7snap.r4841;
|
|
|
|
s7emu.r4842 = s7snap.r4842;
|
|
|
|
|
|
|
|
s7emu.rtc_state = (SPC7110::RTC_State) s7snap.rtc_state;
|
|
|
|
s7emu.rtc_mode = (SPC7110::RTC_Mode) s7snap.rtc_mode;
|
|
|
|
s7emu.rtc_index = (unsigned) s7snap.rtc_index;
|
|
|
|
|
|
|
|
s7emu.decomp.decomp_mode = (unsigned) s7snap.decomp_mode;
|
|
|
|
s7emu.decomp.decomp_offset = (unsigned) s7snap.decomp_offset;
|
|
|
|
|
|
|
|
for (int i = 0; i < SPC7110_DECOMP_BUFFER_SIZE; i++)
|
|
|
|
s7emu.decomp.decomp_buffer[i] = s7snap.decomp_buffer[i];
|
|
|
|
|
|
|
|
s7emu.decomp.decomp_buffer_rdoffset = (unsigned) s7snap.decomp_buffer_rdoffset;
|
|
|
|
s7emu.decomp.decomp_buffer_wroffset = (unsigned) s7snap.decomp_buffer_wroffset;
|
|
|
|
s7emu.decomp.decomp_buffer_length = (unsigned) s7snap.decomp_buffer_length;
|
|
|
|
|
|
|
|
for (int i = 0; i < 32; i++)
|
2009-11-30 09:14:38 +01:00
|
|
|
{
|
2010-01-27 23:08:56 +01:00
|
|
|
s7emu.decomp.context[i].index = s7snap.context[i].index;
|
|
|
|
s7emu.decomp.context[i].invert = s7snap.context[i].invert;
|
2009-11-30 09:14:38 +01:00
|
|
|
}
|
|
|
|
|
2010-01-27 23:08:56 +01:00
|
|
|
s7emu.update_time(0);
|
2009-11-30 09:14:38 +01:00
|
|
|
}
|