72 lines
1.2 KiB
C++
72 lines
1.2 KiB
C++
// (C) 2018 by Folkert van Heusden
|
|
// Released under Apache License v2.0
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
|
|
#include "rx02.h"
|
|
#include "gen.h"
|
|
#include "memory.h"
|
|
#include "utils.h"
|
|
|
|
rx02::rx02(const std::string & file, memory *const m) : m(m)
|
|
{
|
|
offset = 0;
|
|
memset(registers, 0x00, sizeof registers);
|
|
|
|
fh = fopen(file.c_str(), "rb");
|
|
}
|
|
|
|
rx02::~rx02()
|
|
{
|
|
fclose(fh);
|
|
}
|
|
|
|
uint8_t rx02::readByte(const uint16_t addr)
|
|
{
|
|
uint16_t v = readWord(addr & ~1);
|
|
|
|
if (addr & 1)
|
|
return v >> 8;
|
|
|
|
return v;
|
|
}
|
|
|
|
uint16_t rx02::readWord(const uint16_t addr)
|
|
{
|
|
const int reg = (addr - RX02_BASE) / 2;
|
|
uint16_t vtemp = registers[reg];
|
|
|
|
D(printf("RX02 read addr %o: ", addr);)
|
|
|
|
// FIXME
|
|
|
|
D(printf("%o\n", vtemp);)
|
|
|
|
return vtemp;
|
|
}
|
|
|
|
void rx02::writeByte(const uint16_t addr, const uint8_t v)
|
|
{
|
|
uint16_t vtemp = registers[(addr - RX02_BASE) / 2];
|
|
|
|
if (addr & 1) {
|
|
vtemp &= ~0xff00;
|
|
vtemp |= v << 8;
|
|
}
|
|
else {
|
|
vtemp &= ~0x00ff;
|
|
vtemp |= v;
|
|
}
|
|
|
|
writeWord(addr, vtemp);
|
|
}
|
|
|
|
void rx02::writeWord(const uint16_t addr, uint16_t v)
|
|
{
|
|
D(printf("RX02 write %o: %o\n", addr, v);)
|
|
|
|
// FIXME
|
|
|
|
D(printf("set register %o to %o\n", addr, v);)
|
|
registers[(addr - RX02_BASE) / 2] = v;
|
|
}
|