!
!   KMC11 ASSEMBLER V2
!   STARTED GJB 28/03/78
!   UPDATED GJB 29/09/78
!   converted to Imp77 by gtoal, 04/11/2004
!
%CONTROL K'101011'
%BEGIN
%OWNINTEGER FAULTS,LPTR,CLOC,DLOC,TYPE,VALUE,PRINT,LMAX,INST,PPTR,I,COUNT
%OWNINTEGER CORD,SPTR,J,MACLEV,MTPTR,IN1,IN2,IN3,K,TOELSE,POSN
%OWNINTEGER ASL=-1,LS=3
%RECORDFORMAT TF(%BYTEINTEGERARRAY NAME(0:5),%INTEGER TYPE,VALUE)
%RECORD(TF)%ARRAYNAME TAG
%RECORDFORMAT T1F(%BYTEINTEGERARRAYNAME NAME)
%RECORDFORMAT T2F(%RECORD(TF)%ARRAYNAME NAME)
%RECORD(T1F) T1
%RECORD(T2F)%NAME T2
%OWNBYTEINTEGERARRAY TTAG(0:2559) = %C
  66,   0,   0,   0,   0,   0,   7,   0, 255, 255,
  67,   0,   0,   0,   0,   0,   5,   0,   0,   0,
  90,   0,   0,   0,   0,   0,   5,   0,   1,   0,
  66,  82,  71,   0,   0,   0,   1,   0,   0,  97,
  73,  70,   0,   0,   0,   0,   5,   0,  11,   0,
  68,  69,  70,   0,   0,   0,   5,   0,  19,   0,
  69,  78,  68,   0,   0,   0,   5,   0,  22,   0,
  65,  78,  68,   0,   0,   0,   5,   0,  32,   0,
  83,  80,  48,   0,   0,   0,   3,   0,   0,   6,
  83,  80,  49,   0,   0,   0,   3,   0,   1,   6,
  83,  80,  50,   0,   0,   0,   3,   0,   2,   6,
  83,  80,  51,   0,   0,   0,   3,   0,   3,   6,
  83,  80,  52,   0,   0,   0,   3,   0,   4,   6,
  83,  80,  53,   0,   0,   0,   3,   0,   5,   6,
  83,  80,  54,   0,   0,   0,   3,   0,   6,   6,
  83,  80,  55,   0,   0,   0,   3,   0,   7,   6,
  83,  80,  56,   0,   0,   0,   3,   0,   8,   6,
  83,  80,  57,   0,   0,   0,   3,   0,   9,   6,
  77,  65,  82,   0,   0,   0,   2,   0,   0,  16,
  78,  80,  82,   0,   0,   0,   1,   0, 136, 162,
  68,  65,  84,  65,   0,   0,   5,   0,  18,   0,
  79,  82,   0,   0,   0,   0,   5,   0,  33,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  77,  73,  83,  67,   0,   0,   1,   0, 153, 162,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  78,  79,  68,  69,  83,  84,   1,   0,   0,   0,
  80,  65,  71,  69,   0,   0,   2,   0,   0,   8,
  80,  65,  71,  69,  48,   0,   5,   0,   6,   0,
  80,  65,  71,  69,  49,   0,   5,   0,   7,   0,
  80,  65,  71,  69,  50,   0,   5,   0,   8,   0,
  80,  65,  71,  69,  51,   0,   5,   0,   9,   0,
  82,  69,  80,  69,  65,  84,   5,   0,  16,   0,
  69,  76,  83,  69,   0,   0,   5,   0,  12,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  70,  73,  78,  73,  83,  72,   5,   0,  13,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  67,  89,  67,  76,  69,   0,   5,   0,  14,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  87,  72,  73,  76,  69,   0,   5,   0,  15,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  67,  84,  82,  76,   0,   0,   5,   0,  17,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  77,  69,  77,  79,  82,  89,   1,   0,   0,  69,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  74,  85,  77,  80,   0,   0,   5,   0,  10,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  83,  80,  49,  48,   0,   0,   3,   0,  10,   6,
  83,  80,  49,  49,   0,   0,   3,   0,  11,   6,
  67,  83,  82,  48,   0,   0,   1,   0,   0, 162,
  67,  83,  82,  49,   0,   0,   1,   0,  17, 162,
  65,  68,  82,  48,   0,   0,   1,   0,   0,  36,
  65,  68,  82,  49,   0,   0,   1,   0,  17,  36,
  85,  83,  82,  48,   0,   0,   1,   0, 136,  36,
  85,  83,  82,  49,   0,   0,   1,   0, 153,  36,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  77,  65,  67,  82,  79,   0,   5,   0,  20,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  66,  82,  71,  83,  72,  82,   1,   0,   0,   3,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  83,  80,  49,  50,   0,   0,   3,   0,  12,   6,
  83,  80,  49,  51,   0,   0,   3,   0,  13,   6,
  67,  83,  82,  50,   0,   0,   1,   0,  34, 162,
  67,  83,  82,  51,   0,   0,   1,   0,  51, 162,
  65,  68,  82,  50,   0,   0,   1,   0,  34,  36,
  65,  68,  82,  51,   0,   0,   1,   0,  51,  36,
  85,  83,  82,  50,   0,   0,   1,   0, 170,  36,
  85,  83,  82,  51,   0,   0,   1,   0, 187,  36,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  83,  80,  49,  52,   0,   0,   3,   0,  14,   6,
  83,  80,  49,  53,   0,   0,   3,   0,  15,   6,
  67,  83,  82,  52,   0,   0,   1,   0,  68, 162,
  67,  83,  82,  53,   0,   0,   1,   0,  85, 162,
  65,  68,  82,  52,   0,   0,   1,   0,  68,  36,
  65,  68,  82,  53,   0,   0,   1,   0,  85,  36,
  85,  83,  82,  52,   0,   0,   1,   0, 204,  36,
  85,  83,  82,  53,   0,   0,   1,   0, 221,  36,
  76,  73,  83,  84,   0,   0,   5,   0,  21,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  67,  83,  82,  54,   0,   0,   1,   0, 102, 162,
  67,  83,  82,  55,   0,   0,   1,   0, 119, 162,
  65,  68,  82,  54,   0,   0,   1,   0, 102,  36,
  65,  68,  82,  55,   0,   0,   1,   0, 119,  36,
  85,  83,  82,  54,   0,   0,   1,   0, 238,  36,
  85,  83,  82,  55,   0,   0,   1,   0, 255,  36,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
