URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [insight/] [gdb/] [w65-tdep.c] - Rev 1765
Compare with Previous | Blame | View Log
/* OBSOLETE /* Target-machine dependent code for WDC-65816, for GDB. */ /* OBSOLETE Copyright 1995, 1996, 2000, 2001 Free Software Foundation, Inc. */ /* OBSOLETE */ /* OBSOLETE This file is part of GDB. */ /* OBSOLETE */ /* OBSOLETE This program is free software; you can redistribute it and/or modify */ /* OBSOLETE it under the terms of the GNU General Public License as published by */ /* OBSOLETE the Free Software Foundation; either version 2 of the License, or */ /* OBSOLETE (at your option) any later version. */ /* OBSOLETE */ /* OBSOLETE This program is distributed in the hope that it will be useful, */ /* OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* OBSOLETE GNU General Public License for more details. */ /* OBSOLETE */ /* OBSOLETE You should have received a copy of the GNU General Public License */ /* OBSOLETE along with this program; if not, write to the Free Software */ /* OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, */ /* OBSOLETE Boston, MA 02111-1307, USA. */ */ /* OBSOLETE */ /* OBSOLETE /* */ /* OBSOLETE Contributed by Steve Chamberlain */ /* OBSOLETE sac@cygnus.com */ /* OBSOLETE */ */ /* OBSOLETE */ /* OBSOLETE #include "defs.h" */ /* OBSOLETE #include "frame.h" */ /* OBSOLETE #include "obstack.h" */ /* OBSOLETE #include "symtab.h" */ /* OBSOLETE #include "gdbcmd.h" */ /* OBSOLETE #include "gdbtypes.h" */ /* OBSOLETE #include "dis-asm.h" */ /* OBSOLETE #include "gdbcore.h" */ /* OBSOLETE #include "regcache.h" */ /* OBSOLETE */ /* OBSOLETE /* Return the saved PC from this frame. */ */ /* OBSOLETE */ /* OBSOLETE */ /* OBSOLETE CORE_ADDR */ /* OBSOLETE w65_frame_saved_pc (struct frame_info *frame) */ /* OBSOLETE { */ /* OBSOLETE return (read_memory_integer (frame->frame + 2, 4) & 0xffffff); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE CORE_ADDR */ /* OBSOLETE w65_addr_bits_remove (CORE_ADDR addr) */ /* OBSOLETE { */ /* OBSOLETE return ((addr) & 0xffffff); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE read_memory_pointer (CORE_ADDR x) */ /* OBSOLETE { */ /* OBSOLETE return read_memory_integer (ADDR_BITS_REMOVE (x), 4); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE init_frame_pc (void) */ /* OBSOLETE { */ /* OBSOLETE internal_error (__FILE__, __LINE__, "failed internal consistency check"); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE void */ /* OBSOLETE w65_push_dummy_frame (void) */ /* OBSOLETE { */ /* OBSOLETE internal_error (__FILE__, __LINE__, "failed internal consistency check"); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE /* Put here the code to store, into a struct frame_saved_regs, */ /* OBSOLETE the addresses of the saved registers of frame described by FRAME_INFO. */ /* OBSOLETE This includes special registers such as pc and fp saved in special */ /* OBSOLETE ways in the stack frame. sp is even more special: */ /* OBSOLETE the address we return for it IS the sp for the next frame. */ /* OBSOLETE */ /* OBSOLETE We cache the result of doing this in the frame_cache_obstack, since */ /* OBSOLETE it is fairly expensive. */ */ /* OBSOLETE */ /* OBSOLETE void */ /* OBSOLETE frame_find_saved_regs (struct frame_info *fip, struct frame_saved_regs *fsrp) */ /* OBSOLETE { */ /* OBSOLETE int locals; */ /* OBSOLETE CORE_ADDR pc; */ /* OBSOLETE CORE_ADDR adr; */ /* OBSOLETE int i; */ /* OBSOLETE */ /* OBSOLETE memset (fsrp, 0, sizeof *fsrp); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE int */ /* OBSOLETE saved_pc_after_call (void) */ /* OBSOLETE { */ /* OBSOLETE int sp = read_register (SP_REGNUM); */ /* OBSOLETE int val = read_memory_integer (sp + 1, 4); */ /* OBSOLETE return ADDR_BITS_REMOVE (val); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE */ /* OBSOLETE extract_return_value (struct type *type, char *regbuf, char *valbuf) */ /* OBSOLETE { */ /* OBSOLETE int b; */ /* OBSOLETE int len = TYPE_LENGTH (type); */ /* OBSOLETE */ /* OBSOLETE for (b = 0; b < len; b += 2) */ /* OBSOLETE { */ /* OBSOLETE int todo = len - b; */ /* OBSOLETE if (todo > 2) */ /* OBSOLETE todo = 2; */ /* OBSOLETE memcpy (valbuf + b, regbuf + b, todo); */ /* OBSOLETE } */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE void */ /* OBSOLETE write_return_value (struct type *type, char *valbuf) */ /* OBSOLETE { */ /* OBSOLETE int reg; */ /* OBSOLETE int len; */ /* OBSOLETE for (len = 0; len < TYPE_LENGTH (type); len += 2) */ /* OBSOLETE { */ /* OBSOLETE write_register_bytes (REGISTER_BYTE (len / 2 + 2), valbuf + len, 2); */ /* OBSOLETE } */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE void */ /* OBSOLETE store_struct_return (CORE_ADDR addr, CORE_ADDR sp) */ /* OBSOLETE { */ /* OBSOLETE write_register (2, addr); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE void */ /* OBSOLETE w65_pop_frame (void) */ /* OBSOLETE { */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE init_extra_frame_info (void) */ /* OBSOLETE { */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE pop_frame (void) */ /* OBSOLETE { */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE w65_frame_chain (struct frame_info *thisframe) */ /* OBSOLETE { */ /* OBSOLETE return 0xffff & read_memory_integer ((thisframe)->frame, 2); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE static int */ /* OBSOLETE gb (int x) */ /* OBSOLETE { */ /* OBSOLETE return read_memory_integer (x, 1) & 0xff; */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE extern CORE_ADDR */ /* OBSOLETE w65_skip_prologue (CORE_ADDR pc) */ /* OBSOLETE { */ /* OBSOLETE CORE_ADDR too_far = pc + 20; */ /* OBSOLETE */ /* OBSOLETE /* looking for bits of the prologue, we can expect to */ /* OBSOLETE see this in a frameful function: */ /* OBSOLETE */ /* OBSOLETE stack adjust: */ /* OBSOLETE */ /* OBSOLETE 3B tsc */ /* OBSOLETE 1A inc a */ /* OBSOLETE 18 clc */ /* OBSOLETE 69E2FF adc #0xffe2 */ /* OBSOLETE 3A dec a */ /* OBSOLETE 1B tcs */ /* OBSOLETE 1A inc a */ /* OBSOLETE */ /* OBSOLETE link: */ /* OBSOLETE */ /* OBSOLETE A500 lda <r15 */ /* OBSOLETE 48 pha */ /* OBSOLETE 3B tsc */ /* OBSOLETE 1a inc a */ /* OBSOLETE 8500 sta <r15 */ /* OBSOLETE */ /* OBSOLETE */ */ /* OBSOLETE */ /* OBSOLETE #define TSC 0x3b */ /* OBSOLETE #define TCS 0x1b */ /* OBSOLETE #define INCA 0x1a */ /* OBSOLETE #define PHA 0x48 */ /* OBSOLETE #define LDADIR 0xa5 */ /* OBSOLETE #define STADIR 0x85 */ /* OBSOLETE */ /* OBSOLETE /* Skip a stack adjust - any area between a tsc and tcs */ */ /* OBSOLETE if (gb (pc) == TSC) */ /* OBSOLETE { */ /* OBSOLETE while (pc < too_far && gb (pc) != TCS) */ /* OBSOLETE { */ /* OBSOLETE pc++; */ /* OBSOLETE } */ /* OBSOLETE pc++; */ /* OBSOLETE /* Skip a stupid inc a */ */ /* OBSOLETE if (gb (pc) == INCA) */ /* OBSOLETE pc++; */ /* OBSOLETE */ /* OBSOLETE } */ /* OBSOLETE /* Stack adjust can also be done with n pha's */ */ /* OBSOLETE while (gb (pc) == PHA) */ /* OBSOLETE pc++; */ /* OBSOLETE */ /* OBSOLETE /* Skip a link - that's a ld/ph/tsc/inc/sta */ */ /* OBSOLETE */ /* OBSOLETE if (gb (pc) == LDADIR */ /* OBSOLETE && gb (pc + 5) == STADIR */ /* OBSOLETE && gb (pc + 1) == gb (pc + 6) */ /* OBSOLETE && gb (pc + 2) == PHA */ /* OBSOLETE && gb (pc + 3) == TSC */ /* OBSOLETE && gb (pc + 4) == INCA) */ /* OBSOLETE { */ /* OBSOLETE pc += 7; */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE return pc; */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE */ /* OBSOLETE register_raw_size (int n) */ /* OBSOLETE { */ /* OBSOLETE return sim_reg_size (n); */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE */ /* OBSOLETE void */ /* OBSOLETE print_register_hook (int regno) */ /* OBSOLETE { */ /* OBSOLETE if (regno == P_REGNUM) */ /* OBSOLETE { */ /* OBSOLETE /* CCR register */ */ /* OBSOLETE */ /* OBSOLETE int C, Z, N, V, I, D, X, M; */ /* OBSOLETE unsigned char b[1]; */ /* OBSOLETE unsigned char l; */ /* OBSOLETE */ /* OBSOLETE read_relative_register_raw_bytes (regno, b); */ /* OBSOLETE l = b[0]; */ /* OBSOLETE printf_unfiltered ("\t"); */ /* OBSOLETE C = (l & 0x1) != 0; */ /* OBSOLETE Z = (l & 0x2) != 0; */ /* OBSOLETE I = (l & 0x4) != 0; */ /* OBSOLETE D = (l & 0x8) != 0; */ /* OBSOLETE X = (l & 0x10) != 0; */ /* OBSOLETE M = (l & 0x20) != 0; */ /* OBSOLETE V = (l & 0x40) != 0; */ /* OBSOLETE N = (l & 0x80) != 0; */ /* OBSOLETE */ /* OBSOLETE printf_unfiltered ("N-%d ", N); */ /* OBSOLETE printf_unfiltered ("V-%d ", V); */ /* OBSOLETE printf_unfiltered ("M-%d ", M); */ /* OBSOLETE printf_unfiltered ("X-%d ", X); */ /* OBSOLETE printf_unfiltered ("D-%d ", D); */ /* OBSOLETE printf_unfiltered ("I-%d ", I); */ /* OBSOLETE printf_unfiltered ("Z-%d ", Z); */ /* OBSOLETE printf_unfiltered ("C-%d ", C); */ /* OBSOLETE if ((C | Z) == 0) */ /* OBSOLETE printf_unfiltered ("u> "); */ /* OBSOLETE if ((C | Z) == 1) */ /* OBSOLETE printf_unfiltered ("u<= "); */ /* OBSOLETE if ((C == 0)) */ /* OBSOLETE printf_unfiltered ("u>= "); */ /* OBSOLETE if (C == 1) */ /* OBSOLETE printf_unfiltered ("u< "); */ /* OBSOLETE if (Z == 0) */ /* OBSOLETE printf_unfiltered ("!= "); */ /* OBSOLETE if (Z == 1) */ /* OBSOLETE printf_unfiltered ("== "); */ /* OBSOLETE if ((N ^ V) == 0) */ /* OBSOLETE printf_unfiltered (">= "); */ /* OBSOLETE if ((N ^ V) == 1) */ /* OBSOLETE printf_unfiltered ("< "); */ /* OBSOLETE if ((Z | (N ^ V)) == 0) */ /* OBSOLETE printf_unfiltered ("> "); */ /* OBSOLETE if ((Z | (N ^ V)) == 1) */ /* OBSOLETE printf_unfiltered ("<= "); */ /* OBSOLETE } */ /* OBSOLETE } */ /* OBSOLETE */ /* OBSOLETE void */ /* OBSOLETE _initialize_w65_tdep (void) */ /* OBSOLETE { */ /* OBSOLETE tm_print_insn = print_insn_w65; */ /* OBSOLETE } */