mirror of
https://github.com/TomHarte/CLK.git
synced 2024-10-13 21:24:23 +00:00
Merge pull request #33 from TomHarte/NMI
Made an attempt to implement NMI
This commit is contained in:
commit
24280844cb
@ -120,7 +120,9 @@ template <class T> class Processor {
|
|||||||
OperationSBX, OperationLXA, OperationANE, OperationANC,
|
OperationSBX, OperationLXA, OperationANE, OperationANC,
|
||||||
OperationLAS, CycleAddSignedOperandToPC, OperationSetFlagsFromOperand, OperationSetOperandFromFlagsWithBRKSet,
|
OperationLAS, CycleAddSignedOperandToPC, OperationSetFlagsFromOperand, OperationSetOperandFromFlagsWithBRKSet,
|
||||||
OperationSetOperandFromFlags,
|
OperationSetOperandFromFlags,
|
||||||
OperationSetFlagsFromA, CycleReadRSTLow, CycleReadRSTHigh, CycleScheduleJam
|
OperationSetFlagsFromA,
|
||||||
|
CycleReadRSTLow, CycleReadRSTHigh, CycleReadNMILow, CycleReadNMIHigh,
|
||||||
|
CycleScheduleJam
|
||||||
};
|
};
|
||||||
|
|
||||||
#define JAM {CycleFetchOperand, CycleScheduleJam, OperationMoveToNextProgram}
|
#define JAM {CycleFetchOperand, CycleScheduleJam, OperationMoveToNextProgram}
|
||||||
@ -496,6 +498,24 @@ template <class T> class Processor {
|
|||||||
return reset;
|
return reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Gets the program representing an NMI response.
|
||||||
|
|
||||||
|
@returns The program representing an NMI response.
|
||||||
|
*/
|
||||||
|
inline const MicroOp *get_nmi_program() {
|
||||||
|
static const MicroOp reset[] = {
|
||||||
|
CyclePushPCH,
|
||||||
|
CyclePushPCL,
|
||||||
|
OperationSetOperandFromFlags,
|
||||||
|
CyclePushOperand,
|
||||||
|
CycleReadNMILow,
|
||||||
|
CycleReadNMIHigh,
|
||||||
|
OperationMoveToNextProgram
|
||||||
|
};
|
||||||
|
return reset;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Processor() :
|
Processor() :
|
||||||
_scheduleProgramsReadPointer(0),
|
_scheduleProgramsReadPointer(0),
|
||||||
@ -558,11 +578,13 @@ template <class T> class Processor {
|
|||||||
scheduleProgramsReadPointer = _scheduleProgramsWritePointer = scheduleProgramProgramCounter = 0;\
|
scheduleProgramsReadPointer = _scheduleProgramsWritePointer = scheduleProgramProgramCounter = 0;\
|
||||||
if(_reset_line_is_enabled) {\
|
if(_reset_line_is_enabled) {\
|
||||||
schedule_program(get_reset_program());\
|
schedule_program(get_reset_program());\
|
||||||
|
} else if(_nmi_line_is_enabled) {\
|
||||||
|
_nmi_line_is_enabled = false;\
|
||||||
|
schedule_program(get_nmi_program());\
|
||||||
|
} else if(_irq_request_history[0]) {\
|
||||||
|
schedule_program(get_irq_program());\
|
||||||
} else {\
|
} else {\
|
||||||
if(_irq_request_history[0])\
|
schedule_program(fetch_decode_execute);\
|
||||||
schedule_program(get_irq_program());\
|
|
||||||
else\
|
|
||||||
schedule_program(fetch_decode_execute);\
|
|
||||||
}\
|
}\
|
||||||
op;\
|
op;\
|
||||||
}
|
}
|
||||||
@ -649,6 +671,8 @@ template <class T> class Processor {
|
|||||||
case CycleReadFromS: throwaway_read(_s | 0x100); break;
|
case CycleReadFromS: throwaway_read(_s | 0x100); break;
|
||||||
case CycleReadFromPC: throwaway_read(_pc.full); break;
|
case CycleReadFromPC: throwaway_read(_pc.full); break;
|
||||||
|
|
||||||
|
case CycleReadNMILow: read_mem(_pc.bytes.low, 0xfffa); break;
|
||||||
|
case CycleReadNMIHigh: read_mem(_pc.bytes.high, 0xfffb); break;
|
||||||
case CycleReadRSTLow: read_mem(_pc.bytes.low, 0xfffc); break;
|
case CycleReadRSTLow: read_mem(_pc.bytes.low, 0xfffc); break;
|
||||||
case CycleReadRSTHigh: read_mem(_pc.bytes.high, 0xfffd); break;
|
case CycleReadRSTHigh: read_mem(_pc.bytes.high, 0xfffd); break;
|
||||||
case CycleSetIReadBRKLow: _interruptFlag = Flag::Interrupt; read_mem(_pc.bytes.low, 0xfffe); break;
|
case CycleSetIReadBRKLow: _interruptFlag = Flag::Interrupt; read_mem(_pc.bytes.low, 0xfffe); break;
|
||||||
@ -1177,9 +1201,8 @@ template <class T> class Processor {
|
|||||||
*/
|
*/
|
||||||
inline void set_nmi_line(bool active)
|
inline void set_nmi_line(bool active)
|
||||||
{
|
{
|
||||||
// TODO: NMI is edge triggered, not level, and in any case _nmi_line_is_enabled
|
// NMI is edge triggered, not level
|
||||||
// is not honoured elsewhere. So NMI is yet to be implemented.
|
_nmi_line_is_enabled |= active;
|
||||||
_nmi_line_is_enabled = active;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
Loading…
Reference in New Issue
Block a user