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