("cs" 0x0
 (("size") (1 byte) ("size"))

 (("hd") (1 byte) ("hd"))
 (("hs") (1 byte) ("hs"))
 (("un") (1 byte) ("un"))
 (("us") (1 byte) ("us"))

 (("sc") (1 byte) ("sc"))
 (("ss") (1 byte) ("ss"))
 (("er") (1 byte) ("er"))
 (("ed") (1 byte) ("ed"))

 (("sh") (1 byte) ("sh"))
 (("ob") (1 byte) ("ob"))
 (("rl") (1 byte) ("rl"))
 (("du") (1 byte) ("du"))

 (("dps") (1 byte) ("dps"))
 (("dsy") (1 byte) ("dsy"))
 (("dty") (1 byte) ("dty"))
 (("dln") (1 byte) ("dln"))

 (("dso") (1 byte) ("dso"))
 (("dus") (1 byte) ("dus"))
 (("dss") (1 byte) ("dss"))
 (("dbt") (1 byte) ("dbt"))

 (("dpp") (1 byte) ("dpp"))
 (("dfp") (1 byte) ("dfp"))
 (("den") (1 byte) ("den"))
 (("dds") (1 byte) ("dds"))

 (("dar") (1 byte) ("dar"))
 (("dpt") (1 byte) ("dpt"))
 (("dul") (1 byte) ("dul"))
 (("dse") (1 byte) ("dse"))

 (("dot") (1 byte) ("dot")))


("hd" 0x04
 (("module type") (4 bits) ("mt")
  (("MTYPE_ABS_LM" 	"0")
   ("MTYPE_REL_LM" 	"1")
   ("MTYPE_OMS_OR_LMS" 	"2")
   ("MTYPE_UNSPEC" 	"0xf")))
 (("spare")(4 bits) ("spare1"))
 (("creation date")( chars 12 bytes)( "cd"))
 (("number of units") (2 bytes) ("nu"))
 (("code") (1 byte) ("code"))
 (("version") (chars 4 bytes) ("ver"))
 (("address update") (1 byte) ("au"))
 (("segment identifier") (1 bit) ("si"))
 (("address field length") (4 bits) ("afl"))
 (("spare")(3 bits) ("spare2"))
 (("space size within segment") (1 byte) ("spcsz"))
 (("segment size")  	(1 byte) ("segsz"))
 (("segment shift") 	(1 byte) ("segsh"))
 (("entry point") 	(1 byte) ("ep"))
 (cond "ptr->ep"
       (cond "ptr->mt != MTYPE_ABS_LM"
	     (("unit appearance number") (2 bytes) ("uan"))
	     (("section appearance number") (2 bytes) ("sa")))
       (cond "segmented_p"
	     (("segment address") (segsize bytes) ("sad")))
       (("address") (addrsize bytes) ("address")))
 (("os name") (chars variable bytes) ("os"))
 (("sys name") (chars variable bytes) ("sys"))
 (("module name") (chars variable bytes) ("mn"))
 (("cpu") (chars variable bytes) ("cpu")))


("hs" 0x05
 (("neg number") (2 bytes) ("neg")))


("un" 0x06
 (("format") (2 bits) ("format")
  (("FORMAT_LM" "0")
   ("FORMAT_OM" "1")
   ("FORMAT_OMS_OR_LMS" "2")))
 (("spare") (6 bits) ("spare1"))
 (("number of sections") (2 bytes) ("nsections"))
 (("number of external refs") (2 bytes) ("nextrefs"))
 (("number of external defs") (2 bytes) ("nextdefs"))
 (("unit name") (chars variable byte) ("name"))
 (("tool name") (chars variable byte) ("tool"))
 (("creation date") (chars 12 bytes) ("tcd"))
 (("linker name") (chars variable byte) ("linker"))
 (("creation date") (chars 12 bytes) ("lcd")))


("us" 0x07
 (("negotiation number") (2 bytes) ("neg")))


