/* ---------------------------------------------------------------------- */ /* 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