#include <perms.h>

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

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

  //     2  %INTEGER COUNT

  int COUNT;

  //     3  %INTEGER I

  int I;

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

  void FRED(int *I, int FIRST, int STEP, int LAST) {
    //     5        %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;

      //     6           COUNT=COUNT+1

      COUNT = COUNT + 1;

      //     7        %REPEAT

      goto L_0001;
    }

  L_0002:;

  //     8  %END

    return;
  } /* end of FRED */

  //     9        COUNT=0

  COUNT = 0;

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

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

  //    11        %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:;

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

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