!* MODIFIED 10/08/77 08.00 !* OWNINTEGER INMARG1=1, INMARG2=72, OUTMARG1=1, OUTMARG2=120 OWNINTEGER CONTROL;! 0 INCLUDE CONTROL CHARS IN LENGTH,1 EXCLUDE OWNBYTEINTEGERARRAY INPUTBUFF(0:160) OWNBYTEINTEGERARRAY RCHBUFF(0:160) OWNINTEGER PTR=1 CONSTBYTEINTEGERARRAY OTRTAB(0:127)=C 26(10),10,26(14),25,26,26(5), 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, 96,97,98,99,100,101,102,103,104,105,106,107,108,109, 110,111,112,113,114,115,116,117,118,119, 120,121,122,123,124,125,126,26; CONSTBYTEINTEGERARRAY ITRTAB(0:127)=C X'80'(10),10,X'80'(14),25,26,X'80'(5), 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, 48,49,50,51,52,53,54 ,55,56,57,58,59,60,61,62,63, 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79, 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95, 96,97,98,99,100,101,102,103,104,105,106,107,108,109, 110,111,112,113,114,115,116,117,118,119, 120,121,122,123,124,125,126,X'80'; OWNBYTEINTEGERARRAY OUTPUTBUFF(0:132)=10,0(132) OWNINTEGER OUTPTR=1 OWNINTEGER NLFLAG=1 OWNINTEGER SUBCHAR=0 OWNINTEGER EMFLAG=0 SYSTEMROUTINESPEC SIM2(INTEGER EP, R1, R2,INTEGERNAME R3) ROUTINESPEC OUTPUTRECORD SYSTEMINTEGERFN IOCP(INTEGER EP, N) SYSTEMROUTINESPEC SIGNAL(INTEGER EP, WT, EXTRA, INTEGERNAME FLAG) INTEGER FLAGS, FLAG, I, LENGTH, X, Q, L, CH, F SWITCH SW(1:20) UNLESS 1<=EP<=19 THEN SIGNAL(2,148,0,FLAG) AND STOP ->SW(EP) SW(1): ! READ SYMBOL(X) IF NLFLAG=1 THEN X=IOCP(6,0) AND NLFLAG=0 UNTIL X#X'80' CYCLE X=INPUTBUFF(PTR) P TR=PTR+1 REPEAT IF X=NL THEN NLFLAG=1 RESULT =X SW(2): ! X=NEXT SYMBOL IF NLFLAG=1 THEN X=IOCP(6,0) AND NLFLAG=0 WHILE INPUTBUFF(PTR)=X'80' THEN PTR=PTR+1 RESULT =INPUTBUFF(PTR) SW(3): ! PRINT SYMBOL(N) IF N=10 THEN ->OUTPUT OUTPUTBUFF(OUTPTR)=OTRTAB(N&X'7F') OUTPTR=OUTPTR+1 IF OUTPTR>OUTMARG2 THENSTART OUTPUTBUFF(OUTPTR)=10 OUTPUTRECORD FINISH END1: RESULT =0 SW(4): ! READ CH(X) SW(18): ! NEXT CH (FOR ALGOLE IF NLFLAG=1 THEN X=IOCP(6,0) AND NLFLAG=0 X=RCHBUFF(PTR) IF EP=18 THEN RESULT =X IF X=NL THEN NLFLAG=1 PTR=PTR+1 RESULT =X SW(5): ! PRINT CH(N) IF (N=10 OR N=12 OR N=13) T HEN START OUTPUT: OUTPUTBUFF(OUTPTR)=N IF CONTROL=0 THEN OUTPTR=OUTPTR+1 OUTPUTRECORD; OUTPUTBUFF(0)=N ->END2 FINISH OUTPUTBUFF(OUTPTR)=N OUTPTR=OUTPTR+1 IF OUTPTR>OUTMARG2 THEN START OUTPUTBUFF(OUTPTR)=10 OUTPUTRECORD; OUTPUTBUFF(0)=10 FINISH END2: RESULT =0 SW(6): ! LINE RECONSTRUCTION PTR=1 I F EMFLAG=1 THEN START SIGNAL(2,140,0,FLAG); STOP FINISH !******READ A RECORD INTO RCHBUFF****** SIM2(0,ADDR(RCHBUFF(1)),0,L) !******SET FIRST BYTES OF BUFFERS TO LENGTH OF RECORD****** IF L=0 THEN L=160 RCHBUFF(0)=L INPUTBUFF(0)=L !******TEST FOR EM IN INPUT RECORD****** IF RCHBUFF(PTR)=25 THEN START INPUTBUFF(0)=2; EMFLAG=1 INPUTBUFF(2)=10 INPUTBUFF(1)=25; ->JUMP FINISH !******THE FOLLOWING MARKS CHARACTERS NOT CONTAINED IN IMP CHAR SET**** !******WHILST COPYING RECORD FROM RCHBUFF INTO INPUTBUFF****** ! %CYCLE I=1,1,INPUTBUFF(0) ! X=RCHBUFF(I) ! %IF X=X'1A' %THEN SUBCHAR=1 ! INPUTBUFF(I)=ITRTAB(X) ! %REPEAT X=X'180000FF' *LD_INPUTBUFF; *INCA_=1 *LSD_RCHBUFF; *IAD_=1 *LDB_L; *STD_TOS *MV_L =DR ; ! COPY RCHBUFF TO INPUTBUFF *LD_TOS ; *LSS_ITRTAB+4; *LUH_X *STD_TOS ; *SWNE_L =DR ,128,26; ! CHECK FOR SUB *JCC_8,<NOSUB> *LB_=1; *STB_SUBCHAR NOSUB: *LD_TOS ; *TTR_L =DR IF (SUBCHAR=1 OR L=0) THEN ->JUMP !******FOLLOWING MARKS TO LEFT & RIGHT OF INMARG1 & INMARG2****** UNLESS INMARG1=1 THEN START CYCLE I=1,1,INMARG1-1 INPUTBUFF(I)=X'80' REPEAT FINISH IF INMARG2<L-1 THEN START CY CLE I=INMARG2+1,1,L-1 INPUTBUFF(I)=X'80' REPEAT L=INMARG2 FINISH !!******THE FOLLOWING CARRIES OUT THE DELETION RULES****** ! %CYCLE I=1,1,L ! Q=I ! %IF INPUTBUFF(Q)=34 %THEN %START ! INPUTBUFF(Q)=X'80' !BACK: %IF (Q-1)<1 %THEN ->NEXT2 ! %IF INPUTBUFF(Q-1)=X'80' %THEN Q=Q-1 %AND ->BACK ! INPUTBUFF(Q-1)=X'80' ! %FINISH !NEXT2: % REPEAT !******THE FOLLOWING MARKS TRAILING SPACES BEFORE NEWLINE****** ! %CYCLE I=L-1,-1,1 ! %IF INPUTBUFF(I)=32 %THEN INPUTBUFF(I)=X'80' ! %EXIT %UNLESS INPUTBUFF(I)=X'80' ! %REPEAT *LD_INPUTBUFF; *LB_L; *SBB_=1 DTRS: *LSS_(DR +B ); *ICP_=32 *JCC_7,<NOTSP> *LSS_=128; *ST_(DR +B ); *DEBJ_<DTRS> NOTSP: *ICP_=128; *JCC_7,<JUMP>; *DEBJ_<DTRS> !******RECONSTRUCTION NOW COMPLETE****** !******TEST FOR SUB CHAR IN INPUT****** JUMP: I=ADDR(INPUTBUFF(0)) IF SUBCHAR=1 THEN START SUBCHAR=0; SIGNAL(2,144,0,FLAG) STOP FINISH RESULT =I SW(15): ! RESTRICTED PRINTSTRING ! STRING MUST HAVE NO UNPRINTABLES ! OR CONTROLS (XCEPT LAST CHAR) ! AND MAY NOT EXCEED MARGINS X=X'180000FF' L=BYTE INTEGER(N) * LD_OUTPUTBUFF; *MODD_OUTPTR; ! TO RECEIVE STRING *LDB_L *STD_TOS ; *STD_TOS *LDA_N; *INCA_=1; *CYD_=0 *LD_TOS ; *MV_L =DR *LD_TOS ; *LSS_OTRTAB+4 *LUH_X; *TTR_L =DR *INCA_=-1 *LSS_(DR ); *ST_X OUTPTR=OUTPTR+L OUTPTR=OUTPTR-1 AND OUTPUT RECORD IF X=10 RESULT =0 ! ! CAN DELETE M-C CODE AND ALLOX SW(15) TO DROP THRO TO SW(7) ! IF REQUIRED FOR ALL IMP VERSION ! SW(7): ! PRIN T STRING(N) WHERE ! N IS ADDRESS OF STRING L=BYTEINTEGER(N) IF L=0 THEN RESULT =0 CYCLE I=1,1,L CH=BYTEINTEGER(I+N)&X'7F' IF CH=10 THEN OUTPUT RECORD ELSE START OUTPUTBUFF(OUTPTR)=OTRTAB(CH) OUTPTR=OUTPTR+1 IF OUTPTR>OUTMARG2 THEN OUTPUT RECORD FINISH REPEAT RESULT =0 SW(8): ! SELECT INPUT(N) INPUTBUFF(0)=0 EMFLAG=0; NLFLAG=1 SIM2(15,0,N,FLAGS) IF FLAGS<0 THEN START SIGNAL(2,152,0,FLAG) STOP FINISH INMARG1=(FLAGS>>8)&X'FF' INMARG2=FLAGS&X'FF' RESULT =0 SW(9): ! SELECT OUTPUT(N) OUTPUTRECORD UNLESS (OUTPUTBUFF(0)=10 AND OUTPTR=1) SIM2(15,1,N,FLAGS) IF FLAGS<0 THEN START SIGNAL(2,152,0,FLAG) STOP FINISH OUTMARG1=(FLAGS>>8)&X'FF' OUTMARG2=FLAGS&X'FF' IF OUTMARG2=0 THENSTART OUTMARG2=132 CONTROL=0 FINISHELSE CONTROL=1 RESULT =0 SW(10): ! ISOCARD(N) WHERE N IS THE ! ADDRESS OF BUFFER CARD READ INTO SIM2(0,ADDR(INPUTBUFF(0)),0,LENGTH) IF INPUTBUFF( 0)=25 THEN START SIGNAL(2,140,0,FLAG); STOP FINISH CYCLE I=0,1,LENGTH-2 BYTEINTEGER(N+I)=INPUTBUFF(I) REPEAT INPUTBUFF(0)=0 RESULT =0 SW(11): ! OUTPUT THE CURRENT RECORD UNLESS N=-2 THENSTART ;! EXCEPT SPECIAL OUTPUT INT CALL OUTPUTBUFF(OUTPTR)=10 IF CONTROL=0 THEN OUTPTR=OUTPTR+1 IF N>=0 THEN SIM2(1,ADDR(OUTPUTBUFF(0)) ,OUTPTR,F) EMFLAG=0; NLFLAG=1 INMARG1=1; INMARG2=72 FINISHELSE CONTROL=1;! TERMINATING CONTROL CHAR NOT IN LENGTH OUTMARG1=1; OUTMARG2=132 OUTPTR=1 OUTPUTBUFF(0)=10 RESULT =0 SW(12): ! SET INPUT MARGINS FLAGS=0 INMARG1=(N>>16)&X'FF' INMARG2=N&X'FF' SIM2(16,0,(INMARG1<<8)!INMARG2,FLAGS) RESULT =0 SW(13): ! SET OUTPUT MARGINS FLAGS=0 OUTMARG1=(N>>16)&X'FF' X=IOCP(5,10); ! OUTPUT NEWLINE OUTMARG2=N&X'FF' SIM2(16,1,(OUTMARG1<<8)!OUTMARG2,FLAGS) IF OUTMARG2=0 THENSTART OUTMARG2=132 CONTROL=0 FINISHELSE CONTROL=1 RESULT =0 SW(14): ! ADDRESS OF RECORD AS READ IN RESULT =ADDR(RCHBUFF(0)) SW(16): ! CLOSE STREAM(N) SIM2(17,N,0,FLAGS) RESULT =0 SW(17): ! REPEATED PRINT SYMBOL RESULT =0 IF N<0 OR N>>8=0 CYCLE I=1,1,N>>8 X=IOCP(3,N&127) REPEAT RESULT =0 SW(19): ! GET CURRNET MARGINS RESULT =((INMARG1<<8!INMARG2)<<8!OUTMARG1)<<8!OUTMARG2 SW(20): ! GET POSITION OF INPUT OR OUTPUT POINTER IF N=0 THEN RESULT =PTR;! INPUT POINTER RESULT =OUTPTR;! OUTPUT POINTER END ROUTINE OUTPUTRECORD INTEGER F, I SIM2(1,ADDR(OUTPUTBUFF(0)),OUTPTR,F) OUTPTR=OUTMARG1 OUTPUTBUFF(0)=10 I=1 WHILE I<OUTMARG1 THEN OUTPUTBUFF(I)=' ' AND I=I+1 END ENDOFFILE