snes9xgx/source/snes9x/spc7110.cpp

319 lines
8.1 KiB
C++
Raw Normal View History

/*****************************************************************************\
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"
#include "memmap.h"
2010-01-27 23:08:56 +01:00
#include "srtc.h"
#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_
2010-01-27 23:08:56 +01:00
#include <stdint.h>
#include "port.h"
2010-01-27 23:08:56 +01:00
#include "spc7110emu.h"
#include "spc7110emu.cpp"
2010-01-27 23:08:56 +01:00
SPC7110 s7emu;
2008-09-10 07:57:37 +02:00
static void SetSPC7110SRAMMap (uint8);
2010-01-27 23:08:56 +01:00
void S9xInitSPC7110 (void)
{
2010-01-27 23:08:56 +01:00
s7emu.power();
memset(RTCData.reg, 0, 20);
}
2010-01-27 23:08:56 +01:00
void S9xResetSPC7110 (void)
{
2010-01-27 23:08:56 +01:00
s7emu.reset();
}
2010-01-27 23:08:56 +01:00
static void SetSPC7110SRAMMap (uint8 newstate)
{
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
}
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;
}
}
2010-01-27 23:08:56 +01:00
uint8 * S9xGetBasePointerSPC7110 (uint32 address)
{
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;
break;
2010-01-27 23:08:56 +01:00
case 0xe00000:
i = s7emu.ex_offset;
break;
2010-01-27 23:08:56 +01:00
case 0xf00000:
i = s7emu.fx_offset;
break;
2010-01-27 23:08:56 +01:00
default:
2010-01-27 23:08:56 +01:00
i = 0;
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]);
}
2010-01-27 23:08:56 +01:00
uint8 S9xGetSPC7110Byte (uint32 address)
{
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)
{
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;
}
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]);
}
2010-01-27 23:08:56 +01:00
uint8 S9xGetSPC7110 (uint16 address)
{
2010-01-27 23:08:56 +01:00
if (!Settings.SPC7110RTC && address > 0x483f)
return (OpenBus);
return (s7emu.mmio_read(address));
}
2010-01-27 23:08:56 +01:00
void S9xSetSPC7110 (uint8 byte, uint16 address)
{
2010-01-27 23:08:56 +01:00
if (!Settings.SPC7110RTC && address > 0x483f)
return;
2010-01-27 23:08:56 +01:00
if (address == 0x4830)
SetSPC7110SRAMMap(byte);
2010-01-27 23:08:56 +01:00
s7emu.mmio_write(address, byte);
}
2010-01-27 23:08:56 +01:00
void S9xSPC7110PreSaveState (void)
{
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++)
{
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-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
}