/* csplash.h 05/03/01 */
/* Definitions for converted SPLash code */
/* Copyright (c) 2005 Allegro Consultants, Inc. */
/* NOTE: these require compiling with 2-byte alignment */
/* I.e., 32-bit values have to be storable into */
/* memory at addresses that are merely 2-byte */
/* aligned and not 4-byte aligned! */
/* With HP C, that would be "+u2" */
#ifndef CSPLASH_H
#define CSPLASH_H
#ifndef NULL
#define NULL ((void *) 0)
#endif
#include <ctype.h>
/* mike: add some include files */
#define rename lib_rename
#include <stdio.h>
#undef rename
#include <stdlib.h>
#include <string.h>
extern int short CCODE(void);
#ifdef MPE
/* on MPE, none of the above includes will */
/* declare int16_t or int32_t */
typedef short int16_t;
typedef int int32_t;
#endif
typedef int ADR; /* 32 bits */
typedef float FLOAT32;
typedef double FLOAT64;
typedef short INT16;
typedef int INT32;
typedef unsigned char UINT8;
typedef unsigned char UCHAR;
typedef unsigned short UINT16;
typedef unsigned int UINT32;
#ifndef MPE
typedef long long int INT64;
#endif
#ifndef MAXDATA
#define MAXDATA 32767
#endif
#ifdef FROM_CSPLASH_C
#define EXTERN
INT16 STACK [MAXDATA];
INT32 CARRY = 0;
INT32 TOS = 0;
INT32 S = 0;
INT32 X = 0;
#else
#define EXTERN extern
EXTERN INT16 STACK [];
EXTERN INT32 CARRY;
EXTERN INT32 TOS;
EXTERN INT32 S;
EXTERN INT32 X;
#endif
#ifndef CCODE_CCG
#define CCODE_CCG 0
#define CCODE_CCL 1
#define CCODE_CCE 2
#endif
#define A STACK [TOS]
#define B STACK [TOS - 1]
#define C STACK [TOS - 2]
#define LA (UINT16) A
#define LB (UINT16) B
#define LC (UINT16) C
#define DA *((INT32 *) (STACK - 1))
#define DB *((INT32 *) (STACK - 3))
#define POP_ADDRESS (--TOS, (*((char **) (STACK + TOS--))))
#define POP_FLOAT32 (--TOS, *((FLOAT32 *) (STACK + TOS--)))
#define POP_FLOAT64 (TOS -= 3, *((FLOAT64 *) (STACK + TOS--)))
#define POP_INT16 (STACK [TOS--])
#define POP_INT32 (--TOS, *((INT32 *) (STACK + TOS--)))
#define POP_UINT16 ( *((UINT16 *) (STACK + TOS--)))
#define PUSH_ADDRESS *((char **) (STACK + (TOS += 2) - 1))
#define PUSH_FLOAT32 *((FLOAT32 *) (STACK + (TOS += 2) - 1))
#define PUSH_FLOAT64 *((FLOAT64 *) (STACK + (TOS += 4) - 3))
#define PUSH_INT16 STACK [++TOS]
#define PUSH_INT32 *((INT32 *) (STACK + (TOS += 2) - 1))
#define PUSH_UINT16 *((UINT16 *) (STACK + ++TOS))
#define ADAX X += POP_INT16
#define ADBX X += B
#define ADD { B = B + A; DEL; }
#define ADXA A += X
#define ADXB B += X
#define AND { B = B & A; DEL; }
#define BRK (not-implemented-yet)
#define BTOW /* nop */
#define BTST (not-implemented-yet)
#define CAB { INT16 temp = C; C = B; B = A; A = temp; }
#define CLCY CARRY = 0
#define CLOV (not-implemented-yet)
#define CMP (not-implemented-yet)
#define DADD { DB = DB + DA; DDEL; }
#define DCMP (not-implemented-yet)
#define DDEL TOS -= 2
#define DDIV { INT32 temp = DB; DB = temp / DA; DA = temp % DA; }
#define DDUP { INT32 temp = DA; PUSH_INT32 = temp; }
#define DECA A -= 1
#define DECB B -= 1
#define DECX X -= 1
#define DEL TOS--
#define DELB { B = A; TOS--; }
#define DFLT { INT32 temp = POP_INT32; PUSH_FLOAT32 = temp; }
#define DIV { INT16 temp = B; B = temp / A; A = temp % A; }
#define DIVL { UINT16 temp1 = POP_UINT16, temp2 = POP_INT32; \
PUSH_UINT16 = temp2 / temp1; \
PUSH_UINT16 = temp2 % temp1; }
#define DLSZ PUSH_UINT16 = 0xffff
#define DMUL { DB = DB * DA; DDEL; }
#define DNEG DA = -DA
#define DSUB { DB = DB - DA; DDEL; }
#define DTST (not-implemented-yet)
#define DUP { INT16 temp = A; PUSH_INT16 = temp; }
#define DXCH { INT32 temp = A; A = B; B = temp; }
#define DZRO PUSH_INT32 = 0
#define EADD (not-implemented-yet)
#define ECMP (not-implemented-yet)
#define EDIV (not-implemented-yet)
#define EMPY (not-implemented-yet)
#define ENDP (not-implemented-yet)
#define ENEG (not-implemented-yet)
#define ESUB (not-implemented-yet)
#define FADD (not-implemented-yet)
#define FCMP (not-implemented-yet)
#define FDIV (not-implemented-yet)
#define FIXR (not-implemented-yet)
#define FIXT (not-implemented-yet)
#define FLT (not-implemented-yet)
#define FMPY (not-implemented-yet)
#define FNEG (not-implemented-yet)
#define FSUB (not-implemented-yet)
#define INCA A += 1
#define INCB B += 1
#define INCX X := 1
#define LADD { LB = LB + LA; DEL; }
#define LCMP (not-implemented-yet)
#define LDIV { UINT16 temp1 = POP_UINT16, temp2 = POP_INT32; \
PUSH_UINT16 = temp2 / temp1; \
PUSH_UINT16 = temp2 % temp1; }
#define LDXA POP_INT16 = X
#define LDXB B = X
#define LMPY (not-implemented-yet)
#define LSUB { LB = LB - LA; DEL; }
#define MFVA (not-implemented-yet)
#define MPY { B = B * A; DEL; }
#define MPYL (not-implemented-yet)
#define MTVA (not-implemented-yet)
#define NEG A = -A
#define NOP /* nop */
#define NOT A = ~A
#define OR { B = B | A; DEL; }
#define PARC (not-implemented-yet)
#define PLDA (not-implemented-yet)
#define PSTA (not-implemented-yet)
#define STAX X = POP_INT16
#define STBX X = B
#define SUB { B = B - A; DEL; }
#define TEST (not-implemented-yet)
#define TRDB (not-implemented-yet)
#define TRPB (not-implemented-yet)
#define WTOB (not-implemented-yet)
#define XAX { INT16 temp = X; X = A; A = temp; }
#define XBR (not-implemented-yet)
#define XBX { INT16 temp = X; X = B; B = temp; }
#define XCH { INT16 temp = B; B = A; A = temp; }
#define XOR { B = B ^ A; DEL; }
#define ZERO PUSH_INT16 = 0;
#define ZROB B = 0
#define ZROX X = 0
INT16 CCODE (void);
INT32 SPLash_move (void *dst, void *src, INT32 len);
INT32 SPLash_move_a (void *dst, void *src, INT32 stack_dec);
INT32 SPLash_move_an (void *dst, void *src, INT32 stack_dec);
INT32 SPLash_move_ans (void *dst, void *src, INT32 stack_dec);
INT32 SPLash_move_as (void *dst, void *src, INT32 stack_dec);
INT32 SPLash_move_n (void *dst, void *src, INT32 stack_dec);
INT32 SPLash_move_sd (void *dst, void *src, INT32 len,
INT32 stack_dec);
INT32 SPLash_compare (void *dst, void *src, INT32 len);
INT32 SPLash_compare_sd (void *dst, void *src, INT32 len,
INT32 stack_dec);
INT32 SPLash_scan_until (void *src, INT16 search_value,
INT32 stack_dec);
INT32 SPLash_scan_while (void *src, INT16 search_value,
INT32 stack_dec);
UINT32 SPLash_deposit (UINT32 dst, UINT32 src, INT32 start,
INT32 len);
UINT32 SPLash_extract (UINT32 src, INT32 start, INT32 len);
#endif /* CSPLASH_H */