#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2  ! PASSES A RECORD BY VALUE
  //     3  %recordformat fm((%integer i %or %byte b1,b2,b3,b4))

  struct FM {
    union {
      struct {
        union {
          struct {
            int I;
          };
          struct {
            unsigned char B1;
            unsigned char B2;
            unsigned char B3;
            unsigned char B4;
          };
        };
      };
    };
  };

  //     4  %record(fm) a,b

  struct FM A;
  struct FM B;

  //     5
  //     6  %routine fred(%record(fm) x,%integer y, %record(fm) z)

  void FRED(struct FM X, int Y, struct FM Z) {
    //     7     write(x_b1,1)

    _imp_WRITE(X.B1, 1);

    //     8     write(x_b2,1)

    _imp_WRITE(X.B2, 1);

    //     9     write(x_b3,1)

    _imp_WRITE(X.B3, 1);

    //    10     write(x_b4,1)

    _imp_WRITE(X.B4, 1);

    //    11     write(z_b1,1)

    _imp_WRITE(Z.B1, 1);

    //    12     write(z_b2,1)

    _imp_WRITE(Z.B2, 1);

    //    13     write(z_b3,1)

    _imp_WRITE(Z.B3, 1);

    //    14     write(z_b4,1)

    _imp_WRITE(Z.B4, 1);

    //    15  %end

    return;
  } /* end of FRED */

  // ?Y unused
  //    16
  //    17  a_i=x'01020304'

  A.I = 16909060;

  //    18  b_i=x'05060708'

  B.I = 84281096;

  //    19  fred(a,9,b)

  FRED(A, 9, B);

  //    20  %endofprogram

  _imp_stop(0);
  return 0;
end_0:;
}