#include <perms.h>

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

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

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

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

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

const struct AFM *ATYPE = 0;

//    17    %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;
    };
  };
};

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

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

//    41+   %integer OPER,
//    42+       %record (STACKFM) %name LINK %C
//    43+     )
//    44    %recordformat XFM(%c

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

//    45+   %integer XSIZE,
//    46+       %record (STACKFM) %name INDEX %C
//    47+     )
//    48    %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;
        };
      };
    };
  };
};

//    49+   %record (VARFM) V,
//    50+       %integer VARNO,
//    51+       %record (VARFM) %name FV,
//    52+     ( %c
//    53+       %integer BIAS %C
//    54+     %or %c
//    55+       %byte %integer REG,
//    56+       %byte %integer LABEL %C
//    57+     ),
//    58+       %record (STACKFM) %name PARAMS,
//    59+       %record (STACKFM) %name RECORD,
//    60+     ( %c
//    61+       %integer OPER,
//    62+       %record (STACKFM) %name LINK %C
//    63+     %or %c
//    64+       %record (OLFM) OPLINK %C
//    65+     ),
//    66+     ( %c
//    67+       %integer XSIZE,
//    68+       %record (STACKFM) %name INDEX %C
//    69+     %or %c
//    70+       %record (XFM) X %C
//    71+     ) %c
//    72+     )
//    73    %recordformat MEMBERFM(%c

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

//    74+   %integer CONST,
//    75+       %integer ITEMS,
//    76+       %record (STACKFM) %name A,
//    77+       %record (STACKFM) %name B,
//    78+       %record (MEMBERFM) %name LINK %C
//    79+     )
//    80    %constant %record (MEMBERFM) %name MEMBERFMTYPE == 0

const struct MEMBERFM *MEMBERFMTYPE = 0;

//    81    %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;
    };
  };
};

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

const struct STACKFM *STACKFMTYPE = 0;

//   142    %recordformat WITHFM(%c

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

//   143+   %integer KEY,
//   144+       %record (DATAFM) DATA,
//   145+       %record (WITHFM) %name LINK %C
//   146+     )
//   147    %constant %record (WITHFM) %name WITHFMTYPE == 0

const struct WITHFM *WITHFMTYPE = 0;

//   148    %recordformat WORKFM(%c

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

//   149+   %integer SIZE,
//   150+       %integer DISPLACEMENT,
//   151+       %integer VALIDITY %C
//   152+     )
//   153  %endoffile