#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %recordformatspec STACKFM
//     2
//     3  %recordformat BOUNDFM(%c

struct BOUNDFM {
  union {
    struct {
      int LOWER;
      int UPPER;
      int MULT;
    };
  };
};

//     4+   %integer LOWER,
//     5+   %integer UPPER,
//     6+   %integer MULT %C
//     7+ )
//     8
//     9  %recordformat AFM(%c

struct AFM {
  union {
    struct {
      int DIMENSION;
      int TOTALSIZE;
      int ZERODISPLACEMENT;
      int DV;
      int LOCALFRAME;
      int BASE;
      struct BOUNDFM BOUND[7];
    };
  };
};

//    10+   %integer DIMENSION,
//    11+   %integer TOTALSIZE,
//    12+   %integer ZERODISPLACEMENT,
//    13+   %integer DV,
//    14+   %integer LOCALFRAME,
//    15+   %integer BASE,
//    16+   %record (BOUNDFM) %array BOUND (1:7) %C
//    17+ )
//    18
//    19  %constant %record (AFM) %name ATYPE == 0

const struct AFM *ATYPE = 0;

//    20
//    21  %recordformat VARFM(%c

struct VARFM {
  union {
    struct {
      int FLAGS;
      unsigned char BASE;
      unsigned char PRIM;
      unsigned char TYPE;
      unsigned char FORM;
      union {
        struct {
          double RVAR;
        };
        struct {
          int DISP;
          union {
            struct {
              int EXTRA;
            };
            struct {
              struct AFM *ADATA;
            };
          };
        };
      };

      union {
        struct {
          int FORMAT;
        };
        struct {
          int SCALE;
        };
      };

      int AREA;
    };
  };
};

//    22+   %integer FLAGS,
//    23+   %byte %integer BASE,
//    24+   %byte %integer PRIM,
//    25+   %byte %integer TYPE,
//    26+   %byte %integer FORM,
//    27+   ( %c
//    28+     %long %real RVAR %C
//    29+   %or %c
//    30+     %integer DISP,
//    31+     ( %c
//    32+       %integer EXTRA %C
//    33+     %or %c
//    34+       %record (AFM) %name ADATA %C
//    35+     ) %c
//    36+   ),
//    37+   ( %c
//    38+     %integer FORMAT %C
//    39+   %or %c
//    40+     %integer SCALE %C
//    41+   ),
//    42+   %integer AREA %C
//    43+ )
//    44
//    45  %recordformat OLFM(%c

struct OLFM {
  union {
    struct {
      int OPER;
      struct STACKFM *LINK;
    };
  };
};

//    46+   %integer OPER,
//    47+   %record (STACKFM) %name LINK %C
//    48+ )
//    49
//    50  %recordformat XFM(%c

struct XFM {
  union {
    struct {
      int XSIZE;
      struct STACKFM *INDEX;
    };
  };
};

//    51+   %integer XSIZE,
//    52+   %record (STACKFM) %name INDEX %C
//    53+ )
//    54
//    55  %recordformat DATAFM(%c

struct DATAFM {
  union {
    struct {
      struct VARFM V;
      int VARNO;
      struct VARFM *FV;
      union {
        struct {
          int BIAS;
        };
        struct {
          unsigned char REG;
          unsigned char LABEL;
        };
      };

      struct STACKFM *PARAMS;
      struct STACKFM *RECORD;
      union {
        struct {
          int OPER;
          struct STACKFM *LINK;
        };
        struct {
          struct OLFM OPLINK;
        };
      };

      union {
        struct {
          int XSIZE;
          struct STACKFM *INDEX;
        };
        struct {
          struct XFM X;
        };
      };
    };
  };
};

//    56+   %record (VARFM) V,
//    57+   %integer VARNO,
//    58+   %record (VARFM) %name FV,
//    59+   ( %c
//    60+     %integer BIAS %C
//    61+   %or %c
//    62+     %byte %integer REG,
//    63+     %byte %integer LABEL %C
//    64+   ),
//    65+   %record (STACKFM) %name PARAMS,
//    66+   %record (STACKFM) %name RECORD,
//    67+   ( %c
//    68+     %integer OPER,
//    69+     %record (STACKFM) %name LINK %C
//    70+   %or %c
//    71+     %record (OLFM) OPLINK %C
//    72+   ),
//    73+   ( %c
//    74+     %integer XSIZE,
//    75+     %record (STACKFM) %name INDEX %C
//    76+   %or %c
//    77+     %record (XFM) X %C
//    78+   ) %c
//    79+ )
//    80
//    81  %recordformat MEMBERFM(%c

struct MEMBERFM {
  union {
    struct {
      int CONST;
      int ITEMS;
      struct STACKFM *A;
      struct STACKFM *B;
      struct MEMBERFM *LINK;
    };
  };
};

