#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  !%control x'11111111'
//     2  %BEGIN

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

  //     3  %INTEGER COUNT

  int COUNT;

  //     4  %INTEGER I

  int I;

  //     5  %ROUTINE FRED(%INTEGERNAME I,%INTEGER FIRST,STEP,LAST)

  void FRED(int *I, int FIRST, int STEP, int LAST) {
    //     6        %CYCLE I=FIRST,STEP,LAST

    // %for *I = FIRST, STEP, LAST %cycle
    {
      int _initial = FIRST, _increment = STEP, _final = LAST;
      if (invalid_for_loop(_initial, _increment, _final)) _imp_signal(5, 1, 0, "Illegal cycle *I = FIRST, STEP, LAST");
      *I = _initial - _increment;
    L_0001:
      if (*I == _final) goto L_0002;
      *I += _increment;

      //     7           COUNT=COUNT+1

      COUNT = COUNT + 1;

      //     8        %REPEAT

      goto L_0001;
    }

  L_0002:;

  //     9  %END

    return;
  } /* end of FRED */

  //    10        COUNT=0

  COUNT = 0;

  //    11        FRED(I,X'9000',16,X'A000')

  FRED(/*?*/ &I, 36864, 16, 40960);

  //    12        %IF COUNT=257 %AND I=X'A000' %THEN PRINTSTRING("TEST OK") %C

  if (COUNT != 257) goto L_0004;
  if (I != 40960) goto L_0004;
  _imp_PRINTSTRING(_imp_str_literal("TEST OK"));
  goto L_0005;
L_0004:;
  _imp_PRINTSTRING(_imp_str_literal("WRONG"));
  /*_imp_monitor(__LINE__, __FILE__, PRETTY_FUNCTION);*/
L_0005:;

//    13+          %ELSE PRINTSTRING("WRONG") %AND %MONITOR
//    14  %ENDOFPROGRAM

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