Skip to content

Commit 102b527

Browse files
PistonMinerZephiles
authored andcommitted
rel: Add support for writing evts
1 parent ce47b10 commit 102b527

File tree

1 file changed

+360
-0
lines changed

1 file changed

+360
-0
lines changed

ttyd-tools/rel/include/evt_cmd.h

Lines changed: 360 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,360 @@
1+
#pragma once
2+
3+
#include <cstdint>
4+
5+
#define EVT_BEGIN(name) \
6+
const int32_t name[] = {
7+
#define EVT_END() \
8+
0x1 };
9+
10+
#define EVT_HELPER_OP(op) \
11+
reinterpret_cast<int32_t>((op))
12+
13+
// Expression types
14+
#define EVT_HELPER_EXPR(base, offset) \
15+
EVT_HELPER_OP((base) + (offset))
16+
17+
#define EVT_HELPER_LW_BASE -30000000
18+
#define EVT_HELPER_GW_BASE -50000000
19+
#define EVT_HELPER_LF_BASE -70000000
20+
#define EVT_HELPER_GF_BASE -90000000
21+
#define EVT_HELPER_LSWF_BASE -110000000
22+
#define EVT_HELPER_GSWF_BASE -130000000
23+
#define EVT_HELPER_LSW_BASE -150000000
24+
#define EVT_HELPER_GSW_BASE -170000000
25+
#define EVT_HELPER_UW_BASE -190000000
26+
#define EVT_HELPER_UF_BASE -210000000
27+
#define EVT_HELPER_FLOAT_BASE -230000000
28+
#define EVT_HELPER_POINTER_BASE -250000000
29+
30+
#define LW(id) \
31+
EVT_HELPER_EXPR(EVT_HELPER_LW_BASE, id)
32+
#define GW(id) \
33+
EVT_HELPER_EXPR(EVT_HELPER_GW_BASE, id)
34+
#define LF(id) \
35+
EVT_HELPER_EXPR(EVT_HELPER_LF_BASE, id)
36+
#define GF(id) \
37+
EVT_HELPER_EXPR(EVT_HELPER_GF_BASE, id)
38+
#define LSWF(id) \
39+
EVT_HELPER_EXPR(EVT_HELPER_LSWF_BASE, id)
40+
#define GSWF(id) \
41+
EVT_HELPER_EXPR(EVT_HELPER_GSWF_BASE, id)
42+
#define LSW(id) \
43+
EVT_HELPER_EXPR(EVT_HELPER_LSW_BASE, id)
44+
#define GSW(id) \
45+
EVT_HELPER_EXPR(EVT_HELPER_GSW_BASE, id)
46+
#define UW(id) \
47+
EVT_HELPER_EXPR(EVT_HELPER_UW_BASE, id)
48+
#define UF(id) \
49+
EVT_HELPER_EXPR(EVT_HELPER_UF_BASE, id)
50+
51+
#define FLOAT(value) \
52+
EVT_HELPER_EXPR( \
53+
EVT_HELPER_FLOAT_BASE, static_cast<int32_t>((value) * 1024.f) \
54+
)
55+
#define PTR(value) \
56+
reinterpret_cast<int32_t>(value)
57+
58+
// Commands
59+
#define EVT_HELPER_CMD(parameter_count, opcode) \
60+
static_cast<int32_t>( \
61+
static_cast<uint32_t>((parameter_count) << 16 | (opcode)) \
62+
)
63+
64+
#define RETURN() \
65+
EVT_HELPER_CMD(0, 2),
66+
67+
#define LBL(id) \
68+
EVT_HELPER_CMD(1, 3), EVT_HELPER_OP(id),
69+
#define GOTO(id) \
70+
EVT_HELPER_CMD(1, 4), EVT_HELPER_OP(id),
71+
72+
#define DO(iteration_count) \
73+
EVT_HELPER_CMD(1, 5), EVT_HELPER_OP(iteration_count),
74+
#define WHILE() \
75+
EVT_HELPER_CMD(0, 6),
76+
#define DO_BREAK() \
77+
EVT_HELPER_CMD(0, 7),
78+
#define DO_CONTINUE() \
79+
EVT_HELPER_CMD(0, 8),
80+
81+
#define WAIT_FRM() \
82+
EVT_HELPER_CMD(1, 9),
83+
#define WAIT_MSEC() \
84+
EVT_HELPER_CMD(1, 10),
85+
#define HALT(until) \
86+
EVT_HELPER_CMD(1, 11), EVT_HELPER_OP(until),
87+
88+
#define IF_STR_EQUAL(lhs, rhs) \
89+
EVT_HELPER_CMD(2, 12), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
90+
#define IF_STR_NOT_EQUAL(lhs, rhs) \
91+
EVT_HELPER_CMD(2, 13), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
92+
#define IF_STR_SMALL(lhs, rhs) \
93+
EVT_HELPER_CMD(2, 14), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
94+
#define IF_STR_LARGE(lhs, rhs) \
95+
EVT_HELPER_CMD(2, 15), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
96+
#define IF_STR_SMALL_EQUAL(lhs, rhs) \
97+
EVT_HELPER_CMD(2, 16), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
98+
#define IF_STR_LARGE_EQUAL(lhs, rhs) \
99+
EVT_HELPER_CMD(2, 17), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
100+
101+
#define IFF_EQUAL(lhs, rhs) \
102+
EVT_HELPER_CMD(2, 18), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
103+
#define IFF_NOT_EQUAL(lhs, rhs) \
104+
EVT_HELPER_CMD(2, 19), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
105+
#define IFF_SMALL(lhs, rhs) \
106+
EVT_HELPER_CMD(2, 20), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
107+
#define IFF_LARGE(lhs, rhs) \
108+
EVT_HELPER_CMD(2, 21), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
109+
#define IFF_SMALL_EQUAL(lhs, rhs) \
110+
EVT_HELPER_CMD(2, 22), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
111+
#define IFF_LARGE_EQUAL(lhs, rhs) \
112+
EVT_HELPER_CMD(2, 23), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
113+
114+
#define IF_EQUAL(lhs, rhs) \
115+
EVT_HELPER_CMD(2, 24), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
116+
#define IF_NOT_EQUAL(lhs, rhs) \
117+
EVT_HELPER_CMD(2, 25), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
118+
#define IF_SMALL(lhs, rhs) \
119+
EVT_HELPER_CMD(2, 26), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
120+
#define IF_LARGE(lhs, rhs) \
121+
EVT_HELPER_CMD(2, 27), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
122+
#define IF_SMALL_EQUAL(lhs, rhs) \
123+
EVT_HELPER_CMD(2, 28), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
124+
#define IF_LARGE_EQUAL(lhs, rhs) \
125+
EVT_HELPER_CMD(2, 29), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
126+
127+
#define IF_FLAG(val, mask) \
128+
EVT_HELPER_CMD(2, 30), EVT_HELPER_OP(val), reinterpret_cast<int32_t>(mask),
129+
#define IF_NOT_FLAG(val, mask) \
130+
EVT_HELPER_CMD(2, 31), EVT_HELPER_OP(val), reinterpret_cast<int32_t>(mask),
131+
132+
#define ELSE() \
133+
EVT_HELPER_CMD(0, 32),
134+
#define END_IF() \
135+
EVT_HELPER_CMD(0, 33),
136+
137+
#define SWITCH(val) \
138+
EVT_HELPER_CMD(1, 34), EVT_HELPER_OP(val)
139+
#define SWITCHI(val) \
140+
EVT_HELPER_CMD(1, 35), EVT_HELPER_OP(val)
141+
142+
#define CASE_EQUAL(val) \
143+
EVT_HELPER_CMD(1, 36), EVT_HELPER_OP(val),
144+
#define CASE_NOT_EQUAL(val) \
145+
EVT_HELPER_CMD(1, 37), EVT_HELPER_OP(val),
146+
#define CASE_SMALL(val) \
147+
EVT_HELPER_CMD(1, 38), EVT_HELPER_OP(val),
148+
#define CASE_LARGE(val) \
149+
EVT_HELPER_CMD(1, 39), EVT_HELPER_OP(val),
150+
#define CASE_SMALL_EQUAL(val) \
151+
EVT_HELPER_CMD(1, 40), EVT_HELPER_OP(val),
152+
#define CASE_LARGE_EQUAL(val) \
153+
EVT_HELPER_CMD(1, 41), EVT_HELPER_OP(val),
154+
155+
#define CASE_ETC() \
156+
EVT_HELPER_CMD(0, 42),
157+
#define CASE_OR(val) \
158+
EVT_HELPER_CMD(1, 43), EVT_HELPER_OP(val),
159+
#define CASE_AND(val) \
160+
EVT_HELPER_CMD(1, 44), EVT_HELPER_OP(val),
161+
#define CASE_FLAG(mask) \
162+
EVT_HELPER_CMD(1, 45), reinterpret_cast<int32_t>(mask),
163+
#define CASE_END() \
164+
EVT_HELPER_CMD(0, 46),
165+
#define CASE_BETWEEN(low, high) \
166+
EVT_HELPER_CMD(2, 47), EVT_HELPER_OP(low), EVT_HELPER_OP(high),
167+
168+
#define SWITCH_BREAK() \
169+
EVT_HELPER_CMD(0, 48),
170+
#define END_SWITCH() \
171+
EVT_HELPER_CMD(0, 49),
172+
173+
#define SET(lhs, rhs) \
174+
EVT_HELPER_CMD(2, 50), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
175+
#define SETI(lhs, rhs) \
176+
EVT_HELPER_CMD(2, 51), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
177+
#define SETF(lhs, rhs) \
178+
EVT_HELPER_CMD(2, 52), EVT_HELPER_OP(lhs), EVT_HELPER_OP(rhs),
179+
180+
#define ADD(out, lhs, rhs) \
181+
EVT_HELPER_CMD(3, 53), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
182+
EVT_HELPER_OP(rhs),
183+
#define SUB(out, lhs, rhs) \
184+
EVT_HELPER_CMD(3, 54), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
185+
EVT_HELPER_OP(rhs),
186+
#define MUL(out, lhs, rhs) \
187+
EVT_HELPER_CMD(3, 55), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
188+
EVT_HELPER_OP(rhs),
189+
#define DIV(out, lhs, rhs) \
190+
EVT_HELPER_CMD(3, 56), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
191+
EVT_HELPER_OP(rhs),
192+
#define MOD(out, lhs, rhs) \
193+
EVT_HELPER_CMD(3, 57), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
194+
EVT_HELPER_OP(rhs),
195+
196+
#define ADDF(out, lhs, rhs) \
197+
EVT_HELPER_CMD(3, 58), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
198+
EVT_HELPER_OP(rhs),
199+
#define SUBF(out, lhs, rhs) \
200+
EVT_HELPER_CMD(3, 59), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
201+
EVT_HELPER_OP(rhs),
202+
#define MULF(out, lhs, rhs) \
203+
EVT_HELPER_CMD(3, 60), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
204+
EVT_HELPER_OP(rhs),
205+
#define DIVF(out, lhs, rhs) \
206+
EVT_HELPER_CMD(3, 61), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
207+
EVT_HELPER_OP(rhs),
208+
209+
#define SET_READ(val) \
210+
EVT_HELPER_CMD(1, 62), EVT_HELPER_OP(val),
211+
#define READ(out) \
212+
EVT_HELPER_CMD(1, 63), EVT_HELPER_OP(out),
213+
#define READ2(out1, out2) \
214+
EVT_HELPER_CMD(2, 64), EVT_HELPER_OP(out1), EVT_HELPER_OP(out2),
215+
#define READ3(out1, out2, out3) \
216+
EVT_HELPER_CMD(3, 65), EVT_HELPER_OP(out1), EVT_HELPER_OP(out2), \
217+
EVT_HELPER_OP(out3),
218+
#define READ4(out1, out2, out3, out4) \
219+
EVT_HELPER_CMD(4, 66), EVT_HELPER_OP(out1), EVT_HELPER_OP(out2), \
220+
EVT_HELPER_OP(out3), EVT_HELPER_OP(out4),
221+
#define READ_N(out, index) \
222+
EVT_HELPER_CMD(2, 67), EVT_HELPER_OP(out), EVT_HELPER_OP(index),
223+
224+
#define SET_READF(val) \
225+
EVT_HELPER_CMD(1, 68), EVT_HELPER_OP(val),
226+
#define READF(out) \
227+
EVT_HELPER_CMD(1, 69), EVT_HELPER_OP(out),
228+
#define READF2(out1, out2) \
229+
EVT_HELPER_CMD(2, 70), EVT_HELPER_OP(out1), EVT_HELPER_OP(out2),
230+
#define READF3(out1, out2, out3) \
231+
EVT_HELPER_CMD(3, 71), EVT_HELPER_OP(out1), EVT_HELPER_OP(out2), \
232+
EVT_HELPER_OP(out3),
233+
#define READF4(out1, out2, out3, out4) \
234+
EVT_HELPER_CMD(4, 72), EVT_HELPER_OP(out1), EVT_HELPER_OP(out2), \
235+
EVT_HELPER_OP(out3), EVT_HELPER_OP(out4),
236+
#define READF_N(out, index) \
237+
EVT_HELPER_CMD(2, 73), EVT_HELPER_OP(out), EVT_HELPER_OP(index),
238+
239+
#define SET_USER_WRK(val) \
240+
EVT_HELPER_CMD(1, 74), EVT_HELPER_OP(val),
241+
#define SET_USER_FLG(val) \
242+
EVT_HELPER_CMD(1, 75), EVT_HELPER_OP(val),
243+
#define ALLOC_USER_WRK(count) \
244+
EVT_HELPER_CMD(1, 76), EVT_HELPER_OP(count),
245+
246+
#define AND(out, lhs, rhs) \
247+
EVT_HELPER_CMD(3, 77), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
248+
EVT_HELPER_OP(rhs),
249+
#define ANDI(out, lhs, rhs) \
250+
EVT_HELPER_CMD(3, 78), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
251+
EVT_HELPER_OP(rhs),
252+
#define OR(out, lhs, rhs) \
253+
EVT_HELPER_CMD(3, 79), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
254+
EVT_HELPER_OP(rhs),
255+
#define ORI(out, lhs, rhs) \
256+
EVT_HELPER_CMD(3, 80), EVT_HELPER_OP(out), EVT_HELPER_OP(lhs), \
257+
EVT_HELPER_OP(rhs),
258+
259+
#define SET_FRAME_FROM_MSEC(out, in) \
260+
EVT_HELPER_CMD(2, 81), EVT_HELPER_OP(out), EVT_HELPER_OP(in),
261+
#define SET_MSEC_FROM_FRAME(out, in) \
262+
EVT_HELPER_CMD(2, 82), EVT_HELPER_OP(out), EVT_HELPER_OP(in),
263+
#define SET_RAM(val, ptr) \
264+
EVT_HELPER_CMD(2, 83), EVT_HELPER_OP(val), EVT_HELPER_OP(ptr),
265+
#define SET_RAMF(val, ptr) \
266+
EVT_HELPER_CMD(2, 84), EVT_HELPER_OP(val), EVT_HELPER_OP(ptr),
267+
#define GET_RAM(val, ptr) \
268+
EVT_HELPER_CMD(2, 85), EVT_HELPER_OP(out), EVT_HELPER_OP(ptr),
269+
#define GET_RAMF(val, ptr) \
270+
EVT_HELPER_CMD(2, 86), EVT_HELPER_OP(out), EVT_HELPER_OP(ptr),
271+
272+
// R is short for Reg
273+
#define SETR(indirect, val) \
274+
EVT_HELPER_CMD(2, 87), EVT_HELPER_OP(indirect), EVT_HELPER_OP(val),
275+
#define SETRF(indirect, val) \
276+
EVT_HELPER_CMD(2, 88), EVT_HELPER_OP(indirect), EVT_HELPER_OP(val),
277+
#define GETR(indirect, out) \
278+
EVT_HELPER_CMD(2, 89), EVT_HELPER_OP(indirect), EVT_HELPER_OP(out),
279+
#define GETRF(indirect, out) \
280+
EVT_HELPER_CMD(2, 90), EVT_HELPER_OP(indirect), EVT_HELPER_OP(out),
281+
282+
// User function calls with validated parameter counts
283+
template<bool expression>
284+
class expression_assert
285+
{
286+
static_assert(expression);
287+
};
288+
using evt_helper_int_array = int32_t[];
289+
#define EVT_HELPER_NUM_ARGS(...) \
290+
(sizeof(evt_helper_int_array{ __VA_ARGS__ }) / sizeof(int32_t))
291+
#define USER_FUNC(function, ...) \
292+
( \
293+
expression_assert< \
294+
function##_parameter_count == -1 \
295+
|| function##_parameter_count == EVT_HELPER_NUM_ARGS(__VA_ARGS__) \
296+
>(), \
297+
EVT_HELPER_CMD(1 + EVT_HELPER_NUM_ARGS(__VA_ARGS__), 91) \
298+
), \
299+
reinterpret_cast<int32_t>(function), \
300+
##__VA_ARGS__ ,
301+
302+
#define RUN_EVT(evt) \
303+
EVT_HELPER_CMD(1, 92), EVT_HELPER_OP(evt),
304+
#define RUN_EVT_ID(evt, out_id) \
305+
EVT_HELPER_CMD(2, 93), EVT_HELPER_OP(evt), EVT_HELPER_OP(out_id),
306+
#define RUN_CHILD_EVT(evt) \
307+
EVT_HELPER_CMD(1, 94), EVT_HELPER_OP(evt),
308+
#define DELETE_EVT(evt_id) \
309+
EVT_HELPER_CMD(1, 95), EVT_HELPER_OP(evt_id),
310+
#define RESTART_EVT(evt) \
311+
EVT_HELPER_CMD(1, 96), EVT_HELPER_OP(evt),
312+
313+
#define SET_PRI(pri) \
314+
EVT_HELPER_CMD(1, 97), EVT_HELPER_OP(pri),
315+
#define SET_SPD(spd) \
316+
EVT_HELPER_CMD(1, 98), EVT_HELPER_OP(spd),
317+
#define SET_TYPE(type_mask) \
318+
EVT_HELPER_CMD(1, 99), EVT_HELPER_OP(type_mask),
319+
320+
#define STOP_ALL(type_mask) \
321+
EVT_HELPER_CMD(1, 100), EVT_HELPER_OP(type_mask),
322+
#define START_ALL(type_mask) \
323+
EVT_HELPER_CMD(1, 101), EVT_HELPER_OP(type_mask),
324+
#define STOP_OTHER(type_mask) \
325+
EVT_HELPER_CMD(1, 102), EVT_HELPER_OP(type_mask),
326+
#define START_OTHER(type_mask) \
327+
EVT_HELPER_CMD(1, 103), EVT_HELPER_OP(type_mask),
328+
#define STOP_ID(evt_id) \
329+
EVT_HELPER_CMD(1, 104), EVT_HELPER_OP(evt_id),
330+
#define START_ID(evt_id) \
331+
EVT_HELPER_CMD(1, 105), EVT_HELPER_OP(evt_id),
332+
#define CHK_EVT(evt_id) \
333+
EVT_HELPER_CMD(1, 106), EVT_HELPER_OP(evt_id),
334+
335+
#define INLINE_EVT() \
336+
EVT_HELPER_CMD(0, 107),
337+
#define INLINE_EVT_ID(out_id) \
338+
EVT_HELPER_CMD(1, 108), EVT_HELPER_OP(out_id),
339+
#define END_INLINE() \
340+
EVT_HELPER_CMD(0, 109),
341+
342+
#define BROTHER_EVT() \
343+
EVT_HELPER_CMD(0, 110),
344+
#define BROTHER_EVT_ID(out_id) \
345+
EVT_HELPER_CMD(1, 111), EVT_HELPER_OP(out_id),
346+
#define END_BROTHER() \
347+
EVT_HELPER_CMD(0, 112),
348+
349+
#define DEBUG_PUT_MSG(msg) \
350+
EVT_HELPER_CMD(1, 113), EVT_HELPER_OP(msg)
351+
#define DEBUG_MSG_CLEAR(msg) \
352+
EVT_HELPER_CMD(0, 114),
353+
#define DEBUG_PUT_REG(reg) \
354+
EVT_HELPER_CMD(0, 115), EVT_HELPER_OP(reg),
355+
#define DEBUG_NAME(name) \
356+
EVT_HELPER_CMD(1, 116), EVT_HELPER_OP(name),
357+
#define DEBUG_REM(text) \
358+
EVT_HELPER_CMD(1, 117), EVT_HELPER_OP(text),
359+
#define DEBUG_BP(text) \
360+
EVT_HELPER_CMD(0, 118),

0 commit comments

Comments
 (0)