("sc" 0x08
 (("format") (2 bits) ("format"))
 (("spare") (6 bits) ("spare"))
 (("segment address") (segsize bytes) ("segadd"))
 (("address") (addrsize bytes) ("addr"))
 (("length") (addrsize bytes) ("length"))
 (("alignment") (addrsize bytes) ("align"))
 (("contents") (4 bits) ("contents")
  (("CONTENTS_CODE" "0")
   ("CONTENTS_DATA" "1")
   ("CONTENTS_STACK" "2")
   ("CONTENTS_DUMMY" "3")
   ("CONTENTS_SPECIAL" "4")
   ("CONTENTS_NONSPEC" "0xf")))
 (("concat") (4 bits) ("concat")
  (("CONCAT_SIMPLE" "0")
   ("CONCAT_SHAREDC" "1")
   ("CONCAT_DUMMY" "2")
   ("CONCAT_GROUP" "3")
   ("CONCAT_SHARED" "4")
   ("CONCAT_PRIVATE" "5")
   ("CONCAT_UNSPEC" "0xf")))
 (("read") (2 bits) ("read"))
 (("write") (2 bits) ("write"))
 (("exec") (2 bits) ("exec"))
 (("initialized") (2 bits) ("init"))
 (("mode") (2 bits) ("mode"))
 (("spare") (6 bits) ("spare1"))
 (("name") (chars variable byte) ("name")))


("ss" 0x09
 (("neg number") (2 bytes) ("neg")))


("er" 0x0c
 (("symbol type") (2 bits) ("type")
  (("ER_ENTRY" "0")
   ("ER_DATA" "1")
   ("ER_NOTDEF" "2")
   ("ER_NOTSPEC" "3")))
 (("spare") (6 bits) ("spare"))
 (("symbol name") (chars variable byte) ("name")))


("ed" 0x14
 (("section appearance number") (2 bytes) ("section"))
 (("symbol type") (3 bits) ("type")
  (("ED_TYPE_ENTRY" "0")
   ("ED_TYPE_DATA" "1")
   ("ED_TYPE_CONST" "2")
   ("ED_TYPE_NOTSPEC" "7")))
 (("spare") (5 bits) ("spare"))
 (cond "ptr->type==ED_TYPE_ENTRY || ptr->type==ED_TYPE_DATA"
       (("symbol address") (addrsize bytes) ("address")))
 (cond "ptr->type==ED_TYPE_CONST"
       (("constant value") (addrsize bytes) ("constant")))
 (("symbol name") (chars variable byte) ("name")))


("sh" 0x1a
 (("unit appearance number") (2 bytes) ("unit"))
 (("section appearance number") (2 bytes) ("section")))


("ob" 0x1c
 (("starting address flag") (1 bit) ("saf"))
 (("compression flag") (1 bit) ("cpf"))
 (("spare") (6 bits) ("spare"))
 (cond "ptr->saf"
       ( ("starting address") (addrsize bytes) ("address")))
 (cond "ptr->cpf"
       (("comp reps") (addrsize bytes) ("compreps")))
 (("data") (barray counted byte) ("data")))


("rl" 0x20
 (("boundary of relocatable area") (4 bits) ("boundary"))
 (("address polarity") (1 bit) ("apol"))
 (("segment number") (1 bit) ("segment"))
 (("sign of relocation") (1 bit) ("sign"))
 (("check range") (1 bit) ("check"))
 (("reloc address") (addrsize bytes) ("addr"))

 (("bit loc") (1 byte) ("bitloc"))
 (("field length") (1 byte) ("flen"))
 (("bcount") (1 byte) ("bcount"))
 (("operator") (1 byte) ("op")
  (("OP_RELOC_ADDR" "1")
   ("OP_SEC_REF" "0")
   ("OP_EXT_REF" "2")))
 (cond "ptr->op == OP_EXT_REF"
       (("symbol number") (2 bytes) ("symn"))	)

 (cond "ptr->op == OP_SEC_REF"
       (("section number") (2 bytes) ("secn"))
       (("const opcode") (1 byte) ("copcode_is_3"))
       (("addend length") (1 byte) ("alength_is_4"))
       (("addend") (4 byte) ("addend"))
       (("plus opcode") (1 byte) ("aopcode_is_0x20")))

 (cond "ptr->op == OP_RELOC_ADDR"
       (("dunno") (2 bytes) ("dunno")))

 (("end")  (1 byte) ("end")))


("du" 0x30
 (("format") (2 bits) ("format"))
 (("optimized") (1 bit) ("optimized"))
 (("stackfrmt") (2 bits) ("stackfrmt"))
 (("spare") (3 bits) ("spare"))
 (("unit number") (2 bytes) ("unit"))
 (("sections") (2 bytes) ("sections"))
 (repeat "ptr->sections"
	 (("section appearance number") (2 bytes) ("san"))
	 (("address") (addrsize bytes) ("address"))
	 (("section length") (addrsize bytes) ("length")))
 (("tool name") (chars variable byte) ("tool"))
 (("creation date") (chars 12 bytes) ("date")))


