Files
Bear/cpu.h

78 lines
1.7 KiB
C
Raw Permalink Normal View History

2026-03-03 23:50:39 -06:00
#ifndef BEAR_CPU_H
#define BEAR_CPU_H
#include "common.h"
#include "memory.h"
class CPU
{
public:
explicit CPU(IMemoryAccessor* memory);
void start();
void reset();
private:
enum STATUS_FLAGS
{
C = 1 << 0,
Z = 1 << 1,
I = 1 << 2,
D = 1 << 3,
B = 1 << 4,
O = 1 << 6,
N = 1 << 7,
};
uint8_t a;
uint8_t x, y;
uint16_t pc;
uint8_t sp;
IMemoryAccessor* _memory;
// Stat flags
uint8_t stat;
int cycles;
bool stop;
void c(const bool _v) { _v ? (stat |= C) : stat &= ~C; }
[[nodiscard]] bool c() const { return (stat & C) > 0; }
void z(const bool _v) { _v ? (stat |= Z) : stat &= ~Z; }
[[nodiscard]] bool z() const { return (stat & Z) > 0; }
void i(const bool _v) { _v ? (stat |= I) : stat &= ~I; }
[[nodiscard]] bool i() const { return (stat & I) > 0; }
void d(const bool _v) { _v ? (stat |= D) : stat &= ~D; }
[[nodiscard]] bool d() const { return (stat & D) > 0; }
void b(const bool _v) { _v ? (stat |= B) : stat &= ~B; }
[[nodiscard]] bool b() const { return (stat & B) > 0; }
void o(const bool _v) { _v ? (stat |= O) : stat &= ~O; }
[[nodiscard]] bool o() const { return (stat & O) > 0; }
// END Stat flags
void loop();
[[nodiscard]] std::uint8_t readImm() const;
[[nodiscard]] std::uint8_t readZp() const;
[[nodiscard]] std::uint8_t readZpX() const;
[[nodiscard]] std::uint8_t readAbs();
[[nodiscard]] std::uint8_t readAbsX();
[[nodiscard]] std::uint8_t readAbsY();
[[nodiscard]] std::uint8_t readIdxInd();
[[nodiscard]] std::uint8_t readIndIdx();
void adc(std::uint8_t val);
void setFlagsFromResult(std::uint16_t result);
};
#endif //BEAR_CPU_H