//    82+   %integer CONST,
//    83+   %integer ITEMS,
//    84+   %record (STACKFM) %name A,
//    85+   %record (STACKFM) %name B,
//    86+   %record (MEMBERFM) %name LINK %C
//    87+ )
//    88
//    89  %constant %record (MEMBERFM) %name MEMBERFMTYPE == 0

const struct MEMBERFM *MEMBERFMTYPE = 0;

//    90
//    91  %recordformat STACKFM(%c

struct STACKFM {
  union {
    struct {
      struct VARFM V;
    };
    struct {
      struct DATAFM DATA;
    };
    struct {
      int FLAGS;
      unsigned char BASE;
      unsigned char PRIM;
      unsigned char TYPE;
      unsigned char FORM;
      union {
        struct {
          double RVAL;
        };
        struct {
          int RHIGH;
          int RLOW;
        };
        struct {
          union {
            struct {
              int DISP;
              union {
                struct {
                  int EXTRA;
                };
                struct {
                  struct AFM *ADATA;
                };
              };
            };
          };

          union {
            struct {
              int FORMAT;
            };
            struct {
              int SCALE;
            };
          };

          int AREA;
          int VARNO;
          union {
            struct {
              struct VARFM *FV;
            };
            struct {
              struct MEMBERFM *MEMBERS;
            };
          };

          union {
            struct {
              int BIAS;
            };
            struct {
              unsigned char REG;
              unsigned char LABEL;
            };
          };

          struct STACKFM *PARAMS;
          struct STACKFM *RECORD;
          union {
            struct {
              int OPER;
              struct STACKFM *LINK;
            };
            struct {
              struct OLFM OPLINK;
            };
          };

          union {
            struct {
              int XSIZE;
              struct STACKFM *INDEX;
            };
            struct {
              struct XFM X;
            };
          };
        };
      };

      struct STACKFM *USING;
      struct STACKFM *STACK;
    };
  };
};

//    92+   %record (VARFM) V %C
//    93+ %or %c
//    94+   %record (DATAFM) DATA %C
//    95+ %or %c
//    96+   %integer FLAGS,
//    97+   %byte %integer BASE,
//    98+   %byte %integer PRIM,
//    99+   %byte %integer TYPE,
//   100+   %byte %integer FORM,
//   101+   ( %c
//   102+     %long %real RVAL %C
//   103+   %or %c
//   104+     %integer RHIGH,
//   105+     %integer RLOW %C
//   106+   %or %c
//   107+     ( %c
//   108+       %integer DISP,
//   109+       ( %c
//   110+         %integer EXTRA %C
//   111+       %or %c
//   112+         %record (AFM) %name ADATA %C
//   113+       ) %c
//   114+     ),
//   115+     ( %c
//   116+       %integer FORMAT %C
//   117+     %or %c
//   118+       %integer SCALE %C
//   119+     ),
//   120+     %integer AREA,
//   121+     %integer VARNO,
//   122+     ( %c
//   123+       %record (VARFM) %name FV %C
//   124+     %or %c
//   125+       %record (MEMBERFM) %name MEMBERS %C
//   126+     ),
//   127+     ( %c
//   128+       %integer BIAS %C
//   129+     %or %c
//   130+       %byte %integer REG,
//   131+       %byte %integer LABEL %C
//   132+     ),
//   133+     %record (STACKFM) %name PARAMS,
//   134+     %record (STACKFM) %name RECORD,
//   135+     ( %c
//   136+       %integer OPER,
//   137+       %record (STACKFM) %name LINK %C
//   138+     %or %c
//   139+       %record (OLFM) OPLINK %C
//   140+     ),
//   141+     ( %c
//   142+       %integer XSIZE,
//   143+       %record (STACKFM) %name INDEX %C
//   144+     %or %c
//   145+       %record (XFM) X %C
//   146+     ) %c
//   147+   ),
//   148+   %record (STACKFM) %name USING,
//   149+   %record (STACKFM) %name STACK %C
//   150+ )
//   151
//   152  %constant %record (STACKFM) %name STACKFMTYPE == 0

const struct STACKFM *STACKFMTYPE = 0;

//   153
//   154  %recordformat WITHFM(%c

struct WITHFM {
  union {
    struct {
      int KEY;
      struct DATAFM DATA;
      struct WITHFM *LINK;
    };
  };
};

//   155+   %integer KEY,
//   156+   %record (DATAFM) DATA,
//   157+   %record (WITHFM) %name LINK %C
//   158+ )
//   159
//   160  %constant %record (WITHFM) %name WITHFMTYPE == 0

const struct WITHFM *WITHFMTYPE = 0;

//   161
//   162  %recordformat WORKFM(%c

struct WORKFM {
  union {
    struct {
      int SIZE;
      int DISPLACEMENT;
      int VALIDITY;
    };
  };
};

//   163+   %integer SIZE,
//   164+   %integer DISPLACEMENT,
//   165+   %integer VALIDITY %C
//   166+ )
//   167
//   168  %endoffile