mirror of
https://github.com/zoriya/ComSquare.git
synced 2025-12-19 21:55:11 +00:00
99 lines
2.1 KiB
C++
99 lines
2.1 KiB
C++
//
|
|
// Created by Melefo on 27/01/2020.
|
|
//
|
|
|
|
#include "APU.hpp"
|
|
#include "../Exceptions/NotImplementedException.hpp"
|
|
#include "../Exceptions/InvalidAddress.hpp"
|
|
|
|
namespace ComSquare::APU
|
|
{
|
|
APU::APU(std::shared_ptr<DSP> dsp)
|
|
: _dsp(std::move(dsp))
|
|
{ }
|
|
|
|
uint8_t APU::read(uint24_t addr)
|
|
{
|
|
switch (addr) {
|
|
case 0xF0:
|
|
return this->_internalRegisters.unknown;
|
|
case 0xF2:
|
|
return this->_internalRegisters.dspregAddr;
|
|
case 0xF3:
|
|
return this->_internalRegisters.dspregData;
|
|
case 0xF4:
|
|
return this->_internalRegisters.port0;
|
|
case 0xF5:
|
|
return this->_internalRegisters.port1;
|
|
case 0xF6:
|
|
return this->_internalRegisters.port2;
|
|
case 0xF7:
|
|
return this->_internalRegisters.port3;
|
|
case 0xF8:
|
|
return this->_internalRegisters.regmem1;
|
|
case 0xF9:
|
|
return this->_internalRegisters.regmem2;
|
|
case 0xFD:
|
|
return this->_internalRegisters.counter0;
|
|
case 0xFE:
|
|
return this->_internalRegisters.counter1;
|
|
case 0xFF:
|
|
return this->_internalRegisters.counter2;
|
|
default:
|
|
throw InvalidAddress("APU Internal Registers read", addr);
|
|
}
|
|
}
|
|
|
|
void APU::write(uint24_t addr, uint8_t data)
|
|
{
|
|
switch (addr) {
|
|
case 0xF0:
|
|
this->_internalRegisters.unknown = data;
|
|
break;
|
|
case 0xF1:
|
|
this->_internalRegisters.ctrlreg = data;
|
|
break;
|
|
case 0xF2:
|
|
this->_internalRegisters.dspregAddr = data;
|
|
break;
|
|
case 0xF3:
|
|
this->_internalRegisters.dspregData = data;
|
|
break;
|
|
case 0xF4:
|
|
this->_internalRegisters.port0 = data;
|
|
break;
|
|
case 0xF5:
|
|
this->_internalRegisters.port1 = data;
|
|
break;
|
|
case 0xF6:
|
|
this->_internalRegisters.port2 = data;
|
|
break;
|
|
case 0xF7:
|
|
this->_internalRegisters.port3 = data;
|
|
break;
|
|
case 0xF8:
|
|
this->_internalRegisters.regmem1 = data;
|
|
break;
|
|
case 0xF9:
|
|
this->_internalRegisters.regmem2 = data;
|
|
break;
|
|
case 0xFA:
|
|
this->_internalRegisters.timer0 = data;
|
|
break;
|
|
case 0xFB:
|
|
this->_internalRegisters.timer1 = data;
|
|
break;
|
|
case 0xFC:
|
|
this->_internalRegisters.timer2 = data;
|
|
break;
|
|
default:
|
|
throw InvalidAddress("APU Internal Registers write", addr);
|
|
}
|
|
}
|
|
|
|
bool APU::update()
|
|
{
|
|
throw NotImplementedException();
|
|
}
|
|
}
|