3877a1459b
* cpu.h (m32c_opcode_pc): New. (in_gdb): New. * gdb-if.c (sim_open): Add Timer A support. Support unbuffered console. * int.c (trigger_interrupt): Manage the U flag properly. (trigger_based_interrupt): Likewise. (trigger_fixed_interrupt): New. (trigger_peripheral_interrupt): New. * int.h (trigger_peripheral_interrupt): New. * m32c.opc: Use m32c_opcode_pc throughout, as needed. (decode_m32c): Detect jump-to-zero with traceback. (BRK): Try to do the right thing, keeping track of whether we're in gdb or not, and if the user has provided a handler or not. (GBRK): Alternate break opcode for gdb, in case the user's app needs to use BRK for itself. (BRK2): Implement. * main.c: Add Timer A support. Support TCP-based console. (setup_tcp_console): New. (main): Add Timer A support. Support TCP-based console. * mem.c: Add Timer A support. Support TCP-based console. (mem_ptr): Enhance NULL pointer detection. (stdin_ready): New. (m32c_sim_restore_console): New. (mem_get_byte): Check for console input ready. (update_timer_a): New. * r8c.opc (SSTR): Use r0l, not r0h. (REIT): Fix return frame logic. * reg.c (print_flags): New. (trace_register_changes): Use it. (m32c_dump_all_registers): New. * timer_a.h: New. * load.c: Fix indentation. * trace.c: Fix indentation. * trace.h: Fix indentation.
75 lines
1.8 KiB
C
75 lines
1.8 KiB
C
/* int.c --- M32C interrupt handling.
|
|
|
|
Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
|
|
Contributed by Red Hat, Inc.
|
|
|
|
This file is part of the GNU simulators.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
#include "int.h"
|
|
#include "cpu.h"
|
|
#include "mem.h"
|
|
|
|
static void
|
|
trigger_interrupt (int addr, int clear_u)
|
|
{
|
|
int s = get_reg (sp);
|
|
int f = get_reg (flags);
|
|
int p = get_reg (pc);
|
|
|
|
if (clear_u)
|
|
set_flags (FLAGBIT_U, 0);
|
|
set_flags (FLAGBIT_I | FLAGBIT_D, 0);
|
|
|
|
if (A16)
|
|
{
|
|
s -= 4;
|
|
put_reg (sp, s);
|
|
mem_put_hi (s, p);
|
|
mem_put_qi (s + 2, f);
|
|
mem_put_qi (s + 3, ((f >> 4) & 0x0f) | (p >> 16));
|
|
}
|
|
else
|
|
{
|
|
s -= 6;
|
|
put_reg (sp, s);
|
|
mem_put_si (s, p);
|
|
mem_put_hi (s + 4, f);
|
|
}
|
|
put_reg (pc, mem_get_psi (addr));
|
|
}
|
|
|
|
void
|
|
trigger_fixed_interrupt (int addr)
|
|
{
|
|
trigger_interrupt (addr, 1);
|
|
}
|
|
|
|
void
|
|
trigger_based_interrupt (int vector)
|
|
{
|
|
int addr = get_reg (intb) + vector * 4;
|
|
trigger_interrupt (addr, vector <= 31);
|
|
}
|
|
|
|
void
|
|
trigger_peripheral_interrupt (int vector, int icaddr)
|
|
{
|
|
unsigned char old_ic = mem_get_qi (icaddr);
|
|
int addr = get_reg (intb) + vector * 4;
|
|
trigger_interrupt (addr, 1);
|
|
put_reg (flags, (get_reg (flags) & 0x8fff) | ((old_ic & 7) << 12));
|
|
}
|