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