#include <perms.h>

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

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

  //     2  %ROUTINE PRHEX(%INTEGER VALUE, PLACES)

  void PRHEX(int VALUE, int PLACES) {
    //     3  %CONSTBYTEINTEGERARRAY HEX(0:15)='0','1','2','3','4',

    const unsigned char HEX[16] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70};

    //     4+                '5','6','7','8','9','A','B','C','D','E','F'
    //     5  %INTEGER I

    int I;

    //     6        %CYCLE I=PLACES<<2-4, -4, 0

    // %for I = (PLACES << 2) - 4,  -4, 0 %cycle
    {
      int _initial = (PLACES << 2) - 4;
      if (invalid_for_loop(_initial, -4, 0)) _imp_signal(5, 1, 0, "Illegal cycle I = (PLACES << 2) - 4,  -4, 0");
      I = _initial - (-4);
    L_0001:
      if (I == 0) goto L_0002;
      I -= 4;

      //     7           PRINT SYMBOL(HEX(VALUE>>I&15))

      _imp_PRINTSYMBOL(HEX[(unsigned int)VALUE >> I & 15]);

      //     8        %REPEAT

      goto L_0001;
    }

  L_0002:;

  //     9  %END

    return;
  } /* end of PRHEX */

  //    10  PRHEX(X'B00B',8)

  PRHEX(45067, 8);

  //    11  %ENDOFPROGRAM

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