mirror of
https://github.com/libretro/Mesen.git
synced 2024-12-11 10:54:01 +00:00
933fa3e8ba
Based on NRS' research
97 lines
1.6 KiB
C++
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);
|
|
}
|
|
}; |