%CONSTINTEGER MAX LABS=15
%OWNINTEGERARRAY PENDING(0:MAX LABS)
%OWNINTEGERARRAY CONTROL(0:1023)=K'160000'(*)
%CONSTINTEGER MAX LINE=140
%OWNBYTEINTEGERARRAY LINE(0:MAX LINE)
%OWNINTEGERARRAY DATA(0:1023)=-1(*)
%CONSTINTEGER UNKNOWN=0,DEST=1,MEM=2,SP=3,CONST=4,KEYWORD=5,MACRO=6,MEMORY=7
%CONSTINTEGER C=0,BRG7=5,PAGE0=6,PAGE3=9,JUMP=10,IF=11,ELSE=12
%CONSTINTEGER FINISH=13,CYCLE=14,WHILE=15,REPEAT=16,CTRL=17,DTA=18,DEF=19
%CONSTINTEGER MAC=20,LST=21,MEND=22,AIF=23,AELSE=24,AFINISH=25,AND=32,OR=33
%CONSTINTEGER SRC MASK=K'160360',MEM MASK=K'14000',DEST MASK=K'3417'
%CONSTINTEGER SPM=6,BREG=K'400'
%RECORDFORMAT LF(%INTEGER DATA,PTR)
%CONSTINTEGER MAX CELL=256
%RECORD(LF)%ARRAY LIST(0:MAX CELL-1)
%INTEGERNAME LAST
%RECORDFORMAT NF(%INTEGER TYPE,VAL1,VAL2)
%CONSTINTEGER NEST MAX=10
%RECORD(NF)%ARRAY NEST(1:NEST MAX)
%CONSTINTEGER PARMAX=6
%RECORDFORMAT MF(%INTEGER PTR,COND,TPTR,%INTEGERARRAY PARS(1:PAR MAX))
%CONSTINTEGER MACMAX=5
%RECORD(MF)%ARRAY MSTACK(1:MAC MAX)
%RECORDFORMAT PF(%BYTEINTEGERARRAY NAME(0:5),%INTEGER LEN)
%RECORD(PF)%ARRAY PARAM(1:PAR MAX)
%CONSTINTEGER TEXT MAX=8192
%BYTEINTEGERARRAY STORE(0:TEXT MAX)
%SWITCH KEY(JUMP:AFINISH)
!
%CONSTBYTEINTEGERARRAY INCMAR(0:9)=',','M','A','R','=','M','A','R','+','1'
%CONSTBYTEINTEGERARRAY OPRTR(3:29)=1,'+',0,1,'-',0,2,'!','!',1,'!',0,1,'&',0,
   2,'>','>',2,'<','<',1,'*',0,1,'/',0
%CONSTBYTEINTEGERARRAY PRIOR(0:9)=5,1,1,3,3,3,4,4,2,2
%CONSTBYTEINTEGERARRAY REL(0:17)=1,'#',0,1,'=',0,2,'<','=',2,'>','=',
   1,'<',0,1,'>',0


%ROUTINE DUMP(%INTEGER VAL)
PRINT SYMBOL(VAL>>8);   PRINT SYMBOL(VAL&K'377')
%END


%ROUTINE PRINT LINE
%INTEGER I
SPACES(2)
PRINT SYMBOL(LINE(I)) %FOR I=0,1,LMAX-1
PRINT=1
%END
 

%ROUTINE ERROR(%INTEGER TYPE,NUMBER)
%CONSTSTRING(19)%ARRAY MESSAGE(1:10)=   %C
   "LIMIT EXCEEDED",   "INVALID ASS EXPR",
   "INVALID RUN EXPR",   "INVALID COND",
   "INVALID ASSIGN",   "INVALID JUMP",
   "BAD TERMINATOR",   "NESTING",
   "DIRECTIVE",   "MACRO CALL"
SPACES(13) %AND PRINT LINE %IF PRINT=0
SPACES(LPTR+15);   PRINT SYMBOL('|');   NEWLINE
PRINT STRING("************** ERROR : ")
PRINT STRING(MESSAGE(TYPE));   PRINT STRING("  [")
WRITE(NUMBER,0);   PRINT STRING(" ]");   NEWLINE
FAULTS=FAULTS+1
%END


%PREDICATE MATCH(%BYTEINTEGERARRAYNAME MASTER,%INTEGER ADDRESS,LEN,MLEN,SP)
%INTEGER I,J
J=LPTR
%CYCLE I=ADDRESS,1,ADDRESS+LEN-1
   %FALSE %UNLESS LINE(J)=MASTER(I)
   J=J+1 %UNTIL SP=0 %OR LINE(J)#' '
%REPEAT
%CYCLE I=ADDRESS+LEN,1,ADDRESS+MLEN-1
   %FALSE %UNLESS MASTER(I)=0
%REPEAT
LPTR=J
%TRUE
%END


%ROUTINE CODE DUMP(%INTEGER WORD,LOC)
%INTEGER I,J
%IF LOC=-2 %THEN I=8 %ELSE I=0
%IF LOC<0 %THEN LOC=CLOC %AND CLOC=(CLOC+1)&K'1777' %AND J=0 %ELSE J=1
CONTROL(LOC)=WORD
%IF (LS>1 %OR (LS=1 %AND MACLEV=0)) %AND (PRINT=J=0 %OR LS>2) %START
   WRITE(LOC,6)
   %IF J=1 %THEN PRINT STRING("* ") %ELSE SPACES(2)
   %CYCLE I=12,-4,I
      J=WORD>>I&15
      %IF J<10 %THEN PRINT SYMBOL(J+'0') %ELSE PRINT SYMBOL(J-10+'A')
   %REPEAT
   PRINT STRING("__") %IF I=8
   %IF PRINT=0 %THEN PRINT LINE %ELSE NEWLINE
%FINISH
%END



%ROUTINE DATA DUMP(%INTEGER BYTE,LOC)
%INTEGER I
%IF LOC=-1 %THEN LOC=DLOC %AND DLOC=(DLOC+1)&K'1777' %AND I=0 %ELSE I=1
DATA(LOC)=BYTE
%IF (LS>1 %OR (LS=1 %AND MACLEV=0)) %AND (PRINT=I=0 %OR LS>2) %START
   PRINT STRING("@@");   WRITE(LOC,4)
   %IF I=1 %THEN PRINT SYMBOL('*') %ELSE SPACE
   %IF BYTE<0 %THEN PRINT STRING("  ___") %ELSE WRITE(BYTE,4)
   %IF PRINT=0 %THEN PRINT LINE %ELSE NEWLINE
%FINISH
%END
  

%INTEGERFN CELL(%INTEGER DATA,PTR)
%INTEGER I
%RESULT=0 %IF ASL=-1
%IF PTR<-1 %START
   LAST=-2-PTR;   LIST(LAST)_DATA=DATA;   %RESULT=LAST
%FINISH
ERROR(1,3) %AND %STOP %IF ASL=MAX CELL
I=ASL;   ASL=LIST(I)_PTR
LIST(I)_DATA=DATA
%IF PTR=-1 %THEN LIST(I)_PTR=I %ELSE LIST(I)_PTR=LIST(PTR)_PTR %AND %C
   LIST(PTR)_PTR=I
%RESULT=I
%END


%INTEGERFN CONVERT(%INTEGER VAL)
%RESULT=VAL<<3&MEM MASK!VAL&K'377'
%END


%ROUTINE ASSIGN(%INTEGER VAL,END,ALL)
%INTEGER I,J
I=LIST(END)_PTR;   LIST(END)_PTR=-ALL-1
%WHILE LIST(I)_PTR#-1 %CYCLE
   J=LIST(I)_DATA
   %IF J<1024 %START
      %UNLESS 4#CONTROL(J)>>13<6 %START
         CODE DUMP(CONTROL(J)&K'163400'!CONVERT(VAL),J)
      %FINISH %ELSE CODE DUMP(CONTROL(J)&K'177400'!VAL&K'377',J)
   %FINISH %ELSE DATA DUMP(VAL&K'377',J-1024)
   J=LIST(I)_PTR;   %EXIT %IF J<0
   LIST(I)_PTR=ASL;   ASL=I;   I=J
