Mesen/Core/TxcChip.h
2019-12-20 22:59:09 -05:00

97 lines
1.6 KiB
C++

#pragma once
#include "stdafx.h"
#include "Snapshotable.h"
class TxcChip : public Snapshotable
{
private:
uint8_t _accumulator;
uint8_t _inverter;
uint8_t _staging;
uint8_t _output;
bool _increase;
bool _yFlag;
bool _invert;
uint8_t _mask;
bool _isJv001;
public:
TxcChip(bool isJv001)
{
_accumulator = 0;
_inverter = 0;
_staging = 0;
_output = 0;
_increase = false;
_yFlag = false;
_isJv001 = isJv001;
_mask = isJv001 ? 0x0F : 0x07;
_invert = isJv001;
}
void StreamState(bool saving)
{
Stream(_accumulator, _invert, _inverter, _staging, _output, _increase, _yFlag);
}
bool GetInvertFlag()
{
return _invert;
}
bool GetY()
{
return _yFlag;
}
uint8_t GetOutput()
{
return _output;
}
uint8_t Read()
{
uint8_t value = (_accumulator & _mask) | ((_inverter ^ (_invert ? 0xFF : 0)) & ~_mask);
_yFlag = !_invert || ((value & 0x10) != 0);
return value;
}
void Write(uint16_t addr, uint8_t value)
{
if(addr < 0x8000) {
switch(addr & 0xE103) {
case 0x4100:
if(_increase) {
_accumulator++;
} else {
_accumulator = ((_accumulator & ~_mask) | (_staging & _mask)) ^ (_invert ? 0xFF : 0);
}
break;
case 0x4101:
_invert = (value & 0x01) != 0;
break;
case 0x4102:
_staging = value & _mask;
_inverter = value & ~_mask;
break;
case 0x4103:
_increase = (value & 0x01) != 0;
break;
}
} else {
if(_isJv001) {
_output = (_accumulator & 0x0F) | (_inverter & 0xF0);
} else {
_output = (_accumulator & 0x0F) | ((_inverter & 0x08) << 1);
}
}
_yFlag = !_invert || ((value & 0x10) != 0);
}
};