diff options
Diffstat (limited to 'misc/pascal/insn16/include/pexec.h')
-rw-r--r-- | misc/pascal/insn16/include/pexec.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/misc/pascal/insn16/include/pexec.h b/misc/pascal/insn16/include/pexec.h new file mode 100644 index 000000000..356757d53 --- /dev/null +++ b/misc/pascal/insn16/include/pexec.h @@ -0,0 +1,156 @@ +/**************************************************************************** + * pexec.h + * + * Copyright (C) 2008 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __PEXEC_H +#define __PEXEC_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +#define BPERI 2 +#define ITOBSTACK(i) ((i) << 1) +#define BTOISTACK(i) ((i) >> 1) +#define ROUNDBTOI(i) (((i) + 1) >> 1) + +/**************************************************************************** + * Type Definitions + ****************************************************************************/ + +typedef uint16_t ustack_t; /* Stack values are 16-bits in length */ +typedef int16_t sstack_t; +typedef uint16_t paddr_t; /* Addresses are 16-bits in length */ +typedef uint16_t level_t; /* Limits to MAXUINT16 levels */ + +union stack_u +{ + ustack_t *i; + uint8_t *b; +}; +typedef union stack_u stackType; + +/* This structure describes the parameters needed to initialize the p-code + * interpreter. + */ + +struct pexec_attr_s +{ + /* Instruction space (I-Space) */ + + FAR uint8_t *ispace; /* Allocated I-Space containing p-code data */ + paddr_t entry; /* Entry point */ + paddr_t maxpc; /* Last valid p-code address */ + + /* Read-only data block */ + + FAR uint8_t *rodata; /* Address of read-only data block */ + paddr_t rosize; /* Size of read-only data block */ + + /* Allocate for variable storage */ + + paddr_t varsize; /* Variable storage size */ + paddr_t strsize; /* String storage size */ +}; + +/* This structure defines the current state of the p-code interpreter */ + +struct pexec_s +{ + /* This is the emulated P-Machine stack (D-Space) */ + + stackType dstack; + + /* This is the emulated P-Machine instruction space (I-Space) */ + + FAR uint8_t *ispace; + + /* Address of last valid P-Code */ + + paddr_t maxpc; + + /* These are the emulated P-Machine registers: + * + * spb: Base of the stack + * sp: The Pascal stack pointer + * csp: The current top of the stack used to manage string + * storage + * fp: Base Register of the current stack frame. Holds the address + * of the base of the stack frame of the current block. + * fop: Pointer to section containing read-only data + * pc: Holds the current p-code location + */ + + paddr_t spb; /* Pascal stack base */ + paddr_t sp; /* Pascal stack pointer */ + paddr_t csp; /* Character stack pointer */ + paddr_t fp; /* Base of the current frame */ + paddr_t rop; /* Read-only data pointer */ + paddr_t pc; /* Program counter */ + + /* Info needed to perform a simulated reset */ + + paddr_t strsize; /* String stack size */ + paddr_t rosize; /* Read-only stack size */ + paddr_t entry; /* Entry point */ + paddr_t stacksize; /* (debug only) */ +}; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" { +#else +#define EXTERN extern +#endif + +EXTERN FAR struct pexec_s *pload(const char *filename, paddr_t varsize, paddr_t strsize); +EXTERN FAR struct pexec_s *pexec_init(struct pexec_attr_s *attr); +EXTERN int pexec(FAR struct pexec_s *st); +EXTERN void pexec_reset(struct pexec_s *st); +EXTERN void pexec_release(struct pexec_s *st); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* __PEXEC_H */ |