2020-02-16 21:11:01 -05:00
|
|
|
#pragma once
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "BaseCoprocessor.h"
|
|
|
|
#include "Spc7110Decomp.h"
|
|
|
|
#include "Rtc4513.h"
|
|
|
|
|
|
|
|
class Console;
|
|
|
|
class Spc7110Decomp;
|
|
|
|
class IMemoryHandler;
|
2020-02-29 17:15:23 -05:00
|
|
|
class BaseCartridge;
|
2020-02-16 21:11:01 -05:00
|
|
|
|
|
|
|
class Spc7110 : public BaseCoprocessor
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
unique_ptr<Spc7110Decomp> _decomp;
|
|
|
|
unique_ptr<Rtc4513> _rtc;
|
|
|
|
|
|
|
|
IMemoryHandler* _cpuRegisterHandler = nullptr;
|
|
|
|
Console* _console = nullptr;
|
2020-02-29 17:15:23 -05:00
|
|
|
BaseCartridge* _cart = nullptr;
|
2020-02-16 21:11:01 -05:00
|
|
|
bool _useRtc = false;
|
2020-02-29 17:15:23 -05:00
|
|
|
uint32_t _realDataRomSize = 0;
|
2020-02-16 21:11:01 -05:00
|
|
|
|
|
|
|
//Decomp
|
|
|
|
uint32_t _directoryBase = 0;
|
|
|
|
uint8_t _directoryIndex = 0;
|
|
|
|
uint16_t _targetOffset = 0;
|
|
|
|
uint16_t _dataLengthCounter = 0;
|
|
|
|
uint8_t _skipBytes = 0;
|
|
|
|
uint8_t _decompFlags = 0;
|
|
|
|
uint8_t _decompMode = 0;
|
|
|
|
uint32_t _srcAddress = 0;
|
|
|
|
uint32_t _decompOffset = 0;
|
|
|
|
uint8_t _decompStatus = 0;
|
|
|
|
uint8_t _decompBuffer[32];
|
|
|
|
|
|
|
|
//ALU
|
|
|
|
uint32_t _dividend = 0;
|
|
|
|
uint16_t _multiplier = 0;
|
|
|
|
uint16_t _divisor = 0;
|
|
|
|
uint32_t _multDivResult = 0;
|
|
|
|
uint16_t _remainder = 0;
|
|
|
|
uint8_t _aluState = 0;
|
|
|
|
uint8_t _aluFlags = 0;
|
|
|
|
|
|
|
|
//Memory mappings
|
|
|
|
uint8_t _sramEnabled = 0;
|
2020-12-19 23:30:09 +03:00
|
|
|
uint8_t _dataRomBanks[3] = {0, 1, 2};
|
2020-02-16 21:11:01 -05:00
|
|
|
uint8_t _dataRomSize = 0;
|
|
|
|
|
|
|
|
//Data rom
|
|
|
|
uint32_t _readBase = 0;
|
|
|
|
uint16_t _readOffset = 0;
|
|
|
|
uint16_t _readStep = 0;
|
|
|
|
uint8_t _readMode = 0;
|
|
|
|
uint8_t _readBuffer = 0;
|
|
|
|
|
|
|
|
void ProcessMultiplication();
|
|
|
|
void ProcessDivision();
|
|
|
|
|
|
|
|
void FillReadBuffer();
|
|
|
|
void IncrementPosition();
|
|
|
|
void IncrementPosition4810();
|
|
|
|
|
|
|
|
void LoadEntryHeader();
|
|
|
|
void BeginDecompression();
|
|
|
|
uint8_t ReadDecompressedByte();
|
|
|
|
|
|
|
|
public:
|
|
|
|
Spc7110(Console* console, bool useRtc);
|
2020-12-19 23:30:09 +03:00
|
|
|
|
2020-02-16 21:11:01 -05:00
|
|
|
uint8_t ReadDataRom(uint32_t addr);
|
|
|
|
|
|
|
|
void Serialize(Serializer& s) override;
|
|
|
|
uint8_t Read(uint32_t addr) override;
|
|
|
|
uint8_t Peek(uint32_t addr) override;
|
|
|
|
void PeekBlock(uint32_t addr, uint8_t* output) override;
|
|
|
|
void Write(uint32_t addr, uint8_t value) override;
|
|
|
|
void UpdateMappings();
|
|
|
|
AddressInfo GetAbsoluteAddress(uint32_t address) override;
|
|
|
|
void Reset() override;
|
|
|
|
|
|
|
|
void LoadBattery() override;
|
|
|
|
void SaveBattery() override;
|
2020-12-19 23:30:09 +03:00
|
|
|
};
|