/* ---------------------------------------------------------------------- */
/*                   Copyright (C) 1991 by Natrlich!                     */
/*                      This file is copyrighted!                         */
/*                Refer to the documentation for details.                 */
/* ---------------------------------------------------------------------- */
#ifndef _CODE_
# define _CODE_

# define C_ACCU      0
# define C_IMM       1
# define C_ABS0      2
# define C_RELX0     3
# define C_RELY0     4
# define C_ABS       5
# define C_RELX      6
# define C_RELY      7
# define C_IMPL      8
# define C_RELA      9
# define C_INDX    0xA
# define C_INDY    0xB
# define C_IND     0xC

# define DEFORG    0x1000      /* Default PC and PC for reloctable code */
# define inrange( val, min, max) ((val) >= (min) && (val) < (max))

# ifndef KEINE_CODE_INNEREIEN

/* ---------------------------------------------------------- */
/* What it all means...                                       */
/* dbyte - drop 16 bits in MSB LSB order -> FEDCBA98 76543210 */
/* dbeek - read 16 bits in MSB LSB order                      */
/* dpoke - drop 16 bits in LSB MSB order -> 76543210 FEDCBA98 */
/* dpeek - read 16 bits in LSB MSB order                      */
/*                                                            */
/* p.... - as above but increment pointer                     */
/* f.... - as above but p must point to word aligned adress   */
/*                      **-PORT #4-**                         */
/* ---------------------------------------------------------- */
#  ifdef poke
#   undef poke
#  endif
#  ifdef peek
#   undef peek
#  endif
#  define dswap( p) (__x = ((byte huge *)( p))[ 1],               \
          ((byte huge *)( p))[ 1] = *(byte huge *)( p),           \
          *(byte huge *)( p) = __x)

#  define lswap( p) (__x = ((byte huge *)( p))[ 3],               \
          ((byte huge *)( p))[ 3] = *(byte huge *)( p),           \
          *(byte huge *)( p) = __x,                               \
          __x = ((byte huge *)( p))[ 2],                          \
          ((byte huge *)( p))[ 2] = ((byte huge *)( p))[ 1],      \
          ((byte huge *)( p))[ 1] = __x)

#  if ! BIGENDIAN

#   define dpoke( p, v)                                            \
      __x = (v);                                                   \
      *(byte huge *)(p)          = *((byte huge *) &__x + 1);      \
      *((byte huge *)(p) + 1)    = *((byte huge *) &__x)
#   define dpeek( p)                                               \
     (*((byte huge *) &__x + 1)  = *(byte huge *)(p),              \
      *(byte huge *) &__x        = *((byte huge *) (p) + 1),       \
      __x)

#   if ! PHILOSOPHICAL_PROBLEM      /* and you thought C was portable.. */
#    define pdpoke( p, v)                                          \
       __x = (v);                                                  \
       *((byte huge *)(p))++     = (byte) __x;                     \
       *((byte huge *)(p))++     = *((byte huge *) &__x)
#    define pdpeek( p)                                             \
      (*((byte huge *) &__x + 1) = *((byte huge *)(p))++,          \
       *(byte huge *)&__x        = *((byte huge *)(p))++,          \
       __x)
#   else
#    define pdpoke( p, v)                                          \
       __x = (v);                                                  \
       *(byte huge *)(p)         = (byte) __x;                     \
       *((byte huge *)(p)+ 1)    = *((byte huge *) &__x);          \
       (p) = (void huge *) ((byte huge *) (p) + 2)
#    define pdpeek( p)                                             \
      (*((byte huge *) &__x + 1) = *(byte huge *)(p),              \
       *(byte huge *)&__x        = *((byte huge *)(p) + 1),        \
       (p) = (void huge *) ((byte huge *) (p) + 2),                \
       __x)
#   endif

#   if WORD_EVEN
#    define lbyte( p, v)                                          \
      __lx = (v);                                                 \
      *((byte huge *)(p))        = *((byte huge *) &__lx);        \
      *((byte huge *)(p) + 1)    = *((byte huge *) &__lx + 1);    \
      *((byte huge *)(p) + 2)    = *((byte huge *) &__lx + 2);    \
      *((byte huge *)(p) + 3)    = *((byte huge *) &__lx + 3)

#    define lbeek( p)                                             \
     (*((byte huge *) &__lx)     = *((byte huge *) (p)),          \
      *((byte huge *) &__lx + 1) = *((byte huge *) (p) + 1),      \
      *((byte huge *) &__lx + 2) = *((byte huge *) (p) + 2),      \
      *((byte huge *) &__lx + 3) = *((byte huge *) (p) + 3),      \
      __lx)

