%BEGIN;  !DECODE
%OWNINTEGER POS,LINE,ICOUNT,DCOUNT,LCOUNT,SECTION
%OWNINTEGER LMAX,TMAX,TEXT,FIRST
%INTEGER CODE,N1,N2,N3,N4,NUMS
%OWNINTEGERARRAY TAB(1:50) = %C
    40_SZL,8_741400, 40_SPA,8_741100, 40_SNA,8_741200, 40_SKP,8_741000,
    40_SNL,8_740400, 40_SMA,8_740100, 40_SZA,8_740200, 40_STL,8_744002,
    40_RCL,8_744010, 40_RCR,8_744020, 40_CLL,8_744000, 40_CLC,8_750001,
    40_LAS,8_750004, 40_CLA,8_750000, 40_CMA,8_740001, 40_CML,8_740002,
    40_RTL,8_742010, 40_RTR,8_742020, 40_RAL,8_740010, 40_RAR,8_740020,
    40_OAS,8_740004, 40_HLT,8_740040, 40_NOP,8_740000
%INTEGERARRAY LVAL(1:1000)
%SWITCH C(0:47)

%ROUTINE READ ITEM
%ROUTINE READ(%INTEGERNAME N)
%INTEGER SHIFT,SIGN
    N = 0;  SHIFT = 0;  SIGN = 0
1:  READ SYMBOL(CODE)
    %IF CODE = '-' %THEN %START
        SIGN = 1;  ->1
    %FINISH
    %IF '0' <= CODE <= '?' %THEN %START
        N = (CODE&15)<<SHIFT+N
        SHIFT = SHIFT+4
        ->1
    %FINISH
    N = -N %IF SIGN # 0;  NUMS = NUMS+1
%END
    NUMS = 0
1:  READ(N1)
    %RETURN %UNLESS CODE = ' '
    N4 = N3;  N3 = N2;  N2 = N1
    ->1
%END

%ROUTINE PSYM(%INTEGER K)
    PRINT SYMBOL(K);  POS = POS+1
%END

%ROUTINE WRITE(%INTEGER V,P)
%INTEGER SIGN,D
%ROUTINE TRY(%INTEGER N)
    ->3 %IF N = -1
    D = 0
1:  ->2 %IF V+N < 0;  V = V+N;  D = D+1;  ->1
2:  ->4 %IF SIGN = 0 %OR D # 0
    P = P+1
    %RETURN
3:  D = V
4:  %IF SIGN # 0 %THEN %START
        %IF P-6 > 0 %THEN %START
            SPACES(P-6);  POS = POS+P-6
        %FINISH
        PSYM(SIGN) %IF SIGN # ' '
        SIGN = 0
    %FINISH
    PSYM(D+'0')
%END
    SIGN = ' '
    ->1 %IF V >= 0;  V = -V;  SIGN = '-'
1:  TRY(-100000);  TRY(-10000);  TRY(-1000)
    TRY(-100);  TRY(-10);  TRY(-1)
%END

%ROUTINE COUNT(%INTEGER K)
    %IF SECTION=0 %THEN ICOUNT=ICOUNT+1 %ELSE DCOUNT=DCOUNT+1
    %IF FIRST = 1 %THEN %START
        SPACES(9-POS) %AND POS = 9 %IF POS < 9
        FIRST = 0
        %RETURN
    %FINISH
    %IF POS <= 60 %THEN %START
        PSYM(';');  PSYM(' ');  PSYM(K) %IF K # 0
    %FINISH %ELSE %START
        NEWLINE;  SPACES(9);  POS = 9
    %FINISH
%END

%ROUTINE PRINT(%INTEGER X)
%INTEGER I,J,K
%ROUTINE PR(%INTEGER D)
    %IF D<10 %THEN D=D+'0' %ELSE D=D-10+'A'
    PRINT SYMBOL(D)
%END
    J = X//40;  K = X-40J
    I = J//40;  J = J-40I
    PR(I);  PR(J);  PR(K)
    POS = POS+3
%END

%ROUTINE TRANSLATE(%INTEGER V)
%INTEGER I,J,U
    U = 0
    %CYCLE I = 2,2,50
        J = TAB(I)
        %IF \V&J = 0 %AND \U&J # 0 %THEN %START
            PSYM('!') %IF U # 0 %AND \32767&J = \32767
            PRINT(TAB(I-1))
            U = U!J;  %RETURN %IF U = V
        %FINISH
    %REPEAT
    PSYM(' ');  WRITE(\U&V,4)
%END

%ROUTINE JMS(%INTEGER T)
%SWITCH SUB(4:56)
    ->SUB(T)
