#include <perms.h>

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

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

  //     2    ! It would appear that Imp and C do not store their arrays in the same x-major order.
  //     3    %integerarray d2(0:1, 0:2)

  int D2[2][3];

  //     4    %ownintegerarray d1(0:5) = 0,1,2,3,4,5

  static int D1[6] = {0, 1, 2, 3, 4, 5};

  //     5    %integername d, e

  int *D;
  int *E;

  //     6    %integer i,j

  int I;
  int J;

  //     7    d == d2(0,0);            e == d1(0);              d = e;

  D = (int *)/*?*/ &D2[0][0];
  E = (int *)/*?*/ &D1[0];
  *D = *E;

  //     8    d == INTEGER(addr(d)+4); e == INTEGER(ADDR(e)+4); d = e

  D = (int *)_imp_INTEGER(_imp_ADDR(D) + 4);
  E = (int *)_imp_INTEGER(_imp_ADDR(E) + 4);
  *D = *E;

  //     9    d == INTEGER(addr(d)+4); e == INTEGER(ADDR(e)+4); d = e

  D = (int *)_imp_INTEGER(_imp_ADDR(D) + 4);
  E = (int *)_imp_INTEGER(_imp_ADDR(E) + 4);
  *D = *E;

  //    10    d == INTEGER(addr(d)+4); e == INTEGER(ADDR(e)+4); d = e

  D = (int *)_imp_INTEGER(_imp_ADDR(D) + 4);
  E = (int *)_imp_INTEGER(_imp_ADDR(E) + 4);
  *D = *E;

  //    11    d == INTEGER(addr(d)+4); e == INTEGER(ADDR(e)+4); d = e

  D = (int *)_imp_INTEGER(_imp_ADDR(D) + 4);
  E = (int *)_imp_INTEGER(_imp_ADDR(E) + 4);
  *D = *E;

  //    12    d == INTEGER(addr(d)+4); e == INTEGER(ADDR(e)+4); d = e

  D = (int *)_imp_INTEGER(_imp_ADDR(D) + 4);
  E = (int *)_imp_INTEGER(_imp_ADDR(E) + 4);
  *D = *E;

  //    13    %for i = 0, 1, 1 %cycle

  // %for I = 0, 1, 1 %cycle
  {
    I = -1;
  L_0001:
    if (I == 1) goto L_0002;
    I += 1;

    //    14      %for j = 0, 1, 2 %cycle

    // %for J = 0, 1, 2 %cycle
    {
      J = -1;
    L_0004:
      if (J == 2) goto L_0005;
      J += 1;

      //    15        printstring("d2(");write(i,0);printstring(", ");write(j,0);printstring(") = "); write(d2(i,j),0);printstring(",  ");

      _imp_PRINTSTRING(_imp_str_literal("d2("));
      _imp_WRITE(I, 0);
      _imp_PRINTSTRING(_imp_str_literal(", "));
      _imp_WRITE(J, 0);
      _imp_PRINTSTRING(_imp_str_literal(") = "));
      _imp_WRITE(D2[I][J], 0);
      _imp_PRINTSTRING(_imp_str_literal(",  "));

      //    16      %repeat

      goto L_0004;
    }

  L_0005:;

  //    17      newline

    _imp_NEWLINE();

    //    18    %repeat

    goto L_0001;
  }

L_0002:;

//    19    newline

  _imp_NEWLINE();

  //    20    %for i = 0, 1, 2 %cycle

  // %for I = 0, 1, 2 %cycle
  {
    I = -1;
  L_0007:
    if (I == 2) goto L_0008;
    I += 1;

    //    21      %for j = 0, 1, 1 %cycle

    // %for J = 0, 1, 1 %cycle
    {
      J = -1;
    L_0009:
      if (J == 1) goto L_000A;
      J += 1;

      //    22        printstring("d2(");write(j,0);printstring(", ");write(i,0);printstring(") = "); write(d2(j,i),0);printstring(",  ");

      _imp_PRINTSTRING(_imp_str_literal("d2("));
      _imp_WRITE(J, 0);
      _imp_PRINTSTRING(_imp_str_literal(", "));
      _imp_WRITE(I, 0);
      _imp_PRINTSTRING(_imp_str_literal(") = "));
      _imp_WRITE(D2[J][I], 0);
      _imp_PRINTSTRING(_imp_str_literal(",  "));

      //    23      %repeat

      goto L_0009;
    }

  L_000A:;

  //    24      newline

    _imp_NEWLINE();

    //    25    %repeat

    goto L_0007;
  }

L_0008:;

//    26    newline

  _imp_NEWLINE();

  //    27  %endofprogram

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