#    define dbyte( p, v)                                           \
       __x = (v);                                                  \
       *(byte huge *)(p)         = *(byte huge *) &__x;            \
       *((byte huge *)(p) + 1)   = *((byte huge *) &__x + 1)
#    define dbeek( p)                                              \
      (*(byte huge *) &__x       = *(byte huge *)(p),              \
      *((byte huge *) &__x + 1)  = *((byte huge *) (p) + 1),       \
       __x)

#    if ! PHILOSOPHICAL_PROBLEM
#     define pdbyte( p, v)                                         \
        __x = (v);                                                 \
        *((byte huge *)(p))++    = *((byte huge *) &__x);          \
        *((byte huge *)(p))++    = *((byte huge *) &__x + 1)
#     define pdbeek( p)                                            \
       (*(byte huge *) &__x      = *((byte huge *)(p))++,          \
        *((byte huge *) &__x + 1)= *((byte huge *)(p))++,          \
        __x)
#    else
#     define pdbyte( p, v)                                         \
        __x = (v);                                                 \
        *(byte huge *)(p)        = *((byte huge *) &__x);          \
        *((byte huge *)(p) + 1)  = *((byte huge *) &__x + 1);      \
        (p) = (void huge *) ((byte huge *) (p) + 2)
#     define pdbeek( p)                                            \
       (*(byte huge *) &__x      = *(byte huge *)(p),              \
        *((byte huge *) &__x + 1)= *((byte huge *)(p) + 1),        \
        (p) = (void huge *) ((byte huge *) (p) + 2),               \
        __x)
#    endif
#   else
#    define lbyte( p, v)   *(lword huge *)(p)     = (lword)(v)
#    define lbeek( p)      *((lword huge *)(p))

#    define dbyte(  p, v)  *(word huge *)(p)      = (word)(v)
#    define dbeek(  p)     (*(word huge *)(p))
#    if ! PHILOSOPHICAL_PROBLEM
#     define pdbyte( p, v) *((word huge *)(p))++  = (word)(v)
#     define pdbeek( p)    (*((word huge *)(p))++)
#    else
#     define pdbyte( p, v) *(word huge *)(p)= (word)(v);            \
                           (p) = (void huge *) ((word huge *)(p) + 1)
#     define pdbeek( p)    (__x = *(word huge *)(p),                \
                           (p) = (void huge *) ((word huge *)(p) + 1),   \
                           __x)
#    endif
#   endif

#   if ! PHILOSOPHICAL_PROBLEM
#    define plbyte( p, v)  *((lword huge *)(p))++ = (lword)(v)
#    define plbeek( p)     *((lword huge *)(p))++
#   else
#    define plbyte( p, v)  *(lword huge *)(p) = (lword)(v);            \
                           (p) = (void huge *) ((lword huge *)(p) + 1)
#    define plbeek( p)     (__lx = *(lword huge *)(p),                 \
                            (p) = (void huge *) ((lword huge *) (p) + 1),   \
                            __lx)
#   endif
#   define fdpoke(  p, v)  dpoke( p, v)
#   define fdpeek(  p)     dpeek( p)
#   define fdbyte(  p, v)  *(word huge *)(p) = (word)(v)
#   define fdbeek(  p)     (*(word huge *)(p))
#   define fpdpoke( p, v)  pdpoke( p, v)
#   define fpdpeek( p)     pdpeek( p)
#   if ! PHILOSOPHICAL_PROBLEM
#    define fpdbyte( p, v) *((word huge *)(p))++ = (word)(v)
#    define fpdbeek( p)    (*((word huge *)(p))++)
#   else
#    define fpdbyte( p, v) *((word huge *)(p)) = (word)(v);         \
                           (p) = (void huge *) ((word huge *)(p) + 1)
#    define fpdbeek( p)    (__x = *(word huge *)(p),                \
                           (p) = (void huge *) ((word huge *)(p) + 1),   \
                           __x)
#   endif

#  else  /* ------ BIG ENDIAN ------ */


#   if WORD_EVEN
#    define dpoke( p, v)                                           \
       __x = (v);                                                  \
       *(byte huge *)(p)         = *(byte huge *) &__x;            \
       *((byte huge *)(p) + 1)   = *((byte huge *) &__x + 1)