SUB(4):  %PRINTTEXT 'MON';  ->P3
SUB(5):  %PRINTTEXT 'NEST'; ->P4
SUB(6):  %PRINTTEXT 'LE'; ->P2
SUB(7):  %PRINTTEXT 'GE'; ->P2
SUB(8):  %PRINTTEXT 'AREF'; ->P4
SUB(9):  %PRINTTEXT 'ADEC'; ->P4
SUB(10): %PRINTTEXT 'SHIFT'; ->P5
SUB(11): %PRINTTEXT 'OR'; ->P2
SUB(12): %PRINTTEXT 'MULT'; ->P4
SUB(13): %PRINTTEXT 'IDIV'; ->P4
SUB(14): %PRINTTEXT 'DIV'; ->P3
SUB(15): %PRINTTEXT 'EXP'; ->P3
SUB(16): %PRINTTEXT 'ENTRY'; ->P5
SUB(17): %PRINTTEXT 'FTRAP'; ->P5
SUB(18): %PRINTTEXT 'DA'; ->P2
SUB(19): %PRINTTEXT 'S';  ->P6
SUB(20): %PRINTTEXT 'BAR';  ->P3
SUB(21): %PRINTTEXT 'BGET';  ->P4
SUB(22): %PRINTTEXT 'BPUT';  ->P4
SUB(23): %PRINTTEXT 'W';  ->P6
SUB(24): %PRINTTEXT 'X';  ->P6
SUB(25): %PRINTTEXT 'PTEXT';  TEXT = 1;  ->P5
SUB(26): %PRINTTEXT 'Z';  ->P6
SUB(27): %PRINTTEXT 'NL';  ->P2
SUB(28): %PRINTTEXT 'ADDR';  ->P4
SUB(29): %PRINTTEXT 'INT'; ->P3
SUB(30): %PRINTTEXT 'SELIN';  ->P5
SUB(31): %PRINTTEXT 'SELOUT';  ->P6
SUB(32): %PRINTTEXT 'READCH';  ->P6
SUB(33): %PRINTTEXT 'PRINCH';  ->P6
SUB(34): %PRINTTEXT 'NSYM';  ->P4
SUB(35): %PRINTTEXT 'RSYM';  ->P4
SUB(36): %PRINTTEXT 'SSYM';  ->P4
SUB(37): %PRINTTEXT 'PSYM';  ->P4
SUB(38): %PRINTTEXT 'NLINE';  ->P5
SUB(39): %PRINTTEXT 'NLINES';  ->P6
SUB(40): %PRINTTEXT 'SPACE';  ->P5
SUB(41): %PRINTTEXT 'SPACES';  ->P6
SUB(42): %PRINTTEXT 'READ';  ->P4
SUB(43): %PRINTTEXT 'WRITE';  ->P5
SUB(44): %PRINTTEXT 'CLIN'; ->P4
SUB(45): %PRINTTEXT 'CLOUT'; ->P5
SUB(46): %PRINTTEXT 'RDA'; ->P3
SUB(47): %PRINTTEXT 'WDA'; ->P3
SUB(48): %PRINTTEXT 'INSTR'; ->P5
SUB(49): %PRINTTEXT 'OUTSTR'; ->P6
SUB(50): %PRINTTEXT 'INDEV'; ->P5
SUB(51): %PRINTTEXT 'OUTDEV'; ->P6
SUB(52): %PRINTTEXT 'INPUT'; ->P5
SUB(53): %PRINTTEXT 'PROMPT'; ->P6
SUB(54): %PRINTTEXT 'FREE'; ->P4
SUB(55): %PRINTTEXT 'TINT';  ->P4
SUB(56): %PRINTTEXT 'OUTPOS';  ->P6
P6: POS = POS+1
P5: POS = POS+1
P4: POS = POS+1
P3: POS = POS+1
P2: POS = POS+2
%END
%ROUTINE TAG(%INTEGER X)
    COUNT(' ')
    PRINT(X)
    PSYM(' ')
    %IF X=40_JMS %AND 4<=N1<=56 %THEN JMS(N1) %ELSE WRITE(N1,1)
%END

%ROUTINE IND(%INTEGER X)
    COUNT(' ')
    PRINT(X)
    PSYM('*');  PSYM(' ')
    %IF X=40_JMS %AND N1=4 %THEN PRINT(40_MON) %ELSE WRITE(N1,1)
%END

%ROUTINE LIT(%INTEGER X)
%INTEGER I
    COUNT(' ')
    PRINT(X)
    PSYM(' ');  PSYM('#')
    WRITE(N1,1)
    LCOUNT = LCOUNT+1
    %CYCLE I = 1,1,LMAX
        %RETURN %IF LVAL(I) = N1
    %REPEAT
    LMAX = LMAX+1;  LVAL(LMAX) = N1
%END

