summaryrefslogtreecommitdiff
path: root/mknes_cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'mknes_cpu.c')
-rw-r--r--mknes_cpu.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/mknes_cpu.c b/mknes_cpu.c
index 3c0a3f2..0eccf03 100644
--- a/mknes_cpu.c
+++ b/mknes_cpu.c
@@ -6,6 +6,7 @@ static inline uint8_t pack_flags(struct cpu_state *cpu) {
return (cpu->n << 7) | (cpu->v << 6) | (1 << 5) | (cpu->d << 3) | (cpu->i << 2) | (cpu->z << 1) | cpu->c;
}
+__attribute__((always_inline))
static inline void unpack_flags(struct cpu_state *cpu, uint8_t value) {
cpu->n = (value >> 7) & 1;
cpu->v = (value >> 6) & 1;
@@ -15,6 +16,8 @@ static inline void unpack_flags(struct cpu_state *cpu, uint8_t value) {
cpu->c = value & 1;
}
+
+__attribute__((always_inline))
static inline void update_zn(struct cpu_state *cpu, uint8_t result) {
cpu->z = (result == 0);
cpu->n = (result & 0x80) != 0;
@@ -63,6 +66,7 @@ static inline void do_irq(struct nes_state *state) {
cpu->i = 1;
}
+__attribute__((always_inline))
static inline void check_interrupts(struct nes_state *state) {
struct cpu_state * restrict cpu = &state->cpu;
@@ -86,7 +90,17 @@ static inline void cpu_reset(struct nes_state *state) {
static inline void cpu_tick(struct nes_state *state) {
struct cpu_state * restrict cpu = &state->cpu;
- check_interrupts(state);
+ // check_interrupts(state);
+ if(state->cpu.nmi_pending) {
+ state->cpu.nmi_pending = 0;
+ do_nmi(state);
+ }
+ if(state->cpu.irq_pending && cpu->i == 0) {
+ state->cpu.irq_pending = 0;
+ do_irq(state);
+ }
+
+
// printf("%4.4x: ", cpu->pc);
uint8_t opcode = memory_read(state, cpu->pc++);