2 ; Macroinstructions for defining data structures
7 match child parent, name \{ fields@struct equ child,fields@\#parent \}
9 struc db [val] \{ \common define field@struct .,db,<val>
10 fields@struct equ fields@struct,field@struct \}
11 struc dw [val] \{ \common define field@struct .,dw,<val>
12 fields@struct equ fields@struct,field@struct \}
13 struc du [val] \{ \common define field@struct .,du,<val>
14 fields@struct equ fields@struct,field@struct \}
15 struc dd [val] \{ \common define field@struct .,dd,<val>
16 fields@struct equ fields@struct,field@struct \}
17 struc dp [val] \{ \common define field@struct .,dp,<val>
18 fields@struct equ fields@struct,field@struct \}
19 struc dq [val] \{ \common define field@struct .,dq,<val>
20 fields@struct equ fields@struct,field@struct \}
21 struc dt [val] \{ \common define field@struct .,dt,<val>
22 fields@struct equ fields@struct,field@struct \}
23 struc rb count \{ define field@struct .,db,count dup (?)
24 fields@struct equ fields@struct,field@struct \}
25 struc rw count \{ define field@struct .,dw,count dup (?)
26 fields@struct equ fields@struct,field@struct \}
27 struc rd count \{ define field@struct .,dd,count dup (?)
28 fields@struct equ fields@struct,field@struct \}
29 struc rp count \{ define field@struct .,dp,count dup (?)
30 fields@struct equ fields@struct,field@struct \}
31 struc rq count \{ define field@struct .,dq,count dup (?)
32 fields@struct equ fields@struct,field@struct \}
33 struc rt count \{ define field@struct .,dt,count dup (?)
34 fields@struct equ fields@struct,field@struct \}
35 macro db [val] \{ \common \local anonymous
36 define field@struct anonymous,db,<val>
37 fields@struct equ fields@struct,field@struct \}
38 macro dw [val] \{ \common \local anonymous
39 define field@struct anonymous,dw,<val>
40 fields@struct equ fields@struct,field@struct \}
41 macro du [val] \{ \common \local anonymous
42 define field@struct anonymous,du,<val>
43 fields@struct equ fields@struct,field@struct \}
44 macro dd [val] \{ \common \local anonymous
45 define field@struct anonymous,dd,<val>
46 fields@struct equ fields@struct,field@struct \}
47 macro dp [val] \{ \common \local anonymous
48 define field@struct anonymous,dp,<val>
49 fields@struct equ fields@struct,field@struct \}
50 macro dq [val] \{ \common \local anonymous
51 define field@struct anonymous,dq,<val>
52 fields@struct equ fields@struct,field@struct \}
53 macro dt [val] \{ \common \local anonymous
54 define field@struct anonymous,dt,<val>
55 fields@struct equ fields@struct,field@struct \}
56 macro rb count \{ \local anonymous
57 define field@struct anonymous,db,count dup (?)
58 fields@struct equ fields@struct,field@struct \}
59 macro rw count \{ \local anonymous
60 define field@struct anonymous,dw,count dup (?)
61 fields@struct equ fields@struct,field@struct \}
62 macro rd count \{ \local anonymous
63 define field@struct anonymous,dd,count dup (?)
64 fields@struct equ fields@struct,field@struct \}
65 macro rp count \{ \local anonymous
66 define field@struct anonymous,dp,count dup (?)
67 fields@struct equ fields@struct,field@struct \}
68 macro rq count \{ \local anonymous
69 define field@struct anonymous,dq,count dup (?)
70 fields@struct equ fields@struct,field@struct \}
71 macro rt count \{ \local anonymous
72 define field@struct anonymous,dt,count dup (?)
73 fields@struct equ fields@struct,field@struct \}
74 macro union \{ fields@struct equ fields@struct,,union,<
75 sub@struct equ union \}
76 macro struct \{ fields@struct equ fields@struct,,substruct,<
77 sub@struct equ substruct \} }
80 { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
81 restruc rb,rw,rd,rp,rq,rt
82 purge db,dw,du,dd,dp,dq,dt
83 purge rb,rw,rd,rp,rq,rt
85 match name tail,fields@struct, \\{ if $
86 display 'Error: definition of ',\\`name,' contains illegal instructions.',0Dh,0Ah
89 match name=,fields,fields@struct \\{ fields@struct equ
90 make@struct name,fields
91 define fields@\\#name fields \\}
93 match any, sub@struct \{ fields@struct equ fields@struct> \}
96 macro make@struct name,[field,type,def]
102 match , field \{ make@substruct type,name,sub def
103 define equ define,.,sub, \}
104 match any, field \{ define equ define,.#field,type,<def> \}
106 match fields, define \{ define@struct fields \} }
108 macro define@struct name,[field,type,def]
112 load initial@struct byte from 0
113 if initial@struct = '.'
114 display 'Error: name of structure should not begin with a dot.',0Dh,0Ah
123 sizeof.#name#field = $ - name#field
129 match any, list \{ list equ list, \}
130 list equ list <value>
134 match values, list \{
135 struc name value \\{ \\local \\..base
136 match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
137 match , fields@struct \\\{ label \\..base
139 match , value \\\\{ field type def \\\\}
140 match any, value \\\\{ field type value
142 rb sizeof.#name#field - ($-field)
144 common label . at \\..base \\\}
147 match any, fields@struct \\\{ \\\local anonymous
148 fields@struct equ fields@struct,anonymous,name,<values> \\\}
149 match , fields@struct \\\{
151 match , value \\\\{ type def \\\\}
152 match any, value \\\\{ \\\\local ..field
156 rb sizeof.#name#field - ($-..field)
160 macro enable@substruct
161 { macro make@substruct substruct,parent,name,[field,type,def]
164 define equ parent,name
167 match , field \\{ match any, type \\\{ enable@substruct
168 make@substruct type,parent,sub def
170 define equ define,.,sub, \\\} \\}
171 match any, field \\{ define equ define,.\#field,type,<def> \\}
173 match fields, define \\{ define@\#substruct fields \\} \} }
177 macro define@union parent,name,[field,type,def]
179 virtual at parent#.#name
182 virtual at parent#.#name
183 parent#field type def
184 sizeof.#parent#field = $ - parent#field
186 if sizeof.#parent#field > $ - parent#.#name
187 rb sizeof.#parent#field - ($ - parent#.#name)
190 virtual at parent#.#name
194 label name#.#type at parent#.#name
195 if sizeof.#type > $ - parent#.#name
196 rb sizeof.#type - ($ - parent#.#name)
200 sizeof.#name = $ - parent#.#name
202 struc name [value] \{ \common
206 match any, last@union \\{ virtual at .\#name
209 match , last@union \\{ match , value \\\{ field type def \\\}
210 match any, value \\\{ field type value \\\} \\}
212 common rb sizeof.#name - ($ - .\#name) \}
213 macro name [value] \{ \common \local ..anonymous
214 ..anonymous name value \} }
216 macro define@substruct parent,name,[field,type,def]
218 virtual at parent#.#name
221 parent#field type def
222 sizeof.#parent#field = $ - parent#field
228 sizeof.#name = $ - parent#.#name
233 match , value \\{ field type def \\}
234 match any, value \\{ field type value
236 rb sizeof.#parent#field - ($-field)
239 macro name value \{ \local ..anonymous
240 ..anonymous name \} }