%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)<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