summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2009-06-21 21:15:02 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2009-06-21 21:15:02 +0000
commitd24aa76fdf3554b11725c0edbbe6a3ed1d49db4f (patch)
tree7729ef3285b6078885aa42f68df78b05606efd6d /src
parentbf75260ae4d23cd4a2935fa0aa73e66f9f50256c (diff)
mc68hc11: hooked up very basic IRQ support.
Diffstat (limited to 'src')
-rw-r--r--src/emu/cpu/mc68hc11/mc68hc11.c94
-rw-r--r--src/emu/cpu/mc68hc11/mc68hc11.h3
2 files changed, 67 insertions, 30 deletions
diff --git a/src/emu/cpu/mc68hc11/mc68hc11.c b/src/emu/cpu/mc68hc11/mc68hc11.c
index d1bc8e2c533..9f1556c6ceb 100644
--- a/src/emu/cpu/mc68hc11/mc68hc11.c
+++ b/src/emu/cpu/mc68hc11/mc68hc11.c
@@ -2,6 +2,10 @@
Motorola MC68HC11 emulator
Written by Ville Linde & Angelo Salese
+
+TODO:
+- Interrupts handling is really bare-bones, just to make Hit Poker happy;
+- Complete opcodes hook-up;
*/
#include "debugger.h"
@@ -53,6 +57,7 @@ struct _hc11_state
int ad_channel;
cpu_irq_callback irq_callback;
+ UINT8 irq_state[2];
const device_config *device;
const address_space *program;
const address_space *io;
@@ -380,6 +385,31 @@ static CPU_EXIT( hc11 )
}
+static void check_irq_lines(hc11_state *cpustate)
+{
+ if( cpustate->irq_state[MC68HC11_IRQ_LINE]!=CLEAR_LINE && (!(cpustate->ccr & CC_I)) )
+ {
+ UINT16 pc_vector;
+
+ PUSH16(cpustate, cpustate->pc);
+ PUSH16(cpustate, cpustate->iy);
+ PUSH16(cpustate, cpustate->ix);
+ PUSH8(cpustate, REG_A);
+ PUSH8(cpustate, REG_B);
+ PUSH8(cpustate, cpustate->ccr);
+ pc_vector = READ16(cpustate, 0xfff2);
+ SET_PC(cpustate, pc_vector);
+ (void)(*cpustate->irq_callback)(cpustate->device, MC68HC11_IRQ_LINE);
+ }
+}
+
+static void set_irq_line(hc11_state *cpustate, int irqline, int state)
+{
+ cpustate->irq_state[irqline] = state;
+ if (state == CLEAR_LINE) return;
+ check_irq_lines(cpustate);
+}
+
static CPU_EXECUTE( hc11 )
{
hc11_state *cpustate = get_safe_token(device);
@@ -390,6 +420,8 @@ static CPU_EXECUTE( hc11 )
{
UINT8 op;
+ check_irq_lines(cpustate);
+
cpustate->ppc = cpustate->pc;
debugger_instruction_hook(device, cpustate->pc);
@@ -408,6 +440,8 @@ static CPU_SET_INFO( mc68hc11 )
switch (state)
{
+ case CPUINFO_INT_INPUT_STATE + MC68HC11_IRQ_LINE: set_irq_line(cpustate, MC68HC11_IRQ_LINE, info->i); break;
+
/* --- the following bits of info are set as 64-bit signed integers --- */
case CPUINFO_INT_PC: cpustate->pc = info->i; break;
case CPUINFO_INT_REGISTER + HC11_PC: cpustate->pc = info->i; break;
@@ -426,38 +460,38 @@ CPU_GET_INFO( mc68hc11 )
switch(state)
{
/* --- the following bits of info are returned as 64-bit signed integers --- */
- case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(hc11_state); break;
- case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
- case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break;
- case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_BIG; break;
- case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break;
- case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
- case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break;
- case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 5; break;
- case CPUINFO_INT_MIN_CYCLES: info->i = 1; break;
- case CPUINFO_INT_MAX_CYCLES: info->i = 41; break;
-
- case CPUINFO_INT_DATABUS_WIDTH_PROGRAM: info->i = 8; break;
- case CPUINFO_INT_ADDRBUS_WIDTH_PROGRAM: info->i = 16; break;
- case CPUINFO_INT_ADDRBUS_SHIFT_PROGRAM: info->i = 0; break;
- case CPUINFO_INT_DATABUS_WIDTH_DATA: info->i = 0; break;
- case CPUINFO_INT_ADDRBUS_WIDTH_DATA: info->i = 0; break;
- case CPUINFO_INT_ADDRBUS_SHIFT_DATA: info->i = 0; break;
- case CPUINFO_INT_DATABUS_WIDTH_IO: info->i = 8; break;
- case CPUINFO_INT_ADDRBUS_WIDTH_IO: info->i = 8; break;
- case CPUINFO_INT_ADDRBUS_SHIFT_IO: info->i = 0; break;
-
- case CPUINFO_INT_INPUT_STATE: info->i = CLEAR_LINE; break;
-
- case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break;
+ case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(hc11_state); break;
+ case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
+ case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break;
+ case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_BIG; break;
+ case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break;
+ case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break;
+ case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break;
+ case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 5; break;
+ case CPUINFO_INT_MIN_CYCLES: info->i = 1; break;
+ case CPUINFO_INT_MAX_CYCLES: info->i = 41; break;
+
+ case CPUINFO_INT_DATABUS_WIDTH_PROGRAM: info->i = 8; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH_PROGRAM: info->i = 16; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT_PROGRAM: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH_DATA: info->i = 0; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT_DATA: info->i = 0; break;
+ case CPUINFO_INT_DATABUS_WIDTH_IO: info->i = 8; break;
+ case CPUINFO_INT_ADDRBUS_WIDTH_IO: info->i = 8; break;
+ case CPUINFO_INT_ADDRBUS_SHIFT_IO: info->i = 0; break;
+
+ case CPUINFO_INT_INPUT_STATE + MC68HC11_IRQ_LINE: info->i = cpustate->irq_state[MC68HC11_IRQ_LINE]; break;
+
+ case CPUINFO_INT_PREVIOUSPC: /* not implemented */ break;
case CPUINFO_INT_PC: /* intentional fallthrough */
- case CPUINFO_INT_REGISTER + HC11_PC: info->i = cpustate->pc; break;
- case CPUINFO_INT_REGISTER + HC11_SP: info->i = cpustate->sp; break;
- case CPUINFO_INT_REGISTER + HC11_A: info->i = cpustate->d.d8.a; break;
- case CPUINFO_INT_REGISTER + HC11_B: info->i = cpustate->d.d8.b; break;
- case CPUINFO_INT_REGISTER + HC11_IX: info->i = cpustate->ix; break;
- case CPUINFO_INT_REGISTER + HC11_IY: info->i = cpustate->iy; break;
+ case CPUINFO_INT_REGISTER + HC11_PC: info->i = cpustate->pc; break;
+ case CPUINFO_INT_REGISTER + HC11_SP: info->i = cpustate->sp; break;
+ case CPUINFO_INT_REGISTER + HC11_A: info->i = cpustate->d.d8.a; break;
+ case CPUINFO_INT_REGISTER + HC11_B: info->i = cpustate->d.d8.b; break;
+ case CPUINFO_INT_REGISTER + HC11_IX: info->i = cpustate->ix; break;
+ case CPUINFO_INT_REGISTER + HC11_IY: info->i = cpustate->iy; break;
/* --- the following bits of info are returned as pointers to data or functions --- */
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(mc68hc11); break;
diff --git a/src/emu/cpu/mc68hc11/mc68hc11.h b/src/emu/cpu/mc68hc11/mc68hc11.h
index 636c5385d0f..91b0ca02a81 100644
--- a/src/emu/cpu/mc68hc11/mc68hc11.h
+++ b/src/emu/cpu/mc68hc11/mc68hc11.h
@@ -30,4 +30,7 @@ CPU_GET_INFO( mc68hc11 );
#define MC68HC11_IO_AD6 0x16
#define MC68HC11_IO_AD7 0x17
+#define MC68HC11_IRQ_LINE 0
+
+
#endif /* __MC68HC11_H__ */