Initial revision
[divverent/darkplaces.git] / pr_comp.h
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
19 */
20
21 // this file is shared by quake and qcc
22
23 typedef int     func_t;
24 typedef int     string_t;
25
26 typedef enum {ev_void, ev_string, ev_float, ev_vector, ev_entity, ev_field, ev_function, ev_pointer} etype_t;
27
28
29 #define OFS_NULL                0
30 #define OFS_RETURN              1
31 #define OFS_PARM0               4               // leave 3 ofs for each parm to hold vectors
32 #define OFS_PARM1               7
33 #define OFS_PARM2               10
34 #define OFS_PARM3               13
35 #define OFS_PARM4               16
36 #define OFS_PARM5               19
37 #define OFS_PARM6               22
38 #define OFS_PARM7               25
39 #define RESERVED_OFS    28
40
41
42 enum {
43         OP_DONE,
44         OP_MUL_F,
45         OP_MUL_V,
46         OP_MUL_FV,
47         OP_MUL_VF,
48         OP_DIV_F,
49         OP_ADD_F,
50         OP_ADD_V,
51         OP_SUB_F,
52         OP_SUB_V,
53         
54         OP_EQ_F,
55         OP_EQ_V,
56         OP_EQ_S,
57         OP_EQ_E,
58         OP_EQ_FNC,
59         
60         OP_NE_F,
61         OP_NE_V,
62         OP_NE_S,
63         OP_NE_E,
64         OP_NE_FNC,
65         
66         OP_LE,
67         OP_GE,
68         OP_LT,
69         OP_GT,
70
71         OP_LOAD_F,
72         OP_LOAD_V,
73         OP_LOAD_S,
74         OP_LOAD_ENT,
75         OP_LOAD_FLD,
76         OP_LOAD_FNC,
77
78         OP_ADDRESS,
79
80         OP_STORE_F,
81         OP_STORE_V,
82         OP_STORE_S,
83         OP_STORE_ENT,
84         OP_STORE_FLD,
85         OP_STORE_FNC,
86
87         OP_STOREP_F,
88         OP_STOREP_V,
89         OP_STOREP_S,
90         OP_STOREP_ENT,
91         OP_STOREP_FLD,
92         OP_STOREP_FNC,
93
94         OP_RETURN,
95         OP_NOT_F,
96         OP_NOT_V,
97         OP_NOT_S,
98         OP_NOT_ENT,
99         OP_NOT_FNC,
100         OP_IF,
101         OP_IFNOT,
102         OP_CALL0,
103         OP_CALL1,
104         OP_CALL2,
105         OP_CALL3,
106         OP_CALL4,
107         OP_CALL5,
108         OP_CALL6,
109         OP_CALL7,
110         OP_CALL8,
111         OP_STATE,
112         OP_GOTO,
113         OP_AND,
114         OP_OR,
115         
116         OP_BITAND,
117         OP_BITOR
118 };
119
120
121 typedef struct statement_s
122 {
123         unsigned short  op;
124         signed short    a,b,c;
125 } dstatement_t;
126
127 typedef struct
128 {
129         unsigned short  type;           // if DEF_SAVEGLOBGAL bit is set
130                                                                 // the variable needs to be saved in savegames
131         unsigned short  ofs;
132         int                     s_name;
133 } ddef_t;
134 #define DEF_SAVEGLOBAL  (1<<15)
135
136 #define MAX_PARMS       8
137
138 typedef struct
139 {
140         int             first_statement;        // negative numbers are builtins
141         int             parm_start;
142         int             locals;                         // total ints of parms + locals
143         
144         int             profile;                // runtime
145         
146         int             s_name;
147         int             s_file;                 // source file defined in
148         
149         int             numparms;
150         byte    parm_size[MAX_PARMS];
151 } dfunction_t;
152
153
154 #define PROG_VERSION    6
155 typedef struct
156 {
157         int             version;
158         int             crc;                    // check of header file
159         
160         int             ofs_statements;
161         int             numstatements;  // statement 0 is an error
162
163         int             ofs_globaldefs;
164         int             numglobaldefs;
165         
166         int             ofs_fielddefs;
167         int             numfielddefs;
168         
169         int             ofs_functions;
170         int             numfunctions;   // function 0 is an empty
171         
172         int             ofs_strings;
173         int             numstrings;             // first string is a null string
174
175         int             ofs_globals;
176         int             numglobals;
177         
178         int             entityfields;
179 } dprograms_t;
180