#    define dpeek( p)                                              \
      (*(byte huge *) &__x       = *(byte huge *) (p),             \
       *((byte huge *) &__x + 1) = *((byte huge *) (p) + 1),       \
       __x)
#    if ! PHILOSOPHICAL_PROBLEM
#     define pdpoke( p, v)                                         \
        __x = (v);                                                 \
        *((byte huge *)(p))++    = *(byte huge *) &__x;            \
        *((byte huge *)(p))++    = *((byte huge *) &__x + 1)
#     define pdpeek( p)                                            \
       (*(byte huge *) &__x      = *((byte huge *)(p))++,          \
        *((byte huge *) &__x + 1)= *((byte huge *)(p))++,          \
        __x)
#    else
#     define pdpoke( p, v)                                         \
        __x = (v);                                                 \
        *(byte huge *)(p)        = *(byte huge *) &__x;            \
        *((byte huge *)(p) + 1)  = *((byte huge *) &__x + 1);      \
        (p) = (void huge *) ((byte huge *) (p) + 2)
#     define pdpeek( p)                                            \
       (*(byte huge *) &__x      = *(byte huge *) (p),             \
        *((byte huge *) &__x + 1)= *((byte huge *) (p) + 1),       \
        (p) = (void huge *) ((byte huge *) (p) + 2),               \
        __x)
#    endif

#   else       /* WORD ACCESS ON ODD ADDRESS OK */

#    define dpoke( p, v)   *(word huge *)(p)     = (word)(v)
#    define dpeek( p)      (*(word huge *)(p))
#    if ! PHILOSOPHICAL_PROBLEM
#     define pdpoke( p, v) *((word huge *)(p))++ = (word)(v)
#     define pdpeek( p)    (*((word huge *)(p))++)
#    else
#     define pdpoke( p, v) *(word huge *)(p) = (word)(v);          \
                           (p)=(void huge *)((word huge *)(p) + 1)
#     define pdpeek( p)    ( __x = *(word huge *)(p),              \
                           (p)=(void huge *)((word huge *)(p) + 1),\
                            __x)
#    endif
#   endif            /* STILL BIGENDIAN */

#   define dbyte( p, v)                                            \
      __x = (v);                                                   \
      *(byte huge *)(p)         = *((byte huge *) &__x + 1);       \
      *((byte huge *)(p) + 1)   = *(byte huge *) &__x
#   define dbeek( p)                                               \
     (*((byte huge *)&__x + 1)  = *(byte huge *) (p),              \
      *(byte huge *)&__x        = *((byte huge *) (p) + 1),        \
      __x)

#   if ! PHILOSOPHICAL_PROBLEM
#    define pdbyte( p, v)                                          \
       __x = (v);                                                  \
       *((byte huge *)(p))++     = *((byte huge *) &__x + 1);      \
       *((byte huge *)(p))++     = *(byte huge *) &__x
#    define pdbeek( p)                                             \
      (*((byte huge *) &__x + 1) = *((byte huge *) (p))++,         \
       *((byte huge *) &__x)     = *((byte huge *) (p))++,         \
       __x)
#   else
#    define pdbyte( p, v)                                          \
       __x = (v);                                                  \
       *(byte huge *)(p)         = *((byte huge *) &__x + 1);      \
       *((byte huge *)(p) + 1)   = *(byte huge *) &__x;            \
       (p) = (void huge *) ((byte huge *)(p) + 2)
#    define pdbeek( p)                                             \
      (*((byte huge *) &__x + 1) = *(byte huge *) (p),             \
       *((byte huge *) &__x)     = *((byte huge *) (p) + 1),       \
       (p) = (void huge *) ((byte huge *)(p) + 2),                 \
       __x)
#   endif

#   define lbyte( p, v)                                            \
      __lx = (v),                                                  \
      *(byte huge *)(p)         = *((byte huge *) &__lx + 3);      \
      *((byte huge *)(p) + 1)   = *((byte huge *) &__lx + 2);      \
      *((byte huge *)(p) + 2)   = *((byte huge *) &__lx + 1);      \
      *((byte huge *)(p) + 3)   = *(byte huge *) &__lx

#  if ! PHILOSOPHICAL_PROBLEM
#   define plbeek( p)                                              \
      (*((byte huge *) &__lx + 3) = *((byte huge *)(p))++,         \
       *((byte huge *) &__lx + 2) = *((byte huge *)(p))++,         \
       *((byte huge *) &__lx + 1) = *((byte huge *)(p))++,         \
       *((byte huge *) &__lx)     = *((byte huge *)(p))++,         \
       __lx)

