12#define CHIP_STACK_BOTTOM_ADDR 0x0100
13#define CHIP_MAXIMUM_MEMORY 0x10000
66 printf(
"PC=0x%04X AC=0x%02X X=0x%02X Y=0x%02X SR=0x%02X SP=0x%02X\n",
67 self->
pc, self->
ac, self->
x, self->
y, self->
sr, self->
sp);
78 byte *memory = allocator_alloc_ty(
byte, allocator, memory_size);
101 memcpy(self->
memory + rom_start, rom, len);
103 byte lo = self->
memory[0xFFFC];
104 byte hi = self->
memory[0xFFFD];
106 self->
pc = (
u16)hi << 8 | lo;
110 byte value = self->
memory[at & 0xFFFF];
113 read_node; read_node = read_node->next)
114 value = read_node->callback(self->
userdata,
false, at, value);
121 write_node; write_node = write_node->next)
122 value = write_node->callback(self->
userdata,
true, at, value);
124 self->
memory[at & 0xFFFF] = value;
143 addr = (addr + self->
x) & 0xFFFF;
148 addr = (addr + self->
y) & 0xFFFF;
165 PANIC_(
"The ACCUMULATOR addressing read mode is handled on per-instruction "
168 PANIC(
"Unhandled addressing mode read %d", mode);
174 return ((
u32)addr << 16) | value;
190 addr = (addr + self->
x) & 0xFFFF;
216 PANIC_(
"The ACCUMULATOR addressing read mode is handled on per-instruction "
219 PANIC(
"Unhandled addressing mode write %d", mode);
222 self->
memory[addr] = value;
243 if (self->
sp == 0x00) {
253 if (self->
sp == 0xFF) {
254 PANIC_(
"Stack underflow");
264 return (self->
sr >> flag) & 1;
268 self->
sr &= ~(1 << flag);
269 self->
sr |= !!value << flag;
addressing_mode_t
Definition addressing.h:6
@ ADDR_MODE_INDIRECT_Y
Definition addressing.h:16
@ ADDR_MODE_ACCUMULATOR
Definition addressing.h:19
@ ADDR_MODE_ZERO_PAGE
Definition addressing.h:15
@ ADDR_MODE_IMMEDIATE
Definition addressing.h:10
@ ADDR_MODE_ABSOLUTE
Definition addressing.h:7
@ ADDR_MODE_ABSOLUTE_X
Definition addressing.h:8
@ ADDR_MODE_ABSOLUTE_Y
Definition addressing.h:9
@ ADDR_MODE_ZERO_PAGE_Y
Definition addressing.h:18
#define CHIP_STACK_BOTTOM_ADDR
Definition chip.h:12
static u16 chip_memory_read_dword(chip_t *self, addressing_mode_t mode)
Definition chip.h:238
static void chip_stack_push(chip_t *self, byte value)
Definition chip.h:242
byte(* chip_memory_callback_t)(void *, bool is_write, u16 addr, byte value)
Definition chip.h:15
static u32 chip_memory_perform_read(chip_t *self, addressing_mode_t mode)
Definition chip.h:131
static byte chip_memory_read_word(chip_t *self, addressing_mode_t mode)
Definition chip.h:234
static u16 get_memory_addr(u32 read)
Definition chip.h:226
static void chip_flags_update_overflow(chip_t *self, byte value)
Definition chip.h:284
static u16 chip_memory_perform_write(chip_t *self, addressing_mode_t mode, byte value)
Definition chip.h:177
static void chip_dbg_dump(chip_t *self)
Definition chip.h:65
static byte get_memory_word(u32 read)
Definition chip.h:228
static void chip_load_rom(chip_t *self, byte *rom, size_t len, u16 rom_start)
Definition chip.h:100
static void chip_flags_set(chip_t *self, register_flags_t flag, byte value)
Definition chip.h:267
void(* chip_external_call_f)(chip_t *chip)
Definition chip.h:25
static byte chip_pc_inc(chip_t *self)
Definition chip.h:127
static void chip_memory_write_direct(chip_t *self, u16 at, byte value)
Definition chip.h:119
static u16 chip_memory_read_addr(chip_t *self, addressing_mode_t mode)
Definition chip.h:230
register_flags_mask_t
Definition chip.h:54
@ FLAG_MASK_CARRY
Definition chip.h:55
@ FLAG_MASK_DECIMAL
Definition chip.h:58
@ FLAG_MASK_UNUSED
Definition chip.h:60
@ FLAG_MASK_B
Definition chip.h:59
@ FLAG_MASK_INTERRUPT_DISABLE
Definition chip.h:57
@ FLAG_MASK_ZERO
Definition chip.h:56
@ FLAG_MASK_NEGATIVE
Definition chip.h:62
@ FLAG_MASK_OVERFLOW
Definition chip.h:61
static byte chip_memory_read_direct(chip_t *self, u16 at)
Definition chip.h:109
static void chip_flags_update_carry(chip_t *self, byte value)
Definition chip.h:272
register_flags_t
Definition chip.h:42
@ FLAG_NEGATIVE
Definition chip.h:51
@ FLAG_OVERFLOW
Definition chip.h:50
@ FLAG_ZERO
Definition chip.h:44
@ FLAG_B
Definition chip.h:48
@ FLAG_UNUSED
Definition chip.h:49
@ FLAG_CARRY
Definition chip.h:43
@ FLAG_DECIMAL
Definition chip.h:46
@ FLAG_INTERRUPT_DISABLE
Definition chip.h:45
static void chip_init(chip_t *self, allocator_t allocator, sz memory_size, u32 quota)
Definition chip.h:70
static byte chip_stack_pull(chip_t *self)
Definition chip.h:252
static void chip_flags_update_zero_negative(chip_t *self, byte value)
Definition chip.h:276
static void chip_memory_add_callback(chip_t *self, chip_memory_callback_t callback)
Definition chip.h:91
static byte chip_flags_get(chip_t *self, register_flags_t flag)
Definition chip.h:263
unsigned char byte
Definition defs.h:49
size_t sz
Definition defs.h:51
uint16_t u16
Definition defs.h:48
#define PANIC_(msg)
Definition defs.h:9
#define PANIC(msg,...)
Definition defs.h:15
uint32_t u32
Definition defs.h:45
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
chip_memory_callback_t callback
Definition chip.h:19
struct chip_memory_callback_node_t * next
Definition chip.h:20
byte ac
Definition chip.h:39
byte sp
Definition chip.h:39
bool halted
Definition chip.h:34
u32 quota
Definition chip.h:33
chip_external_call_f external_call
Definition chip.h:29
u16 pc
Definition chip.h:38
byte x
Definition chip.h:39
chip_memory_callback_node_t * memory_callback
Definition chip.h:28
byte y
Definition chip.h:39
byte * memory
Definition chip.h:36
byte sr
Definition chip.h:39
void * userdata
Definition chip.h:31