%BEGIN %TRUSTEDPROGRAM %INTEGER I,J,K !*DELSTART %CONSTBYTEINTEGERARRAY OPC(0:120)=0, 8,9,X'10',X'11',X'12', X'13',X'20',X'21',X'22',X'23', X'30',X'31',X'32',X'33',X'24', X'34',0,X'45',X'46',X'47', X'54',X'55',X'56',X'57',X'58',X'59',X'5A',X'5B',X'5C', X'5D',X'5E',X'5F',X'68',X'69',X'6A', X'6B',X'6C',X'6D',X'6E',X'6F', X'78',X'79',X'7A',X'7B',X'7C', X'7D',X'7E',X'7F',0,X'70', X'60',X'50',X'4E',X'4F',X'4C', X'4B',X'4A',X'49',X'48',X'44', X'43',X'42',X'41',X'40',0, X'90',X'98',X'86',X'87',0, X'91',X'92',X'94',X'95',X'96', X'97',X'9C',X'9E',X'9D',X'9F', X'82',X'84',X'85',0,X'88', X'89',X'8A',X'8B',X'8C',X'8D', X'8E',X'8F',0,X'D0',X'D1', X'D2',X'D4',X'D5',X'D6',X'D7', X'D8',X'DC',X'DD',X'DE',X'DF', X'D3',0,X'F1',X'F2',X'F3', X'F8',X'F9',X'FA',X'FB',X'FC', X'FD',0,10,4,X'80'; %CONSTINTEGERARRAY NEM(0:120)=M'CNOP', M'SSK',M'ISK',M'LP',M'LN',M'LT', M'LC',M'LPD',M'LND',M'LTD',M'LCD', M'LPE',M'LNE',M'LTE',M'LCE',M'HD', M'HE',0,M'BAL',M'BCT',M'BC', 'N',M'CL','O','X','L','C','A','S','M','D', M'AL',M'SL',M'LD',M'CD',M'AD', M'SD',M'MD',M'DD',M'AW',M'SW', M'LE',M'CE',M'AE',M'SE',M'ME', M'DE',M'AU',M'SU',0,M'STE', M'STD',M'ST',M'CVD',M'CVB',M'MH', M'SH',M'AH',M'CH',M'LH',M'EX', M'IC',M'STC',M'LA',M'STH',0, M'STM',M'LM',M'BXH',M'BXLE',0, M'TM',M'MVI',M'NI',M'CLI',M'OI', M'XI',M'SDV',M'HDV',M'TDV',M'CKC', M'PC',M'WRD',M'RDD',0,M'SRL', M'SLL',M'SRA',M'SLA',M'SRDL',M'SLDL', M'SRDA',M'SLDA',0,M'SSP',M'MVN', M'MVC',M'NC',M'CLC',M'OC',M'XC', M'LSP',M'TR',M'TRT',M'ED',M'EDMK', M'MVZ',0,M'MVO',M'PACK',M'UNPK', M'ZAP',M'CP',M'AP',M'SP',M'MP', M'DP',0,M'SVC',M'SPM',M'IDL'; %CONSTBYTEINTEGERARRAY HASHALT(0:218)=20(33),6, 20(11),1,20(2),4(10),20(7),1(26),20(102), 20,7,2,9,1,13,20,20,5,20,20,7,1,20,17,1(4),20,5,20,6,20(3); !*DELEND %OWNINTEGERARRAY FIXED GLA(0:28)=0, X'30000000',0(2),-1,0,255,0(5), X'41100000',0,X'80000000',X'FFFFFF',0(2), X'4E000000',0,-4,-8,0(4),X'80000000',X'6492350',M'ERMA'; %CONSTSHORTINTEGERARRAY TSNAME (0:53)=10000(8), 10001,10000(5),10001,10032,10001(2),10032, 10000(2),2,1,32,10032(7),10000,11,21,10032(2),11,10000, 1,32,10000(2),5,10000,10005,11,5,10005,3,0,10000,1,2, 10001; %CONSTBYTEINTEGERARRAY BYTES(0:7)=4,1,2,8,4,1,2,8; %CONSTBYTEINTEGERARRAY GRMAP(0:14)=0,1,2,3,15,16,18,20,22, 4,5,6,7,8,14; %CONSTBYTEINTEGERARRAY PRECEDENCE (1:12)=0,3,3,3,3,4,4,4,4,5,5,5; %OWNBYTEINTEGERARRAY TRTABS (0:1283)=128(39), 1,255(8),0(10),255(7),0(26),255(6),255(26),255(133), 28(34),8,28,8,28(2),12,28(6),4,28,0(10), 28(8),24,28(8),32,28,20,28(4),36,28(5),16,28(167), 0(9),1,0(49),2,0(196), 0(10),12,0(21),8,20(4),16,20,4, 20(25),24(26),20(32),0,20,0,28,0,0, 0(10),12,0(21),0,20(4),16,20,4 , 20(25),24(26),20(32),0,20,0,28,0,0, 128(10),12,128(21),8,20(4),16,20,4, 20(25),0(26),20(32),20,20,20,28,128(2), 128(32),8,0,4,0,0,16,0,4, 0(25),0(26),0(32),0,0,0,28,128,128 %COMMENT TABLE 1 FOR NAMES --2 FOR CONSTS -- 3 FOR TEXT %COMMENT LAST 129 =TABLE FOR READ LINE KEY AS FOLLOWS. %COMMENT 0=ILLEGAL,4='''',8=SP,12=NL,16=%,20=NONALPHA,24=ALPHA %OWNBYTEINTEGERARRAY TYPEFLAG(1:6)=1,2, B'1001',B'10001',B'11010',5; %OWNSHORTINTEGERARRAY WARNINGS(0:30) %OWNINTEGER MASK1=X'0F0F0F0F' %OWNINTEGER MASK2=X'0F0F0F0F' %OWNINTEGER PI1=X'413243F6', PI2=X'A8885A31' %CONSTINTEGER RELEASE=9,VERSION=18 %CONSTSHORTINTEGER MAXLEVELS=11 %CONSTSHORTINTEGER PTBASE=256 %CONSTSHORTINTEGER SNPT=10006; ! SPECIALNAME PTYPE %CONSTINTEGER CODER=12 %CONSTINTEGER WSPR =11 %CONSTINTEGER GLA =13 %OWNINTEGER HH1=X'0047002F',HH2=X'00610035' ! ! THE FOLLOWING FUNNY WORDS ARE CYCLE CONTROL WORDS FOR SEARCHING THE ! LIST OF FREE REGISTERS. THE TOP HALF IS INC(SIGNED) AND THE BOTTOM ! TWO BYTES ARE START AND FINISH RESPECTIVELY ! %CONSTINTEGER GR0 =X'10F1E'; ! 15,1,14 %CONSTINTEGER GR1 =X'1010F'; ! 1,1,15 %CONSTINTEGER FR0 =X'FFFE1610';! 6,-2,0 %CONSTINTEGER ADDREG=X'FFFF0E01';! 14,-1,1 %CONSTINTEGER SAFE =X'FFFF0E04';! 14,-1,4 %CONSTINTEGER CLMABL=X'1050E'; ! 5,1,14 %SHORTINTEGER CCSIZE,ARSIZE,DSIZE,DUMMY FORMAT %INTEGER ASL,NNAMES,FLAG,GLAFLAG %INTEGER CABUF,PPCURR,LCA,OLDLINE,LINE,LENGTH,LENGTHP, %C N0,NUM,SNUM,RLEVEL,NMAX,LOPCODE,CONSTPTR, %C PLABEL,LEVEL,CA,MARKER1,MARKER2,LABSET,CCSTATE, %C CYCLE NUM,CSAVED,CUR CYC VAR,CYC REGS,CYC BITS,CYC ASS ! %BYTEINTEGER FFLAG,CHECKS,SBFLAG,LAST INST,FAULTY,MONE, %C HIT,LET,DIAGS2,LIST,ALLLONG,INHCODE,LINENOS, %C DIAGS1,IMPS,CHECKSP,CTYPE,DCOMP,COMPILER,CPRMODE, %C UNASS,PRINTMAP,BFFLAG,NMDECS ! %LONGREAL CVALUE,IMAX %INTEGER MASK,RBASE,SFLABEL,NEXT,N,MAX ULAB,GSAVED,CODEBASE, %C P,Q,R,S,TTOPUT,U,V,NEST,FNAME,NOT USED,FILEPTR, %C FILE END,SSTL,QMAX,STMTS,MAINEP1,MAINEP2,MAINEP3, %C GLACA,GLACURR,GLACABUF,CYC BASE,CYC ADDR ! %SHORTINTEGER RELHEAD,EPLINK,LEVELINF,DVHEAD,GLAHOLES, %C CONSTL2,CONSTL4,CONSTL6,CONSTL8,RNEXT ! ! THIS IS THE LIMIT OF INITIALISATION OF SCALARS TO ZERO ! %INTEGER QUICK,MARGIN,IOCP1,IOCP2,IOCP3,XLABEL,IMPMON1, %C IMPMON2,IMPMON3,STMTSHELD,STOPSTM,TOPPTR,PREV3CL,FILEADDR %SHORTINTEGERARRAY STPTRS (1:15) %ROUTINESPEC FETCH AR %ROUTINESPEC STORE AR(%INTEGERNAME I) %INTEGERARRAY REGISTER,GRUSE,GRINF,GRAT(0:22) %SHORTINTEGERARRAY A(-7:800) %INTEGERARRAY SET(0:11) %SHORTINTEGERARRAY CYCLE,LABEL,SBR,L,M,NAMES(0:11) %SHORTINTEGERARRAY AVLWSP(0:7,0:MAXLEVELS) %INTEGERARRAY UVARREG(5:14) %RECORDFORMAT OPTFORM(%BYTEINTEGER COUNT,TYPE,%INTEGER BITS,%C PTYPE,XTRA) %RECORDARRAY OPTINF(0:25)(OPTFORM) %INTEGER OPTPTR %BYTEINTEGERARRAY GLABUF,CODE(0:268) %SYSTEMINTEGERMAPSPEC COMREG(%INTEGER N) !*INSERT %BEGIN %SHORTROUTINE %INTEGER FREE,TOTAL ! BLOCK TO ALLOCATE AVAILABLE STACK SPACE TO THE MAIN ARRAYS FILE ADDR=COMREG(46) %IF FILE ADDR#0 %THEN %START; ! ON EMAS TOTAL=INTEGER(FILEADDR); NNAMES=255 %IF TOTAL>8000 %THEN NNAMES=511 %IF TOTAL>32000 %THEN NNAMES=1023 %IF TOTAL>409600 %OR COMREG(27)&8#0 %THEN NNAMES=2047 DSIZE=7*NNAMES; ASL=DSIZE<<2 CCSIZE=100+NNAMES; ->2 %FINISH FREE=COMREG(1)-ADDR(TOTAL)-6000; ! ON IBM 370 %CYCLE I=2,1,4; ! ALLOWS 255,511,1023 OR 2047 NAMES NNAMES=128*2**I-1 DSIZE=7*NNAMES ASL=DSIZE<<2 CCSIZE=250+100*I TOTAL=CCSIZE+ASL+DSIZE<<1 ->1 %IF TOTAL>FREE %REPEAT ->2 1: CCSIZE=CCSIZE-100 NNAMES=NNAMES>>1 ASL=(ASL>>1+(FREE-CCSIZE-DSIZE))//2;! HALF 'EXTRA' SPACE TO ASL DSIZE=DSIZE>>1 2: ASL=32760%IF ASL>32760 ASL=ASL&X'FFFFFFF0' %END %BYTEINTEGERARRAY CC(0:CCSIZE+10), %C ASLIST(0:ASL+32),LETT(0:DSIZE+20) %SHORTINTEGERARRAY WORD,TAGS(0:NNAMES) %SYSTEMROUTINESPEC IOCP(%INTEGER A,B) %ROUTINESPEC CODE OUT %ROUTINESPEC CNOP(%INTEGER I,J) %ROUTINESPEC PCONST(%INTEGER X) %ROUTINESPEC PSI(%INTEGER OPCODE,J,BASE,DISP) %ROUTINESPEC PSS(%INTEGER OPCODE,N,BASE,DISP,P,Q) %ROUTINESPEC PRX(%INTEGER OPCODE,R1,R2,BASE,DISP) %ROUTINESPEC PLANT(%INTEGER VALUE) %ROUTINESPEC PRR (%INTEGER OPCODE,R1,R2) %ROUTINESPEC PGLA(%INTEGER I,J,K) %SYSTEMROUTINESPEC LPUT(%INTEGER A,B,C,D) %ROUTINESPEC SET PERMBASE %ROUTINESPEC PLUG(%INTEGER AREA,J,K) %ROUTINESPEC PRHEX(%INTEGER VALUE,PLACES) %ROUTINESPEC RESTORE(%SHORTINTEGER HEAD) %ROUTINESPEC GET ENV(%SHORTINTEGERNAME HEAD) ! %INTEGERFNSPEC NEWCELL %ROUTINESPEC INSERTAFTER(%SHORTINTEGERNAME STAD,%INTEGER S1,S2) ! %ROUTINESPEC INSERTATEND(%SHORTINTEGERNAME S,%INTEGER A,B) %ROUTINESPEC FROM12(%INTEGER CELL,%INTEGERNAME S1,S2) %ROUTINESPEC FROM123(%INTEGER CELL,%INTEGERNAME S1,S2,S3) %ROUTINESPEC POP(%SHORTINTEGERNAME CELL,%INTEGERNAME S1,S2) %ROUTINESPEC POP123(%SHORTINTEGERNAME C,%INTEGERNAME P,Q,R) %ROUTINESPEC PUSH(%SHORTINTEGERNAME CELL,%INTEGER S1,S2) %ROUTINESPEC PUSH123(%SHORTINTEGERNAME C,%INTEGER S1,S2,S3) %INTEGERFNSPEC FIND(%INTEGER LAB,LIST) %INTEGERFNSPEC FIND3(%INTEGER LAB,LIST) %ROUTINESPEC MLINK(%INTEGERNAME CELL) %ROUTINESPEC REPLACE2(%INTEGER CELL,S2) %ROUTINESPEC REPLACE1(%INTEGER CELL,S1) %ROUTINESPEC REPLACE123(%INTEGER CELL,S1,S2,S3) %INTEGERFNSPEC FROM2(%INTEGER CELL) %INTEGERFNSPEC FROM1(%INTEGER CELL) %INTEGERFNSPEC FROM3(%INTEGER CELL) ! %ROUTINESPEC CHECK ASL !*DELSTART %ROUTINESPEC COMPARE %ROUTINESPEC PNAME %ROUTINESPEC CONST(%INTEGER MODE) %ROUTINESPEC CONSTLIST %ROUTINESPEC TEXTTEXT %ROUTINESPEC READ LINE(%BYTEINTEGER N,CHAR) !*DELEND %ROUTINESPEC FROMAR8(%INTEGER PTR,%LONGREALNAME VALUE) %ROUTINESPEC FROMAR4(%INTEGER PTR,%INTEGERNAME VALUE) %ROUTINESPEC TOAR8(%INTEGER PTR,%LONGREAL VALUE) %ROUTINESPEC TOAR4(%INTEGER PTR,VALUE) %ROUTINESPEC CSS(%INTEGER P,MODE) %ROUTINESPEC FAULT(%INTEGER N,FNAME) %ROUTINESPEC ABORT %ROUTINESPEC PRINT USE %ROUTINESPEC PRINTNAME (%INTEGER N) %SYSTEM %C %ROUTINESPEC RECODE (%INTEGER START,FINISH,CA) %ROUTINESPEC MESSAGE(%INTEGER N) %FAULT 1,2->OFL,9->INEND,18->SUBSCHAR ! START OF COMPILATION %BEGIN !*********************************************************************** !* THIS BLOCK INITIALISE THE COMPILER SCALARS AND ARRAYS * !* WAS ORIGINALLY ROUTINE 'INITIALISE'. * !* THE INITIALISATION OF THE CONSTANT LISTS WITH THE VALUES * !* IN PERM MAY BE OMITTED IN BATCH OR CUT-DOWN VERSIONS. * !*********************************************************************** %SHORTROUTINE !*DELSTART %CONSTBYTEINTEGERARRAY ILETT(0: 410)= 11, 'S','E','L','E','C','T','I','N','P','U','T', 12,'S','E','L','E', 'C','T','O','U','T','P','U','T', 7,'N','E','W','L','I','N','E', 5,'S','P','A','C','E', 10,'S','K','I','P','S','Y','M','B','O', 'L', 10,'R','E','A','D','S','T','R','I','N','G', 8,'N','E','W', 'L','I','N','E','S', 6,'S','P','A','C','E','S', 10,'N','E','X', 'T','S','Y','M','B','O','L', 11,'P','R','I','N','T','S','Y','M', 'B','O','L', 10,'R','E','A','D','S','Y','M','B','O','L', 4,'R', 'E','A','D', 5,'W','R','I','T','E', 7,'N','E','W','P','A','G', 'E', 4,'A','D','D','R', 6,'A','R','C','S','I','N', 3,'I','N', 'T', 5,'I','N','T','P','T', 6,'F','R','A','C','P','T', 5,'P', 'R','I','N','T', 7,'P','R','I','N','T','F','L', 4,'R','E','A', 'L', 7,'I','N','T','E','G','E','R', 3,'M','O','D', 6,'A','R', 'C','C','O','S', 4,'S','Q','R','T', 3,'L','O','G', 3,'S','I', 'N', 3,'C','O','S', 3,'T','A','N', 3,'E','X','P', 11,'C','L', 'O','S','E','S','T','R','E','A','M', 11,'B','Y','T','E','I','N', 'T','E','G','E','R', 12,'S','H','O','R','T','I','N','T','E','G', 'E','R', 6,'R','A','D','I','U','S', 6,'A','R','C','T','A','N', 6,'L','E','N','G','T','H', 11,'P','R','I','N','T','S','T','R', 'I','N','G', 2,'N','L', 8,'L','O','N','G','R','E','A','L', 7, 'P','R','I','N','T','C','H', 6,'R','E','A','D','C','H', 6,'S', 'T','R','I','N','G', 8,'R','E','A','D','I','T','E','M', 8,'N', 'E','X','T','I','T','E','M', 6,'C','H','A','R','N','O', 8,'T', 'O','S','T','R','I','N','G', 10,'F','R','O','M','S','T','R','I', 'N','G', 6,'R','E','C','O','R','D', 5,'A','R','R','A','Y', 10, 'S','E','T','M','A','R','G','I','N','S',4,'I','M','O','D', 2,'P','I',6,'N','E','X','T','C','H',255; !*DELEND *XC_CABUF(108),CABUF ;!CLEAR INTEGER *XC_FFLAG(24),FFLAG; !CLEAR BYTE FLAG VARIABLES *XC_MASK(144),MASK; ! CLEAR WORK VARIABLES STMTSHELD=0; TOPPTR=500 IMAX=(-1)>>1;PLABEL=26999 LABSET=3<<30;LETT(0)=0 N0=27; N=12; MARGIN=1024 MAX ULAB=NNAMES+16384; ! LARGEST VALID USER LABEL GLACA=N0<<2; GLACABUF=GLACA CHECKSP=1 ; CHECKS=1 LINENOS=1; DIAGS1=1; MONE=1 LIST=1; SFLABEL=21999; UNASS=1 LET=1; XLABEL=19999; ! FOR EXIT STATEMENTS ARSIZE=480 QUICK=11009 MAINEP1=4; MAINEP2=M'S#GO'; ! DEFAULT ENTRY POINT IOCP1=6; IOCP2=M'S#IO'; IOCP3=M'CPXX' IMPMON1=8; IMPMON2=M'S#IM'; IMPMON3=M'PMON' !*INSERT %IF FILE ADDR#0 %THEN %START FILE PTR=FILE ADDR+INTEGER(FILE ADDR+4) FILE END=FILE ADDR+INTEGER(FILE ADDR) %FINISH I=COMREG(27) %IF I&2=2 %THEN LIST=0 %IF I&4=4 %THEN LINENOS=0 %IF I&16=16 %THEN UNASS=0 %IF I&32=32 %THEN CHECKS=0 %IF I&(128<<8)#0 %THEN PRINTMAP=1 %IF I&(32<<8)#0 %THEN LET=0 %IF I&64=64 %THEN DIAGS1=0 DIAGS2=I>>18&1 TTOPUT=I>>21&1 %IF I&(1<<16)#0 %THEN %START CHECKS=0; CHECKSP=0 LINENOS=0; UNASS=0 %FINISH GLAFLAG=CHECKSP; ! GLAFLAG SHOULD BE SET TO 0 IF ! IMPS IS COMPILED NON OPTIMISED. WARNINGS(0)=0 IMPS=I>>23&1; ! BIT SET IF IMPS REQUESTED ! ! OPEN OBJECT FILE HERE BEFORE MORE PAGES OF COMPILER CODE ! ARE PAGED IN AND SUB-SYSTEM PAGES MOVE OUT ! LPUT(0,IMPS<<1+1,RELEASE,VERSION) NEWLINES(3); SPACES(20) %PRINTTEXT'E.R.C.C. IMP' %IF IMPS#0 %THEN %PRINTTEXT'S' %PRINTTEXT' COMPILER RELEASE' WRITE(RELEASE,1) %PRINTTEXT' VERSION' WRITE(VERSION,2) NEWLINES(3) WRITE(NNAMES,5); WRITE(ASL,5) *L_1,SET; *XC_0(48,1),0(1) *L_1,CYCLE; *XC_0(24,1),0(1) *L_1,NAMES; *XC_0(24,1),0(1) *L_1,LABEL; *XC_0(24,1),0(1) *L_1,SBR; *XC_0(24,1),0(1) *L_1,AVL WSP; *XC_0(192,1),0(1) *L_1,REGISTER; *XC_0(92,1),0(1) *L_1,GRUSE; *XC_0(92,1),0(1) *L_1,GRINF; *XC_0(92,1),0(1) *L_1,GRAT; *XC_0(92,1),0(1) REGISTER(10)=-1; GRUSE(10)=12 REGISTER(11)=-1; REGISTER(13)=-1 *L_1,UVARREG+4; *XC_0(40,1),0(1);!NO USER DEFINED REGS %CYCLE I=0,16,ASL-16 SHORT INTEGER(ADDR(ASLIST(I))+30)=I %REPEAT INTEGER(ADDR(ASLIST(0)))=-1 INTEGER(ADDR(ASLIST(4)))=-1 INTEGER(ADDR(ASLIST(8)))=-1 INTEGER(ADDR(ASLIST(12)))=X'FFFF0000' SET PERMBASE PCONST(X'50FB003C'); ! ST 15,60(11) PCONST(X'45FC004C'); ! BAL 15,RTI1 %CYCLE I=0,1,NNAMES WORD(I)=0; TAGS(I)=0 %REPEAT ! ! NOW DECLARE THE SPECIAL NAMES WHICH ARE IN ARRAY ILETT. A SPECIAL ! ALTERNATIVE (19) OF PHRASE IS PROVIDED FOR THIS PURPOSE ! !*DELSTART A(1)=19; K=0; NEXT=1 I=ILETT(0) %WHILE I<255 %CYCLE %CYCLE J=1,1,I CC(J)=ILETT(K+J) %REPEAT; CC(J+1)=';' R=2; Q=ADDR(CC(1)); PNAME CSS(1,1); K=K+I+1; I=ILETT(K) %REPEAT !*DELEND ! A(-7)=2; TOAR4(-6,PI1); TOAR4(-4,PI2) A(0)=0; A(1)=12; CSS(1,1); ! COMPILE A BEGIN @ LINE 0 COMREG(24)=16; ! RETURN CODE %CYCLE I=1,1,3 PUSH123(CONSTL4,I,0,X'800000E0'+I<<2) PUSH123(CONSTL4,I<<12,0,X'80000100'+I<<2) %REPEAT PUSH123(CONSTL4,-1,0,16) PUSH123(CONSTL4,255,0,24) PUSH123(CONSTL4,-4,0,X'800000F8') PUSH123(CONSTL4,-8,0,X'800000FC') PUSH123(CONSTL8,X'41100000',0,X'800000C8');! FLOATNG =D'1' DUMMY FORMAT=0; ! DUMMY RECORD FORMAT PUSH(CONSTL6,0,0) PUSH123(DUMMY FORMAT,0,0,CONSTL6); ! FOR BETTER ERROR RECOVERY CONSTL6=0 %END ! ->8 %ROUTINE LOAD DATA %SHORTROUTINE !*********************************************************************** !* PASS INFORMATION TO LPUT TO ENABLE IT TO GENERATE THE * !* LOADER DATA AND COMPLETE THE PROGRAM FILE. * !*********************************************************************** %INTEGER JJ,KK,FLAG,XTRA,ID1,ID2,ID3 %SHORTINTEGER HEAD GLACA=(GLACA+7)&(-8) CONSTPTR=(CONSTPTR+7)&(-8) ! ! DEFINE ANY DATA EPS FOR DATA IN THE GLA SYMBOL TABLES. THESE CAN NOT ! BE DEFINED BEFORE THE SIZE OF THE GLA IS KNOWN ! %WHILE EPLINK#0 %CYCLE POP123(EPLINK,JJ,XTRA,KK) HEAD=KK; FLAG=JJ>>24; JJ=JJ&X'FFFFFF' JJ=JJ+GLACA POP123(HEAD,ID1,ID2,ID3) ID3=ID3<<16 LPUT(14,XTRA,JJ,ADDR(ID1)) %REPEAT CNOP(0,8) FIXED GLA(2)=GLACA; ! GLA SYMTABS FROM HEAD OF GLA FIXED GLA(3)=CA; ! CODE SYMTABS FROM HEAD OF CODE FIXED GLA(0)=CA; ! WILL BE RELOCATED CODE OUT I=GLACA-GLACABUF %IF INHCODE=0 %THEN %START LPUT(2,I,GLACABUF,ADDR(GLABUF(0))) %UNLESS I=0;! BACK OF GLAP ! ! NOW SET THE LANGUAGE FLAG(BYTE 4 OF GLA) 1=IMP,3=IMPS ! BYTE INTEGER(ADDR(FIXED GLA(1)))=16+IMPS<<5;! LANGUAGE FLAG LPUT(2,N0<<2,0,ADDR(FIXED GLA(0))); ! FRONT OF GLAP I=X'E2E2E2E2' LPUT(4,4,SSTL,ADDR(I)) ! ! NOW PLANT ANY RELOCATION INFO THAT HAS BEEN HELD UP AS IT IS RELATIVE ! TO THE SYMBOL TABLES. LPUT DEALS ONLY IN CODE & GLA SO THE COMPILER ! HAS TO ADJUST ST REFEFERNCES TO ALLOW FOR FRONT OF CODE OR GLA ! ! %WHILE RELHEAD#0 %CYCLE ! POP123(RELHEAD,JJ,KK,XTRA) ! %IF XTRA=4 %THEN %START; ! CODE ST ! KK=KK+CA ! %FINISH %ELSE %START; ! GLA ST ! KK=KK+GLACA ! %FINISH ! LPUT(2,4,JJ,ADDR(KK)); ! OUTPUT ADJUSTED POINTER ! LPUT(XTRA+16,0,JJ,0); ! AND RELOCATION INFO ! %REPEAT ! LPUT(20,0,0,0); ! RELOCATE POINTER TO CST LPUT(20,0,28,0); ! RELOCATE GLA HDOFCODE WORD LPUT(12,0,23<<2,ADDR(FIXEDGLA(27)));! O-P PERM REFERENCE LPUT(16,0,64,0); ! DEFINE TOPOFSTORE WORD %FINISH SSTL=(SSTL+11)&(-8) %PRINTTEXT' CODE' WRITE(CA,6); %PRINTTEXT ' BYTES GLAP' WRITE(GLACA,3); %PRINTTEXT'+' WRITE(CONSTPTR,1); %PRINTTEXT' BYTES DIAG TABLES' WRITE(SSTL,3); %PRINTTEXT' BYTES TOTAL' REGISTER(0)=CA; REGISTER(1)=GLACA REGISTER(2)=0 REGISTER(3)=SSTL REGISTER(4)=CONSTPTR K=CA+GLACA+SSTL+CONSTPTR;REGISTER(5)=K WRITE(K,5); %PRINTTEXT' BYTES' %IF IMPS=0 %AND WARNINGS(0)>0 %START J=WARNINGS(0) PRINTSTRING(" THE FOLLOWING LINES ARE NOT ACCEPTABLE TO 2900 IMP:-") NEWLINE %CYCLE I=1,1,J WRITE(WARNINGS(I),3) %EXIT %IF I>=30 %REPEAT NEWLINE %IF J>30 %THEN PRINTSTRING("PLUS ") %AND WRITE(J-30,3) %C %AND PRINTSTRING(" MORE ") %FINISH NEWLINE; PRINT CH(13); ! MARKER FOR COMP TO PRINT SUMMARY %IF FAULTY=0 %THEN %START WRITE(STMTS,7); %PRINTTEXT' STATEMENTS COMPILED' %IF GLACA>4096 %THEN %PRINTTEXT' WARNING:- GLAP ROOT IS GREATER THAN 4096 BYTES! ******** OBJECT PROGRAM IS LIABLE TO BE VERY INEFFICIENT ' COMREG(47) = STMTS %FINISH %ELSE %START %PRINTTEXT'PROGRAM CONTAINS'; WRITE(FAULTY,2) %PRINTTEXT' FAULT'; PRINTSYMBOL('S') %IF FAULTY>1 COMREG(47)=FAULTY; ! FOR COMPER %FINISH NEWLINES(2) I=0; I=8 %IF FAULTY#0 COMREG(24)=I %IF INHCODE=0 %THEN %C LPUT(7,24,0,ADDR(REGISTER(0)));! SUMMARY INFO..REGISTER AS BUF %STOP %END %ROUTINE FAULT(%INTEGER N,FNAME) %SHORTROUTINE %INTEGER I,J,QP,FLINE %IF N=100 %THEN FLINE=LINE %ELSE FLINE=A(STPTRS(1)-1) QP=Q %PRINTTEXT' *'; WRITE(FLINE,4) I=3; I=3*LEVEL %IF LIST=0; SPACES(I) CHECKSP=1; FAULTY=FAULTY+1 INHCODE=1 %UNLESS LET=0; ! STOP GENERATING CODE %IF N#100 %THEN %START; ! ALL EXCEPT SYNTAX %PRINTTEXT'FAULT'; WRITE(N,2) MESSAGE(N) %IF N>100 %THEN %START %PRINTTEXT' DISASTER ' ABORT %UNLESS N<=108; %STOP %FINISH PRINTNAME(FNAME) %UNLESS FNAME=0 %FINISH %ELSE %START; ! SYMTAX FAULTS %PRINTTEXT' SYNTAX ' %IF LINE#OLDLINE %THEN %START %PRINTTEXT' TEXT MODE FAILURE ' WRITE(LINE-OLDLINE,1) %PRINTTEXT' LINES LOST ' Q=QMAX %FINISH %ELSE %START %UNTIL J=';' %OR Q=LENGTH %CYCLE J=BYTE INTEGER(Q) PRINT SYMBOL(J) Q=Q+1 %REPEAT %IF I+20+Q-QP<=120 %THEN %START NEWLINE; SPACES(I+QMAX-QP+17) %PRINTTEXT'! ' %FINISH %FINISH %FINISH %IF TTOPUT#0 %THEN %START Q=QP; TTOPUT=0 SELECT OUTPUT(87) FAULT(N,FNAME) FAULTY=FAULTY-1 NEWLINE SELECT OUTPUT(82) TTOPUT=1 %FINISH %END %ROUTINE WARN(%INTEGER LINE) !*********************************************************************** !* STORE A WARNING IF STMNT NOT 2900 IMP COMPATIBLE * !*********************************************************************** %INTEGER I,J I=WARNINGS(0); J=I+1 %IF J>30 %THEN WARNINGS(0)=J %AND %RETURN %IF LINE>WARNINGS(I) %THEN WARNINGS(J)=LINE %AND %C WARNINGS(0)=J %END %ROUTINE ABORT %PRINTTEXT' **************** ABORT******************** ABORT *******' RECODE(ADDR(CODE(0)),ADDR(CODE(PPCURR)),CABUF) %UNLESS CA=CABUF PRINT USE %MONITORSTOP; %END %ROUTINE PRINT USE %INTEGER I, J, K %ROUTINESPEC USES(%INTEGER I) %OWNSTRING (10) %ARRAY STATUS(-1:2)=' LOCKED ', ' FREE ',' CLAIMED ',' RESERVED ' %INTEGER NNAMES *L_1,TAGS+8; *MVC_NNAMES(4),8(1) NEWLINES(2) %CYCLE I=0, 1, 15 ->9 %IF 10<=I<=13 ->9 %IF REGISTER(I)=0 %AND GRUSE(I)=0 %AND (I>6 %C %OR (REGISTER(I+16)=0 %AND GRUSE(I+16)=0)) WRITE(I, 2) PRINT STRING(STATUS(REGISTER(I))) USES(I) ->4 %IF I>6 %OR (REGISTER(I+16)=0=GRUSE(I+16)) SPACES(13-K) PRINT STRING(STATUS(REGISTER(I+16))) USES(I+16) 4: NEWLINE 9: %REPEAT I=CCSTATE>>16 %IF 1<=I<=2 %THEN %START %IF I=1 %THEN PRINTSTRING('ARITHMETIC CC ON REG') %C %ELSE PRINT STRING('LOGICAL CC ON REG') WRITE(CCSTATE&255, 5) NEWLINE %FINISH %RETURN %ROUTINE PN(%INTEGER N) %INTEGER J, P, Q, R %CYCLE J=0, 1, NNAMES ->FOUND %IF N=TAGS(J) %REPEAT; %PRINTTEXT ' ??' K=K+3; ->99 FOUND: P=WORD(J); R=LETT(P) %IF R#0 %THEN %START %CYCLE Q=1, 1, R PRINT SYMBOL(LETT(P+Q)) %REPEAT %FINISH %ELSE %PRINTTEXT '?' K=K+1+R 99: %END %ROUTINE USES(%INTEGER I) %SWITCH SW(0:18) %INTEGER INF, J %PRINTTEXT ' USE = ' K=0; J=GRUSE(I); INF=GRINF(I) ->SW(J) SW(0): %PRINTTEXT ' NOT KNOWN'; ->99 SW(1): %PRINTTEXT ' I/RESULT ' 1: K=7; WRITE(INF, 6); ->99 SW(2): %PRINTTEXT ' CONST = '; ->1 SW(3): %PRINTTEXT ' LOCAL ' 2: PN(INF); ->99 SW(4): SW(5): SW(6): %PRINTTEXT ' ERROR '; ->1 SW(7): %PRINTTEXT ' ADDR OF '; ->2 SW(8): %PRINTTEXT ' BASE OF '; ->2 SW(9): PN(INF&X'FFFF') %PRINTTEXT ' TIMES '; WRITE(INF>>24, 2); ->99 SW(10): %PRINTTEXT 'DOPE V OF '; ->2 SW(11): %IF INF>0 %THEN ->111 %PRINTTEXT ' 4K FOR LAB ' K=8; WRITE(\INF, 6); ->99 111: %PRINTTEXT ' 4096 * '; K=8; WRITE(INF, 6); ->99 SW(12): %PRINTTEXT ' BASE AT '; ->1 SW(13): %PRINTTEXT ' STR LEN '; ->1 SW(14): %PRINTTEXT ' CYCLE VAR '; ->99 SW(15): %PRINTTEXT ' RT PARAM '; ->99 SW(16): %PRINTTEXT ' RSLN PARM '; ->1 SW(17): %PRINTTEXT ' ADDR SST '; ->1 SW(18): %PRINTTEXT ' PERMBASE '; ->99 99: %END %END %ROUTINE MESSAGE(%INTEGER N) !*********************************************************************** !* OUTPUTS AN ERROR MESSAGE STORED IN A COMPRESSED FORMAT * !*********************************************************************** %CONSTBYTEINTEGERARRAY WORD(0: 330)=0,%C 1, 1, 2, 3, 0, 2, 4, 5, 7, 8, 4, 9, 10, 11, 7, 5, 9, 4, 12, 0, 6, 9, 4, 7, 8, 7, 10, 7, 8, 0, 8, 13, 14, 11, 16, 9, 13, 14, 11, 16, 10, 13, 14, 11, 16, 11, 4, 11, 7, 0, 13, 1, 18, 0, 0, 14, 2, 3, 20, 0, 15, 18, 20, 0, 0, 16, 10, 11, 7, 0, 17, 11, 21, 10, 0, 18, 9, 23, 12, 0, 19, 24, 25, 26, 14, 20, 9, 10, 27, 28, 22, 30, 14, 11, 16, 23, 21, 10, 27, 28, 24, 31, 27, 32, 28, 25, 34, 35, 11, 32, 26, 37, 38, 24, 39, 28, 21, 40, 18, 0, 29, 41, 11, 42, 0, 30, 44, 45, 26, 46, 31, 48, 45, 26, 46, 34, 2, 3, 49, 0, 35, 2, 3, 21, 49, 36, 50, 37, 25, 0, 39, 31, 52, 0, 0, 40, 23, 53, 0, 0, 42, 55, 35, 27, 28, 43, 56, 57, 45, 0, 44, 50, 58, 0, 0, 45, 24, 25, 26, 58, 47, 50, 59, 0, 0, 48, 60, 61, 27, 38, 51, 62, 2, 3, 0, 52, 1, 18, 63, 62, 53, 62, 18, 0, 0, 54, 64, 45, 26, 46, 57, 65, 18, 0, 0, 62, 11, 66, 10, 0, 64, 67, 18, 0, 0, 65, 67, 11, 27, 66, 66, 50, 69, 70, 0, 67, 11, 69, 10, 0, 69, 67, 45, 26, 46, 70, 50, 55, 23, 0, 71, 35, 27, 55, 28, 72, 50, 55, 72, 0, 73, 74, 45, 26, 46, 74, 74, 24, 66, 0, 81, 50, 76, 0, 0, 82, 41, 11, 78, 10, 83, 80, 76, 0, 0, 84, 50, 69, 70, 0, 85, 81, 0, 0, 0, 98, 84, 0, 0, 0, 99, 84, 0, 0, 0, 103, 87, 2, 88, 0, 104, 2, 3, 87, 0, 106, 55, 58, 2, 88, 108, 89, 61, 27, 38, 127, 90, 0, 0, 0 %CONSTINTEGERARRAY LETT(0: 92)=0,%C X'48B02868',X'51EF0000',X'342EC800',X'30222B00', X'25D60B13',X'13EF9000',X'4CB40000',X'52E91940', X'4EE9A0D0',X'382D2800',X'39F40000',X'16527C80', X'19F26858',X'40320B4B',X'50B29800',X'067F9C0B', X'0C000000',X'35339A5D',X'1C000000',X'15C49800', X'49F5A25D',X'14000000',X'10A36380',X'5E4F71C0', X'39E00000',X'3CC00000',X'25C00000',X'171094E7', X'38000000',X'0474A858',X'48A16000',X'25D429CB', X'48000000',X'0F236140',X'58324845',X'30A00000', X'18356500',X'4E8D7500',X'30B62B00',X'09E4C800', X'31130000',X'10B3A3A9',X'38000000',X'48B4AC9C', X'3EB40000',X'0DEEA171',X'50000000',X'48B3AB28', X'30B62B26',X'258C29C3',X'30000000',X'17107500', X'35338303',X'0CA40000',X'4E924B8E',X'06520E40', X'25D3490A',X'0DEE9D00',X'15932800',X'4EA20000', X'0D019000',X'192E4CD0',X'06800000',X'1709A000', X'08A74B80',X'19F26868',X'4EA2705B',X'14000000', X'48A37C88',X'3E059069',X'38000000',X'3E059069', X'3E400000',X'48B37B2B',X'512F7000',X'16354D83', X'30AE1940',X'41E9750B',X'48000000',X'39EE0000', X'112D2BA7',X'25EE0B13',X'53200000',X'04849167', X'4C224B13',X'53200000',X'382D2CC0',X'31EE3800', X'15A00000',X'4CA5FA5B',X'43ED0BAB',X'05800000' %INTEGER I,J,K,M,Q,S %PRINTTEXT' (' I=-4 %UNTIL N=WORD(I) %OR I= 326 %THEN I=I+5 %CYCLE J=1,1,4 K=WORD(I+J) %IF K=0 %THEN %EXIT SPACE %UNLESS J=1 %UNTIL M&1=0 %CYCLE M=LETT(K); S=26 %UNTIL S<0 %CYCLE Q=M>>S&31; %IF Q=31 %THEN Q=-32 %IF Q\=0 %THEN PRINT SYMBOL(Q+64) S=S-5 %REPEAT K=K+1 %REPEAT %REPEAT %PRINTTEXT') ' %END INEND: FAULT(108,0) OFL: FAULT(38,0); ->8 SUBSCHAR:LINE=LINE+1;FAULT(48,0) SPACES(5) 15: READSYMBOL(I); ->8 %IF I=10 PRINTSYMBOL(I); ->15 %ROUTINE PRINTNAME (%INTEGER N) %IF N<0 %THEN %START N=-N %IF 16384<=N<=MAX ULAB %THEN N=N-16384 %ELSE %START WRITE(N,5); ->99 %FINISH %FINISH %PRINTTEXT' ' **1,WORD(N) *A_1,LETT; *->P5; ! USE PRINTSTRING IN PERM 99: %END ! !*********************************************************************** !* IMP CODE PLANTING ROUTINES * !* CODE AND GLAP ARE PUT INTO THE BUFFERS 'CODE,GLABUF(0:268)' * !* BY A NUMBER OF TRIVIAL ROUTINES.LPUT IS CALLED TO ADD THE * !* BUFFER TO THE OUTPUT FILE. THE BUFFERS ARE BASICALLY 0:255 * !* WITH A 12-BYTE MARGIN TO MINIMISE THE NUMBER OF TESTS FOR * !* THE BUFFER FULL CONDITION * !* * !* PPCURR(GLACURR) IS THE BUFFER POINTER * !* CA(GLACA) IS THE RELATIVE ADDRESS OF THE NEXT BYTE * !* CABUF(GLACABUF) IS CA(GLACA) FOR START OF BUFFER * !*********************************************************************** %ROUTINE CODEOUT %IF PPCURR>0 %THEN %START %IF DCOMP#0 %THEN %C RECODE(ADDR(CODE(0)),ADDR(CODE(PPCURR)),CABUF) LPUT(1,PPCURR,CABUF,ADDR(CODE(0))) %IF INHCODE=0 PPCURR=0; CABUF=CA %FINISH %END %ROUTINE PLANT(%INTEGER HALFWORD) ! ADD A HALF WORD OF BINARY TO THE BUFFER SHORT INTEGER(ADDR(CODE(PPCURR)))<-HALFWORD PPCURR=PPCURR+2 CA=CA+2 CODEOUT %IF PPCURR>=256 %END %ROUTINE PCONST(%INTEGER WORD) ! ADD A WORD OF BINARY TO THE BUFFER **1,ADDR(CODE(PPCURR)) *MVC_0(4,1),WORD PPCURR=PPCURR+4 CA=CA+4 CODEOUT %IF PPCURR>=256 %END %ROUTINE PRR(%INTEGER OPCODE,R1,R2) CODE(PPCURR)=OPCODE CODE(PPCURR+1)=R1<<4!R2 PPCURR=PPCURR+2 CA=CA+2 CODEOUT %IF PPCURR>=256 %END %ROUTINE MOVE BACK PC %IF LCA=256 %END %ROUTINE PSI(%INTEGER OPCODE,J,B,D) CODE(PPCURR)=OPCODE CODE(PPCURR+1)=J SHORT INTEGER(ADDR(CODE(PPCURR+2)))<- B<<12!D PPCURR=PPCURR+4 CA=CA+4 CODEOUT %IF PPCURR>=256 %END %ROUTINE PSS(%INTEGER OPCODE,N,B1,D1,B2,D2) CODE(PPCURR)=OPCODE N=N-1 %UNLESS N=0 CODE(PPCURR+1)=N SHORT INTEGER(ADDR(CODE(PPCURR+2)))<- B1<<12!D1 SHORT INTEGER(ADDR(CODE(PPCURR+4)))<- B2<<12!D2 PPCURR=PPCURR+6 CA=CA+6 CODEOUT %IF PPCURR>=256 %END %ROUTINE PMVC(%INTEGER L,B1,D1,B2,D2) %SHORTROUTINE !*********************************************************************** !* PLANTS AN MVC INSTRN. IN OPTIMISING MODE TRIES TO GLUE IT * !* ON TO THE LAST ONE PLANTED * !*********************************************************************** %OWNINTEGER LL,LB1,LD1,LB2,LD2 %IF CHECKSP#1 %THEN %START %IF LCA+6=CA %AND B1=LB1 %AND B2=LB2 %AND LOPCODE=X'D2' %C %AND D1=LD1+LL %AND D2=LD2+LL %AND LL+L<=256 %START MOVE BACK PC CA=LCA; L=L+LL D1=LD1; D2=LD2 %FINISH LCA=CA; LL=L; LB1=B1; LD1=D1 LB2=B2; LD2=D2; LOPCODE=X'D2' %FINISH PSS(X'D2',L,B1,D1,B2,D2) %END %ROUTINE CNOP(%INTEGER I,J) PLANT(X'0700') %WHILE CA&(J-1)#I %END %ROUTINE PGLA(%INTEGER BDRY,L,INF ADR) %SHORTROUTINE %INTEGER I,J J=GLACA; GLACA=(J+BDRY-1)&(-BDRY) GLACURR=GLACURR+GLACA-J; ! COMPLETE THE ROUNDING ! ! RECORD HOLES IN THE GLA FOR FUTURE USE ! %IF J&1#0 %THEN J=J+1 %WHILE J+2<=GLACA %CYCLE PUSH(GLAHOLES,J,0) J=J+2 %REPEAT %IF L+GLACURR>256 %THEN %START %IF INHCODE=0 %THEN LPUT(2,GLACURR,GLACABUF,ADDR(GLABUF(0))) GLACA=(GLACA+1)&(-2) GLACURR=0; GLACABUF=GLACA %FINISH *LM_1,2,L; *L_3,GLABUF *A_3,GLACURR; *BCTR_1,0 *EX_1, GLACA=GLACA+L; GLACURR=GLACURR+L %RETURN MOVE: *MVC_0(1,3),0(2) %END %ROUTINE PLUG(%INTEGER AREA,AT,VALUE) %SHORTROUTINE !*********************************************************************** !* WRITE ONE HALFWORD INTO OBJECT FILE OUT OF SEQUENCE * !*********************************************************************** %INTEGERNAME WCABUF %INTEGER RELAD,BUFAD WCABUF==CABUF; BUFAD=ADDR(CODE(0)) %IF AREA=2 %THEN WCABUF==GLACABUF %AND BUFAD=ADDR(GLABUF(0)) RELAD=AT-WCABUF %IF RELAD>=0 %THEN SHORTINTEGER(RELAD+BUFAD)<-VALUE %ELSESTART %IF INHCODE=0 %THEN LPUT(AREA,2,AT,ADDR(VALUE)+2) %FINISH %END %ROUTINE SET PERMBASE PCONST(X'58CD005C') REGISTER(12)=-1 GRUSE(12)=18 GRINF(12)=0 %END %ROUTINE PRHEX(%INTEGER VALUE,PLACES) %OWNINTEGER HT1=M'0123' %OWNINTEGER HT2=M'4567' %OWNINTEGER HT3=M'89AB' %OWNINTEGER HT4=M'CDEF' %INTEGER W1,W2,W3 *UNPK_W1+1(9),VALUE(5) *NC_W1+1(8),MASK1 *TR_W1+1(8),HT1 *LA_1,W1+8; *S_1,PLACES *MVC_ 0(1,1),PLACES+3 *-> P5; ! PRINT STRING IN PERM %END %ROUTINE GET ENV(%SHORTINTEGERNAME HEAD) %SHORTROUTINE !*********************************************************************** !* SAVE A COPY OF THE REGISTER STATE FOR FUTURE REFERENCE * !*********************************************************************** %INTEGER I,J %CYCLE J=0,1,14; I=GRMAP(J) PUSH123(HEAD,GRINF(I),GRAT(I),I<<8!GRUSE(I)) %IF GRUSE(I)>1 %REPEAT %END %ROUTINE RESTORE(%SHORTINTEGER HEAD) %SHORTROUTINE !*********************************************************************** !* RESET THE REGISTERS TO ENVIRONMENT IN LIST HEADED BY 'HEAD' * !*********************************************************************** %INTEGER I,J,R,USE,INF,AT CCSTATE=-1 %CYCLE J=0,1,14; I=GRMAP(J) %IF REGISTER(I)>=0 %THEN GRUSE(I)=0 %AND GRINF(I)=0 %REPEAT %WHILE HEAD#0 %CYCLE POP123(HEAD,INF,AT,I) R=I>>8 %IF REGISTER(R)>=0 %THEN GRUSE(R)=I&255 %AND GRINF(R)=INF GRAT(R)=AT %REPEAT %END ! %ROUTINE PRINT LIST(%INTEGER HEAD) ! %SHORTROUTINE ! %INTEGER I,J,K !1: %IF HEAD=0 %THEN %RETURN ! FROM123(HEAD,I,J,K) ! NEWLINE ! PRHEX(I,8) ! SPACES(3) ! PRHEX(J,8) ! SPACES(3) ! PRHEX(K,8) ! NEWLINE ! MLINK(HEAD) ! ->1 ! %END ! ! ******* LIST***PROCESSING***ROUTINES ! NEW VERSIONS BASED ON A 96BIT(12 BYTE) UNIT ! S1=S2=32 BIT STREAM, S3=16 BIT STREAM ! ! %ROUTINE CHECK ASL !! CHECK ASL FOR CONSISTENCY AND PRINT OUT FREE CELLS !! FOR DEBUGGING OBSCURE LIST PROCESSING FAULTS ONLY ! %SHORTROUTINE ! %INTEGER N,Q ! N=0 ! Q=ASL !1: ->2 %IF Q=0 ! ABORT %UNLESS Q&3=0 ! MLINK(Q) ! N=N+1 ! ->1 !2: %PRINTTEXT' FREE CELLS=' ! WRITE(N,3) ! NEWLINE ! %END ! ! %INTEGERFN NEW CELL ! %INTEGER I ! *L_1,ASL ! *LTR_2,1 ! *BC_7,<1> ! FAULT(107,0) !1: *A_2,ASLIST ! *MVC_ASL+2(2),14(2); !ASL TO NEXT FREE CELL ! *XC_0(16,2),0(2); ! NEWCELL TO ZERO ! *LM_4,15,16(8) ! *BCR_15,15 ! %END %ROUTINE PUSH(%SHORTINTEGERNAME CELL,%INTEGER S1,S2) *L_4,ASL; *LTR_5,4; *BC_7,<1> FAULT(107,0) 1: *A_5,ASLIST; *MVC_ASL+2(2),14(5) *LM_15,1,CELL; *LH_3,0(15); *SR_2,2 *STH_4,0(15); *STM_0,3,0(5) %END %ROUTINE PUSH123(%SHORTINTEGERNAME CELL,%INTEGER S1,S2,S3) *L_4,ASL; *LTR_5,4; *BC_7,<1> FAULT(107,0) 1: *A_5,ASLIST; *MVC_ASL+2(2),14(5) *LM_15,2,CELL; *LH_3,0(15) *STH_4,0(15); *STM_0,3,0(5) %END %ROUTINE POP(%SHORTINTEGERNAME CELL,%INTEGERNAME S1,S2) *LM_1,3,CELL; *LH_4,0(1); *L_15,ASLIST *L_0,0(4,15); *ST_0,0(2); ! SET S1 *L_0,4(4,15); *ST_0,0(3); ! SET S2 *LTR_4,4; *BC_8,<1>; ! HEAD =0 FOR NULL LIST *LH_0,14(4,15); *STH_0,0(1); ! HEADCELL TO OLD 2ND CELL *L_3,ASL; *STH_3,14(4,15); *ST_4,ASL 1: %END %ROUTINE POP123(%SHORTINTEGERNAME CELL,%C %INTEGERNAME S1,S2,S3) *LM_1,3,CELL; *LH_4,0(1); *L_15,ASLIST *L_0,0(4,15); *ST_0,0(2); ! SET S1 *L_0,4(4,15); *ST_0,0(3); ! SET S2 *L_0,8(4,15); *L_3,S3; *ST_0,0(3); ! SET S3 *LTR_4,4; *BC_8,<1>; ! HEAD =0 FOR NULL LIST *LH_0,14(4,15); *STH_0,0(1); ! HEADCELL TO OLD 2ND CELL *L_3,ASL; *STH_3,14(4,15); *ST_4,ASL 1: %END %ROUTINE INSERT AFTER(%SHORTINTEGERNAME CELL,%INTEGER S1,S2) *L_1,ASL; *LTR_2,1; *BC_7,<2> FAULT(107,0) 2: *A_2,ASLIST; *MVC_ASL+2(2),14(2) *SR_0,0; *ST_0,12(2); *ST_0,8(2) *L_2,ASLIST;*LM_3,4,S1;*ST_3,0(1,2);*ST_4,4(1,2) *L_4,CELL; *LH_3,0(4); *STH_1,0(4) *LTR_3,3;*BC_8,<1>;*LH_4,14(3,2) *STH_4,14(1,2); *STH_1,14(3,2) 1: %END %ROUTINE BINSERT(%SHORTINTEGERNAME TOP,BOT,%INTEGER S1,S2,S3) !*********************************************************************** !* ADD A NEWCELL AT THE BOTTOM OF A LIST * !*********************************************************************** *LM_14,2,TOP; *L_3,ASL *LTR_4,3; *BC_7,<1> FAULT(107,0) 1: *L_5,ASLIST; *LH_6,14(3,5); *ST_6,ASL *LH_6,0(15); *LTR_6,6; *BC_7,<2>; ! IS BOT 0 ? *STH_3,0(14); *BC_15,<3>; ! YES SET TOP =NEWCELL 2: *STH_3,14(6,5); ! LINK NEWCELL TO PREV BOT 3: *STH_3,0(15); ! BOT =NEWCELL *SR_3,3; *AR_4,5 *STM_0,3,0(4) %END %ROUTINE REPLACE123(%INTEGER CELL,S1,S2,S3) *LM_15,2,CELL;*A_15,ASLIST *STM_0,2,0(15) *LM_8,15,32(8); *BCR_15,15 %END %ROUTINE REPLACE1(%INTEGER CELL,S1) INTEGER(ADDR(ASLIST(CELL)))=S1 %END %ROUTINE REPLACE2(%INTEGER CELL,S2) INTEGER(ADDR(ASLIST(CELL+4)))=S2 %END %ROUTINE REPLACE3(%INTEGER CELL,S3) INTEGER(ADDR(ASLIST(CELL+8)))=S3 %END %ROUTINE MLINK(%INTEGERNAME CELL) CELL=SHORTINTEGER(ADDR(ASLIST(CELL+14))) %END %INTEGERFN FIND(%INTEGER LAB,LIST) ! THIS FUNCTION SEARCHES LIST 'LIST' FOR LAB IN STREAM2 AND ! RETURNS THE CORRESPONDING CELL NO.IT USED FOR MORE THAN ! SCANNING LABEL LISTS. %MCODE *LM_0,1,LAB; *L_2,ASLIST *LTR_15,1; *BC_8, AGAIN: *C_0,4(1,2); *BC_8, *LH_1,14(1,2) *LTR_15,1 *BC_7, FAIL: *L_1,0(15,2); ! IF FAIL LOADS-1 ELSE RESULT FOUND: *LM_8,15,32(8); *BCR_15,15 %ENDOFMCODE %END %INTEGERFN FIND3(%INTEGER S3,LIST) !*********************************************************************** !* SEARCHES LIST FOR S3 IN STREAM 3 * !* RETURNS CELL NO AS RESULT * !*********************************************************************** *LM_0,1,S3; *L_2,ASLIST; *SR_3,3 *LTR_1,1; *BC_8, AGAIN: *C_0,8(1,2) *BC_8, *LR_3,1; ! SAVE PREVIOUS CELL *LH_1,14(1,2) *LTR_1,1 *BC_7, FAIL: *BCTR_1,0 FOUND: *ST_3,PREV3CL; *LM_8,15,32(8); *BCR_15,15 %END %ROUTINE FROM123(%INTEGER CELL,%INTEGERNAME S1,S2,S3) *LM_1,4,CELL; *A_1,ASLIST; *LM_15,1,0(1); * ST_15,0(2) *ST_ 0,0(3); *ST_1,0(4) *LM_8,15,32(8); *BCR_15,15 %END %ROUTINE FROM12(%INTEGER CELL,%INTEGERNAME S1,S2) *LM_1,3,CELL ;*A_1,ASLIST ; *LM_0,1,0(1); *ST_0,0(2); *ST_1,0(3) %END %INTEGERFN FROM1(%INTEGER CELL) %RESULT=INTEGER(ADDR(ASLIST(CELL))) %END %INTEGERFN FROM2(%INTEGER CELL) %RESULT=INTEGER(ADDR(ASLIST(CELL))+4) %END %INTEGERFN FROM3(%INTEGER CELL) %RESULT=INTEGER(ADDR(ASLIST(CELL))+8) %END %ROUTINE CLEAR LIST (%SHORTINTEGERNAME OPHEAD) **1,OPHEAD; *LTR_1,1; *BC_8, *L_2,ASLIST; *L_0,ASL; *ST_1,ASL AGAIN: *LR_3,1; *LH_1,14(1,2); ! NEXT LINK *LTR_1,1; *BC_7,; ! IS IT ZERO? *STH_0,14(3,2); ! LAST LINK TO OLD VALUE OF ASL EMPTY: OPHEAD=0; %END ! %ROUTINE CONCAT(%SHORTINTEGERNAME LIST1,LIST2) ! %COMMENT ADDS LIST2 TO BOTTOM OF LIST1 ! *L_4,LIST1 ! *L_15,LIST2 ! *LH_0,0(15) ! *L_2,ASLIST ! *LH_1,0(4) ! *LTR_3,1 ! *BC_7, ! *STH_0,0(4) ! *BC_15, !ON: *LR_3,1 ! *LH_1,14(3,2); ! NEXT LINK ! *LTR_1,1 ! *BC_7, ! *STH_0,14(3,2); ! LAST LINK TO NEW LIST !COMM: *STH_1,0(15); ! ZERO HEAD OF LIST2 IN CASE ! %END; ! AN ERROR PUTS CELL TWICE ONTO ! FREE LIST - CATASTROPHIC! ! %ROUTINE INSERT AT END(%SHORTINTEGERNAME CELL,%INTEGER S1,S2) ! %SHORTROUTINE !!*********************************************************************** !!* ADD A CELL TO THE BOTTOM OF THE LIST HEADED BY 'CELL' * !!*********************************************************************** ! *L_1,ASL ! *LTR_2,1 ! *BC_7,<1> ! FAULT(107,0) !1: *A_2,ASLIST ! *MVC_ASL+2(2),14(2) ! *SR_0,0 ! *ST_0,12(2) ! *L_2,ASLIST ! *L_4,CELL ! *LH_3,0(4); ! GET HEAD CELL ! *LTR_3,3 ! *BC_7,; ! LIST NOT EMPTY ! *STH_1,0(4) ! *BC_15,; ! EMPTY LIST -- CELL TO TOP !ON: *LR_4,3 ! *LH_3,14(2,4); ! IS NEXT CELL THE BOTTOM?? ! *LTR_3,3 ! *BC_7, ! *STH_1,14(2,4) !LOAD: *AR_1,2 ! *MVC_0(8,1),S1 ! %END ! ************END****OF****LIST****PROCESSING ROUTINES %ROUTINE CSS(%INTEGER PIN,CSSMODE) %ROUTINESPEC CIOCP(%INTEGER N) %ROUTINESPEC DEFINE EP(%INTEGER A,B,C,D) %ROUTINESPEC LAB LOOK(%INTEGERNAME A,%INTEGER B) %ROUTINESPEC SET LOCAL BASE %ROUTINESPEC STRINGOP(%INTEGER Z,L,BTO,DTO,BFRM,DFRM,BML,DML,X) %ROUTINESPEC CEND(%INTEGER KKK) %ROUTINESPEC CBPAIR(%INTEGERNAME LB,UB) %ROUTINESPEC CCOND(%INTEGER IU,FARLAB) %ROUTINESPEC SET LINE %ROUTINESPEC CUI(%INTEGER CODE) %ROUTINESPEC CSTART(%INTEGER CODE) %ROUTINESPEC BULKM(%INTEGER A,B,C,D,E,F) %ROUTINESPEC TORP(%SHORTINTEGERNAME H,B,NOPS,%INTEGER MODE) %ROUTINESPEC SET USE(%INTEGER R,U,I) %ROUTINESPEC CSEXP(%INTEGER REG,MODE) %ROUTINESPEC DSEXP(%INTEGER REG,MODE) %ROUTINESPEC FREE AND FORGET(%INTEGER REG) %ROUTINESPEC SAVE IRS(%INTEGER MODE) %ROUTINESPEC BOOT OUT(%INTEGER MODE) %ROUTINESPEC EXPOP(%INTEGER A,B,C,D) %ROUTINESPEC CSTREXP(%INTEGER MODE,REG) %ROUTINESPEC ASSIGN (%INTEGER P1,P2) %INTEGERFNSPEC COPY RECORD TAG(%INTEGERNAME SUBS) %ROUTINESPEC TEST APP(%INTEGERNAME NUM) %INTEGERFNSPEC DISPLACEMENT(%INTEGER LINK) %ROUTINESPEC SKIP APP %ROUTINESPEC CRFORMAT(%SHORTINTEGERNAME HEAD) %INTEGERFNSPEC DOPE VECTOR(%INTEGER A,B,C) %ROUTINESPEC DECLARE ARRAYS(%INTEGER MODE,XTRA) %ROUTINESPEC DECLARE SCALARS(%INTEGER A,B) %ROUTINESPEC CQN(%INTEGER P) %ROUTINESPEC CLT %ROUTINESPEC MOVE R(%INTEGER R,N) %ROUTINESPEC GET WSP(%INTEGERNAME PLACE,%INTEGER SIZE) %ROUTINESPEC RETURN WSP(%INTEGER PLACE,SIZE) %ROUTINESPEC CRCALL(%INTEGER A) %ROUTINESPEC CNAME(%INTEGER Z,REG) %ROUTINESPEC CRNAME(%INTEGER Z,REG,MODE,CLINK,BS,IX,DP) %ROUTINESPEC CANAME(%INTEGER Z,BS,DP,LINK) %ROUTINESPEC ADJUST INDEX(%INTEGER M,%INTEGERNAME I,D) %ROUTINESPEC CREATE AH(%INTEGER M,R,B,D) %ROUTINESPEC CRES(%INTEGER LAB) %ROUTINESPEC CSNAME(%INTEGER Z,REG) %ROUTINESPEC COPY TAG(%INTEGER KK) %ROUTINESPEC REDUCE TAG(%INTEGER MODE) %ROUTINESPEC REPLACE TAG (%INTEGER KK) %ROUTINESPEC RT EXIT %ROUTINESPEC RT JUMP(%INTEGER CODE,R1,RT,WKREG) %ROUTINESPEC MERGE INFO %ROUTINESPEC REDUCE ENV(%SHORTINTEGERNAME HEAD) %ROUTINESPEC RELOCATE(%INTEGER A,B,C) %ROUTINESPEC GXREF(%INTEGER A,B,C,D) %ROUTINESPEC CXREF(%INTEGER A,B,C,%INTEGERNAME D) %ROUTINESPEC STORE TAG(%INTEGER KK,SLINK) %ROUTINESPEC TESTNST %ROUTINESPEC CUCI %ROUTINESPEC SKIP EXP %ROUTINESPEC UNPACK %ROUTINESPEC PACK(%INTEGERNAME PTYPE) %ROUTINESPEC CRSPEC (%INTEGER M) %ROUTINESPEC LOAD DV(%INTEGERNAME REG,%INTEGER B,D,T) %ROUTINESPEC DUMP(%INTEGER CODE,REG,DIS,X,LEVEL) %ROUTINESPEC DUMPM(%INTEGER OPCODE,R1,R2,B,D) %ROUTINESPEC DUMPSI(%INTEGER OPCODE,L,B,D) %ROUTINESPEC DUMPSS(%INTEGER OP,L,B,D,B,D) %ROUTINESPEC RHEAD(%INTEGER KK) %ROUTINESPEC ENTER JUMP(%INTEGER MASK,STAD,FLAG) %ROUTINESPEC CFPDEL %ROUTINESPEC PPJ(%INTEGER N) %ROUTINESPEC ENTER LAB(%INTEGER M,FLAG) %ROUTINESPEC CHECK CAPACITY(%INTEGER REG,DIS,X,LEVEL) %INTEGERFNSPEC TSEXP(%INTEGERNAME CODE,%INTEGER I) %ROUTINESPEC FIND USE(%INTEGERNAME REG,%INTEGER TYPE,USE,INF) %ROUTINESPEC CLAIM THIS REG(%INTEGER A) %ROUTINESPEC CLAIM(%INTEGER A,%INTEGERNAME REG) %ROUTINESPEC FIND REG (%INTEGER A,%INTEGERNAME REG) %ROUTINESPEC FORGET(%INTEGER REG) %ROUTINESPEC FORGETM(%INTEGER UPPER) %ROUTINESPEC FIND SEQ(%INTEGERNAME ONE,TWO) %ROUTINESPEC REMEMBER %INTEGERFNSPEC CONST FIND (%INTEGER L,AD) %ROUTINESPEC STORE CONST(%INTEGERNAME B,D,%INTEGER L,AD) %ROUTINESPEC NOTE ASSMENT(%INTEGER REG,ASSOP,VAR) %ROUTINESPEC TEXTOUT(%INTEGER REG) %ROUTINESPEC VALLOC(%INTEGER A,B) %ROUTINESPEC VDALLOC(%INTEGER A,B) %ROUTINESPEC CYCOPT(%INTEGERNAME FLAG,%INTEGER WU) %ROUTINESPEC EXTRA PASS(%INTEGER I,J,K) %ROUTINESPEC CYC RESTORE %SWITCH SW(1:30) %RECORDFORMAT RD(%SHORTINTEGER PTYPE,%BYTEINTEGER XB,FLAG,%C %INTEGER D,%SHORTINTEGER XTRA) %SHORTINTEGER OPHEAD,SFHEAD,TWSPHEAD,DUMHEAD,SNDISP,ACC,K,KFORM %INTEGER BXLE,TCELL,CURRINST,ADISP,BIMSTR,JJ,JJJ,KK,KKK, %C Q,QQ,EXTRN,STARTCOND,MARKIU,MARKUI,MARKC,MARKE,MARKR, %C BASE,INDEX,DISP,VALUE,BML,DML,LOCAL BASE, LOCAL ADDR, %C PTYPE,I,J,OLDI,USEBITS,SENOPS,SEFOP,PTYPEP,STRINGL,LINE %BYTEINTEGER ROUT,NAM,ARR,PREC,TYPE,REPORTUI %REGISTER P(14); P=PIN %INTEGERARRAY SGRUSE,SGRINF(0:22) %CONSTINTEGER WSPTRTAB1=X'00010204',WSPTRTAB2= X'04060607' LINE=A(P-1) LOCAL BASE=0; TWSPHEAD=0 STARTCOND=0; CURRINST=0 CYC BITS=0; BIMSTR=0 SENOPS=0; SEFOP=0 ! ! CHECK THERE ARE SOME CELLS LEFT ON THE AVAILABLE SPACE LIST ! %IF ASL<200 %AND CSSMODE#0 %THEN %START;! GARBAGE COLLECT NEEDED %IF PRINTMAP=1 %THEN %PRINTTEXT' ? LIST SPACE' %IF ASL<200 %THEN %START; ! STILL SHORT OF SPACE %PRINTTEXT'?' CLEAR LIST(DVHEAD); ! REMOVE LIST OF SHAREABLE D-VS CLEAR LIST(CONSTL8); ! AND SHAREABLE LONG CONSTANTS CLEAR LIST(CONSTL6) %IF ASL<200 %THEN %START %PRINTTEXT'?' CLEAR LIST(CONSTL4);! & INTEGER CONSTANTS CLEAR LIST(CONSTL2);! & SHORT INT CONSTANTS %FINISH %FINISH %FINISH OLDI=0; ->SW(A(P)) SW(23): WARN(LINE) SBFLAG=1 %IF CHECKSP=0; ! '%SHORTROUTINE' ! 1: LAST INST=CURR INST %WHILE TWSPHEAD#0 %CYCLE POP(TWSPHEAD,JJ,KK) RETURN WSP(JJ,KK) %REPEAT SW(29): ! REDUNDANT SEP SW(10): ! ! %CYCLE I=10,1,13 ! ABORT %UNLESS REGISTER(I)=-1 ! %REPEAT %RETURN SW(1): MARKER2=P+1+A(P+1); P=P+2 ->LABFND %IF A(MARKER2)=1 SET LINE %IF LINENOS#0 -> 101 %IF A(MARKER2)<=3 MASK=15; CUI(0); ->1 LABFND: ->SWITCH %UNLESS A(P)<2 %AND A(P+3)=2;! 1ST ALT UI & NO APP ->SWITCH %UNLESS A(P+4)=2 %AND A(P+5)=2;! NO ENAME OR ASSOP K=16384+A(P+2); ->401 101: MARKE=0; MARKR=0 MARKUI=P; MARKIU=MARKER2+1;MARKC=MARKIU+1 -> CONEXP %IF A(MARKER2)=2; ->WHILE ! SW(2): ! %CYCLE !*********************************************************************** !* THE LAYOUT OF AN ENTRY ON THE CYCLE LIST IS:- * !* S1= CNAME<<16!LABEL N0 * !* S2= EL<<16!BXLE<<15! CYCLE WORK AREA DISPLACEMENT FROM RBASE * !* S3= BREG (THE REGISTER USED FOR INCREMENT AND FINAL VALUE)* !* WHERE :- * !* CNAME= CYCLE CONTROL NAME(IF SIMPLE SCALAR) OR * !* X'3000'!CYCLE NUM FOR CHECKED OR COMPLEX CYCLES* !* LABEL= NO OF INTERNAL LABEL FOR REPEAT TO JUMP TO * !* BXLE=1 IF 'BXLE' CAN BE USED (IE INCREMENT +VE) ,=0 OTHERWISE* !* EL=LABEL NO FOR EXIT STATEMENT (TOP BIT SET WHEN USED) * !*********************************************************************** %BEGIN %SHORTROUTINE %INTEGER PP,Q,INC,NAME,TNAME,PASS,WSPL,CFLAG,BREG,OPEN,CREG SET LINE CUR CYC VAR=0; CYC REGS=0 BXLE=0; INC=0; BREG=2; CREG=1; ! DEFAULTS OPEN=A(P+1)-1; P=P+2; PP=P %IF OPEN #0 %THEN %START CYCOPT(CFLAG,2) %IF CHECKSP=0 PASS=X'10000000' %FINISH %ELSE %START NAME=A(P); TNAME = TAGS(NAME) COPY TAG (NAME) FAULT(25,NAME) %UNLESS TYPE=1 %AND PREC=0 %IF A(P+1)=2=A(P+2)%AND UNASS=0%AND CHECKSP=0 %AND %C NAM=0 %AND K<4095 %THEN %START;! CONTROL A LOCAL SCALAR WSPL=2; P=P+3; PASS= NAME<<16 CUR CYC VAR=NAME Q=P; FFLAG=0; SKIP EXP; SKIP EXP; SKIP EXP P=Q; ! CHECK FNS IN CNTRL EXPRSNS CYCOPT(CFLAG,0) P=Q %IF CFLAG=0 %THEN CUR CYC VAR=0 %IF CFLAG>0 %THEN BREG=CFLAG&15 COPYTAG(NAME) %IF PTYPE=8 %THEN CREG=K %FINISH %ELSE %START; ! CONTROL NAMETYPE OR ARRAY ELEMENT CYCLE NUM=CYCLE NUM+1 PASS=X'30000000'!CYCLE NUM<<16 WSPL=3; CNAME(3,4) REGISTER(4)=1 %FINISH %IF BREG=2 %THEN %START; ! REGISTER PAIR NOT AVAILABLE GET WSP(INC,WSPL); ! WORKAREA TO INC POP(TWSPHEAD,JJ,KK); ! MUST NOT BE FREED BEFORE REPEAT %FINISH Q=P; SKIP EXP; JJ=P; ! Q TO 1ST EXP, JJ TO SECOND BXLE=1 %IF (3900>CA-CODEBASE %OR CYC BASE#0) %C %AND 1<=TSEXP (JJJ,0)<=2 %AND TYPE=1 P=JJ ! ! LOAD INCREMENT AND FINAL TO BREG & BREG+1 UNLESS THIS HAS BEEN ! DONE BY THE LOOP OPTIMISING ! DSEXP(BREG,0) %UNLESS BREG>2 %AND GRUSE(BREG)=14 %IF BREG=2 %THEN DUMPM(X'90',2,WSPL+1,RBASE,INC);! STORE PARAMS DUMPSI(X'92',CYCLE NUM&255,RBASE,INC+8) %IF UNASS=1 %CYCLE KK=BREG,1,BREG+WSPL-1 %IF KK<4 %AND REGISTER(KK)>0 %THEN REGISTER(KK)=0 %IF CFLAG=0 %THEN FORGET(KK) %ELSE SET USE(KK,14,TNAME) %REPEAT P=Q; CSEXP(CREG,1) FORGET(CREG); ! BEFORE PPJ TO AVOID A BOOTOUT REGISTER(CREG)=1 %IF CHECKSP=1 %THEN DUMP(0,2,INC,0,RBASE);! LA 2, CYCLE PARAMS REGISTER(CREG)=0; MONE=1 %IF CHECKSP=1 %THEN PPJ(17);! CHECK VALIDITY %FINISH PLABEL=PLABEL-1; PASS=PASS!PLABEL PUSH123(LABEL(LEVEL),CA,0,PLABEL);! STORE LABEL CCSTATE=-1; LCA=0 %IF OPEN#0 %THEN %START PLABEL=PLABEL-1 FORGETM(14) %FINISH %ELSE %START %CYCLE JJ=0,1,22 FORGET(JJ) %IF REGISTER(JJ)=0 %AND GRUSE(JJ)#14 %REPEAT %IF WSPL=3 %THEN %START DUMP(1,1,0,0,4) REGISTER(4)=0 %FINISH %ELSE %START %IF CREG=1 %THEN %START P=PP; CNAME(1,1) DUMP(1,1,DISP,INDEX,BASE) %FINISH NOTE ASSMENT(CREG,2,NAME) %IF CREG#1 %THEN REGISTER(CREG)=-1 %FINISH INC=INC!BXLE<<15 %FINISH XLABEL=XLABEL-1 PUSH123(CYCLE(LEVEL),PASS,XLABEL<<16!INC,CREG<<16!BREG) %END; ->1 ! SW(3): !REPEAT %BEGIN %SHORTROUTINE %INTEGER NAME,TOPREG,CNUM,DSP,WSPL,LAB,KK,BREG,ELABEL,EUSED,CREG %SHORTINTEGER HEAD %SWITCH CTYPE(0:3) SET LINE %IF -1<=FROM1(CYCLE(LEVEL))<=0 %THEN FAULT(1,0) %AND -> 1 CUR CYC VAR=0 POP123(CYCLE(LEVEL),J,DSP,BREG) ELABEL=DSP>>16&X'7FFF' EUSED=DSP>>31 BXLE=DSP>>15&1; DSP=DSP&X'7FFF'; LAB=J&X'FFFF' CREG=BREG>>16; BREG=BREG&X'FFFF' ->CTYPE(J>>28) CTYPE(3): ! STEP CYCLE WITH PTR TO CONTROL CNUM=J>>16&255; TOPREG=4; WSPL=3; NAME=-1; ->COM CTYPE(0): ! STEP CYCLE LOCAL SCALAR CONTROL TOPREG=3; WSPL=2; NAME=J>>16 COM: ! ALL STEPWISE CYCLES %IF UNASS=1 %THEN %START; ! CHECK CYCLE ENTERD OK DUMPSI(X'95',CNUM,RBASE,DSP+8);! CLI CYCLE WK AREA,CODE NO PCONST(X'477C0028'); ! BNE UNASSIGNED VARIABLE USED %FINISH ! ! LOAD UP CYCLE PARAMETERS FROM WKAREA UNLESS THEY ARE LOADED ALREADY ! %UNLESS BREG>2 %OR (GRUSE(2)=14=GRUSE(3) %AND %C (GRUSE(4)=14 %OR NAME>=0)) %THEN %START DUMPM(X'98',2,TOPREG,RBASE,DSP);! LM CYCLE PARAMS %CYCLE I=1,1,TOPREG FORGET(I); ! FORGET REGISTER USED %REPEAT %FINISH ! ! NOW GET CONTROL TO REG 1 VIA POINTER OR DIRECTLY AS RELEVANT ! %IF NAME<0 %THEN %START; ! VIA POINTER (REGS NOT ALLOCATED) PRX(X'58',1,0,4,0) REGISTER(4)=1 %FINISH %ELSE %START; ! LOCAL SCALAR USE CNAME P=R; A(P)=NAME A(P+1)=2; A(P+2)=2; ! SET NO APP OR ENAME CNAME(2,CREG); ! CONTROL -> R1 OPTIMUM METHOD %FINISH ! ! NOW PLANT CODE TO DO THE TEST AND BRANCH.AGAIN 2 WAYS POSSIBLE ! %IF BXLE=0 %THEN %START; ! THE TEDIOUS BUT VALID ROUTE PRR(X'18',0,CREG); ! LR 0,1 PRR(X'1A',CREG,BREG); ! AR 1,INC PRR(X'19',0,BREG+1); ! CR 0,FINAL FORGET(0) REGISTER(CREG)=1; ! JUMP MAY LOAD 4K MULTIPLE REGISTER(BREG)=1; ! SO PROTECT REGISTER IN USE REGISTER(BREG+1)=1 ENTER JUMP(7,LAB,0); ! BNE %FINISH %ELSE %START; ! THE BXLE INSTRUCTION CAN BE USED KK=FIND3(LAB,LABEL(LEVEL)) KK=FROM1(KK); ! EXTRACT LABEL ADDRESS %IF CYC BASE=0 %THEN I=10 %AND KK=KK-CODEBASE %ELSE %C I=CYC BASE %AND KK=KK-CYC ADDR PRX(X'87',CREG,BREG,I,KK); ! BXLE 1,2, %FINISH %IF CREG#1 %THEN CYC REGS=CYCREGS!!(1<1 CTYPE(1): ! '%WHILE' '%CYCLE' ENTER JUMP(15,LAB,0); ! UNCONDITIONALLY TO WHILE CLAUS ENTER LAB(LAB-1,B'111'); ! CONDITIONAL/REPLACE ENV ->2 CTYPE(2): ! '%UNTIL' ... '%CYCLE' %IF 500-R>799-TOPPTR %THEN %START P=R+1; WSPL=499-P %FINISH %ELSE %START P=TOPPTR+1; WSPL=799-P %FINISH %IF WSPL1 ! SW(4): ! (LABEL)':' K=A(P+1) FAULT(2,0) %IF K=0 %OR K>16383 401: NMDECS=NMDECS!1 ENTER LAB(K,0) CYC BITS=CYC BITS!1; ! SET 'LABEL' BIT ->1 ! SW(5): ! (%IU)(COND)%THEN(UI)(ELSE') MARKIU=P+1; MARKC=MARKIU+2 MARKR=P+2+A(P+2); MARKE=0 %IF A(MARKR)=3 %THEN %START MARKE=MARKR+1+A(MARKR+1); MARKUI=MARKR+2 %FINISH SET LINE %IF LINENOS#0 CONEXP: %BEGIN !*********************************************************************** !* THIS BLOCK COMPILES CONDITIONAL EXPRESSIONS.IT REQUIRES THE * !* FOLLOWING GLOBAL POINTERS TO BE SET TO THEIR A .R. ENTRY. * !* MARKIU TO THE ENTRY FOR P(%IU) * !* MARKC TO THE ENTRY FOR P(COND) * !* MARKUI TO THE ENTRY FOR (FIRST OCCURRENCE OF) P(UI) * !* MARKE TO THE ENTRY FOR P(ELSE') - =0 FOR BACKWARDS CONDITION* !* MARKR TO ENTRY FOR P(RESTOFIU) * !*********************************************************************** %SHORTROUTINE MARKIU=A(MARKIU); ! ALT OF IU 1=%IF,2=%UNLESS KKK=-1 %IF MARKR>0 %AND A(MARKR)<=2 %START;! '%START' OR '%THENSTART' KKK=SFLABEL-1 P=MARKC; CCOND(MARKIU,KKK) CSTART(1) -> 1 %FINISH %IF A(MARKUI)=2 %AND (A(MARKUI+1)<2 %OR A(MARKUI+3)=2) %THEN %C KKK=A(MARKUI+2)+(A(MARKUI+1)-1)<<14;! UI = SIMPLE LABEL ! %IF A(MARKUI)=8 %AND CYCLE(LEVEL)#0 %START; ! VALID EXIT KKK=FROM2(CYCLE(LEVEL)) REPLACE2(CYCLE(LEVEL),KKK!X'80000000') KKK=KKK>>16&X'7FFF' %FINISH ! %IF KKK>=0 %THEN %START; ! FIRST UI IS'->'