22#ifndef SYSTEMROMBANKS_H
23#define SYSTEMROMBANKS_H
31#include "c64/CPU/opcodes.h"
44 static_assert((N > 0) && ((N & (N - 1)) == 0),
"N must be a power of two");
56 inline void setVal(uint_least16_t address, uint8_t val) {
rom[address & (N-1)] = val; }
57 inline void setVal16(uint_least16_t address, uint_least16_t val)
59 endian_little16(
getPtr(address), val);
65 inline uint8_t
getVal(uint_least16_t address)
const {
return rom[address & (N-1)]; }
66 inline uint_least16_t getVal16(uint_least16_t address)
68 return endian_little16(
getPtr(address));
74 inline uint8_t*
getPtr(uint_least16_t address) {
return &
rom[address & (N-1)]; }
80 virtual void set(
const uint8_t* source) {
if (source !=
nullptr) std::memcpy(
rom, source, N); }
85 void poke(uint_least16_t, uint8_t)
override {}
90 uint8_t
peek(uint_least16_t address)
override {
return rom[address & (N-1)]; }
101 uint_least16_t resetVector;
104 uint8_t save_regs[5] =
113 uint8_t restore_regs[5] =
123 uint16_t kernal_functions[78] =
167 void fill(uint_least16_t address,
const uint8_t data[5])
169 std::memcpy(
getPtr(address), data, 5);
173 void set(
const uint8_t* kernal)
override
177 if (kernal ==
nullptr)
179 std::fill(std::begin(
rom), std::end(
rom), NOPn);
183 setVal16(0xea32, 0xea7e);
186 setVal16(0xea7f, 0xdc0d);
187 fill(0xea81, restore_regs);
196 setVal16(0xfe45, 0x0318);
199 fill(0xfe47, save_regs);
201 fill(0xfebc, restore_regs);
205 fill(0xff48, save_regs);
207 setVal16(0xff4e, 0x0314);
210 setVal16(0xfffa, 0xfe43);
211 setVal16(0xfffc, 0xfce2);
212 setVal16(0xfffe, 0xff48);
215 for (
auto addr: kernal_functions)
220 resetVector = getVal16(0xfffc);
226 setVal16(0xfffc, resetVector);
236 setVal16(0xfffc, addr);
252 void set(
const uint8_t* basic)
override
257 std::memcpy(trap,
getPtr(0xa7ae),
sizeof(trap));
259 std::memcpy(subTune,
getPtr(0xbf53),
sizeof(subTune));
265 std::memcpy(
getPtr(0xa7ae), trap,
sizeof(trap));
267 std::memcpy(
getPtr(0xbf53), subTune,
sizeof(subTune));
278 setVal16(0xa7af, addr);
281 void setSubtune(uint8_t tune)
286 setVal16(0xbf56, 0x030c);
288 setVal16(0xbf59, 0xa82c);
290 setVal16(0xbf5c, 0xa7b1);
Definition SystemROMBanks.h:246
void set(const uint8_t *basic) override
Definition SystemROMBanks.h:252
void installTrap(uint_least16_t addr)
Definition SystemROMBanks.h:275
Definition SystemROMBanks.h:299
Definition SystemROMBanks.h:99
void installResetHook(uint_least16_t addr)
Definition SystemROMBanks.h:234
void set(const uint8_t *kernal) override
Definition SystemROMBanks.h:173
Definition SystemROMBanks.h:43
uint8_t peek(uint_least16_t address) override
Definition SystemROMBanks.h:90
uint8_t getVal(uint_least16_t address) const
Definition SystemROMBanks.h:65
uint8_t * getPtr(uint_least16_t address)
Definition SystemROMBanks.h:74
virtual void set(const uint8_t *source)
Definition SystemROMBanks.h:80
void poke(uint_least16_t, uint8_t) override
Definition SystemROMBanks.h:85
uint8_t rom[N]
The ROM array.
Definition SystemROMBanks.h:48
void setVal(uint_least16_t address, uint8_t val)
Definition SystemROMBanks.h:56