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