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.pc = resetAddr
|
||||||
|
|
||||||
m6502.interrupt = SOFTRESET;
|
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
|
This idea is that "INLINE" would work only if it is
|
||||||
located in the same source file -- hence the include...
|
located in the same source file -- hence the include...
|
||||||
**/
|
**/
|
||||||
#include "6502_instructions.h"
|
|
||||||
|
|
||||||
INLINE flags_t getFlags() {
|
INLINE flags_t getFlags() {
|
||||||
flags_t f = {
|
flags_t f = {
|
||||||
@ -162,6 +161,7 @@ INLINE void setFlags( uint8_t byte ) {
|
|||||||
m6502.N = flags.N; // Negative Flag
|
m6502.N = flags.N; // Negative Flag
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "6502_instructions.h"
|
||||||
|
|
||||||
INLINE int m6502_Step() {
|
INLINE int m6502_Step() {
|
||||||
|
|
||||||
@ -672,6 +672,36 @@ unsigned long long epoch = 0;
|
|||||||
|
|
||||||
unsigned int clkfrm = 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() {
|
void m6502_Run() {
|
||||||
static unsigned int clk = 0;
|
static unsigned int clk = 0;
|
||||||
|
|
||||||
@ -702,35 +732,19 @@ void m6502_Run() {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case IRQ:
|
case IRQ:
|
||||||
m6502.PC = memread16(IRQ_VECTOR);
|
interrupt_IRQ();
|
||||||
// TODO: PUSH things onto stack?
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NMI:
|
case NMI:
|
||||||
m6502.PC = memread16(NMI_VECTOR);
|
interrupt_NMI();
|
||||||
// TODO: PUSH things onto stack?
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HARDRESET:
|
case HARDRESET:
|
||||||
m6502.PC = memread16(RESET_VECTOR);
|
hardReset();
|
||||||
// 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;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SOFTRESET:
|
case SOFTRESET:
|
||||||
// m6502.PC = memread16(SOFTRESET_VECTOR);
|
softReset();
|
||||||
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;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -161,7 +161,10 @@ extern void m6502_Run(void);
|
|||||||
extern void kbdInput ( uint8_t code );
|
extern void kbdInput ( uint8_t code );
|
||||||
extern void setIO ( uint16_t ioaddr, uint8_t val );
|
extern void setIO ( uint16_t ioaddr, uint8_t val );
|
||||||
|
|
||||||
INLINE flags_t getFlags( void );
|
extern void interrupt_IRQ(void);
|
||||||
INLINE void setFlags( uint8_t byte );
|
extern void interrupt_NMI(void);
|
||||||
|
extern void hardReset(void);
|
||||||
|
extern void softReset(void);
|
||||||
|
|
||||||
|
|
||||||
#endif /* __6502_H__ */
|
#endif /* __6502_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user