Obsolete w65-*-* target.

This commit is contained in:
Andrew Cagney 2001-04-03 21:56:01 +00:00
parent 52071915c8
commit 76f4ea5303
7 changed files with 517 additions and 508 deletions

View File

@ -1,3 +1,13 @@
2001-04-03 Andrew Cagney <ac131313@redhat.com>
Obsolete w65-*-* target.
* configure.tgt (w65-*-*): Obsolete.
* config/w65/w65.mt: Obsolete.
* config/w65/tm-w65.h: Obsolete.
* w65-tdep.c: Obsolete.
* NEWS: Update. Fix TiC80 description.
* TODO: Update.
2001-04-03 Andrew Cagney <ac131313@redhat.com>
Obsolete tic80-*-* target.

View File

@ -18,7 +18,8 @@ x86 FreeBSD before 2.2 i[3456]86*-freebsd{1,2.[01]}*,
Harris/CXUX m88k m88*-harris-cxux*
Most ns32k hosts and targets ns32k-*-mach3* ns32k-umax-*
ns32k-utek-sysv* ns32k-utek-*
TiC80 32 Bit DSP target tic80-*-*
TI TMS320C80 tic80-*-*
WDC 65816 w65-*-*
stuff.c (Program to stuff files into a specially prepared space in kdb)
kdb-start.c (Main loop for the standalone kernel debugger)

View File

@ -198,7 +198,7 @@ Steps:
powerpcle-*-solaris* powerpc solaris solaris
powerpcle-*-cygwin* powerpc cygwin cygwin
powerpc-*-netware* powerpc - ppc-nw
w65-*-* w65 - w65
w65-*-* w65 - w65 yes
i[3456]86-*-sunos* i386 sun386 sun386
(DONE)

View File

