mirror of
https://github.com/trudnai/Steve2.git
synced 2025-03-10 02:32:57 +00:00
Interrupt handling outside of the instruction loop
This commit is contained in:
parent
368dd13309
commit
393b28ab3d
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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__ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user