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 #ifndef PR_COMP_H
24 #define PR_COMP_H
25 
26 typedef unsigned int	func_t;
27 typedef int	string_t;
28 
29 typedef enum etype_e {ev_void, ev_string, ev_float, ev_vector, ev_entity, ev_field, ev_function, ev_pointer} etype_t;
30 
31 
32 #define	OFS_NULL		0
33 #define	OFS_RETURN		1
34 #define	OFS_PARM0		4		// leave 3 ofs for each parm to hold vectors
35 #define	OFS_PARM1		7
36 #define	OFS_PARM2		10
37 #define	OFS_PARM3		13
38 #define	OFS_PARM4		16
39 #define	OFS_PARM5		19
40 #define	OFS_PARM6		22
41 #define	OFS_PARM7		25
42 #define	RESERVED_OFS	28
43 
44 
45 typedef enum opcode_e
46 {
47 	OP_DONE,
48 	OP_MUL_F,
49 	OP_MUL_V,
50 	OP_MUL_FV,
51 	OP_MUL_VF,
52 	OP_DIV_F,
53 	OP_ADD_F,
54 	OP_ADD_V,
55 	OP_SUB_F,
56 	OP_SUB_V,
57 
58 	OP_EQ_F,
59 	OP_EQ_V,
60 	OP_EQ_S,
61 	OP_EQ_E,
62 	OP_EQ_FNC,
63 
64 	OP_NE_F,
65 	OP_NE_V,
66 	OP_NE_S,
67 	OP_NE_E,
68 	OP_NE_FNC,
69 
70 	OP_LE,
71 	OP_GE,
72 	OP_LT,
73 	OP_GT,
74 
75 	OP_LOAD_F,
76 	OP_LOAD_V,
77 	OP_LOAD_S,
78 	OP_LOAD_ENT,
79 	OP_LOAD_FLD,
80 	OP_LOAD_FNC,
81 
82 	OP_ADDRESS,
83 
84 	OP_STORE_F,
85 	OP_STORE_V,
86 	OP_STORE_S,
87 	OP_STORE_ENT,
88 	OP_STORE_FLD,
89 	OP_STORE_FNC,
90 
91 	OP_STOREP_F,
92 	OP_STOREP_V,
93 	OP_STOREP_S,
94 	OP_STOREP_ENT,
95 	OP_STOREP_FLD,
96 	OP_STOREP_FNC,
97 
98 	OP_RETURN,
99 	OP_NOT_F,
100 	OP_NOT_V,
101 	OP_NOT_S,
102 	OP_NOT_ENT,
103 	OP_NOT_FNC,
104 	OP_IF,
105 	OP_IFNOT,
106 	OP_CALL0,
107 	OP_CALL1,
108 	OP_CALL2,
109 	OP_CALL3,
110 	OP_CALL4,
111 	OP_CALL5,
112 	OP_CALL6,
113 	OP_CALL7,
114 	OP_CALL8,
115 	OP_STATE,
116 	OP_GOTO,
117 	OP_AND,
118 	OP_OR,
119 
120 	OP_BITAND,
121 	OP_BITOR
122 }
123 opcode_t;
124 
125 
126 typedef struct statement_s
127 {
128 	unsigned short	op;
129 	signed short	a,b,c;
130 }
131 dstatement_t;
132 
133 typedef struct ddef_s
134 {
135 	unsigned short	type;		// if DEF_SAVEGLOBGAL bit is set
136 								// the variable needs to be saved in savegames
137 	unsigned short	ofs;
138 	int			s_name;
139 }
140 ddef_t;
141 #define	DEF_SAVEGLOBAL	(1<<15)
142 
143 #define	MAX_PARMS	8
144 
145 typedef struct dfunction_s
146 {
147 	int		first_statement;	// negative numbers are builtins
148 	int		parm_start;
149 	int		locals;				// total ints of parms + locals
150 
151 	int		profile;		// runtime
152 
153 	int		s_name;
154 	int		s_file;			// source file defined in
155 
156 	int		numparms;
157 	unsigned char	parm_size[MAX_PARMS];
158 }
159 dfunction_t;
160 
161 typedef struct mfunction_s
162 {
163 	int		first_statement;	// negative numbers are builtins
164 	int		parm_start;
165 	int		locals;				// total ints of parms + locals
166 
167 	// these are doubles so that they can count up to 54bits or so rather than 32bit
168 	double  tprofile;           // realtime in this function
169 	double  tbprofile;          // realtime in builtins called by this function (NOTE: builtins also have a tprofile!)
170 	double	profile;		// runtime
171 	double	builtinsprofile; // cost of builtin functions called by this function
172 	double	callcount; // times the functions has been called since the last profile call
173 	double  totaltime; // total execution time of this function DIRECTLY FROM THE ENGINE
174 	double	tprofile_total;		// runtime (NOTE: tbprofile_total makes no real sense, so not accumulating that)
175 	double	profile_total;		// runtime
176 	double	builtinsprofile_total; // cost of builtin functions called by this function
177 	int     recursion;
178 
179 	int		s_name;
180 	int		s_file;			// source file defined in
181 
182 	int		numparms;
183 	unsigned char	parm_size[MAX_PARMS];
184 }
185 mfunction_t;
186 
187 typedef struct mstatement_s
188 {
189 	opcode_t	op;
190 	int			operand[3]; // always a global or -1 for unused
191 	int			jumpabsolute; // only used by IF, IFNOT, GOTO
192 }
193 mstatement_t;
194 
195 
196 #define	PROG_VERSION	6
197 typedef struct dprograms_s
198 {
199 	int		version;
200 	int		crc;			// check of header file
201 
202 	int		ofs_statements;
203 	int		numstatements;	// statement 0 is an error
204 
205 	int		ofs_globaldefs;
206 	int		numglobaldefs;
207 
208 	int		ofs_fielddefs;
209 	int		numfielddefs;
210 
211 	int		ofs_functions;
212 	int		numfunctions;	// function 0 is an empty
213 
214 	int		ofs_strings;
215 	int		numstrings;		// first string is a null string
216 
217 	int		ofs_globals;
218 	int		numglobals;
219 
220 	int		entityfields;
221 }
222 dprograms_t;
223 
224 #endif
225 
226