@ -1,214 +1,214 @@
/* Parameters for execution on a WDC 65816 machine.
Copyright 1995, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of GDB.
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 2 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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "regcache.h"
/* Contributed by Steve Chamberlain sac@cygnus.com */
#define GDB_TARGET_IS_W65
#define IEEE_FLOAT (1)
/* Define the bit, byte, and word ordering of the machine. */
#define TARGET_BYTE_ORDER LITTLE_ENDIAN
/* Offset from address of function to start of its code.
Zero on most machines. */
#define FUNCTION_START_OFFSET 0
/* Advance PC across any function entry prologue instructions
to reach some "real" code. */
extern CORE_ADDR w65_skip_prologue ();
#define SKIP_PROLOGUE(ip) \
{(ip) = w65_skip_prologue(ip);}
/* Immediately after a function call, return the saved pc.
Can't always go through the frames for this because on some machines
the new frame is not set up until the new function executes
some instructions.
The return address is the value saved in the PR register + 4 */
#define SAVED_PC_AFTER_CALL(frame) \
saved_pc_after_call(frame)
/* Stack grows downward. */
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
/* Illegal instruction - used by the simulator for breakpoint
detection */
#define BREAKPOINT {0xcb} /* WAI */
/* If your kernel resets the pc after the trap happens you may need to
define this before including this file. */
#define DECR_PC_AFTER_BREAK 0
/* Return 1 if P points to an invalid floating point value. */
#define INVALID_FLOAT(p, len) 0 /* Just a first guess; not checked */
/* Say how long registers are. */
/*#define REGISTER_TYPE int */
/* Say how much memory is needed to store a copy of the register set */
#define REGISTER_BYTES (NUM_REGS*4)
/* Index within `registers' of the first byte of the space for
register N. */
#define REGISTER_BYTE(N) ((N)*4)
/* Number of bytes of storage in the actual machine representation
for register N. */
#define REGISTER_RAW_SIZE(N) (((N) < 16) ? 2 : 4)
#define REGISTER_VIRTUAL_SIZE(N) REGISTER_RAW_SIZE(N)
/* Largest value REGISTER_RAW_SIZE can have. */
#define MAX_REGISTER_RAW_SIZE 4
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
#define MAX_REGISTER_VIRTUAL_SIZE 4
/* Return the GDB type object for the "standard" data type
of data in register N. */
#define REGISTER_VIRTUAL_TYPE(N) \
(REGISTER_VIRTUAL_SIZE(N) == 2 ? builtin_type_unsigned_short : builtin_type_unsigned_long)
/* Initializer for an array of names of registers.
Entries beyond the first NUM_REGS are ignored. */
#define REGISTER_NAMES \
{"r0","r1","r2", "r3", "r4", "r5", "r6", "r7", \
"r8","r9","r10","r11","r12","r13","r14","r15", \
"pc","a", "x", "y", "dbr","d", "s", "p", \
"ticks","cycles","insts"}
/* Register numbers of various important registers.
Note that some of these values are "real" register numbers,
and correspond to the general registers of the machine,
and some are "phony" register numbers which are too large
to be actual register numbers as far as the user is concerned
but do serve to get the desired values when passed to read_register. */
#define SP_REGNUM 22
#define FP_REGNUM 15
#define NUM_REGS 27
#define PC_REGNUM 16
#define P_REGNUM 23
/* Store the address of the place in which to copy the structure the
subroutine will return. This is called from call_function.
We store structs through a pointer passed in R4 */
#define STORE_STRUCT_RETURN(ADDR, SP) \
{ write_register (4, (ADDR)); }
/* Extract from an array REGBUF containing the (raw) register state
a function return value of type TYPE, and copy that, in virtual format,
into VALBUF. */
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
memcpy (VALBUF, (char *)(REGBUF), TYPE_LENGTH(TYPE))
/* Write into appropriate registers a function return value
of type TYPE, given in virtual format.
Things always get returned in R4/R5 */
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
write_register_bytes (REGISTER_BYTE(4), VALBUF, TYPE_LENGTH (TYPE))
/* Extract from an array REGBUF containing the (raw) register state
the address in which a function should return its structure value,
as a CORE_ADDR (or an expression that can be used as one). */
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))
/* A macro that tells us whether the function invocation represented
by FI does not have a frame on the stack associated with it. If it
does not, FRAMELESS is set to 1, else 0. */
#define FRAMELESS_FUNCTION_INVOCATION(FI) \
(frameless_look_for_prologue (FI))
#define FRAME_CHAIN(FRAME) w65_frame_chain(FRAME)
#define FRAME_SAVED_PC(FRAME) (w65_frame_saved_pc(FRAME))
#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
/* Set VAL to the number of args passed to frame described by FI.
Can set VAL to -1, meaning no way to tell. */
/* We can't tell how many args there are */
#define FRAME_NUM_ARGS(fi) (-1)
/* Return number of bytes at start of arglist that are not really args. */
#define FRAME_ARGS_SKIP 0
/* Put here the code to store, into a struct frame_saved_regs,
the addresses of the saved registers of frame described by FRAME_INFO.
This includes special registers such as pc and fp saved in special
ways in the stack frame. sp is even more special:
the address we return for it IS the sp for the next frame. */
#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
frame_find_saved_regs(frame_info, &(frame_saved_regs))
typedef unsigned short INSN_WORD;
extern CORE_ADDR w65_addr_bits_remove (CORE_ADDR);
#define ADDR_BITS_REMOVE(addr) w65_addr_bits_remove (addr)
#define CALL_DUMMY_LENGTH 10
/* Discard from the stack the innermost frame,
restoring all saved registers. */
#define POP_FRAME pop_frame();
#define NOP {0xea}
#define REGISTER_SIZE 4
#define PRINT_REGISTER_HOOK(regno) print_register_hook(regno)
#define TARGET_INT_BIT 16
#define TARGET_LONG_BIT 32
#define TARGET_PTR_BIT 32
/* OBSOLETE /* Parameters for execution on a WDC 65816 machine. */
/* OBSOLETE Copyright 1995, 1998, 1999, 2000 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 #include "regcache.h" */
/* OBSOLETE */
/* OBSOLETE /* Contributed by Steve Chamberlain sac@cygnus.com */ */
/* OBSOLETE */
/* OBSOLETE #define GDB_TARGET_IS_W65 */
/* OBSOLETE */
/* OBSOLETE #define IEEE_FLOAT (1) */
/* OBSOLETE */
/* OBSOLETE /* Define the bit, byte, and word ordering of the machine. */ */
/* OBSOLETE */
/* OBSOLETE #define TARGET_BYTE_ORDER LITTLE_ENDIAN */
/* OBSOLETE */
/* OBSOLETE */
/* OBSOLETE /* Offset from address of function to start of its code. */
/* OBSOLETE Zero on most machines. */ */
/* OBSOLETE */
/* OBSOLETE #define FUNCTION_START_OFFSET 0 */
/* OBSOLETE */
/* OBSOLETE /* Advance PC across any function entry prologue instructions */
/* OBSOLETE to reach some "real" code. */ */
/* OBSOLETE */
/* OBSOLETE extern CORE_ADDR w65_skip_prologue (); */
/* OBSOLETE */
/* OBSOLETE #define SKIP_PROLOGUE(ip) \ */
/* OBSOLETE {(ip) = w65_skip_prologue(ip);} */
/* OBSOLETE */
/* OBSOLETE */
/* OBSOLETE /* Immediately after a function call, return the saved pc. */
/* OBSOLETE Can't always go through the frames for this because on some machines */
/* OBSOLETE the new frame is not set up until the new function executes */
/* OBSOLETE some instructions. */
/* OBSOLETE */
/* OBSOLETE The return address is the value saved in the PR register + 4 */ */
/* OBSOLETE */
/* OBSOLETE #define SAVED_PC_AFTER_CALL(frame) \ */
/* OBSOLETE saved_pc_after_call(frame) */
/* OBSOLETE */
/* OBSOLETE */
/* OBSOLETE /* Stack grows downward. */ */
/* OBSOLETE */
/* OBSOLETE #define INNER_THAN(lhs,rhs) ((lhs) < (rhs)) */
/* OBSOLETE */
/* OBSOLETE /* Illegal instruction - used by the simulator for breakpoint */
/* OBSOLETE detection */ */
/* OBSOLETE */
/* OBSOLETE #define BREAKPOINT {0xcb} /* WAI */ */
/* OBSOLETE */
/* OBSOLETE /* If your kernel resets the pc after the trap happens you may need to */
/* OBSOLETE define this before including this file. */ */
/* OBSOLETE #define DECR_PC_AFTER_BREAK 0 */
/* OBSOLETE */
/* OBSOLETE /* Return 1 if P points to an invalid floating point value. */ */
/* OBSOLETE */
/* OBSOLETE #define INVALID_FLOAT(p, len) 0 /* Just a first guess; not checked */ */
/* OBSOLETE */
/* OBSOLETE /* Say how long registers are. */ */
/* OBSOLETE /*#define REGISTER_TYPE int */ */
/* OBSOLETE */
/* OBSOLETE /* Say how much memory is needed to store a copy of the register set */ */
/* OBSOLETE #define REGISTER_BYTES (NUM_REGS*4) */
/* OBSOLETE */
/* OBSOLETE /* Index within `registers' of the first byte of the space for */
/* OBSOLETE register N. */ */
/* OBSOLETE */
/* OBSOLETE #define REGISTER_BYTE(N) ((N)*4) */
/* OBSOLETE */
/* OBSOLETE /* Number of bytes of storage in the actual machine representation */
/* OBSOLETE for register N. */ */
/* OBSOLETE */
/* OBSOLETE #define REGISTER_RAW_SIZE(N) (((N) < 16) ? 2 : 4) */
/* OBSOLETE */
/* OBSOLETE #define REGISTER_VIRTUAL_SIZE(N) REGISTER_RAW_SIZE(N) */
/* OBSOLETE */
/* OBSOLETE /* Largest value REGISTER_RAW_SIZE can have. */ */
/* OBSOLETE */
/* OBSOLETE #define MAX_REGISTER_RAW_SIZE 4 */
/* OBSOLETE */
/* OBSOLETE /* Largest value REGISTER_VIRTUAL_SIZE can have. */ */
/* OBSOLETE */
/* OBSOLETE #define MAX_REGISTER_VIRTUAL_SIZE 4 */
/* OBSOLETE */
/* OBSOLETE /* Return the GDB type object for the "standard" data type */
/* OBSOLETE of data in register N. */ */
/* OBSOLETE */
/* OBSOLETE #define REGISTER_VIRTUAL_TYPE(N) \ */
/* OBSOLETE (REGISTER_VIRTUAL_SIZE(N) == 2 ? builtin_type_unsigned_short : builtin_type_unsigned_long) */
/* OBSOLETE */
/* OBSOLETE /* Initializer for an array of names of registers. */
/* OBSOLETE Entries beyond the first NUM_REGS are ignored. */ */
/* OBSOLETE */
/* OBSOLETE #define REGISTER_NAMES \ */
/* OBSOLETE {"r0","r1","r2", "r3", "r4", "r5", "r6", "r7", \ */
/* OBSOLETE "r8","r9","r10","r11","r12","r13","r14","r15", \ */
/* OBSOLETE "pc","a", "x", "y", "dbr","d", "s", "p", \ */
/* OBSOLETE "ticks","cycles","insts"} */
/* OBSOLETE */
/* OBSOLETE /* Register numbers of various important registers. */
/* OBSOLETE Note that some of these values are "real" register numbers, */
/* OBSOLETE and correspond to the general registers of the machine, */
/* OBSOLETE and some are "phony" register numbers which are too large */
/* OBSOLETE to be actual register numbers as far as the user is concerned */
/* OBSOLETE but do serve to get the desired values when passed to read_register. */ */
/* OBSOLETE */
/* OBSOLETE #define SP_REGNUM 22 */
/* OBSOLETE #define FP_REGNUM 15 */
/* OBSOLETE #define NUM_REGS 27 */
/* OBSOLETE #define PC_REGNUM 16 */
/* OBSOLETE #define P_REGNUM 23 */
/* OBSOLETE */
/* OBSOLETE /* Store the address of the place in which to copy the structure the */
/* OBSOLETE subroutine will return. This is called from call_function. */
/* OBSOLETE */
/* OBSOLETE We store structs through a pointer passed in R4 */ */
/* OBSOLETE */
/* OBSOLETE #define STORE_STRUCT_RETURN(ADDR, SP) \ */
/* OBSOLETE { write_register (4, (ADDR)); } */
/* OBSOLETE */
/* OBSOLETE /* Extract from an array REGBUF containing the (raw) register state */
/* OBSOLETE a function return value of type TYPE, and copy that, in virtual format, */
/* OBSOLETE into VALBUF. */ */
/* OBSOLETE */
/* OBSOLETE #define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \ */
/* OBSOLETE memcpy (VALBUF, (char *)(REGBUF), TYPE_LENGTH(TYPE)) */
/* OBSOLETE */
/* OBSOLETE */
/* OBSOLETE /* Write into appropriate registers a function return value */
/* OBSOLETE of type TYPE, given in virtual format. */
/* OBSOLETE */
/* OBSOLETE Things always get returned in R4/R5 */ */
/* OBSOLETE */
/* OBSOLETE #define STORE_RETURN_VALUE(TYPE,VALBUF) \ */
/* OBSOLETE write_register_bytes (REGISTER_BYTE(4), VALBUF, TYPE_LENGTH (TYPE)) */
/* OBSOLETE */
/* OBSOLETE */
/* OBSOLETE /* Extract from an array REGBUF containing the (raw) register state */
/* OBSOLETE the address in which a function should return its structure value, */
/* OBSOLETE as a CORE_ADDR (or an expression that can be used as one). */ */
/* OBSOLETE */
/* OBSOLETE #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF)) */
/* OBSOLETE */
/* OBSOLETE /* A macro that tells us whether the function invocation represented */
/* OBSOLETE by FI does not have a frame on the stack associated with it. If it */
/* OBSOLETE does not, FRAMELESS is set to 1, else 0. */ */
/* OBSOLETE */
/* OBSOLETE #define FRAMELESS_FUNCTION_INVOCATION(FI) \ */
/* OBSOLETE (frameless_look_for_prologue (FI)) */
/* OBSOLETE */
/* OBSOLETE #define FRAME_CHAIN(FRAME) w65_frame_chain(FRAME) */
/* OBSOLETE #define FRAME_SAVED_PC(FRAME) (w65_frame_saved_pc(FRAME)) */
/* OBSOLETE #define FRAME_ARGS_ADDRESS(fi) (fi)->frame */
/* OBSOLETE #define FRAME_LOCALS_ADDRESS(fi) (fi)->frame */
/* OBSOLETE */
/* OBSOLETE /* Set VAL to the number of args passed to frame described by FI. */
/* OBSOLETE Can set VAL to -1, meaning no way to tell. */ */
/* OBSOLETE */
/* OBSOLETE /* We can't tell how many args there are */ */
/* OBSOLETE */
/* OBSOLETE #define FRAME_NUM_ARGS(fi) (-1) */
/* OBSOLETE */
/* OBSOLETE /* Return number of bytes at start of arglist that are not really args. */ */
/* OBSOLETE */
/* OBSOLETE #define FRAME_ARGS_SKIP 0 */
/* 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 #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \ */
/* OBSOLETE frame_find_saved_regs(frame_info, &(frame_saved_regs)) */
/* OBSOLETE */
/* OBSOLETE typedef unsigned short INSN_WORD; */
/* OBSOLETE */
/* OBSOLETE extern CORE_ADDR w65_addr_bits_remove (CORE_ADDR); */
/* OBSOLETE #define ADDR_BITS_REMOVE(addr) w65_addr_bits_remove (addr) */
/* OBSOLETE */
/* OBSOLETE #define CALL_DUMMY_LENGTH 10 */
/* OBSOLETE */
/* OBSOLETE /* Discard from the stack the innermost frame, */
/* OBSOLETE restoring all saved registers. */ */
/* OBSOLETE */
/* OBSOLETE #define POP_FRAME pop_frame(); */
/* OBSOLETE */
/* OBSOLETE */
/* OBSOLETE #define NOP {0xea} */
/* OBSOLETE */
/* OBSOLETE #define REGISTER_SIZE 4 */
/* OBSOLETE */
/* OBSOLETE #define PRINT_REGISTER_HOOK(regno) print_register_hook(regno) */
/* OBSOLETE */
/* OBSOLETE #define TARGET_INT_BIT 16 */
/* OBSOLETE #define TARGET_LONG_BIT 32 */
/* OBSOLETE #define TARGET_PTR_BIT 32 */

View File

@ -1,8 +1,6 @@
# Target: WDC 65816 with simulator
TDEPFILES= w65-tdep.o
TM_FILE= tm-w65.h
SIM_OBS = remote-sim.o
SIM = ../sim/w65/libsim.a
# OBSOLETE # Target: WDC 65816 with simulator
# OBSOLETE TDEPFILES= w65-tdep.o
# OBSOLETE TM_FILE= tm-w65.h
# OBSOLETE
# OBSOLETE SIM_OBS = remote-sim.o
# OBSOLETE SIM = ../sim/w65/libsim.a

View File

@ -303,7 +303,7 @@ v850*-*-*) gdb_target=v850
esac
;;
w65-*-*) gdb_target=w65 ;;
# OBSOLETE w65-*-*) gdb_target=w65 ;;
z8k-*-coff*) gdb_target=z8k ;;

View File

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