Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/macros/asserts.asm
1270 views
1
; Macros to verify assumptions about the data or code
2
3
MACRO _redef_current_label
4
IF DEF(\1)
5
PURGE \1
6
ENDC
7
IF _NARG == 3 + (\3)
8
DEF \1 EQUS "\<_NARG>"
9
ELIF DEF(..)
10
IF .. - @ == 0
11
DEF \1 EQUS "{..}"
12
ENDC
13
ELIF DEF(.)
14
if . - @ == 0
15
DEF \1 EQUS "{.}"
16
ENDC
17
ENDC
18
if !DEF(\1)
19
DEF \1 EQUS \2
20
{\1}:
21
ENDC
22
ENDM
23
24
MACRO table_width
25
DEF CURRENT_TABLE_WIDTH = \1
26
_redef_current_label CURRENT_TABLE_START, "._table_width\@", 2, \#
27
ENDM
28
29
MACRO assert_table_length
30
DEF w = \1
31
DEF x = w * CURRENT_TABLE_WIDTH
32
DEF y = @ - {CURRENT_TABLE_START}
33
ASSERT x == y, "{CURRENT_TABLE_START}: expected {d:w} entries, each {d:CURRENT_TABLE_WIDTH} " ++ \
34
"bytes, for {d:x} total; but got {d:y} bytes"
35
ENDM
36
37
MACRO assert_max_table_length
38
DEF w = \1
39
DEF x = w * CURRENT_TABLE_WIDTH
40
DEF y = @ - {CURRENT_TABLE_START}
41
ASSERT x >= y, "{CURRENT_TABLE_START}: expected a maximum of {d:w} entries, each " ++ \
42
"{d:CURRENT_TABLE_WIDTH} bytes, for maximum {d:x} total; but got {d:y} bytes"
43
ENDM
44
45
MACRO list_start
46
DEF list_index = 0
47
_redef_current_label CURRENT_LIST_START, "._list_start\@", 1, \#
48
ENDM
49
50
MACRO li
51
ASSERT STRFIND(\1, "@") == -1, "String terminator \"@\" in list entry: \1"
52
db \1, "@"
53
DEF list_index += 1
54
ENDM
55
56
MACRO assert_list_length
57
DEF x = \1
58
ASSERT x == list_index, \
59
"{CURRENT_LIST_START}: expected {d:x} entries, got {d:list_index}"
60
ENDM
61
62
MACRO nybble_array
63
DEF CURRENT_NYBBLE_ARRAY_VALUE = 0
64
DEF CURRENT_NYBBLE_ARRAY_LENGTH = 0
65
IF _NARG == 1
66
REDEF CURRENT_NYBBLE_ARRAY_START EQUS "\1"
67
ELSE
68
REDEF CURRENT_NYBBLE_ARRAY_START EQUS "._nybble_array\@"
69
{CURRENT_NYBBLE_ARRAY_START}:
70
ENDC
71
ENDM
72
73
MACRO nybble
74
ASSERT 0 <= (\1) && (\1) < $10, "nybbles must be 0-15"
75
DEF CURRENT_NYBBLE_ARRAY_VALUE = (\1) | (CURRENT_NYBBLE_ARRAY_VALUE << 4)
76
DEF CURRENT_NYBBLE_ARRAY_LENGTH += 1
77
IF CURRENT_NYBBLE_ARRAY_LENGTH % 2 == 0
78
db CURRENT_NYBBLE_ARRAY_VALUE
79
DEF CURRENT_NYBBLE_ARRAY_VALUE = 0
80
ENDC
81
ENDM
82
83
MACRO end_nybble_array
84
IF CURRENT_NYBBLE_ARRAY_LENGTH % 2
85
db CURRENT_NYBBLE_ARRAY_VALUE << 4
86
ENDC
87
IF _NARG == 1
88
DEF x = \1
89
ASSERT x == CURRENT_NYBBLE_ARRAY_LENGTH, \
90
"{CURRENT_NYBBLE_ARRAY_START}: expected {d:x} nybbles, got {d:CURRENT_NYBBLE_ARRAY_LENGTH}"
91
DEF x = (x + 1) / 2
92
ASSERT x == @ - {CURRENT_NYBBLE_ARRAY_START}, \
93
"{CURRENT_NYBBLE_ARRAY_START}: expected {d:x} bytes"
94
ENDC
95
ENDM
96
97
MACRO bit_array
98
DEF CURRENT_BIT_ARRAY_VALUE = 0
99
DEF CURRENT_BIT_ARRAY_LENGTH = 0
100
IF _NARG == 1
101
REDEF CURRENT_BIT_ARRAY_START EQUS "\1"
102
ELSE
103
REDEF CURRENT_BIT_ARRAY_START EQUS "._bit_array\@"
104
{CURRENT_BIT_ARRAY_START}:
105
ENDC
106
ENDM
107
108
MACRO dbit
109
ASSERT (\1) == 0 || (\1) == 1, "bits must be 0 or 1"
110
DEF CURRENT_BIT_ARRAY_VALUE |= (\1) << (CURRENT_BIT_ARRAY_LENGTH % 8)
111
DEF CURRENT_BIT_ARRAY_LENGTH += 1
112
IF CURRENT_BIT_ARRAY_LENGTH % 8 == 0
113
db CURRENT_BIT_ARRAY_VALUE
114
DEF CURRENT_BIT_ARRAY_VALUE = 0
115
ENDC
116
ENDM
117
118
MACRO end_bit_array
119
IF CURRENT_BIT_ARRAY_LENGTH % 8
120
db CURRENT_BIT_ARRAY_VALUE
121
ENDC
122
IF _NARG == 1
123
DEF x = \1
124
ASSERT x == CURRENT_BIT_ARRAY_LENGTH, \
125
"{CURRENT_BIT_ARRAY_START}: expected {d:x} bits, got {d:CURRENT_BIT_ARRAY_LENGTH}"
126
DEF x = (x + 7) / 8
127
ASSERT x == @ - {CURRENT_BIT_ARRAY_START}, \
128
"{CURRENT_BIT_ARRAY_START}: expected {d:x} bytes"
129
ENDC
130
ENDM
131
132
MACRO def_grass_wildmons
133
;\1: encounter rate
134
DEF CURRENT_GRASS_WILDMONS_RATE = \1
135
REDEF CURRENT_GRASS_WILDMONS_LABEL EQUS "._def_grass_wildmons_\1"
136
{CURRENT_GRASS_WILDMONS_LABEL}:
137
db \1
138
ENDM
139
140
MACRO end_grass_wildmons
141
DEF x = @ - {CURRENT_GRASS_WILDMONS_LABEL}
142
IF CURRENT_GRASS_WILDMONS_RATE == 0
143
ASSERT 1 == x, \
144
"def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected 1 byte, got {d:x}"
145
ELSE
146
ASSERT WILDDATA_LENGTH == x, \
147
"def_grass_wildmons {d:CURRENT_GRASS_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes, got {d:x}"
148
ENDC
149
ENDM
150
151
MACRO def_water_wildmons
152
;\1: encounter rate
153
DEF CURRENT_WATER_WILDMONS_RATE = \1
154
REDEF CURRENT_WATER_WILDMONS_LABEL EQUS "._def_water_wildmons_\1"
155
{CURRENT_WATER_WILDMONS_LABEL}:
156
db \1
157
ENDM
158
159
MACRO end_water_wildmons
160
DEF x = @ - {CURRENT_WATER_WILDMONS_LABEL}
161
IF CURRENT_WATER_WILDMONS_RATE == 0
162
ASSERT 1 == x, \
163
"def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected 1 byte, got {d:x}"
164
ELSE
165
ASSERT WILDDATA_LENGTH == x, \
166
"def_water_wildmons {d:CURRENT_WATER_WILDMONS_RATE}: expected {d:WILDDATA_LENGTH} bytes, got {d:x}"
167
ENDC
168
ENDM
169
170