/* 
 * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
 * 
 * This software may be freely used, copied, modified, and distributed
 * provided that the above copyright notice is preserved in all copies of the
 * software.
 */

/*> angel.h <*/
/*---------------------------------------------------------------------------*/
/* This header file is the main holder for the declarations and
 * prototypes for the core Angel system. Some Angel concepts are
 * described at the start of this file to ensure that a complete view
 * of the Angel world can be derived purely from the source.
 *
 * $Revision: 1.1.1.1 $
 *     $Date: 1998/10/20 17:25:36 $
 *
 *
 * NOTE: Currently the Angel source is designed to be simple,
 * understandable and easy to port to new hardware platforms. However,
 * this does not always yield the highest performing system. The
 * current layered approach introduces an overhead to the performance
 * of the system. In a true commercial target, this code should be
 * re-designed to build a system where the Angel logical message
 * system, device driver and hardware accesses are merged to provide
 * the best performance.
 */
/*---------------------------------------------------------------------------*/
/* Angel overview:

... some comments describing Angel ...

 * Angel is designed as a kit-of-parts that can be used to provide
 * run-time support for the development of ARM applications. The main
 * core of Angel is in providing support for the "debug" message
 * communication with a host system. These messages do not just cover
 * debugging ARM processes, but also the process of downloading ARM
 * programs or attaching to executing processes on the target.
 *
 * A stand-alone ROM based Angel world is the basic starting point for
 * a system, since it will allow programs to be downloaded to the
 * target. The ROM version of Angel will provide the generic debug
 * support, but no system specific routines. The preferred method of
 * using Angel is as a link library. This ensures that applications
 * carry with them the Angel routines necessary to support debugging
 * (and also ensure that the Angel version is up-to-date, independant
 * of the version in the target ROM). Eventually, once a program has
 * been fully debugged, a ROMmed version of the program can be
 * generated with the Angel code being provided in the application.

.. more comments ..

 * The standard Angel routines do *NOT* perform any dynamic memory
 * allocation. To simplify the source, and aid the porting to a non C
 * library world, memory is either pre-allocated (as build-time
 * globals) or actually given to the particular Angel routine by the
 * active run-time. This ensures that the interaction between Angel
 * and the target O/S is minimised.
 *
 * Notes: We sub-include more header files to keep the source
 * modular. Since Angel is a kit-of-parts alternative systems may need
 * to change the prototypes of particular functions, whilst
 * maintaining a fixed external interface. e.g. using the standard
 * DEBUG messages, but with a different communications world.
 */
/*---------------------------------------------------------------------------*/

#ifndef __angel_h
#define __angel_h

/*---------------------------------------------------------------------------*/
/*-- Global Angel definitions and manifests ---------------------------------*/
/*---------------------------------------------------------------------------*/
/* When building Angel we may not include the standard library
 * headers. However, it is useful coding using standard macro names
 * since it makes the code easier to understand.
 */

typedef unsigned int  word ;
typedef unsigned char byte ;

/* The following typedefs can be used to access I/O registers: */
typedef volatile unsigned int  vuword ;
typedef volatile unsigned char vubyte ;

/*
 * The following typedefs are used when defining objects that may also
 * be created on a host system, where the word size is not
 * 32bits. This ensures that the same data values are manipulated.
 */
#ifdef TARGET
typedef unsigned int unsigned32;
typedef signed int   signed32;
typedef        int   int32;

typedef unsigned short int unsigned16;
typedef signed   short int signed16;

/*
 * yet another solution for the bool/boolean problem, this one is
 * copied from Scott's modifications to clx/host.h
 */
# ifdef IMPLEMENT_BOOL_AS_ENUM
   enum _bool { _false, _true };
#  define _bool enum _bool
# elif defined(IMPLEMENT_BOOL_AS_INT) || !defined(__cplusplus)
#  define _bool int
#  define _false 0
#  define _true 1
# endif

# ifdef _bool
#  define bool _bool
# endif

# ifndef true
#  define true _true
#  define false _false
# endif

# ifndef YES
#  define YES   true
#  define NO    false
# endif

# undef TRUE             /* some OSF headers define as 1 */
# define TRUE  true

# undef FALSE            /* some OSF headers define as 1 */
# define FALSE false

# ifndef NULL
#  define NULL 0
# endif

#else

# include "host.h"

#endif

#ifndef IGNORE
# define IGNORE(x) ((x)=(x))
#endif

/* The following typedef allows us to cast between integral and
 * function pointers. This isn't allowed by direct casting when
 * conforming to the ANSI spec.
 */
typedef union ansibodge
{
 word  w ;
 word *wp ;
 void *vp ;
 byte *bp ;
 void (*vfn)(void) ;
 word (*wfn)(void) ;
 int  (*ifn)(void) ;
 byte (*bfn)(void) ;
} ansibodge ;

/*---------------------------------------------------------------------------*/

/* The amount setup aside by the run-time system for stack overflow
 * handlers to execute in. This must be at least 256bytes, since that
 * value is assumed by the current ARM Ltd compiler.
 * This space is _only_ kept for the USR stack, not any of the privileged
 * mode stacks, as stack overflow on these is always fatal - there is
 * no point attemptingto recover.  In addition is is important that
 * Angel should keep privileged stack space requirements to a minimum.
 */
#define APCS_STACKGUARD 256

#endif /* __angel_h */

/* EOF angel.h */
