1
1
2
2
; MIT License
3
3
;
4
- ; Copyright (c) 2018 Eldred Habert
4
+ ; Copyright (c) 2018-2019 Eldred Habert
5
5
; Originally hosted at https://github.com/ISSOtm/rgbds-structs
6
6
;
7
7
; Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -60,7 +60,9 @@ field_name_from_id: MACRO
60
60
FIELD_ID_STR equs "{\1}"
61
61
STRUCT_FIELD equs STRC AT ( "{STRUCT_NAME}_field" , STRSUB( "{FIELD_ID_STR}" , 2 , STRLEN( "{FIELD_ID_STR}" ) - 1 ))
62
62
STRUCT_FIELD_NAME equs "{STRUCT_FIELD}_name"
63
- STRUCT_FIELD_SIZE equs "{STRUCT_FIELD}_size"
63
+ STRUCT_FIELD_TYPE equs "{STRUCT_FIELD}_type"
64
+ STRUCT_FIELD_NBEL equs "{STRUCT_FIELD}_nb_el" ; Number of elements
65
+ STRUCT_FIELD_SIZE equs "{STRUCT_FIELD}_size" ; sizeof(type) * nb_el
64
66
ENDM
65
67
66
68
@@ -77,7 +79,7 @@ STRUCT_FIELD_NAME equs "\"\3\""
77
79
PURGE STRUCT_FIELD_NAME
78
80
79
81
; Set field offset
80
- STRUCT_FIELD \ 2 \ 1
82
+ STRUCT_FIELD \ 2 (\ 1 )
81
83
; Alias this in a human-comprehensive manner
82
84
STRUCT_FIELD_NAME equs "{STRUCT_NAME}_\3"
83
85
STRUCT_FIELD_NAME = STRUCT_FIELD
@@ -86,9 +88,15 @@ STRUCT_FIELD_NAME = STRUCT_FIELD
86
88
CURRENT_RS RB 0
87
89
STRUCT_FIELD_SIZE = CURRENT_RS - STRUCT_FIELD
88
90
91
+ ; Set properties
92
+ STRUCT_FIELD_NBEL = \ 1
93
+ STRUCT_FIELD_TYPE equs STRSUB( "\2" , 2 , 1 )
94
+
89
95
PURGE FIELD_ID_STR
90
96
PURGE STRUCT_FIELD
91
97
PURGE STRUCT_FIELD_NAME
98
+ PURGE STRUCT_FIELD_TYPE
99
+ PURGE STRUCT_FIELD_NBEL
92
100
PURGE STRUCT_FIELD_SIZE
93
101
PURGE CURRENT_RS
94
102
@@ -114,29 +122,54 @@ longs: MACRO
114
122
ENDM
115
123
116
124
117
- ; dstruct struct_type, var_name
118
- ; Allocates space for a struct in memory (primarily RAM)
125
+ ; dstruct struct_type, var_name[, ...]
126
+ ; Allocates space for a struct in memory
127
+ ; If no further arguments are supplied, the space is simply allocated (using `ds`)
128
+ ; Otherwise, the data is written to memory using the appropriate types
129
+ ; For example, a struct defined with `bytes 1, Field1` and `words 3, Field2` would have four extra arguments, one byte then three words.
119
130
dstruct: MACRO
120
131
NB_FIELDS equs "\1_nb_fields"
121
132
IF !DEF(NB_FIELDS)
122
133
FAIL "Struct \1 isn' t defined!"
123
134
ENDC
124
135
STRUCT_NAME equs "\1" ; Target this struct for `field_name_from_id`
136
+ VAR_NAME equs "\2"
125
137
126
- \ 2 :: ; Declare the struct's root
138
+ VAR_NAME :: ; Declare the struct's root
127
139
128
140
FIELD_ID = 0
129
141
REPT NB_FIELDS
130
142
131
143
field_name_from_id FIELD_ID
132
- FIELD_NAME equs STRC AT ( "\2_ " , STRUCT_FIELD_NAME)
144
+ FIELD_NAME equs STRC AT ( "{VAR_NAME}_ " , STRUCT_FIELD_NAME)
133
145
FIELD_NAME::
134
- ds STRUCT_FIELD_SIZE
146
+ IF _NARG == 2 ; RAM definition, no data
147
+ ds STRUCT_FIELD_SIZE
148
+ ELSE
149
+ TMP equs STRC AT ( "\{" , STRC AT ( "{STRUCT_FIELD_TYPE}" , "\}" )) ; Temp var for double deref because "{{STRUCT_FIELD_TYPE}}" is a syntax error
150
+ DATA_TYPE equs STRC AT ( "D" , TMP)
151
+ PURGE TMP
152
+ SHIFT_FIELDS equs ""
153
+ REPT STRUCT_FIELD_NBEL
154
+ DATA_TYPE \ 3
155
+ SHIFT
156
+ ; Stupid hack because RGBDS saves the macro arguments when entering REPT blocks
157
+ TMP equs "{SHIFT_FIELDS}\n\tSHIFT"
158
+ PURGE SHIFT_FIELDS
159
+ SHIFT_FIELDS equs "{TMP}"
160
+ PURGE TMP
161
+ ENDR
162
+ SHIFT_FIELDS
163
+ PURGE SHIFT_FIELDS
164
+ PURGE DATA_TYPE
165
+ ENDC
135
166
136
167
; Clean up vars for next iteration
137
168
PURGE FIELD_ID_STR
138
169
PURGE STRUCT_FIELD
139
170
PURGE STRUCT_FIELD_NAME
171
+ PURGE STRUCT_FIELD_TYPE
172
+ PURGE STRUCT_FIELD_NBEL
140
173
PURGE STRUCT_FIELD_SIZE
141
174
PURGE FIELD_NAME
142
175
@@ -152,5 +185,6 @@ sizeof_\2 = sizeof_\1
152
185
; Clean up
153
186
PURGE NB_FIELDS
154
187
PURGE STRUCT_NAME
188
+ PURGE VAR_NAME
155
189
PURGE FIELD_ID
156
190
ENDM
0 commit comments