("dsy" 0x34
 (("symbol type") (7 bits) ("type")
  (("STYPE_VAR" "0")
   ("STYPE_LAB" "1")
   ("STYPE_PROC" "2")
   ("STYPE_FUNC" "3")
   ("STYPE_TYPE" "4")
   ("STYPE_CONST" "5")
   ("STYPE_ENTRY" "6")
   ("STYPE_MEMBER" "7")
   ("STYPE_ENUM" "8")
   ("STYPE_TAG" "9")
   ("STYPE_PACKAGE" "10")
   ("STYPE_GENERIC" "11")
   ("STYPE_TASK" "12")
   ("STYPE_EXCEPTION" "13")
   ("STYPE_PARAMETER" "14")
   ("STYPE_EQUATE" "15")
   ("STYPE_UNSPEC" "0x7f")))
 (("assignment info") (1 bit) ("assign"))
 (("symbol id") (2 bytes) ("snumber"))
 (("symbol name") (chars variable bytes) ("sname"))
 (("nesting level") (2 bytes) ("nesting"))
 (cond "ptr->assign"
       (("assignment type") (1 byte)  ("ainfo")
	(("AINFO_REG" "1")
	 ("AINFO_STATIC_EXT_DEF" "2")
	 ("AINFO_STATIC_EXT_REF" "3")
	 ("AINFO_STATIC_INT" "4")
	 ("AINFO_STATIC_COM" "5")
	 ("AINFO_AUTO" "6")
	 ("AINFO_CONST" "7")
	 ("AINFO_UNSPEC" "0xff")))
       (("data length") (addrsize bytes) ("dlength"))
       (cond "ptr->ainfo == AINFO_STATIC_EXT_DEF
            || ptr->ainfo == AINFO_STATIC_INT
            || ptr->ainfo == AINFO_STATIC_COM"
	     (("section number")  (2 bytes) ("section")))
       (cond "ptr->ainfo == AINFO_STATIC_EXT_DEF
            || ptr->ainfo == AINFO_STATIC_INT
            || ptr->ainfo == AINFO_STATIC_COM
            || ptr->ainfo == AINFO_AUTO"
	     (("address") (addrsize bytes) ("address")))
       (cond "ptr->ainfo == AINFO_REG"
	     (("register name") (chars variable bytes) ("reg")))
       (cond "ptr->ainfo == AINFO_STATIC_EXT_DEF
	    || ptr->ainfo == AINFO_STATIC_EXT_REF"
	     (("external name") (chars variable bytes) ("ename")))
       (cond "ptr->ainfo == AINFO_CONST"
	     (("constant") (chars variable bytes) ("constant"))))
 (cond "ptr->type == STYPE_MEMBER"
       (("assignment unit") (1 bit) ("bitunit"))
       (("spare") (7 bits) ("spare2"))
       (("field length") (addrsize bytes) ("field_len"))
       (("field offset") (addrsize bytes) ("field_off"))
       (cond "ptr->bitunit"
	     (("bit offset") (addrsize bytes) ("field_bitoff"))))
 (cond "ptr->type== STYPE_ENUM"
       (("value length") (1 byte) ("evallen"))
       (("value") (4 bytes) ("evalue")))
 (cond "ptr->type == STYPE_CONST"
       (("value") (chars variable bytes) ("cvalue")))
 (cond "ptr->type == STYPE_EQUATE"
       (("value length") (1 byte) ("qvallen"))
       (("value") (4 bytes) ("qvalue"))
       (("basic type") (1 byte) ("btype"))
       (("size information") (addrsize bytes) ("sizeinfo"))
       (("sign") (2 bits) ("sign"))
       (("floating point type") (6 bits) ("flt_type")))
 (("source file number") (2 bytes) ("sfn"))
 (("source line number") (2 bytes) ("sln"))
 (("negotiation number") (2 bytes) ("neg"))
 (cond "ptr->type == STYPE_TAG"
       (("magic") (1 byte) ("magic"))))



