247 lines
9.8 KiB
PHP
247 lines
9.8 KiB
PHP
|
|
||
|
; Macroinstructions for defining data structures
|
||
|
|
||
|
macro struct name
|
||
|
{ virtual at 0
|
||
|
fields@struct equ name
|
||
|
match child parent, name \{ fields@struct equ child,fields@\#parent \}
|
||
|
sub@struct equ
|
||
|
struc db [val] \{ \common define field@struct .,db,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc dw [val] \{ \common define field@struct .,dw,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc du [val] \{ \common define field@struct .,du,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc dd [val] \{ \common define field@struct .,dd,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc dp [val] \{ \common define field@struct .,dp,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc dq [val] \{ \common define field@struct .,dq,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc dt [val] \{ \common define field@struct .,dt,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc rb count \{ define field@struct .,db,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc rw count \{ define field@struct .,dw,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc rd count \{ define field@struct .,dd,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc rp count \{ define field@struct .,dp,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc rq count \{ define field@struct .,dq,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
struc rt count \{ define field@struct .,dt,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro db [val] \{ \common \local anonymous
|
||
|
define field@struct anonymous,db,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro dw [val] \{ \common \local anonymous
|
||
|
define field@struct anonymous,dw,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro du [val] \{ \common \local anonymous
|
||
|
define field@struct anonymous,du,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro dd [val] \{ \common \local anonymous
|
||
|
define field@struct anonymous,dd,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro dp [val] \{ \common \local anonymous
|
||
|
define field@struct anonymous,dp,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro dq [val] \{ \common \local anonymous
|
||
|
define field@struct anonymous,dq,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro dt [val] \{ \common \local anonymous
|
||
|
define field@struct anonymous,dt,<val>
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro rb count \{ \local anonymous
|
||
|
define field@struct anonymous,db,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro rw count \{ \local anonymous
|
||
|
define field@struct anonymous,dw,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro rd count \{ \local anonymous
|
||
|
define field@struct anonymous,dd,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro rp count \{ \local anonymous
|
||
|
define field@struct anonymous,dp,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro rq count \{ \local anonymous
|
||
|
define field@struct anonymous,dq,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro rt count \{ \local anonymous
|
||
|
define field@struct anonymous,dt,count dup (?)
|
||
|
fields@struct equ fields@struct,field@struct \}
|
||
|
macro union \{ fields@struct equ fields@struct,,union,<
|
||
|
sub@struct equ union \}
|
||
|
macro struct \{ fields@struct equ fields@struct,,substruct,<
|
||
|
sub@struct equ substruct \} }
|
||
|
|
||
|
macro ends
|
||
|
{ match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
|
||
|
restruc rb,rw,rd,rp,rq,rt
|
||
|
purge db,dw,du,dd,dp,dq,dt
|
||
|
purge rb,rw,rd,rp,rq,rt
|
||
|
purge union,struct
|
||
|
match name tail,fields@struct, \\{ if $
|
||
|
display 'Error: definition of ',\\`name,' contains illegal instructions.',0Dh,0Ah
|
||
|
err
|
||
|
end if \\}
|
||
|
match name=,fields,fields@struct \\{ fields@struct equ
|
||
|
make@struct name,fields
|
||
|
define fields@\\#name fields \\}
|
||
|
end virtual \}
|
||
|
match any, sub@struct \{ fields@struct equ fields@struct> \}
|
||
|
restore sub@struct }
|
||
|
|
||
|
; @dont_give_a_doxygen
|
||
|
macro make@struct name,[field,type,def]
|
||
|
{ common
|
||
|
local define
|
||
|
define equ name
|
||
|
forward
|
||
|
local sub
|
||
|
match , field \{ make@substruct type,name,sub def
|
||
|
define equ define,.,sub, \}
|
||
|
match any, field \{ define equ define,.#field,type,<def> \}
|
||
|
common
|
||
|
match fields, define \{ define@struct fields \} }
|
||
|
|
||
|
; @dont_give_a_doxygen
|
||
|
macro define@struct name,[field,type,def]
|
||
|
{ common
|
||
|
virtual
|
||
|
db `name
|
||
|
load initial@struct byte from 0
|
||
|
if initial@struct = '.'
|
||
|
display 'Error: name of structure should not begin with a dot.',0Dh,0Ah
|
||
|
err
|
||
|
end if
|
||
|
end virtual
|
||
|
local list
|
||
|
list equ
|
||
|
forward
|
||
|
if ~ field eq .
|
||
|
name#field type def
|
||
|
sizeof.#name#field = $ - name#field
|
||
|
else
|
||
|
label name#.#type
|
||
|
rb sizeof.#type
|
||
|
end if
|
||
|
local value
|
||
|
match any, list \{ list equ list, \}
|
||
|
list equ list <value>
|
||
|
common
|
||
|
sizeof.#name = $
|
||
|
restruc name
|
||
|
match values, list \{
|
||
|
struc name value \\{ \\local \\..base
|
||
|
match any, fields@struct \\\{ fields@struct equ fields@struct,.,name,<values> \\\}
|
||
|
match , fields@struct \\\{ label \\..base
|
||
|
forward
|
||
|
match , value \\\\{ field type def \\\\}
|
||
|
match any, value \\\\{ field type value
|
||
|
if ~ field eq .
|
||
|
rb sizeof.#name#field - ($-field)
|
||
|
end if \\\\}
|
||
|
common label . at \\..base \\\}
|
||
|
\\}
|
||
|
macro name value \\{
|
||
|
match any, fields@struct \\\{ \\\local anonymous
|
||
|
fields@struct equ fields@struct,anonymous,name,<values> \\\}
|
||
|
match , fields@struct \\\{
|
||
|
forward
|
||
|
match , value \\\\{ type def \\\\}
|
||
|
match any, value \\\\{ \\\\local ..field
|
||
|
..field = $
|
||
|
type value
|
||
|
if ~ field eq .
|
||
|
rb sizeof.#name#field - ($-..field)
|
||
|
end if \\\\}
|
||
|
common \\\} \\} \} }
|
||
|
|
||
|
; @dont_give_a_doxygen
|
||
|
macro enable@substruct
|
||
|
{ macro make@substruct substruct,parent,name,[field,type,def]
|
||
|
\{ \common
|
||
|
\local define
|
||
|
define equ parent,name
|
||
|
\forward
|
||
|
\local sub
|
||
|
match , field \\{ match any, type \\\{ enable@substruct
|
||
|
make@substruct type,parent,sub def
|
||
|
purge make@substruct
|
||
|
define equ define,.,sub, \\\} \\}
|
||
|
match any, field \\{ define equ define,.\#field,type,<def> \\}
|
||
|
\common
|
||
|
match fields, define \\{ define@\#substruct fields \\} \} }
|
||
|
|
||
|
; @dont_give_a_doxygen
|
||
|
enable@substruct
|
||
|
|
||
|
; @dont_give_a_doxygen
|
||
|
macro define@union parent,name,[field,type,def]
|
||
|
{ common
|
||
|
virtual at parent#.#name
|
||
|
forward
|
||
|
if ~ field eq .
|
||
|
virtual at parent#.#name
|
||
|
parent#field type def
|
||
|
sizeof.#parent#field = $ - parent#field
|
||
|
end virtual
|
||
|
if sizeof.#parent#field > $ - parent#.#name
|
||
|
rb sizeof.#parent#field - ($ - parent#.#name)
|
||
|
end if
|
||
|
else
|
||
|
virtual at parent#.#name
|
||
|
label parent#.#type
|
||
|
type def
|
||
|
end virtual
|
||
|
label name#.#type at parent#.#name
|
||
|
if sizeof.#type > $ - parent#.#name
|
||
|
rb sizeof.#type - ($ - parent#.#name)
|
||
|
end if
|
||
|
end if
|
||
|
common
|
||
|
sizeof.#name = $ - parent#.#name
|
||
|
end virtual
|
||
|
struc name [value] \{ \common
|
||
|
label .\#name
|
||
|
last@union equ
|
||
|
forward
|
||
|
match any, last@union \\{ virtual at .\#name
|
||
|
field type def
|
||
|
end virtual \\}
|
||
|
match , last@union \\{ match , value \\\{ field type def \\\}
|
||
|
match any, value \\\{ field type value \\\} \\}
|
||
|
last@union equ field
|
||
|
common rb sizeof.#name - ($ - .\#name) \}
|
||
|
macro name [value] \{ \common \local ..anonymous
|
||
|
..anonymous name value \} }
|
||
|
|
||
|
; @dont_give_a_doxygen
|
||
|
macro define@substruct parent,name,[field,type,def]
|
||
|
{ common
|
||
|
virtual at parent#.#name
|
||
|
forward
|
||
|
if ~ field eq .
|
||
|
parent#field type def
|
||
|
sizeof.#parent#field = $ - parent#field
|
||
|
else
|
||
|
label parent#.#type
|
||
|
rb sizeof.#type
|
||
|
end if
|
||
|
common
|
||
|
sizeof.#name = $ - parent#.#name
|
||
|
end virtual
|
||
|
struc name value \{
|
||
|
label .\#name
|
||
|
forward
|
||
|
match , value \\{ field type def \\}
|
||
|
match any, value \\{ field type value
|
||
|
if ~ field eq .
|
||
|
rb sizeof.#parent#field - ($-field)
|
||
|
end if \\}
|
||
|
common \}
|
||
|
macro name value \{ \local ..anonymous
|
||
|
..anonymous name \} }
|