#   define plbyte( p, v)                                           \
       __lx = (v),                                                 \
       *((byte huge *)(p))++      = *((byte huge *) &__lx + 3);    \
       *((byte huge *)(p))++      = *((byte huge *) &__lx + 2);    \
       *((byte huge *)(p))++      = *((byte huge *) &__lx + 1);    \
       *((byte huge *)(p))++      = *(byte huge *) &__lx
#  else
#   define plbeek( p)                                              \
      (*((byte huge *) &__lx + 3) = *(byte huge *)(p),             \
       *((byte huge *) &__lx + 2) = *((byte huge *)(p) + 1),       \
       *((byte huge *) &__lx + 1) = *((byte huge *)(p) + 2),       \
       *((byte huge *) &__lx)     = *((byte huge *)(p) + 3),       \
       (p) = (void huge *) ((lword huge *)(p) + 1),                \
       __lx)

#   define plbyte( p, v)                                           \
       __lx = (v),                                                 \
       *(byte huge *)(p)           = *((byte huge *) &__lx + 3);   \
       *((byte huge *)(p) + 1)     = *((byte huge *) &__lx + 2);   \
       *((byte huge *)(p) + 2)     = *((byte huge *) &__lx + 1);   \
       *((byte huge *)(p) + 3)     = *(byte huge *) &__lx;         \
       (p) = (void huge *) ((lword huge *)(p) + 1)
#  endif
#  define lbeek( p)                                                \
     (*(byte huge *) &__lx       = *((byte huge *) (p) + 3),       \
      *((byte huge *) &__lx + 1) = *((byte huge *) (p) + 2),       \
      *((byte huge *) &__lx + 2) = *((byte huge *) (p) + 1),       \
      *((byte huge *) &__lx + 3) = *(byte huge *) (p),             \
      __lx)


#   define fdpoke(  p, v)  *(word huge *) (p) = (word)(v)
#   define fdpeek(  p)    (*(word huge *) (p))
#   define fdbyte(  p, v)  dbyte( p, v)
#   define fdbeek(  p)     dbeek( p)
#   define fpdpoke( p, v)  pdpoke(p, v)
#   define fpdpeek( p)     pdpeek( p)
#   define fpdbyte( p, v)  pdbyte( p, v)
#   define fpdbeek( p)     pdbeek( p)
#  endif

#  if WORD_EVEN
#   define dclr( p)        *(byte huge *)(p) = *((byte huge *)(p) + 1) = 0
#   if ! PHILOSOPHICAL_PROBLEM
#    if ! LATE_PLUSPLUS
#     define pdclr( p)     *((byte huge *)(p))++ = *((byte huge *)(p))++ = 0
#    else
#     define pdclr( p)     *((byte huge *)(p))++ = 0; *((byte huge *)(p))++ = 0
#    endif
#   else
#     define pdclr( p)     *(byte huge *)(p) = 0; *((byte huge *)(p) + 1) = 0; \
                           (p) = (void huge *) ((word huge *)(p) + 1)
#   endif
#  else
#   define dclr( p)        *(word huge *)(p) = 0
#   if PHILOSOPHICAL_PROBLEM
#    define pdclr( p)      *(word huge *)(p) = 0;                         \
                           (p) = (void huge *) ((word huge *)(p) + 1)
#   else
#    define pdclr( p)      *((word huge *)(p))++ = 0
#   endif
#  endif

#  define poke( p, v)      *(byte huge *)(p)  = (byte) (v)
#  define peek( p)         *(byte huge *)(p)
#  define apoke( p, v)     *(byte huge *)(p) += (byte) (v)
#  define adpoke( p, v)    dpoke( p, (v) + dpeek( p))
#  define adbyte( p, v)    dbyte( p, dbeek( p) + (word)(v))

#  define is_in_program( x)                              \
     ((byte huge *) (x) >= __program && (byte huge *) (x) < __program + MAXMODULE)

#  define p_index()      ((word) (__p - __program))
#  define calc_ind( adr) ((word) ((byte huge *)(adr) - __program))
#  ifndef calc_pc
#   define calc_pc( adr) (((word) ((byte huge *)(adr) - __program)) + DEFORG)
#  endif
# endif

# ifndef __BIG_GENERATOR__
extern word       __pc, __x;
extern lword      __lx;
extern byte huge  *__program, huge *__p;
# endif


#endif