("dul" 0x52
 (("max declaration type flag") (1 bit) ("max_variable"))
 (("max spare") (7 bits) ("maxspare"))
 (cond "ptr->max_variable == 0"
       (("maximum") (addrsize bytes) ("max"))
       (("max mode") (chars variable bytes) ("maxmode")))

 (("min declaration type flag") (1 bit) ("min_variable"))
 (("min spare") (7 bits) ("minspare"))
 (cond "ptr->min_variable == 0"
       (("minimum") (addrsize bytes) ("min"))
       (("min mode") (chars variable bytes) ("minmode"))))


("dty" 0x36
 (("end flag") (1 bit) ("end"))
 (("spare") (7 bits) ("spare"))
 (cond "!ptr->end"
       (("negotiation") (2 bytes) ("neg"))))


("dbt" 0x44
 (("basic type") (1 byte) ("btype")
  (("BTYPE_VOID" "0")
   ("BTYPE_UNDEF" "1")
   ("BTYPE_CHAR" "2")
   ("BTYPE_INT" "3")
   ("BTYPE_FLOAT" "4")
   ("BTYPE_BIT" "5")
   ("BTYPE_STRING" "6")
   ("BTYPE_DECIMAL" "7")
   ("BTYPE_ENUM" "8")
   ("BTYPE_STRUCT" "9")
   ("BTYPE_TYPE" "10")
   ("BTYPE_TAG" "11")
   ("BTYPE_UNSPEC" "0xff")))
 (("size info") (addrsize bytes) ("bitsize"))
 (("sign") (2 bits) ("sign")
  (("SIGN_SIGNED" "0")
   ("SIGN_UNSIGNED" "1")
   ("SIGN_UNSPEC" "3")))
 (("floating point type") (6 bits) ("fptype")
  (("FPTYPE_SINGLE" "0")
   ("FPTYPE_DOUBLE" "1")
   ("FPTYPE_EXTENDED" "2")
   ("FPTYPE_NOTSPEC" "0x3f")))
 (cond "ptr->btype==BTYPE_TAG || ptr->btype == BTYPE_TYPE"
       (("symbol id") (2 bytes) ("sid")))
 (("negotiation") (2 bytes) ("neg")))

("dar" 0x4e
 (("element length" ) (addrsize bytes) ("length"))
 (("dims") (1 byte) ("dims"))
 (repeat "ptr->dims"
	 (("variable flag") (1 bit) ("variable")
	  (("VARIABLE_FIXED" "0")
	   ("VARIABLE_VARIABLE" "1")))

	 (("subscript type") (1 bit) ("subtype")
	  (("SUB_INTEGER" "0")
	   ("SUB_TYPE"    "1")))

	 (("spare") (6 bits) ("spare"))

	 (cond "ptr->subtype[n] == SUB_TYPE"
	       (("sub symbol id") (2 bytes) ("sid")))

	 (cond "ptr->subtype[n] == SUB_INTEGER"
	       (("max declaration type flag") (1 bit) ("max_variable"))
	       (("max spare") (7 bits) ("maxspare"))
	       ;; FIXME: next field should be conditional on max_variable,
	       (("maximum") (addrsize bytes) ("max"))

	       (("min declaration type flag") (1 bit) ("min_variable"))
	       (("min spare") (7 bits) ("minspare"))
	       ;; FIXME: next field should be conditional on min_variable
	       (("minimum") (addrsize bytes) ("min"))))
 (("negotiation") (2 bytes) ("neg")))


("dso" 0x3a
 (("function name") (2 bytes) ("sid"))
 (("sp update count") (4 bytes) ("spupdates"))
 (repeat "ptr->spupdates"
	 (("update address") (addrsize bytes) ("address"))
	 (("offset") (addrsize bytes) ("offset"))))

("dln" 0x38
 (("number of lines") (2 bytes) ("nln"))
 (repeat "ptr->nln"
	 (("source file number") (2 bytes) ("sfn"))
	 (("source line number") (2 bytes) ("sln"))
	 (("section number") (2 bytes) ("section"))
	 (("from address") (addrsize bytes) ("from_address"))
	 (("to address") (addrsize bytes) ("to_address"))
	 (("call count") (2 bytes) ("cc"))
	 )
 (("neg") (2 bytes) ("neg")))

("dpp" 0x46
 (("start/end") (1 bit) ("end"))
 (("spare") (7 bits) ("spare"))
 (cond "!ptr->end"
       (("params") (1 byte) ("params"))
       (("neg number") (2 bytes) ("neg"))))