%ROUTINE TRANS OPR(%INTEGER I)
    COUNT(' ')
    TRANSLATE(8_740000+I)
%END

    %IF NEXT SYMBOL = ' ' %THEN %START
        READ SYMBOL(CODE) %UNTIL CODE = ';' %OR CODE = NL
    %FINISH
1:  NEWLINE;  FIRST = 1;  LINE = LINE+1
    WRITE(LINE,3);  SPACES(2);  POS = 5
    %FAULT 9 ->2;  SELECT INPUT(2)
    READ SYMBOL(CODE) %AND PRINT SYMBOL(CODE) %UNTIL CODE = NL
    SPACES(5)
2:  %FAULT 9 ->99;  SELECT INPUT(1)
3:  READ ITEM
    ->1 %IF CODE = NL
    ->C(CODE&63)
C(0):  TAG(40_ADA);  ->3
C(1):  TAG(40_DAC);  ->3
C(2):  TAG(40_JMS);  ->3
C(3):  TAG(40_DZM);  ->3
C(4):  TAG(40_LAC);  ->3
C(5):  TAG(40_XOR);  ->3
C(6):  TAG(40_ADD);  ->3
C(7):  TAG(40_TAD);  ->3
C(8):  TAG(40_XCT);  ->3
C(9):  TAG(40_ISZ);  ->3
C(10): TAG(40_AND);  ->3
C(11): TAG(40_SAD);  ->3
C(12): TAG(40_JMP);  ->3
C(13): TAG(40_EAE);  ->3
C(14): TAG(40_IOT);  ->3
C(15): TRANS OPR(N1);  ->3
C(16): TAG(40_ADR);  ->3
C(17): IND(40_DAC);  ->3
C(18): IND(40_JMS);  ->3
C(19): IND(40_DZM);  ->3
C(20): IND(40_LAC);  ->3
C(21): IND(40_XOR);  ->3
C(22): IND(40_ADD);  ->3
C(23): IND(40_TAD);  ->3
C(24): IND(40_XCT);  ->3
C(25): IND(40_ISZ);  ->3
C(26): IND(40_AND);  ->3
C(27): IND(40_SAD);  ->3
C(28): IND(40_JMP);  ->3
C(29): TAG(40_DAD);  ->3
C(30): TAG(40_C30);  ->3
C(31): TAG(40_LAD);  ->3
C(32): TAG(40_C32);  ->3
C(33): PSYM('!');  ->4
C(34): TAG(40_C34);  ->3
C(35): COUNT(0)
    %IF TEXT = 0 %THEN WRITE(N1,1) %ELSE %START
        PSYM('''');  PSYM(N1>>7&127)
        PSYM(N1&127) %IF N1&127 # 0;  PSYM('''')
        TEXT = 0 %IF N1 < 0
    %FINISH
    ->3
C(36): LIT(40_LAC);  ->3
C(37): LIT(40_XOR);  ->3
C(38): LIT(40_ADD);  ->3
C(39): LIT(40_TAD);  ->3
C(40): PSYM('(');  POS = POS+1;  ->3
C(41): PSYM(')');  POS = POS+1;  WRITE(N1,1);  ->3
C(42): LIT(40_AND);  ->3
C(43): LIT(40_SAD);  ->3
C(44): PSYM(',');  ->4
C(45): TAG(40_C45);  ->3
C(46): NEWLINE %AND POS = 0 %IF POS > 5
    SPACES(5-POS);  POS = 5
    WRITE(N1,1)
    %IF NUMS = 1 %THEN %START
        PSYM(':');  SPACES(9-POS);  POS = 9
    %FINISH %ELSE %START
        PSYM('_');  WRITE(N2,1);  PSYM(':')
    %FINISH
    FIRST = 1
    TMAX = N1 %IF TMAX < N1 < 210
    ->3
C(47): PSYM('/');  SECTION = SECTION!!1;  ->3
4:  WRITE(N1,1);  WRITE(N2,7) %IF N2 # 0
    WRITE(N3,7) %IF N3 # 0
    WRITE(N4,7) %IF N4 # 0
    ->3
99: %PRINTTEXT '$$$$$'
    NEWLINES(2)
    %PRINTTEXT 'INSTRUCTIONS:';  WRITE(ICOUNT,9);  NEWLINE
    %PRINTTEXT 'DATA SLOTS:';  WRITE(DCOUNT,11);  NEWLINE
    %PRINTTEXT 'LITERALS:'; WRITE(LCOUNT,13);  NEWLINE
    %PRINTTEXT 'DISTINCT LITERALS:';  WRITE(LMAX,4);  NEWLINE
    %PRINTTEXT 'MAXIMUM TAG:';  WRITE(TMAX,10);  NEWLINE
    NEWLINE
%ENDOFPROGRAM