%REPEAT
LIST(I)_PTR=ASL;   ASL=I
%END


%PREDICATE VALID RHS
%INTEGER I
%IF TYPE=CONST %START
   I=VALUE!1<<8;   VALUE=3<<13
%FINISH %ELSE %IF TYPE=SP %START
   I=3<<13!1<<8!8<<4!VALUE&15;   VALUE=3<<13
%FINISH %ELSE %IF TYPE=DEST %AND VALUE>>13#0 %START
   %TRUE %IF 2<=VALUE>>13<=3
   I=VALUE&SRC MASK!1<<8;   VALUE=3<<13
%FINISH %ELSE %IF TYPE=MEMORY %AND VALUE>=0 %START
   I=VALUE&K'377'!2<<11;   VALUE=2<<13
%FINISH %ELSE %FALSE
IN1=I
%TRUE
%END


%PREDICATE MSTORE(%INTEGER VAL)
ERROR(1,7) %AND %FALSE %IF MTPTR=TEXT MAX
STORE(MTPTR)=VAL;   MTPTR=MTPTR+1
%TRUE
%END
 

%PREDICATE LINE END
%FALSE %IF ';'#LINE(LPTR)#NL
%TRUE
%END


%INTEGERFN READ LINE
%INTEGER I,J
LMAX=1
%CYCLE
   %IF MACLEV=0 %THEN READ SYMBOL(I) %ELSE %START
      I=STORE(MSTACK(MACLEV)_PTR)
      MSTACK(MACLEV)_PTR=MSTACK(MACLEV)_PTR+1
   %FINISH
   %IF I&K'200'#0 %START
      %IF I=255 %START
         J=MSTACK(MACLEV)_COND
         ASSIGN(CLOC,J,1) %IF J>=0
         MTPTR=MSTACK(MACLEV)_TPTR
         MACLEV=MACLEV-1
         %CONTINUE
      %FINISH
      J=MSTACK(MACLEV)_PARS(I&K'177')
      %IF J=-1 %THEN ERROR(10,1) %ELSE %START
         MACLEV=MACLEV+1
         MSTACK(MACLEV)_COND=-1;   MSTACK(MACLEV)_TPTR=MTPTR
         MSTACK(MACLEV)_PTR=J
      %FINISH
   %FINISH %ELSE %START
      LINE(LMAX-1)=I;   %EXIT %IF I=NL
      %RESULT=1 %IF I=4
      LMAX=LMAX+1 %IF LMAX<MAX LINE
   %FINISH
%REPEAT
LPTR=0;   PRINT=0
%RESULT=0
%END


%PREDICATE TEST IF
%TRUE %IF LINE(LPTR)='I' %AND LINE(LPTR+1)='F'
%FALSE
%END


%ROUTINE SKIP SPACES
LPTR=LPTR+1 %WHILE LINE(LPTR)=' '
%END


%ROUTINE IDENTIFIER(%BYTEINTEGERARRAYNAME NAME,%INTEGERNAME LEN)
NAME(LEN)=0 %FOR LEN=0,1,5
LEN=0
%WHILE 'A'<=LINE(LPTR)<='Z' %OR '0'<=LINE(LPTR)<='9' %CYCLE
   NAME(LEN)=LINE(LPTR) %AND LEN=LEN+1 %IF LEN<=5
   LPTR=LPTR+1
%REPEAT
%END
 

%INTEGERFN DECIMAL
%INTEGER I
SKIP SPACES
I=0
I=10*I+(LINE(LPTR)-'0') %AND LPTR=LPTR+1 %WHILE '0'<=LINE(LPTR)<='9'
SKIP SPACES
%RESULT=I
%END


%INTEGERFN BINARY
%INTEGER I
SKIP SPACES
I=0
I=I<<1!(LINE(LPTR)-'0') %AND LPTR=LPTR+1 %WHILE '0'<=LINE(LPTR)<='1'
SKIP SPACES
 %RESULT=I
%END


%INTEGERFN OCTAL
%INTEGER I
SKIP SPACES
I=0
I=I<<3!(LINE(LPTR)-'0') %AND LPTR=LPTR+1 %WHILE '0'<=LINE(LPTR)<='7'
SKIP SPACES
%RESULT=I
%END

%INTEGERFN HEX
%INTEGER I
SKIP SPACES
I=0
%CYCLE
   I=I<<4!(LINE(LPTR)-'0') %AND LPTR=LPTR+1 %AND %CONTINUE %IF '0'<=LINE(LPTR)<='9'
   %EXIT %UNLESS 'A'<=LINE(LPTR)<='F'
   I=I<<4!(LINE(LPTR)-'A'+10);   LPTR=LPTR+1
%REPEAT
SKIP SPACES
%RESULT=I
%END


%INTEGERFNSPEC GET ASS EXPR
%ROUTINE GET TAG
%INTEGER I,J,K,L;   %BYTEINTEGERARRAY TEMP(0:5)
%CONSTINTEGERARRAY BIT(4:7)='0','1','4','7'
TYPE=CONST;   POSN=-1
SKIP SPACES
%IF '0'<=LINE(LPTR)<='9' %START
   VALUE=DECIMAL
   %IF LINE(LPTR)='_' %START
      %IF VALUE=2 %THEN LPTR=LPTR+1 %AND VALUE=BINARY %ELSE %START
      %IF VALUE=8 %THEN LPTR=LPTR+1 %AND VALUE=OCTAL %ELSE %START
      %IF VALUE=16 %THEN LPTR=LPTR+1 %AND VALUE=HEX
      %FINISH;   %FINISH
   %FINISH
%FINISH %ELSE %IF LINE(LPTR)='.' %START
   VALUE=CLOC;   LPTR=LPTR+1
%FINISH %ELSE %IF LINE(LPTR)='@' %START
   VALUE=DLOC;   LPTR=LPTR+1