("den" 0x4a
 (("start/end") (1 bit) ("end"))
 (("spare") (7 bits) ("spare"))
 (cond "!ptr->end"
       (("neg number") (2 bytes) ("neg"))))

("dfp" 0x48
 (("start/end flag") (1 bit) ("end"))
 (("spare") (7 bits) ("spare"))
 (cond "!ptr->end"
       (("number of parameters") (1 byte) ("nparams"))
       (("neg number") (2 bytes) ("neg"))))

("dds" 0x4c
 (("start/end") (1 bit) ("end"))
 (("spare") (7 bits) ("spare"))
 (cond "!ptr->end"
       (("neg number") (2 bytes) ("neg"))))

("dpt" 0x50
 (("neg number") (2 bytes) ("neg"))
 (("dunno") (1 byte) ("dunno")))

("dse" 0x54
 (("neg number") (2 bytes) ("neg"))
 (("dunno") (1 byte) ("dunno")))

("dot" 0x56
 (("unknown") (1 byte) ("unknown")))
; FIXME: unknown field should be repeated symbol number?


("dss" 0x42
 (("type") (1 byte) ("type"))
 (("external/internal") (1 bit) ("internal"))
 (("spare") (7 bits) ("spare"))
 (cond "!ptr->internal"
       (  ("package name") (chars variable byte) ("package")))
 (cond "ptr->internal"
       (("symbol id") (2 bytes) ("id")))
 (("record type") (2 bytes) ("record"))
 (("rules") (chars variable byte) ("rules"))
 (("number of symbols") (2 bytes) ("nsymbols"))
 (("unknown" ) (2 bytes) ("fixme")))

("pss" 0x40
 (("negotiation number") (2 bytes) ("efn"))
 (("number of source files") (2 bytes) ("ns"))
 (repeat "ptr->ns"
	 (("directory reference bit") (1 bit) ("drb"))
	 (("spare") (7 bits) ("spare"))
	 (("completed file name") (chars variable byte) ("fname"))
	 (cond "ptr->drb[n]"
	       (("directory apperance number") (2 bytes) ("dan"))))

 (("number of directories") (2 bytes) ("ndir"))
 (repeat "ptr->ndir"
	 (("directory name") (chars variable bytes) ("dname"))))


; FIXME: the tr block has no contents. sysinfo, etc. aren't prepared
; to deal with that.
; ("tr" 0x7f)


("dus" 0x40
 (("negotiation number") (2 bytes) ("efn"))
 (("number of source files") (2 bytes) ("ns"))
 (repeat "ptr->ns"
	 (("directory reference bit") (1 bit) ("drb"))
	 (("spare") (7 bits) ("spare"))
	 (("completed file name") (chars variable byte) ("fname"))
	 (cond "ptr->drb[n]"
	       (("directory apperance number") (2 bytes) ("dan"))))
 (("number of directories") (2 bytes) ("ndir"))
 (repeat "ptr->ndir"
	 (("directory name") (chars variable bytes) ("dname"))))


("dps" 0x32
 (("start/end flag") (1 bit) ("end"))
 (("block type") (7 bits) ("type")
  (("BLOCK_TYPE_COMPUNIT" "0")
   ("BLOCK_TYPE_PROCEDURE" "2")
   ("BLOCK_TYPE_FUNCTION" "3")
   ("BLOCK_TYPE_BLOCK" "4")
   ("BLOCK_TYPE_BASIC" "9")))
 (cond "!ptr->end"
       (("optimization") (1 byte) ("opt"))
       (("section number") (2 bytes) ("san"))
       (("address") (addrsize bytes) ("address"))
       (("block size") (addrsize bytes) ("block_size"))
       (("nesting") (1 byte) ("nesting"))
       (cond "ptr->type == BLOCK_TYPE_PROCEDURE
	    || ptr->type == BLOCK_TYPE_FUNCTION"
	     (("return address") (1 bit) ("retaddr"))
	     (("interrupt function flag") (1 bit) ("intrflag"))
	     (("stack update flag") (1 bit) ("stackflag"))
	     (("intra page JMP") (1 bit) ("intrpagejmp"))
	     (("spare") (4 bits) ("spare")))
       (("neg number") (2 bytes) ("neg"))))

