instance_st.h 5 KB
Newer Older
1
/*
2
 *  Copyright (C) 2014-2016 Joseba García Etxebarria <joseba.gar@gmail.com>
3 4 5
 *  Copyright (C) 2006-2012 SplinterGU (Fenix/Bennugd)
 *  Copyright (C) 2002-2006 Fenix Team (Fenix)
 *  Copyright (C) 1999-2002 José Luis Cebrián Pagüe (Fenix)
6
 *
7
 *  This file is part of PixTudio
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 *
 *  This software is provided 'as-is', without any express or implied
 *  warranty. In no event will the authors be held liable for any damages
 *  arising from the use of this software.
 *
 *  Permission is granted to anyone to use this software for any purpose,
 *  including commercial applications, and to alter it and redistribute it
 *  freely, subject to the following restrictions:
 *
 *     1. The origin of this software must not be misrepresented; you must not
 *     claim that you wrote the original software. If you use this software
 *     in a product, an acknowledgment in the product documentation would be
 *     appreciated but is not required.
 *
 *     2. Altered source versions must be plainly marked as such, and must not be
 *     misrepresented as being the original software.
 *
 *     3. This notice may not be removed or altered from any source
 *     distribution.
 *
 */

#ifndef __INSTANCE_ST_H
#define __INSTANCE_ST_H

33 34
#define FIRST_INSTANCE_ID 0x00010000
#define LAST_INSTANCE_ID 0x0001ffff
35

36 37 38
#define STACK_RETURN_VALUE 0x8000
#define STACK_SIZE_MASK 0x7FFF
#define STACK_SIZE 2048
39

40 41
#include <stdint.h>

42 43 44
/* Instancias. Una instancia se crea a partir de un proceso, pero en
 * realidad es independiente del proceso original */

45 46 47 48
typedef struct _instance {
    void *locdata;
    void *pridata;
    void *pubdata;
49

50 51
    int *code;
    int *codeptr;
52

53 54
    int exitcode;
    int errorcode;
55

56
    int call_level;
57

58
    struct _procdef *proc;
59

60 61
    int private_size;
    int public_size;
62

63
    int first_run;
64 65 66

    /* General list - unsorted */

67 68
    struct _instance *next;
    struct _instance *prev;
69 70 71

    /* Linked list by priority */

72 73 74
    struct _instance *next_by_priority;
    struct _instance *prev_by_priority;
    int last_priority;
75 76 77

    /* Linked list by process_type */

78 79
    struct _instance *next_by_type;
    struct _instance *prev_by_type;
80 81 82

    /* Linked list by INSTANCE * */

83 84
    struct _instance *next_by_instance;
    struct _instance *prev_by_instance;
85 86 87

    /* Function support */

88
    struct _instance *called_by;
89 90 91 92

    /* The first integer at the stack is the stack size,
       with optional NO_RETURN_VALUE mask. The stack contents follows */

93 94
    intptr_t *stack;
    intptr_t *stack_ptr;
95 96 97 98 99 100 101 102 103

    /* For debugging */

    int switchval;
    int switchval_string;
    int cased;

    int breakpoint;

104
} INSTANCE;
105 106 107

/* Macros para acceder a datos locales o privados de una instancia */

108 109 110
#define LOCDWORD(a, b) (*(uint32_t *)((uint8_t *)(a->locdata) + b))
#define LOCWORD(a, b) (*(uint16_t *)((uint8_t *)(a->locdata) + b))
#define LOCBYTE(a, b) (*(uint8_t *)((uint8_t *)(a->locdata) + b))
111

112 113 114
#define LOCINT32(a, b) (*(int32_t *)((uint8_t *)(a->locdata) + b))
#define LOCINT16(a, b) (*(int16_t *)((uint8_t *)(a->locdata) + b))
#define LOCINT8(a, b) (*(int8_t *)((uint8_t *)(a->locdata) + b))
115

116 117 118
#define LOCUINT32(a, b) (*(uint32_t *)((uint8_t *)(a->locdata) + b))
#define LOCUINT16(a, b) (*(uint16_t *)((uint8_t *)(a->locdata) + b))
#define LOCUINT8(a, b) (*(uint8_t *)((uint8_t *)(a->locdata) + b))
119

120 121 122
#define PRIDWORD(a, b) (*(uint32_t *)((uint8_t *)(a->pridata) + b))
#define PRIWORD(a, b) (*(uint16_t *)((uint8_t *)(a->pridata) + b))
#define PRIBYTE(a, b) (*(uint8_t *)((uint8_t *)(a->pridata) + b))
123

124 125 126
#define PRIINT32(a, b) (*(int32_t *)((uint8_t *)(a->pridata) + b))
#define PRIINT16(a, b) (*(int16_t *)((uint8_t *)(a->pridata) + b))
#define PRIINT8(a, b) (*(int8_t *)((uint8_t *)(a->pridata) + b))
127

128 129 130
#define PRIUINT32(a, b) (*(uint32_t *)((uint8_t *)(a->pridata) + b))
#define PRIUINT16(a, b) (*(uint16_t *)((uint8_t *)(a->pridata) + b))
#define PRIUINT8(a, b) (*(uint8_t *)((uint8_t *)(a->pridata) + b))
131

132 133 134
#define PUBDWORD(a, b) (*(uint32_t *)((uint8_t *)(a->pubdata) + b))
#define PUBWORD(a, b) (*(uint16_t *)((uint8_t *)(a->pubdata) + b))
#define PUBBYTE(a, b) (*(uint8_t *)((uint8_t *)(a->pubdata) + b))
135

136 137 138
#define PUBINT32(a, b) (*(int32_t *)((uint8_t *)(a->pubdata) + b))
#define PUBINT16(a, b) (*(int16_t *)((uint8_t *)(a->pubdata) + b))
#define PUBINT8(a, b) (*(int8_t *)((uint8_t *)(a->pubdata) + b))
139

140 141 142
#define PUBUINT32(a, b) (*(uint32_t *)((uint8_t *)(a->pubdata) + b))
#define PUBUINT16(a, b) (*(uint16_t *)((uint8_t *)(a->pubdata) + b))
#define PUBUINT8(a, b) (*(uint8_t *)((uint8_t *)(a->pubdata) + b))
143

144 145 146
#define GLODWORD(b) (*(uint32_t *)((uint8_t *)(globaldata) + b))
#define GLOWORD(b) (*(uint16_t *)((uint8_t *)(globaldata) + b))
#define GLOBYTE(b) (*(uint8_t *)((uint8_t *)(globaldata) + b))
147

148 149 150
#define GLOINT32(b) (*(int32_t *)((uint8_t *)(globaldata) + b))
#define GLOINT16(b) (*(int16_t *)((uint8_t *)(globaldata) + b))
#define GLOINT8(b) (*(int8_t *)((uint8_t *)(globaldata) + b))
151

152 153 154
#define GLOUINT32(b) (*(uint32_t *)((uint8_t *)(globaldata) + b))
#define GLOUINT16(b) (*(uint16_t *)((uint8_t *)(globaldata) + b))
#define GLOUINT8(b) (*(uint8_t *)((uint8_t *)(globaldata) + b))
155 156

#endif