From 393b28ab3d33b87a6bd900e55505a7202ba31623 Mon Sep 17 00:00:00 2001 From: tudnai Date: Sat, 2 May 2020 22:35:59 -0700 Subject: [PATCH] Interrupt handling outside of the instruction loop --- A2Mac/ViewController.swift | 10 +++++++ src/cpu/6502.c | 56 ++++++++++++++++++++++++-------------- src/cpu/6502.h | 7 +++-- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index 3cde6a4..6e5d4b2 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -141,6 +141,16 @@ class ViewController: NSViewController { // m6502.pc = resetAddr m6502.interrupt = SOFTRESET; + + let saved_frm_set = clk_6502_per_frm_set; + clk_6502_per_frm_set = 0 + clk_6502_per_frm_max = 0 + // wait for 1 ms to allow the simulation to halt + usleep(10000); + + softReset() + + clk_6502_per_frm_set = saved_frm_set } diff --git a/src/cpu/6502.c b/src/cpu/6502.c index 9177aa6..1896f2d 100644 --- a/src/cpu/6502.c +++ b/src/cpu/6502.c @@ -131,7 +131,6 @@ typedef struct { This idea is that "INLINE" would work only if it is located in the same source file -- hence the include... **/ -#include "6502_instructions.h" INLINE flags_t getFlags() { flags_t f = { @@ -162,6 +161,7 @@ INLINE void setFlags( uint8_t byte ) { m6502.N = flags.N; // Negative Flag } +#include "6502_instructions.h" INLINE int m6502_Step() { @@ -672,6 +672,36 @@ unsigned long long epoch = 0; unsigned int clkfrm = 0; +void interrupt_IRQ() { + m6502.PC = memread16(IRQ_VECTOR); + // TODO: PUSH things onto stack? +} + +void interrupt_NMI() { + m6502.PC = memread16(NMI_VECTOR); + // TODO: PUSH things onto stack? +} + +void hardReset() { + m6502.PC = memread16(RESET_VECTOR); + // make sure it will be a cold reset... + memwrite(0x3F4, 0); + m6502.SP = 0xFF; + // N V - B D I Z C + // 0 0 1 0 0 1 0 1 + setFlags(0x25); +} + +void softReset() { +// m6502.PC = memread16(SOFTRESET_VECTOR); + m6502.PC = memread16( RESET_VECTOR ); + + m6502.SP = 0xFF; + // N V - B D I Z C + // 0 0 1 0 0 1 0 1 + setFlags(0x25); +} + void m6502_Run() { static unsigned int clk = 0; @@ -702,35 +732,19 @@ void m6502_Run() { return; case IRQ: - m6502.PC = memread16(IRQ_VECTOR); - // TODO: PUSH things onto stack? + interrupt_IRQ(); break; case NMI: - m6502.PC = memread16(NMI_VECTOR); - // TODO: PUSH things onto stack? + interrupt_NMI(); break; case HARDRESET: - m6502.PC = memread16(RESET_VECTOR); - // make sure it will be a cold reset... - memwrite(0x3F4, 0); - m6502.SP = 0xFF; - // N V - B D I Z C - // 0 0 1 0 0 1 0 1 - m6502.SR = 0x25; - + hardReset(); break; case SOFTRESET: -// m6502.PC = memread16(SOFTRESET_VECTOR); - m6502.PC = memread16( RESET_VECTOR ); - - m6502.SP = 0xFF; - // N V - B D I Z C - // 0 0 1 0 0 1 0 1 - m6502.SR = 0x25; - + softReset(); break; default: diff --git a/src/cpu/6502.h b/src/cpu/6502.h index 9bfd472..55ebbd8 100644 --- a/src/cpu/6502.h +++ b/src/cpu/6502.h @@ -161,7 +161,10 @@ extern void m6502_Run(void); extern void kbdInput ( uint8_t code ); extern void setIO ( uint16_t ioaddr, uint8_t val ); -INLINE flags_t getFlags( void ); -INLINE void setFlags( uint8_t byte ); +extern void interrupt_IRQ(void); +extern void interrupt_NMI(void); +extern void hardReset(void); +extern void softReset(void); + #endif /* __6502_H__ */