mirror of
https://github.com/zoriya/ComSquare.git
synced 2026-05-24 07:11:19 +00:00
Parsing SPC ROM data into APU & fixing operands of two MOV instructions
This commit is contained in:
+71
-2
@@ -3,6 +3,7 @@
|
||||
//
|
||||
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include "APU.hpp"
|
||||
#include "../Exceptions/NotImplementedException.hpp"
|
||||
#include "../Exceptions/InvalidAddress.hpp"
|
||||
@@ -650,7 +651,7 @@ namespace ComSquare::APU
|
||||
case 0xE3:
|
||||
return this->BBS(this->_getDirectAddr(), this->_getImmediateData(), 7);
|
||||
case 0xE4:
|
||||
return this->MOV(this->_getDirectAddr(), this->_internalRegisters.a, 3);
|
||||
return this->MOV(this->_internalRead(this->_getDirectAddr()), this->_internalRegisters.a, 3);
|
||||
case 0xE5:
|
||||
return this->MOV(this->_getAbsoluteAddrByX(), this->_internalRegisters.a, 5);
|
||||
case 0xE6:
|
||||
@@ -682,7 +683,7 @@ namespace ComSquare::APU
|
||||
case 0xF3:
|
||||
return this->BBC(this->_getDirectAddr(), this->_getImmediateData(), 7);
|
||||
case 0xF4:
|
||||
return this->MOV(this->_getDirectAddrByX(), this->_internalRegisters.a, 4);
|
||||
return this->MOV(this->_internalRead(this->_getDirectAddrByX()), this->_internalRegisters.a, 4);
|
||||
case 0xF5:
|
||||
return this->MOV(this->_getAbsoluteAddrByX(), this->_internalRegisters.a, 5);
|
||||
case 0xF6:
|
||||
@@ -731,6 +732,74 @@ namespace ComSquare::APU
|
||||
this->_renderer.playAudio(std::span{this->_soundBuffer}, samples / 2);
|
||||
}
|
||||
|
||||
void APU::loadFromSPC(const std::shared_ptr<Cartridge::Cartridge>& cartridge)
|
||||
{
|
||||
const uint8_t *data = cartridge->getData();
|
||||
|
||||
std::string song = std::string(reinterpret_cast<const char *>(data + 0x2E), 0x20);
|
||||
std::string game = std::string(reinterpret_cast<const char *>(data + 0x4E), 0x20);
|
||||
std::string dumper = std::string(reinterpret_cast<const char *>(data + 0x6E), 0x10);
|
||||
std::string comment = std::string(reinterpret_cast<const char *>(data + 0x7E), 0x20);
|
||||
std::string date = std::string(reinterpret_cast<const char *>(data + 0x9E), 0x0B);
|
||||
std::string artist = std::string(reinterpret_cast<const char *>(data + 0xB1), 0x20);
|
||||
|
||||
this->_internalRegisters.pcl = cartridge->read(0x25);
|
||||
this->_internalRegisters.pch = cartridge->read(0x26);
|
||||
this->_internalRegisters.a = cartridge->read(0x27);
|
||||
this->_internalRegisters.x = cartridge->read(0x28);
|
||||
this->_internalRegisters.y = cartridge->read(0x29);
|
||||
this->_internalRegisters.psw = cartridge->read(0x2A);
|
||||
this->_internalRegisters.sp = cartridge->read(0x2B);
|
||||
|
||||
std::memcpy(this->_map->Page0.getData(), data + 0x100, this->_map->Page0.getSize());
|
||||
std::memcpy(this->_map->Page1.getData(), data + 0x200, this->_map->Page1.getSize());
|
||||
std::memcpy(this->_map->Memory.getData(), data + 0x300, this->_map->Memory.getSize());
|
||||
|
||||
this->_registers.unknown = cartridge->read(0x100 + 0xF0);
|
||||
this->_registers.ctrlreg = cartridge->read(0x100 + 0xF1);
|
||||
this->_registers.dspregAddr = cartridge->read(0x100 + 0xF2);
|
||||
this->_dsp.write(this->_registers.dspregAddr, cartridge->read(0x100 + 0xF3));
|
||||
this->_registers.port0 = cartridge->read(0x100 + 0xF4);
|
||||
this->_registers.port1 = cartridge->read(0x100 + 0xF5);
|
||||
this->_registers.port2 = cartridge->read(0x100 + 0xF6);
|
||||
this->_registers.port3 = cartridge->read(0x100 + 0xF7);
|
||||
this->_registers.regmem1 = cartridge->read(0x100 + 0xF8);
|
||||
this->_registers.regmem2 = cartridge->read(0x100 + 0xF9);
|
||||
this->_registers.timer0 = cartridge->read(0x100 + 0xFA);
|
||||
this->_registers.timer1 = cartridge->read(0x100 + 0xFB);
|
||||
this->_registers.timer2 = cartridge->read(0x100 + 0xFC);
|
||||
this->_registers.counter0 = cartridge->read(0x100 + 0xFD);
|
||||
this->_registers.counter1 = cartridge->read(0x100 + 0xFE);
|
||||
this->_registers.counter2 = cartridge->read(0x100 + 0xFF);
|
||||
|
||||
for (int i = 0x00; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x01; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x02; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x03; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x04; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x05; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x06; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x07; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x08; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x09; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x0C; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x0D; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
for (int i = 0x0F; i < 0x80; i += 0x10)
|
||||
this->_dsp.write(i, cartridge->read(0x10100 + i));
|
||||
}
|
||||
|
||||
void APU::_setNZflags(uint8_t value)
|
||||
{
|
||||
this->_internalRegisters.n = value & 0x80u;
|
||||
|
||||
Reference in New Issue
Block a user