%FINISH %ELSE %IF LPTR+2<LMAX %AND LINE(LPTR)=LINE(LPTR+2)='''' %START
    VALUE=LINE(LPTR+1);   LPTR=LPTR+3
%FINISH %ELSE %IF LINE(LPTR)='#' %START
   J=LPTR;   LPTR=LPTR+1;   GET TAG
   %IF TYPE=MEMORY %AND VALUE>=0 %THEN TYPE=CONST %ELSE  %C
      TYPE=-1 %AND LPTR=J
%FINISH %ELSE %IF 'A'<=LINE(LPTR)<='Z' %START
   J=LPTR
   IDENTIFIER(TEMP,I)
   K=LPTR;   LPTR=J;   J=K
   VALUE=TEMP(2)>>1&15!(TEMP(3)&30)<<3
   K=VALUE
   %IF CORD=0 %THEN L=CLOC %ELSE L=DLOC+1024
   %CYCLE
      ->OUT %IF TAG(K)_NAME(0)=0 %OR MATCH(TAG(K)_NAME,0,I,6,0)
      K=(K+1)&K'377'
   %REPEAT %UNTIL K=VALUE
   ERROR(1,1);   %STOP
OUT:%IF TAG(K)_NAME(0)=0 %START
      TYPE=UNKNOWN
      TAG(K)_NAME(I)=TEMP(I) %FOR I=0,1,5
      TAG(K)_TYPE=UNKNOWN;   TAG(K)_VALUE=CELL(L,-1)
      VALUE=K;   LAST==TAG(K)_VALUE
    %FINISH %ELSE %START
      TYPE=TAG(K)_TYPE
      %IF TYPE=UNKNOWN %START
         TAG(K)_VALUE=CELL(L,TAG(K)_VALUE)
         VALUE=K;   LAST==TAG(K)_VALUE
      %FINISH %ELSE VALUE=TAG(K)_VALUE
   %FINISH
   POSN=K
   %IF LINE(J)='.' %AND (TYPE=SP %OR (TYPE=DEST %AND VALUE>>13#0)) %START
      %CYCLE I=4,1,7
         %IF LINE(J+1)=BIT(I) %START
            J=J+2
            TYPE=KEYWORD %AND VALUE=3<<13!I<<8!8<<4!VALUE&15 %AND %EXIT %IF TYPE=SP
            TYPE=KEYWORD
            VALUE=VALUE&SRC MASK!I<<8 %AND %EXIT %UNLESS 1#VALUE>>13#5
            VALUE=2<<13!I<<8!9<<4 %AND %EXIT %IF VALUE>>13=2
            VALUE=I-2+C;   %EXIT
         %FINISH
      %REPEAT
   %FINISH
   LPTR=J
   SKIP SPACES
   %IF TYPE=MEMORY %AND VALUE=-1 %AND LINE(LPTR)='(' %START
      LPTR=LPTR+1;   GET TAG;   VALUE=GET ASS EXPR
      VALUE=-1 %UNLESS LINE(LPTR)=')'
      LPTR=LPTR+1;   SKIP SPACES
      TYPE=MEMORY
   %FINISH
%FINISH %ELSE TYPE=-1
%END


%INTEGERFN GET ASS EXPR
%INTEGER I,OPTR,PTR;   %INTEGERARRAY OP(1:5),STACK(1:6)

%ROUTINE EVAL
%INTEGER  LH,RH,OPR;   %SWITCH SW(1:9)
RH=STACK(PTR);   OPR=OP(OPTR);   OPTR=OPTR-1
%IF OPR=0 %THEN STACK(PTR)=\RH %ELSE %START
   PTR=PTR-1;   LH=STACK(PTR)
   ->SW(OPR)
SW(1):STACK(PTR)=LH+RH;   %RETURN
SW(2):STACK(PTR)=LH-RH;   %RETURN
 SW(3):STACK(PTR)=LH!!RH;   %RETURN
SW(4):STACK(PTR)=LH!RH;   %RETURN
SW(5):STACK(PTR)=LH&RH;   %RETURN
SW(6):STACK(PTR)=LH>>RH;   %RETURN
SW(7):STACK(PTR)=LH<<RH;   %RETURN
SW(8):STACK(PTR)=LH*RH;   %RETURN
SW(9):STACK(PTR)=LH//RH
%FINISH
%END

PTR=0;   OPTR=0
%CYCLE
   %WHILE TYPE=-1 %AND LINE(LPTR)='\' %CYCLE
      %IF OPTR>0 %AND OP(OPTR)=0 %THEN OPTR=OPTR-1 %ELSE  %C
         OPTR=OPTR+1 %AND OP(OPTR)=0
      LPTR=LPTR+1
      GET TAG
   %REPEAT
   %IF TYPE=CONST %START
      PTR=PTR+1;   STACK(PTR)=VALUE
   %FINISH %ELSE %IF TYPE=UNKNOWN %AND PTR=0 %START
      GET TAG;   %RESULT=-2
   %FINISH %ELSE %IF TYPE=-1 %AND LINE(LPTR)='(' %START
      LPTR=LPTR+1;   GET TAG
      I=GET ASS EXPR
      %RESULT=-1 %IF I<0
      ERROR(7,3) %AND %RESULT=-1 %UNLESS TYPE=-1 %AND LINE(LPTR)=')'
      LPTR=LPTR+1
      PTR=PTR+1;   STACK(PTR)=I
   %FINISH %ELSE ERROR(2,1) %AND %RESULT=-1
   GET TAG
   %IF TYPE=-1 %START
      %CYCLE I=1,1,9
         %IF MATCH(OPRTR,3*I+1,OPRTR(3*I),2,0) %START
            EVAL %WHILE OPTR>0 %AND PRIOR(I)<=PRIOR(OP(OPTR))
            OPTR=OPTR+1;   OP(OPTR)=I
            ->OUT
          %FINISH
      %REPEAT
   %FINISH
   EVAL %WHILE OPTR>0
   %RESULT=STACK(1)&K'1777'
OUT:GET TAG
%REPEAT
%END


%INTEGERFN GET RUN EXPR(%INTEGER IN)
%INTEGER I,RESULT;   %SWITCH SW(1:5)
%IF TYPE=DEST %START
   %IF 2<=VALUE>>13<=3 %THEN %RESULT=VALUE&SRC MASK!9<<4
   %UNLESS 1#VALUE>>13#5 %OR IN#1 %THEN %RESULT=VALUE&SRC MASK
   %IF VALID RHS %THEN %RESULT=VALUE
   ERROR(2,1);   %RESULT=-1
%FINISH
RESULT=VALUE&15
%CYCLE I=1,1,5
   GET TAG %AND ->SW(I) %IF MATCH(OPRTR,3*I+1,OPRTR(3*I),2,0)
%REPEAT
%RESULT=3<<13!8<<4!RESULT
SW(1): ! +
   %IF TYPE=SP %AND VALUE&15=RESULT&15 %START
      %RESULT=RESULT!3<<13!5<<4 %UNLESS LINE(LPTR)='+'
      LPTR=LPTR+1;   GET TAG
       %RESULT=RESULT!3<<13!6<<4 %IF TYPE=KEYWORD %AND VALUE=C
      ERROR(3,2);   %RESULT=-1
   %FINISH
   %IF TYPE=KEYWORD %AND VALUE=C %THEN %RESULT=RESULT!3<<13!4<<4
   %IF TYPE=CONST %AND VALUE=1 %THEN %RESULT=RESULT!3<<13!3<<4
   %IF VALID RHS %START
      RESULT=RESULT!VALUE&SRC MASK
      %RESULT=RESULT %UNLESS LINE(LPTR)='+'
      LPTR=LPTR+1
      GET TAG
      %IF TYPE=KEYWORD %AND VALUE=C %THEN %RESULT=RESULT!1<<4
      ERROR(3,2);   %RESULT=-1
   %FINISH
   ERROR(3,1);   %RESULT=-1
SW(2): ! -
   %IF TYPE=CONST %AND VALUE=1 %THEN %RESULT=3<<13!RESULT!7<<4
   %IF VALID RHS %START
      RESULT=RESULT!VALUE&SRC MASK
      %RESULT=RESULT!14<<4 %UNLESS LINE(LPTR)='-'
      LPTR=LPTR+1
      GET TAG
      %IF TYPE=CONST %AND VALUE=1 %THEN %RESULT=RESULT!15<<4
      %IF TYPE=-1 %AND LINE(LPTR)='\' %START
         LPTR=LPTR+1
         GET TAG
         %IF TYPE=KEYWORD %AND VALUE=C %THEN %RESULT=RESULT!2<<4
         ERROR(3,2);   %RESULT=-1
      %FINISH
      ERROR(3,1);   %RESULT=-1
   %FINISH
   ERROR(3,1);   %RESULT=-1
SW(3): ! !!
   %IF VALID RHS %START
      %RESULT=RESULT!VALUE&SRC MASK!13<<4
   %FINISH
   ERROR(3,1);   %RESULT=-1
SW(4): ! !
   %IF VALID RHS %START
      %RESULT=RESULT!VALUE&SRC MASK!12<<4
%FINISH
   %IF TYPE=-1 %AND LINE(LPTR)='\' %START
      LPTR=LPTR+1
      GET TAG
      %IF VALID RHS %START
         %RESULT=RESULT!VALUE&SRC MASK!10<<4
      %FINISH
      ERROR(3,1);   %RESULT=-1
   %FINISH
    ERROR(3,1);   %RESULT=-1
SW(5): ! &
   %IF VALID RHS %START
      %RESULT=RESULT!VALUE&SRC MASK!11<<4
   %FINISH
   ERROR(3,1);    %RESULT=-1
%END


%INTEGERFN GET EXPRESSION(%INTEGER IN)
GET TAG %AND %RESULT=2<<13!9<<4 %IF TYPE=MEMORY %AND VALID RHS
%IF TYPE=DEST %OR TYPE=SP %THEN I=GET RUN EXPR(IN) %AND GET TAG %ELSE  %C
   I=GET ASS EXPR
%RESULT=I
%END
 

%INTEGERFN CONDITION(%INTEGER TORF,ADDR,%INTEGERNAME FORWARD)
%INTEGER I,J,K,JPTR
%RECORDFORMAT JF(%INTEGER INST,ADDR)
%RECORD(JF)%ARRAY JUMP(1:30)
%ROUTINE PUSH(%INTEGER INST,ADDR)
ERROR(1,8) %AND JPTR=0 %IF JPTR=30
JPTR=JPTR+1;   JUMP(JPTR)_INST=INST;   JUMP(JPTR)_ADDR=ADDR
%END

JPTR=0
%CYCLE
GET TAG
%IF TYPE=KEYWORD %AND (C<=VALUE<=BRG7 %OR VALUE>>8#0) %START
   %IF C<=VALUE<=BRG7 %THEN I=(VALUE-C+2)<<8 %ELSE %START
      I=VALUE&X'700'
      PUSH(VALUE&X'E0FF'!1<<8,-1)
   %FINISH
   K=0
   %UNLESS '='#LINE(LPTR)#'#' %START
      K=1 %IF LINE(LPTR)='='
      LPTR=LPTR+1;   GET TAG
      ERROR(4,2) %AND %RESULT=-1 %UNLESS TYPE=CONST %AND VALUE=0
   %FINISH
%FINISH %ELSE %IF TYPE=SP %START
   %CYCLE I=0,1,5
      ->OUT %IF MATCH(REL,3*I+1,REL(3*I),2,0)
   %REPEAT
   ERROR(4,1);   %RESULT=-1
OUT:J=VALUE&15;   GET TAG
   %IF TYPE=CONST %AND VALUE=0 %AND (I<3 %OR I=6) %START
      PUSH(3<<13!7<<4!J,-1)
   %FINISH %ELSE %START
      K=IN1;   IN1=0
      %IF VALID RHS %START
         PUSH(IN1,-1) %IF IN1#0;   IN1=K
         %IF I<3 %OR I=6 %THEN PUSH(VALUE&SRC MASK!15<<4!J,-1) %ELSE  %C
            PUSH(VALUE&SRC MASK!14<<4!J,-1)
      %FINISH %ELSE ERROR(4,4) %AND %RESULT=-1
   %FINISH
   K=(I+1)&1
   %IF I<2 %THEN I=3<<8 %ELSE I=2<<8
%FINISH %ELSE ERROR(4,3) %AND %RESULT=-1
GET TAG
%IF TYPE=KEYWORD %AND ((K=0 %AND VALUE=AND) %OR (K=1 %AND VALUE=OR)) %START
   PUSH(4<<13!I!CONVERT(CLOC+JPTR+2),-1)
   %IF TORF=K %START
      %IF ADDR>>10&1#0 %START
         FORWARD=CELL(CLOC+JPTR,FORWARD)
         PUSH(ADDR&K'160000'!1<<8,-2)
      %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!1<<8,ADDR) %ELSE  %C
         PUSH(ADDR!1<<8,-1)
   %FINISH %ELSE PUSH(4<<13!1<<8,0)
%FINISH %ELSE %IF TYPE=KEYWORD %AND ((K=0 %AND VALUE=OR) %OR (K=1 %AND VALUE=AND)) %START
   %IF TORF=K %THEN PUSH(4<<13!I,0) %ELSE %START
      %IF ADDR>>10&1#0 %START
         FORWARD=CELL(CLOC+JPTR,FORWARD)
         PUSH(ADDR&K'160000'!I,-2)
      %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!I,ADDR) %ELSE  %C
         PUSH(ADDR!I,-1)
   %FINISH
%FINISH %ELSE %START
   %IF TORF=K %START
      PUSH(4<<13!I!CONVERT(CLOC+JPTR+2),-1)
       %IF ADDR>>10&1#0 %START
         FORWARD=CELL(CLOC+JPTR,FORWARD)
         PUSH(ADDR&K'160000'!1<<8,-2)
      %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!1<<8,ADDR) %ELSE  %C
         PUSH(ADDR!1<<8,-1)
   %FINISH %ELSE %START
      %IF ADDR>>10&1#0 %START
         FORWARD=CELL(CLOC+JPTR,FORWARD)
         PUSH(ADDR&K'160000'!I,-2)
      %FINISH %ELSE %IF ADDR>=0 %THEN PUSH(4<<13!I,ADDR) %ELSE  %C
         PUSH(ADDR!I,-1)
   %FINISH
   J=CLOC+JPTR
   %CYCLE I=1,1,JPTR
      JUMP(I)_INST=JUMP(I)_INST!CONVERT(J+JUMP(I)_ADDR) %AND  %C
         JUMP(I)_ADDR=-1 %IF JUMP(I)_ADDR>=0
      CODE DUMP(JUMP(I)_INST,JUMP(I)_ADDR)
   %REPEAT
   %RESULT=0
%FINISH
%REPEAT
%END


%PREDICATE BREG NEEDED
   %IF I=2 %OR I=4 %START
      %TRUE %IF COUNT>>13=0 %AND COUNT&15#INST&15
      %TRUE %IF 2<=COUNT>>13<=3 %AND COUNT&15#0
      %FALSE
   %FINISH
   %IF I>=6 %AND 1#COUNT>>13#5 %AND INST&15#COUNT&15 %START
      %TRUE %IF COUNT>>13=0
      %TRUE %IF COUNT>>4&15#9
      %FALSE
   %FINISH
   %TRUE %IF I=5 %AND COUNT>>13=2 %AND IN1#IN3#0
   %FALSE
%END

%ROUTINE SKIP TEXT(%INTEGER TERM)
%CYCLE
   %IF LINE(LPTR)=NL %START
      SPACES(13) %AND PRINT LINE %IF LS=4 %AND PRINT=0
      ERROR(8,6) %AND %STOP %IF READ LINE=1
   %FINISH %ELSE LPTR=LPTR+1
   SKIP SPACES
   %IF LINE(LPTR)='$' %START
      LPTR=LPTR+1;   GET TAG
      %RETURN %IF TYPE=KEYWORD %AND VALUE=FINISH
      TOELSE=2 %AND %RETURN %IF TYPE=KEYWORD %AND TERM=1 %AND VALUE=ELSE
   %FINISH
   LPTR=LPTR+1 %WHILE %NOT LINE END
%REPEAT
%END


%ROUTINE FILL IN(%INTEGER VAL1,VAL2)
%INTEGER I
%WHILE PPTR>0 %CYCLE
   PPTR=PPTR-1;   I=PENDING(PPTR)
   ASSIGN(VAL2,TAG(I)_VALUE,0)
   TAG(I)_TYPE=VAL1;   TAG(I)_VALUE=VAL2
%REPEAT
%END


LIST(I)_PTR=I+1 %FOR I=0,1,MAX CELL-1


T1_NAME == TTAG;   T2==RECORD(ADDR(T1));   TAG==T2_NAME

open input(1, "test.hal")
open output(1, "out1.txt")
open output(2, "out2.txt")
SELECT INPUT(1);   SELECT OUTPUT(2)
NEWLINES(3)
ASL=0
%CYCLE

%EXIT %IF READ LINE=1
SKIP SPACES
%WHILE LINE(LPTR)#NL %CYCLE

CORD=0;   IN1=0;   IN2=0;   IN3=0
GET TAG
%WHILE TYPE=UNKNOWN %AND LINE(LPTR)=':' %CYCLE
   ERROR(1,2) %AND ->END %IF PPTR=MAX LABS
   PENDING(PPTR)=VALUE;   PPTR=PPTR+1
   LPTR=LPTR+1;   GET TAG
%REPEAT
%IF TYPE=MEMORY %AND VALUE>=0 %THEN TYPE=DEST %AND   %C
   IN3=VALUE&K'377'!2<<11 %AND VALUE=5<<8
%IF DEST<=TYPE<=SP %START
    FILL IN(CONST,CLOC)
   INST=VALUE&(MEM MASK!DEST MASK)
   %IF LINE(LPTR)#'=' %THEN ERROR(5,1) %AND ->END
   %CYCLE
      LPTR=LPTR+1
      GET TAG
      %EXIT %UNLESS LINE(LPTR)='='
      %IF TYPE=MEMORY %AND VALUE>=0 %THEN TYPE=DEST %AND  %C
         IN2=VALUE&K'377'!2<<11 %AND VALUE=5<<8
      %IF TYPE=MEM %START
         %IF INST&MEM MASK=0 %THEN INST=INST!VALUE %ELSE ERROR(5,2) %AND ->END
      %FINISH %ELSE %IF TYPE=DEST %OR TYPE=SP %START
         %IF INST&DEST MASK=0 %THEN INST=INST!VALUE&DEST MASK %AND %CONTINUE
         %IF (VALUE&DEST MASK)>>8=SPM %AND INST&DEST MASK=BREG %THEN  %C
           INST=INST!VALUE %AND %CONTINUE
         %IF VALUE&DEST MASK=BREG %AND (INST&DEST MASK)>>8=SPM %THEN  %C
            INST=INST!BREG  %C
         %ELSE ERROR(5,3) %AND ->END
      %FINISH %ELSE ERROR(5,4) %AND ->END
   %REPEAT
   COUNT=GET EXPRESSION(1);   ->END %IF COUNT=-1
   COUNT=COUNT&K'377' %IF COUNT>>13=0
   %IF COUNT=-2 %THEN COUNT=(INST+1)&15 %AND J=-2 %ELSE J=-1
   I=(INST&DEST MASK)>>8
   IN2=1<<8!COUNT %AND COUNT=3<<13!9<<4 %IF BREG NEEDED
   INST=INST!COUNT
   %IF TYPE=-1 %AND MATCH(INCMAR,0,10,10,1) %START
      %IF INST&MEM MASK=0 %THEN INST=INST!3<<11 %ELSE ERROR(5,5) %AND ->END
      GET TAG
   %FINISH
   %IF TYPE=KEYWORD %AND VALUE=IF %START
      K=LAST
      COUNT=0;   COUNT=1 %IF IN1#0;   COUNT=COUNT+1 %IF IN2#0
      COUNT=COUNT+1 %IF IN3#0
      I=CONDITION(0,COUNT+1,I);   ->END %IF I=-1
      LAST=K
   %FINISH
   CODE DUMP(IN1,-1) %IF IN1#0
   %IF IN2#0 %START
      CODE DUMP(IN2,J);   J=-1 %AND LIST(LAST)_DATA=(CLOC-1)&K'1777' %IF J=-2
   %FINISH
   CODE DUMP(IN3,-1) %IF IN1#IN3#0
   LIST(LAST)_DATA=CLOC %IF J=-2
   CODE DUMP(INST,J)
%FINISH %ELSE %IF TYPE=KEYWORD %AND JUMP<=VALUE<=REPEAT %START
   FILL IN(CONST,CLOC)
   ->KEY(VALUE)
KEY(JUMP):IN1=0
   GET TAG
   %IF TYPE=KEYWORD %AND PAGE0<=VALUE<=PAGE3 %START
      ERROR(6,2) %AND ->END %IF LINE(LPTR)#':'
      INST=(VALUE-PAGE0)<<11
      LPTR=LPTR+1;   GET TAG
      COUNT=1
   %FINISH %ELSE INST=CLOC<<3&MEM MASK %AND COUNT=0
   I=GET EXPRESSION(0);   ->END %IF I=-1
   %IF I=-2 %THEN I=INST>>3 %AND J=-2 %ELSE J=-1
   %IF 2<=I>>13<=3 %THEN INST=INST!I+4<<13 %ELSE %START
      I=CONVERT(I)
      %IF INST&MEM MASK#I&MEM MASK %START
         ERROR(6,1) %AND ->END %IF COUNT=1
         INST=0
      %FINISH
      INST=INST!4<<13!I
   %FINISH
   %IF TYPE=KEYWORD %AND VALUE=IF %START
      K=LAST
      %IF IN1=0 %START
         %IF J=-2 %THEN LAST=-2-LAST %AND I=CONDITION(1,INST!1<<10,LAST) %ELSE  %C
            I=CONDITION(1,INST,I)
         %IF I=-1 %THEN ->END %ELSE ->TERM
      %FINISH %ELSE %START
        %IF IN1=0 %THEN COUNT=0 %ELSE COUNT=1
         I=CONDITION(0,COUNT+1,I);   ->END %IF I=-1
      %FINISH
      LAST=K
   %FINISH
   CODE DUMP(IN1,-1) %IF IN1#0
   LIST(LAST)_DATA=CLOC %IF J=-2
   CODE DUMP(INST!1<<8,J)
   ->TERM
KEY(IF):ERROR(1,4) %AND ->END %IF SPTR=NEST MAX
   SPTR=SPTR+1;   NEST(SPTR)_TYPE=1
   NEST(SPTR)_VAL1=-1;   NEST(SPTR)_VAL2=-1
   I=CONDITION(0,4<<13!1<<10,NEST(SPTR)_VAL2)
   NEST(SPTR)_VAL2=-1 %AND ->END %IF I=-1
   NEST(SPTR)_VAL1=-1
   ->TERM
KEY(ELSE):ERROR(8,2) %AND ->END %IF SPTR=0 %OR NEST(SPTR)_TYPE#1 %OR  %C
      NEST(SPTR)_VAL2=-1
   NEST(SPTR)_VAL1=CELL(CLOC,NEST(SPTR)_VAL1)
   CODE DUMP(4<<13!1<<8,-2)
   ASSIGN(CLOC,NEST(SPTR)_VAL2,1)
   GET TAG
   %IF TYPE=KEYWORD %AND VALUE=IF %START
      NEST(SPTR)_VAL2=-1
      I=CONDITION(0,4<<13!1<<10,NEST(SPTR)_VAL2)
      NEST(SPTR)_VAL2=-1 %AND ->END %IF I=-1
   %FINISH %ELSE NEST(SPTR)_VAL2=-1
   ->TERM
KEY(FINISH):ERROR(8,2) %AND ->END %IF SPTR=0 %OR NEST(SPTR)_TYPE#1
   ASSIGN(CLOC,NEST(SPTR)_VAL1,1) %IF NEST(SPTR)_VAL1#-1
   ASSIGN(CLOC,NEST(SPTR)_VAL2,1) %IF NEST(SPTR)_VAL2#-1
   SPTR=SPTR-1
   GET TAG
   ->TERM
KEY(CYCLE):ERROR(1,4) %AND ->END %IF SPTR=NEST MAX
   SPTR=SPTR+1;   NEST(SPTR)_TYPE=2
   NEST(SPTR)_VAL1=CLOC;   NEST(SPTR)_VAL2=-1
   GET TAG
   ->TERM
KEY(WHILE):ERROR(1,4) %AND ->END %IF SPTR=NEST MAX
   SPTR=SPTR+1;   NEST(SPTR)_TYPE=2
   NEST(SPTR)_VAL1=CLOC
   NEST(SPTR)_VAL2=-1
   I=CONDITION(0,4<<13!1<<10,NEST(SPTR)_VAL2)
   NEST(SPTR)_VAL2=-1 %AND ->END %IF I=-1
   ->TERM
KEY(REPEAT):ERROR(8,3) %AND ->END %IF SPTR=0 %OR NEST(SPTR)_TYPE#2
   GET TAG
   %IF TYPE=KEYWORD %AND VALUE=IF %START
      I=CONDITION(1,4<<13!CONVERT(NEST(SPTR)_VAL1),I);   ->END %IF I=-1
   %FINISH %ELSE CODE DUMP(4<<13!1<<8!CONVERT(NEST(SPTR)_VAL1),-1)
   ASSIGN(CLOC,NEST(SPTR)_VAL2,1) %IF NEST(SPTR)_VAL2#-1
   SPTR=SPTR-1
%FINISH %ELSE %IF TYPE=MACRO %START
   ERROR(1,6) %AND ->END %IF MACLEV=MACMAX
   MSTACK(MACLEV+1)_PTR=VALUE
   MSTACK(MACLEV+1)_PARS(I)=-1 %FOR I=1,1,PARMAX
   MSTACK(MACLEV+1)_TPTR=MTPTR
   %CYCLE I=1,1,PAR MAX
      %EXIT %IF LINE END %OR TEST IF
       %IF LINE(LPTR)#',' %START
         MSTACK(MACLEV+1)_PARS(I)=MTPTR;   J=0
         %WHILE LINE(LPTR)#NL %CYCLE
            %EXIT %UNLESS J=1 %OR ('!'#LINE(LPTR)#';' %AND %NOT TEST IF)
            %IF LINE(LPTR)='[' %AND J=0 %START
               J=1
            %FINISH %ELSE %IF LINE(LPTR)=']' %AND J=1 %START
               J=0
            %FINISH %ELSE %START
               ->END %UNLESS (J=0 %AND LINE(LPTR)=' ') %OR MSTORE(LINE(LPTR))
            %FINISH
            LPTR=LPTR+1
            LPTR=LPTR+1 %AND %EXIT %IF J=0 %AND LINE(LPTR)=','
         %REPEAT
         ->END %UNLESS MSTORE(255)
         ERROR(7,4) %AND ->END %IF J=1
      %FINISH %ELSE LPTR=LPTR+1
   %REPEAT
   GET TAG
   %IF TYPE=KEYWORD %AND VALUE=IF %START
      MSTACK(MACLEV+1)_COND=-1
      I=CONDITION(0,5<<13!1<<10,MSTACK(MACLEV+1)_COND);   ->END %IF I=-1
   %FINISH %ELSE MSTACK(MACLEV+1)_COND=-1
   %IF LINE(LPTR)='!' %START
      LPTR=LPTR+1 %UNTIL LINE END
   %FINISH
   ERROR(7,1) %AND ->TERM %UNLESS LINE(LPTR)=NL
   SPACES(13) %AND PRINT LINE %IF LS=1 %AND MACLEV=0 %AND PRINT=0
   MACLEV=MACLEV+1
%FINISH %ELSE %IF TYPE=-1 %AND LINE(LPTR)='$' %START
   LPTR=LPTR+1;   GET TAG
   ->KEY(VALUE) %IF TYPE=KEYWORD %AND CTRL<=VALUE<=LST
   ->KEY(VALUE-IF+AIF) %IF TYPE=KEYWORD %AND IF<=VALUE<=FINISH
   ERROR(9,1);   ->END
KEY(CTRL):GET TAG;   I=GET ASS EXPR
   ->END %IF I=-1
   CLOC=I&1023
   ->TERM
KEY(DTA):GET TAG;   I=GET ASS EXPR
   ->END %IF I=-1
   DLOC=I&1023
   ->TERM
KEY(DEF):%CYCLE
      GET TAG
      ERROR(9,2) %AND ->END %UNLESS POSN>=0 %AND LINE(LPTR)='='
      I=POSN
      ASSIGN(0,TAG(I)_VALUE,0) %IF TYPE=UNKNOWN
      LPTR=LPTR+1;   GET TAG
      ERROR(9,3) %AND ->END %IF TYPE=UNKNOWN
      %IF TYPE=CONST %START
         VALUE=GET ASS EXPR;   ->END %IF VALUE=-1
         TYPE=CONST
      %FINISH
      TAG(I)_TYPE=TYPE;   TAG(I)_VALUE=VALUE
      %EXIT %UNLESS LINE(LPTR)=','
      LPTR=LPTR+1
   %REPEAT
   GET TAG
   ->TERM
KEY(MAC):GET TAG
   ERROR(9,4) %AND ->END %IF TYPE#UNKNOWN
   TAG(VALUE)_TYPE=MACRO;   TAG(VALUE)_VALUE=MTPTR
   COUNT=0
   %CYCLE
      SKIP SPACES;   %EXIT %IF LINE END
      COUNT=COUNT+1
      IDENTIFIER(PARAM(COUNT)_NAME,PARAM(COUNT)_LEN)
       SKIP SPACES
      %EXIT %UNLESS LINE(LPTR)=','
      LPTR=LPTR+1
      ERROR(1,5) %AND ->END %IF COUNT=PARMAX
   %REPEAT
   ERROR(7,1) %UNLESS LINE END
   %CYCLE
      %IF LINE(LPTR)=NL %START
         SPACES(13) %AND PRINT LINE %IF LS>0
         ERROR(8,1) %AND %STOP %IF READ LINE=1
      %FINISH %ELSE LPTR=LPTR+1
      J=LPTR
      SKIP SPACES
      %IF LINE(LPTR)='$' %START
         LPTR=LPTR+1;   GET TAG
         %IF TYPE=KEYWORD %START
            ERROR(9,5) %AND ->END %IF VALUE=MAC
            %EXIT %IF VALUE=MEND
         %FINISH
      %FINISH
      LPTR=J
      %CYCLE
         %CYCLE I=1,1,COUNT
            %IF MATCH(PARAM(I)_NAME,0,PARAM(I)_LEN,6,0) %START
               %IF MSTORE(1<<7!I) %THEN ->ESC %ELSE ->END
            %FINISH
         %REPEAT
         ->END %UNLESS MSTORE(LINE(LPTR))
         %EXIT %IF LINE END;   LPTR=LPTR+1
   ESC:%REPEAT
   %REPEAT
   SPACES(13) %AND PRINT LINE %IF LS>0
   ->END %UNLESS MSTORE(255)
   GET TAG
   ->TERM
KEY(LST):GET TAG;   I=GET ASS EXPR
   ERROR(9,6) %AND ->END %UNLESS 0<=I<=4
   LS=I
   ->TERM
KEY(AIF):ERROR(9,7) %AND ->END %UNLESS TOELSE=0
   GET TAG;   I=TYPE
   %IF TYPE=CONST %START
      J=GET ASS EXPR;   ->END %IF J=-1
   %FINISH %ELSE J=VALUE
   ERROR(9,8) %AND ->END %IF '='#LINE(LPTR)#'#'
   COUNT=LINE(LPTR)
   LPTR=LPTR+1;   GET TAG;   I=TYPE-I
   %IF TYPE=CONST %START
      VALUE=GET ASS EXPR;   ->END %IF VALUE=-1
   %FINISH
   J=VALUE-J
   %IF (COUNT='=' %AND I=J=0) %OR (COUNT='#' %AND %NOT I=J=0) %START
      TOELSE=1
      GET TAG
      ->TERM
   %FINISH
   ERROR(7,1) %UNLESS LINE END
   SPACES(13) %AND PRINT LINE %IF LS>0
   SKIP TEXT(1)
   GET TAG
   ->TERM
KEY(AELSE):ERROR(9,9) %AND ->END %UNLESS TOELSE=1;   TOELSE=0
   ERROR(7,1) %UNLESS LINE END
   SPACES(13) %AND PRINT LINE %IF LS>0
   SKIP TEXT(0)
   GET TAG
   ->TERM
KEY(AFINISH):ERROR(9,9) %AND ->END %UNLESS TOELSE>0;   TOELSE=0
   GET TAG
%FINISH %ELSE %IF TYPE#-1 %OR (LINE(LPTR)#'!' %AND %NOT LINE END) %START
   CORD=1;   FILL IN(MEMORY,DLOC)
   LIST(TAG(VALUE)_VALUE)_DATA=DLOC+1024 %IF TYPE=UNKNOWN
   %CYCLE
      I=GET ASS EXPR;   ->END %IF I=-1
      I=I&K'377' %UNLESS I=-2
      %IF TYPE=-1 %AND LINE(LPTR)='(' %START
         ERROR(2,2) %AND ->END %IF I=-2
         LPTR=LPTR+1;   GET TAG
         COUNT=GET ASS EXPR;   ->END %IF COUNT=-1
         %IF TYPE=-1 %AND LINE(LPTR)#')' %THEN ERROR(7,2) %AND ->END
         LPTR=LPTR+1;   GET TAG
      %FINISH %ELSE COUNT=1
      DATA DUMP(I,-1) %FOR VALUE=1,1,COUNT
      %EXIT %UNLESS TYPE=-1 %AND LINE(LPTR)=','
      LPTR=LPTR+1;   GET TAG
   %REPEAT
%FINISH
TERM:ERROR(7,1) %IF TYPE#-1 %OR (LINE(LPTR)#'!' %AND %NOT LINE END)
END:LPTR=LPTR+1 %WHILE %NOT LINE END
%EXIT %IF LINE(LPTR)=NL
LPTR=LPTR+1

%REPEAT

 
SPACES(13) %AND PRINT LINE %IF (LS>1 %OR (LS=1 %AND MACLEV=0)) %AND PRINT=0
%REPEAT

NEWLINE
ERROR(8,3+NEST(SPTR)_TYPE) %AND SPTR=SPTR-1 %WHILE SPTR>0
%CYCLE I=0,1,255
   %IF TAG(I)_TYPE=UNKNOWN %AND TAG(I)_NAME(0)#0 %START
      FAULTS=FAULTS+1
      J=0
      PRINT SYMBOL(TAG(I)_NAME(J)) %AND J=J+1 %WHILE TAG(I)_NAME(J)#0
      PRINT STRING(" UNDEFINED");   NEWLINE
   %FINISH
%REPEAT
NEWLINES(2)

SELECT OUTPUT(0);   NEWLINE
%IF FAULTS>0 %START
   PRINT STRING("PROGRAM CONTAINS");   WRITE(FAULTS,0)
   PRINT STRING(" FAULTS");   NEWLINE
%FINISH %ELSE %START
   PRINT STRING("ASSEMBLY SUCCESSFUL");   NEWLINE
   SELECT OUTPUT(1)
   DUMP(7<<13)
   COUNT=0
   %CYCLE I=0,1,1023
      %IF CONTROL(I)#K'160000' %START
         DUMP(6<<13!CONVERT(I)) %AND COUNT=1 %IF COUNT=0
         DUMP(CONTROL(I))
      %FINISH %ELSE COUNT=0
   %REPEAT
   COUNT=0
   %CYCLE I=0,1,1023
      %IF DATA(I)#-1 %START
         DUMP(4<<13!CONVERT(I)) %AND COUNT=1 %IF COUNT=0
         DUMP(DATA(I))
      %FINISH %ELSE COUNT=0
   %REPEAT
   DUMP(7<<13)
%FINISH



%ENDOFPROGRAM
