constinteger malmon=0 EXTERNAL ROUTINE SPEC Phex {*~np1 %alias "s_phex"}(INTEGER n) EXTERNAL INTEGER FN SPEC MALLOC(INTEGER bytesize) INCLUDE "hostcodes.inc" CONSTINTEGER HOST=M88K !%INCLUDE "tform2s" ! ! RECORDFORMAT FOR ALL THE OPTION AND FLAG VARAIBLES ! ! amended to remove non-alined longreal prior to bootstrapping to gould ! RECORDFORMAT PARMF(INTEGER BITS1,BITS2,TTOPUT, BYTEINTEGER LET,DYNAMIC,LINE,TRACE,ARR,DBUG,CHK,DIAG,OPT,FREE, LIST,CPRMODE,COMPILER,Z,Y,PROF,INHCODE,DCOMP,FAULTY,X,STACK,MAP,QUOTES,S2, INTEGER LPOPUT,SP0) RECORDFORMAT LEVELF(INTEGER RBASE, DIAGINF, RAL, FLAG, L, M, NMDECS, ONWORD, ONINF, LABEL, JROUND, UNATT FORMATS, PSIZE, ENTRYAD, DISPLAY, AUXSBASE, NAMES, SNMAX,SN,RESSIZE,CLEVEL,SET, MAXPP, EXITLAB, CONTLAB, S3, INTEGERARRAY AVL WSP(0:4)) IF 1<<host&unsignedshorts=0 START RECORDFORMAT RD((INTEGER S1 OR SHORT PTYPE,BYTE XB,FLAG), ((INTEGER D OR REAL R), INTEGER XTRA OR SHORT H0,H1,H2,H3 OR BYTE B0,B1,B2,B3,B4,B5,B6,B7)) RECORDFORMAT TAGF((SHORTINTEGER PTYPE,UIOJ,SNDISP,ACC,SLINK,KFORM OR C INTEGER S1,S2,S3),INTEGER LINK) RECORDFORMAT TRIPF(BYTE OPERN,OPTYPE,CNT,DPTH, SHORTINTEGER FLAGS,PUSE,FLINK,BLINK,INTEGER X1, RECORD(RD) OPND1,OPND2) RECORDFORMAT LISTF((SHORTINTEGER PTYPE,(SHORT UIOJ OR BYTE XB,FLAG), SHORT SNDISP,ACC,SLINK,KFORM OR INTEGER S1,S2,S3),INTEGER LINK) FINISH ELSE START RECORDFORMAT RD((INTEGER S1 OR HALF PTYPE,BYTE XB,FLAG), ((INTEGER D OR REAL R), INTEGER XTRA OR HALF H0,H1,H2,H3 OR BYTE B0,B1,B2,B3,B4,B5,B6,B7)) RECORDFORMAT TAGF((HALFINTEGER PTYPE,UIOJ,SNDISP,ACC,SLINK,KFORM OR C INTEGER S1,S2,S3),INTEGER LINK) RECORDFORMAT TRIPF(BYTE OPERN,OPTYPE,CNT,DPTH, HALFINTEGER FLAGS,PUSE,FLINK,BLINK,INTEGER X1, RECORD(RD) OPND1,OPND2) RECORDFORMAT LISTF((HALFINTEGER PTYPE,(HALF UIOJ OR BYTE XB,FLAG), HALF SNDISP,ACC,SLINK,KFORM OR INTEGER S1,S2,S3),INTEGER LINK) FINISH RECORDFORMAT WORKAF(INTEGER NNAMES,CCSIZE,DSIZE,ASL MAX,ASL CUR BTM,CONST PTR, CONST BTM,LASTTRIP,WKFILEAD,WKFILEK,FILE ADDR,RELEASE,AASL0,CONST LIMIT, RTCOUNT,ARTOP,AMAINEP,DICTBASE,OPTCNT,INCLHEAD,S2,S3,S4, INTEGERNAME LINE,N,S5,STRING(9)LADATE, BYTEINTEGERARRAYNAME CC,A,LETT, INTEGERARRAYNAME WORD,TAGS,CTABLE, RECORD(LEVELF)ARRAYNAME LEVELINF, INTEGERARRAY PLABS,PLINK(0:31), RECORD(LISTF)ARRAYNAME ASLIST) ! ! TRIPF_FLAGS SIGNIFY AS FOLLOWS CONSTINTEGER LEAVE STACKED=2****0; ! SET LEAVE RESULT IN ESTACK CONSTINTEGER LOADOP1=2****1; ! OPERAND 1 NEEDS LOADING CONSTINTEGER LOADOP2=2****2; ! OPERAND 2 NEEDS LOADING CONSTINTEGER NOTINREG=2****3; ! PREVENT REG OPTIMISNG ! OF TEMPS OVER LOOPS&JUMPS CONSTINTEGER USE ESTACK=2****4; ! KEEP DUPLICATE IN ESTACK CONSTINTEGER USE MSTACK=2****5; ! PUT DUPLICAT ON MSTACK CONSTINTEGER CONSTANTOP=2****6; ! ONE OPERAND IS CONSTANT(FOR FOLDING) CONSTINTEGER COMMUTABLE=2****7; ! OPERATION IS COMMUTABLE CONSTINTEGER USED LATE=2****13; ! I-RESULT USED AFTER LAB OR A LONG WAY AHEAD CONSTINTEGER ASS LEVEL=2****14; ! ASSEMBLER LEVEL OPERATION CONSTINTEGER DONT OPT=2****15; ! DONT DUPLICATE THIS RESULT ! USED FOR BYTE PTR & OTHER SODS! ! RECORDFORMAT EMASFHDRF(INTEGER ENDRA,STARTRA,FBYTESIZE,W3,W4,W5,W6,W7) ! FORMAT FOR ARRAY HEADS ! %END %OF %FILE "TFORM2S" OWNINTEGERNAME ASL OWNRECORD(LISTF)ARRAYNAME ASLIST EXTRINSICRECORD(WORKAF)WORKA EXTRINSICRECORD(PARMF)PARM EXTERNALROUTINE MOVE BYTES(INTEGER LENGTH,FBASE,FOFF,TOBASE,TOOFF) !************************************************************************ !* A MOVE BYTES ROUTINE THAT WILL WORK ON WORD&BYTE ADDRESS M-CS * !*********************************************************************** INTEGER I AGN: RETURN IF LENGTH<=0 IF HOST=EMAS START; ! EMAS BYTE ADDRESSES I=X'18000000'+LENGTH *LDA_TOBASE; *INCA_TOOFF; *LDTB_I *LSS_FBASE; *IAD_FOFF; *LUH_I *MV_L=DR FINISH else IF HOST=PERQ START; ! WORD ADDRESS+BYTE OFFSET FBASE=FBASE+FOFF>>1 FOFF=FOFF&1 TOBASE=TOBASE+TOOFF>>1 TOOFF=TOOFF&1 IF (TOBASE+LENGTH>>1)>>16#TOBASE>>16 OR C (FBASE+LENGTH>>1)>>16#FBASE>>16 START ! TLATE FAILS IF SEG BNDRY CROSSED MOVEBYTES(1,FBASE,FOFF,TOBASE,TOOFF) TOOFF=TOOFF+1 FOFF=FOFF+1 LENGTH=LENGTH-1 ->AGN FINISH *LDLDB_6; ! TO BASE *LDL8; ! TOOFF (BTM BITS) *LDLDB_2; ! FBASE *LDL4; ! FOFF *LDL0; ! LENGTH *STLATE_X'63' *MVBW FINISH else IF HOST=ACCENT START; ! WORD ADDRESS+BYTE OFFSET FBASE=FBASE+FOFF>>1 FOFF=FOFF&1 TOBASE=TOBASE+TOOFF>>1 TOOFF=TOOFF&1 *LDLDB_6; ! TO BASE *LDL8; ! TOOFF (BTM BITS) *LDLDB_2; ! FBASE *LDL4; ! FOFF *LDL0; ! LENGTH *MVBW FINISH else IF HOST=PNX start FBASE=2*FBASE+FOFF TOBASE=2*TOBASE+TOOFF **FBASE **TOBASE **LENGTH *MVB FINISH else IF 1<<host&emachine#0 START FBASE=FBASE+FOFF TOBASE=TOBASE+TOOFF **FBASE **TOBASE **LENGTH *MVB FINISH else IF HOST=IBM OR HOST=IBMXA OR HOST=AMDAHL START *L_0,TOBASE; *A_0,TOOFF *L_2,FBASE; *A_2,FOFF *L_1,LENGTH; *LR_3,1 *MVCL_0,2 else FBASE=FBASE+FOFF TOBASE=TOBASE+TOOFF BYTEINTEGER(TOBASE+I)=BYTEINTEGER(FBASE+I) FOR I=0,1,LENGTH-1 FINISH END EXTERNALSTRING(255)FN PRINTNAME(INTEGER N) CONSTSTRING(1)ARRAY HEX(0:15)="0","1","2","3","4","5","6","7","8","9", "A","B","C","D","E","F"; INTEGER V,K,TOP STRING(255) S S="?" TOP=N>>16 N=N&X'FFFF' IF 0<=N<=WORKA_NNAMES START V=WORKA_WORD(N) K=WORKA_LETT(V) IF K#0 THEN S=STRING(ADDR(WORKA_LETT(V))) FINISH IF S="?" START; ! UNPRINTABLE S=S.HEX(N>>K&15) FOR K=28,-4,0 FINISH ELSE START IF TOP>0 THEN S=PRINTNAME(TOP)."_".S FINISH RESULT=S END STRINGFN MESSAGE(INTEGER N) !*********************************************************************** !* OUTPUTS AN ERROR MESSAGE STORED IN A COMPRESSED FORMAT * !* 1 %REPEAT is not required * !* 2 Label & has already been set in this block * !* 3 Jump into %CYCLE at Label & from line # * !* 4 & is not a Switch name at current textual level * !* 5 Switch name & in expression or assignment * !* 6 Switch label &(#) set a second time * !* 7 Name & has already been declared * !* 8 Routine or fn & has more parameters than specified * !* 9 Parameter # of & differs in type from specification * !* 10 Routine or fn & has fewer parameters than specified * !* 11 Label & referenced at line # has not been set * !* 12 %CYCLE at line # has two control clauses * !* 13 %REPEAT for %CYCLE at line # is missing * !* 14 %END is not required * !* 15 # %ENDs are missing * !* 16 Name & has not been declared * !* 17 Name & does not require parameters or subscripts * !* 18 # too few parameters provided for & * !* 19 # too many parameters provided for & * !* 20 # too few subscripts provided for array & * !* 21 # too many subscripts provided for array & * !* 22 Actual parameter # of & conflicts with specification * !* 23 Routine name & in an expression * !* 24 Integer operator has Real operands * !* 25 Real expression in integer context * !* 26 # is not a valid %EVENT number * !* 27 & is not a routine name * !* 28 Routine or fn & has specification but no body * !* 29 %FUNCTION name & not in expression * !* 30 %RETURN outwith routine body * !* 31 %RESULT outwith fn or map body * !* 34 Too many textual levels * !* 37 Array & has too many dimensions * !* 38 Array & has upper bound # less than lower bound * !* 39 Size of Array & is more than X'FFFFFF' bytes * !* 40 Declaration is not at head of block * !* 41 Constant cannot be evaluated at compile time * !* 42 # is an invalid repetition factor * !* 43 %CONSTANT name & not in expression * !* 44 Invalid constant initialising & after # items * !* 45 Array initialising items expected ## items given # * !* 46 Invalid %EXTERNAL %EXTRINSIC or variable %SPEC * !* 47 %ELSE already given at line # * !* 48 %ELSE invalid after %ON %EVENT * !* 49 Attempt to initialise %EXTRINSIC or %FORMAT & * !* 50 Subscript of # is outwith the bounds of & * !* 51 %FINISH is not required * !* 52 %REPEAT instead of %FINISH for %START at line # * !* 53 %FINISH for %START at line # is missing * !* 54 %EXIT outwith %CYCLE %REPEAT body * !* 55 %CONTINUE outwith %CYCLE %REPEAT body * !* 56 %EXTERNALROUTINE & at wrong textual level * !* 57 Executable statement found at textual level zero * !* 58 Program among external routines * !* 59 %FINISH instead of %REPEAT for %CYCLE at line # * !* 61 Name & has already been used in this %FORMAT * !* 62 & is not a %RECORD or %RECORD %FORMAT name * !* 63 %RECORD length is greater than # bytes * !* 64 Name & requires a subname in this context * !* 65 Subname & is not in the %RECORD %FORMAT * !* 66 Expression assigned to record & * !* 67 Records && and & have different formats * !* 69 Subname && is attached to & which is not of type %RECORD * !* 70 String declaration has invalid max length of # * !* 71 & is not a String variable * !* 72 Arithmetic operator in a String expression * !* 73 Arithmetic constant in a String expression * !* 74 Resolution is not the correct format * !* 75 String expression contains a sub expression * !* 76 String variable & in arithmetic expression * !* 77 String constant in arithmetic expression * !* 78 String operator '.' in arithmetic expression * !* 80 Pointer variable & compared with expression * !* 81 Pointer variable & equivalenced to expression * !* 82 & is not a pointer name * !* 83 && and & are not equivalent in type * !* 86 Global pointer && equivalenced to local & * !* 87 %FORMAT name & used in expression * !* 90 Untyped name & used in expression * !* 91 %FOR control variable & not integer * !* 92 %FOR clause has zero step * !* 93 %FOR clause has noninteger number of traverses * !* 95 Name & not valid in assembler * !* 96 Operand # not valid in assembler * !* 97 Assembler construction not valid * !* 98 Addressability * !* 99 Facility not supported by target hardware * !* 101 Source line has too many continuations * !* 102 Workfile of # Kbytes is too small * !* 103 Dictionary completely full * !* 104 Dictionary completely full * !* 105 Too many textual levels * !* 106 String constant too long * !* 107 Compiler tables are completely full * !* 108 Condition too complicated * !* 109 Compiler inconsistent * !* 110 Input ended * !* 201 Long integers are inefficient as subscripts * !* 202 Name & not used * !* 203 Label & not used * !* 204 Global %FOR control variable & * !* 205 Name & not addressable * !* 206 Semicolon in comment text * !* 207 %CONSTANT variable & not initialised * !* 208 Unsupported precision used - nearest available substituted * !* 209 Target machine is word addressed * !* 210 Redundant %ALIAS provided * !* 211 Prefix %SYSTEM not supported. Use %ALIAS * !* 212 Unproductive logical operation noted * !* 255 Contact Advisory Service * !*********************************************************************** CONSTBYTEINTEGERARRAY OUTTT(0:63)='?','A','B','C','D','E','F','G', 'H','I','J','K','L','M','N', 'O','P','Q','R','S','T','U', 'V','W','X','Y','Z','&','-', '/','''','(',')', 'a','b','c','d','e','f','g', 'h','i','j','k','l','m','n', 'o','p','q','r','s','t','u', 'v','w','x','y','z','.','%', '#','?'(2) CONSTINTEGER WORDMAX= 802,DEFAULT= 798 CONSTshortINTEGERARRAY WORD(0:WORDMAX)=0,C 1, 32769, 32771, 32772, 32773, 2, 32775, 32776, 32777, 32778, 32780, 32781, 32782, 32783, 32784, 3, 32785, 32786, 32787, 32789, 32775, 32776, 32790, 32791, 32792, 4, 32776, 32771, 32772, 32793, 32794, 32796, 32789, 32797, 32799, 32801, 5, 32794, 32796, 32776, 32782, 32802, 32804, 32805, 6, 32794, 32807, 32808, 32781, 32793, 32809, 32811, 7, 32812, 32776, 32777, 32778, 32780, 32813, 8, 32815, 32804, 32817, 32776, 32777, 32818, 32819, 32821, 32822, 9, 32824, 32792, 32826, 32776, 32827, 32782, 32829, 32790, 32830, 10, 32815, 32804, 32817, 32776, 32777, 32833, 32819, 32821, 32822, 11, 32775, 32776, 32834, 32789, 32791, 32792, 32777, 32772, 32780, 32781, 12, 32787, 32789, 32791, 32792, 32777, 32836, 32837, 32839, 13, 32769, 32841, 32787, 32789, 32791, 32792, 32771, 32842, 14, 32844, 32771, 32772, 32773, 15, 32792, 32845, 32846, 32842, 16, 32812, 32776, 32777, 32772, 32780, 32813, 17, 32812, 32776, 32847, 32772, 32848, 32819, 32804, 32850, 18, 32792, 32852, 32853, 32819, 32854, 32841, 32776, 19, 32792, 32852, 32856, 32819, 32854, 32841, 32776, 20, 32792, 32852, 32853, 32850, 32854, 32841, 32857, 32776, 21, 32792, 32852, 32856, 32850, 32854, 32841, 32857, 32776, 22, 32858, 32860, 32792, 32826, 32776, 32862, 32864, 32830, 23, 32815, 32796, 32776, 32782, 32865, 32802, 24, 32866, 32868, 32777, 32870, 32871, 25, 32870, 32802, 32782, 32873, 32875, 26, 32792, 32771, 32772, 32793, 32877, 32878, 32880, 27, 32776, 32771, 32772, 32793, 32882, 32796, 28, 32815, 32804, 32817, 32776, 32777, 32830, 32884, 32885, 32886, 29, 32887, 32796, 32776, 32772, 32782, 32802, 30, 32889, 32891, 32882, 32886, 31, 32893, 32891, 32817, 32804, 32895, 32886, 34, 32896, 32856, 32799, 32897, 37, 32899, 32776, 32777, 32852, 32856, 32900, 38, 32899, 32776, 32777, 32902, 32903, 32792, 32904, 32821, 32905, 32903, 39, 32906, 32826, 32899, 32776, 32771, 32818, 32821, 32907, 32909, 40, 32910, 32771, 32772, 32789, 32913, 32826, 32784, 41, 32914, 32916, 32918, 32919, 32789, 32921, 32811, 42, 32792, 32771, 32865, 32923, 32925, 32927, 43, 32929, 32796, 32776, 32772, 32782, 32802, 44, 32931, 32933, 32935, 32776, 32938, 32792, 32939, 45, 32899, 32935, 32939, 32940, 32942, 32939, 32943, 32792, 46, 32931, 32944, 32946, 32804, 32948, 32950, 47, 32951, 32778, 32943, 32789, 32791, 32792, 48, 32951, 32923, 32938, 32952, 32878, 49, 32953, 32955, 32956, 32946, 32804, 32958, 32776, 50, 32960, 32826, 32792, 32771, 32891, 32962, 32963, 32826, 32776, 51, 32965, 32771, 32772, 32773, 52, 32769, 32967, 32826, 32965, 32841, 32969, 32789, 32791, 32792, 53, 32965, 32841, 32969, 32789, 32791, 32792, 32771, 32842, 54, 32971, 32891, 32787, 32769, 32886, 55, 32972, 32891, 32787, 32769, 32886, 56, 32974, 32776, 32789, 32978, 32799, 32801, 57, 32979, 32981, 32983, 32789, 32799, 32801, 32984, 58, 32985, 32987, 32988, 32990, 59, 32965, 32967, 32826, 32769, 32841, 32787, 32789, 32791, 32792, 61, 32812, 32776, 32777, 32778, 32780, 32992, 32782, 32783, 32958, 62, 32776, 32771, 32772, 32793, 32993, 32804, 32993, 32958, 32796, 63, 32993, 32995, 32771, 32997, 32821, 32792, 32909, 64, 32812, 32776, 32999, 32793, 33001, 32782, 32783, 32875, 65, 33003, 32776, 32771, 32772, 32782, 32962, 32993, 32958, 66, 33005, 33007, 32955, 33009, 32776, 67, 33011, 33013, 33014, 32776, 33015, 33016, 33018, 69, 33003, 33013, 32771, 33020, 32955, 32776, 33022, 32771, 32772, 32826, 32829, 32993, 70, 33023, 33025, 32777, 32923, 33028, 32995, 32826, 32792, 71, 32776, 32771, 32772, 32793, 33023, 32948, 72, 33029, 32868, 32782, 32793, 33023, 32802, 73, 33029, 32933, 32782, 32793, 33023, 32802, 74, 33031, 32771, 32772, 32962, 33033, 33035, 75, 33023, 32802, 33037, 32793, 33039, 32802, 76, 33023, 32948, 32776, 32782, 33040, 32802, 77, 33023, 32933, 32782, 33040, 32802, 78, 33023, 32868, 33042, 32782, 33040, 32802, 80, 33043, 32948, 32776, 33045, 32864, 32802, 81, 33043, 32948, 32776, 33047, 32955, 32802, 82, 32776, 32771, 32772, 32793, 33050, 32796, 83, 33013, 33014, 32776, 32846, 32772, 33052, 32782, 32829, 86, 33054, 33050, 33013, 33047, 32955, 33056, 32776, 87, 32958, 32796, 32776, 32992, 32782, 32802, 90, 33057, 32796, 32776, 32992, 32782, 32802, 91, 33059, 32837, 32948, 32776, 32772, 32873, 92, 33059, 33060, 32777, 32984, 33062, 93, 33059, 33060, 32777, 33063, 32880, 32826, 33065, 90, 33057, 32796, 32776, 32992, 33067, 32948, 95, 32812, 32776, 32772, 32877, 32782, 33068, 96, 33070, 32792, 32772, 32877, 32782, 33068, 97, 33072, 33074, 32772, 32877, 98, 33077, 99, 33080, 32772, 33082, 33084, 33085, 33087, 101, 33089, 32791, 32777, 32852, 32856, 33091, 102, 33094, 32826, 32792, 33096, 32771, 32852, 33098, 103, 33099, 33101, 33103, 104, 33099, 33101, 33103, 105, 32896, 32856, 32799, 32897, 106, 33023, 32933, 32852, 33104, 107, 33105, 33107, 32846, 33101, 33103, 108, 33109, 32852, 33111, 109, 33105, 33114, 110, 33117, 33118, 201, 33119, 33120, 32846, 33122, 33067, 32850, 202, 32812, 32776, 32772, 32992, 203, 32775, 32776, 32772, 32992, 204, 33054, 33059, 32837, 32948, 32776, 205, 32812, 32776, 32772, 33125, 206, 33128, 32782, 33130, 33132, 207, 32929, 32948, 32776, 32772, 33133, 208, 33136, 33139, 32992, 33141, 33142, 33144, 33146, 209, 33149, 33151, 32771, 33153, 33154, 210, 33156, 33158, 32854, 211, 33160, 33162, 32772, 33164, 33166, 33158, 212, 33167, 33170, 33172, 33174, 255, 33175, 33177, 33179, 0 CONSTINTEGERARRAY LETT(0: 412)=0,C X'7890A80B',X'02A00000',X'53980000',X'5D7E8000', X'652E3AD3',X'652C8000',X'190C52D8',X'36000000', X'510E6000',X'436652C3',X'49C80000',X'452CB700', X'672E8000',X'53700000',X'69453980',X'4565F1D6', X'15ADB800',X'53769780',X'781B2199',X'0A000000', X'43A00000',X'4D95F680',X'594DD280',X'7A000000', X'42000000',X'27BD3A47',X'50000000',X'5D0DB280', X'47AE594B',X'5DA00000',X'692F1A6B',X'43600000', X'592ED2D8',X'4BC6194B',X'679D37DC',X'5F900000', X'439E74CF',X'5D6CB768',X'590C52D8',X'36FFB000', X'672C77DD',X'48000000',X'694DB280',X'1D0DB280', X'492C7643',X'652C8000',X'257EBA53',X'5D280000', X'4D700000',X'5B7E5280',X'610E50DB',X'4BA4B966', X'69443700',X'6784B1D3',X'4D4CB200',X'210E50DB', X'4BA4B900',X'5F300000',X'494CD34B',X'65980000', X'69CE1280',X'6784B1D3',X'4D4C70E9',X'537DC000', X'4D2EF2E4',X'652CD2E5',X'4B7472C8',X'69BDE000', X'477DDA65',X'5F600000',X'47643AE7',X'4B980000', X'4D7E4000',X'5B4E79D3',X'5D380000',X'7829C200', X'7829C266',X'4394A000',X'497CB980',X'652E3AD3', X'65280000',X'67AC59C7',X'654E1A66',X'697DE000', X'4D2EE000',X'6195FB53',X'492C8000',X'5B0DDC80', X'439650F2',X'031E9AC3',X'58000000',X'610E50DB', X'4BA4B900',X'477DD359',X'531E9980',X'6F4E9400', X'43700000',X'137692CF',X'4B900000',X'5F84B943', X'697E4000',X'252C3600',X'5F84B943',X'5D266000', X'537692CF',X'4B900000',X'477DDA4B',X'71A00000', X'6D0D94C8',X'782AC29D',X'28000000',X'5DADB14B', X'64000000',X'657EBA53',X'5D280000',X'45AE8000', X'5D780000',X'457C9C80',X'7832A707',X'2849E700', X'7890AA2B',X'24700000',X'5FAE9BD3',X'69400000', X'7890A9AB',X'18A00000',X'5B0E0000',X'297DE000', X'592ED2D9',X'66000000',X'039650F2',X'494DB2DD', X'674DF766',X'6B8612E4',X'457EB748',X'592E7980', X'597EF2E4',X'274F5280',X'30F0C30D',X'0C30CF00', X'45CE92E6',X'092C7643',X'650E94DF',X'5C000000', X'512C3200',X'077DD9E9',X'43768000',X'470DD75F', X'68000000',X'45280000',X'4BB4366B',X'43A4B200', X'477DB853',X'59280000',X'5376D0D9',X'53200000', X'652E12E9',X'53A537DC',X'4D0C7A5F',X'64000000', X'7819E727',X'2809CA00',X'1376D0D9',X'53200000', X'477DD9E9',X'43768000',X'53753A53',X'436539D3', X'5D380000',X'433692E4',X'53A4B6E6',X'4BC612C7', X'692C8000',X'7BE80000',X'4F4ED2DC',X'782B0A0B', X'24702600',X'782B0A25',X'12726486',X'6D0E54C3', X'4564A000',X'789A0286',X'7829898A',X'7879C000', X'03A692DB',X'61A00000',X'69780000',X'53753A53', X'436539CA',X'7831E91B',X'02A00000',X'27AC59C7', X'654E1A00',X'6944A000',X'457EB749',X'66000000', X'78312713',X'26400000',X'53767A4B',X'43200000', X'789A80A5',X'28000000',X'782B04A8',X'7819E729', X'1272A280',X'782B0A0B',X'24702625',X'1EAA849D', X'0A000000',X'6F95F74E',X'0BC4B1EB',X'690C564A', X'67A43A4B',X'5B2DDA00',X'4D7EB748',X'752E5780', X'2195F3E5',X'43680000',X'436DF74E',X'4BC692E5', X'5D0D8000',X'657EBA53',X'5D2E6000',X'6B9CB200', X'7890A19F',X'24200000',X'592DD3E9',X'50000000', X'4F94B0E9',X'4B900000',X'652E3AD3',X'652E6000', X'67AC5743',X'5B280000',X'27AC5743',X'5B280000', X'0BC6194B',X'679D37DC',X'439E74CF',X'5D2C8000', X'652C77E5',X'48000000',X'252C77E5',X'49980000', X'36D80000',X'43748000',X'510ED280',X'494CD34B', X'652DDA00',X'4D7E56C3',X'69980000',X'43A690C7', X'512C8000',X'6F4531D0',X'27A654DD',X'4E000000', X'492C7643',X'650E94DF',X'5C000000',X'5B0F0000', X'03953A51',X'5B2E94C6',X'252E77D9',X'6BA537DC', X'477E594B',X'47A00000',X'4D7E56C3',X'68000000', X'477DDA43',X'53766000',X'67AC4000',X'43953A51', X'5B2E94C6',X'3DDBC000',X'217D3769',X'4B900000', X'477DB843',X'652C8000',X'4B8EB4ED',X'4364B747', X'4B200000',X'617D3769',X'4B900000',X'4B8EB4ED', X'4364B768',X'0F65F143',X'58000000',X'597C70D8', X'2B769CE1',X'4B200000',X'7831E900',X'47643AE7', X'4A000000',X'67A4B800',X'5D7DD4DD',X'692CF2E4', X'69943B4B',X'659CB980',X'43980000',X'439E72DB', X'4564B900',X'1F84B943',X'5D200000',X'039E72DB', X'4564B900',X'477DD9E9',X'65AC7A53',X'5F700000', X'0324994B',X'679C3153',X'594E9C80',X'0D0C74D9', X'53A72000',X'67AE185F',X'65A4B200',X'45C80000', X'690E53CB',X'68000000',X'510E526F',X'4394A000', X'277EB947',X'4A000000',X'477DDA53',X'5DAC3A53', X'5F766000',X'2F7E55CD',X'5364A000',X'17173A4B', X'66000000',X'676C3658',X'094C7A53',X'5F743972', X'477DB859',X'4BA4B672',X'4DAD9600',X'597DD380', X'077DB853',X'592E4000',X'690C564B',X'66000000', X'077DD253',X'694DF700',X'477DB859',X'531C3A4B', X'48000000',X'537477DD',X'674E7A4B',X'5DA00000', X'13761AE8',X'4B7492C8',X'197DD380',X'537692CF', X'4B966000',X'5374B34D',X'531D32DD',X'68000000', X'4324994B',X'679C3159',X'4A000000',X'272DB4C7', X'5F65F700',X'477DB6CB',X'5DA00000',X'692F1A00', X'53753A53',X'436539CB',X'48000000',X'2B767AE1', X'617E5A4B',X'48000000',X'6194B1D3',X'674DF700', X'38000000',X'5D2C394B',X'67A00000',X'43B434D9', X'43159280',X'67AC59E9',X'53A6BA4B',X'48000000', X'290E53CB',X'68000000',X'5B0C7453',X'5D280000', X'6F7E5200',X'4324994B',X'679CB200',X'252C9ADD', X'490DDA00',X'78098483',X'26000000',X'2194B353', X'70000000',X'789B29A9',X'0A680000',X'67AE185F', X'65A4B276',X'2B9CA000',X'2B76195F',X'49AC7A53', X'6D280000',X'597CF4C7',X'43600000',X'5F84B943', X'694DF700',X'5D7E92C8',X'077DDA43',X'47A00000', X'0326D4E7',X'5F972000',X'272E5B53',X'47280000' INTEGER I,J,K,M,Q,S STRING(70)OMESS OMESS=" " CYCLE I=1,1,WORDMAX-1 ->FOUND IF N=WORD(I) REPEAT I=DEFAULT FOUND: J=1 CYCLE K=WORD(I+J) IF K&X'8000'=0 THEN EXIT K=K&X'7FFF' OMESS=OMESS." " UNLESS J=1 UNTIL M&1=0 CYCLE M=LETT(K); S=25 UNTIL S<0 CYCLE Q=M>>S&63; IF Q¬=0 THEN OMESS=OMESS.TOSTRING(OUTTT(Q)) S=S-6 REPEAT K=K+1 REPEAT J=J+1 REPEAT RESULT=OMESS END EXTERNALSTRING(16)FN SWRITE(INTEGER VALUE, PLACES) STRING (16) S STRING(1)SIGN INTEGER D0, D1, D2 PLACES=PLACES&15 SIGN=" " S="" IF VALUE<0 THEN SIGN="-" AND VALUE=-VALUE D0=VALUE CYCLE D1=D0//10 D2=D0-10*D1 S=TOSTRING(D2+'0').S D0=D1 REPEAT UNTIL D0=0 S=SIGN.S S=" ".S WHILE LENGTH(S)<=PLACES RESULT=S END EXTERNALROUTINE FAULT(INTEGER N, DATA, IDENT) !*********************************************************************** !* SETS UP AN ERROR MESSAGE AND SHOVES IT OUT ONTO THE LISTING * !* AN ALSO OPTIONALLY TO THE TERMINAL * !*********************************************************************** INTEGER I, J, S, T, Q, QMAX, LENGTH STRING(255)MESS1,MESS2,WK1,WK2 !*DELSTART MONITOR IF (PARM_FAULTY=0 or n>100) AND (PARM_Z#0 OR PARM_DCOMP#0) !*DELEND MESS1=""; MESS2="" if parm_faulty < 255 then PARM_FAULTY=PARM_FAULTY+1 IF N=100 THEN START; ! SYNTAX FAULTS ARE SPECIAL MESS1=" * Failed to analyse line ".SWRITE(WORKA_LINE,2)." " J=0; S=0; T=0; Q=DATA; QMAX=IDENT>>16 LENGTH=IDENT&X'FFFF' UNTIL (J=';' AND Q>QMAX) OR Q=LENGTH CYCLE I=J; J=WORKA_CC(Q); ! DATA HAS START OF LINE POSN IF J>128 AND I<128 THEN MESS2=MESS2." %" AND T=T+2 IF I>128 AND J<128 THEN MESS2=MESS2." " AND T=T+1 IF Q=QMAX THEN START S=T+1 IF S>=11 THEN MESS2=MESS2."?" AND T=T+1 FINISH MESS2=MESS2.TOSTRING(J&127) T=T+1 Q=Q+1 EXIT IF T>=250 REPEAT IF Q=QMAX THEN S=T FINISH ELSE START MESS1=" *".SWRITE(WORKA_LINE, 4)." " PARM_OPT=1 PARM_INHCODE=1 IF PARM_LET=0; ! STOP GENERATING CODE MESS1=MESS1."FAULT".SWRITE(N,2) MESS2=MESSAGE(N) IF MESS2->WK1.("##").WK2 THEN C MESS2=WK1.SWRITE(IDENT,1).WK2 IF MESS2->WK1.("#").WK2 THEN C MESS2=WK1.SWRITE(DATA,1).WK2 IF MESS2->WK1.("&&").WK2 THEN C MESS2=WK1.PRINTNAME(DATA).WK2 IF MESS2->WK1.("&").WK2 THEN C MESS2=WK1.PRINTNAME(IDENT).WK2 IF N>100 THEN MESS2=MESS2." Disaster" FINISH SELECT OUTPUT(PARM_TTOPUT) unless PARM_TTOPUT=-1 PRINTSTRING(MESS1) PRINTSTRING(MESS2) IF MESS2#"" IF N=100 AND S<115 THEN START NEWLINE; SPACES(S+4); PRINTSYMBOL('!') FINISH NEWLINE SELECT OUTPUT(parm_lpoput) unless PARM_TTOPUT=-1 IF N=109 THEN MONITOR ! %IF N=109 %THEN PARM_DCOMP=1 %AND CODEOUT IF N>100 THEN STOP END EXTERNALROUTINE WARN(INTEGER N,V) string (255) mess return if worka_line>=20000 { In an included file } if n=10 start mess=" ? Warning: Inspect the C produced for input line ".SWRITE(WORKA_LINE,2)." " select output( PARM_TTOPUT) unless PARM_TTOPUT=-1 printstring(mess) select output(parm_lpoput) unless PARM_TTOPUT=-1 finish if n=11 start mess=" ? Warning: Structure member name the same as defined name line ".SWRITE(WORKA_LINE,2)." " select output( PARM_TTOPUT) unless PARM_TTOPUT=-1 printstring(mess) select output(parm_lpoput) unless PARM_TTOPUT=-1 finish if n=12 start mess=" ? Warning: Possible Missed comment at line ".SWRITE(WORKA_LINE,2)." " select output( PARM_TTOPUT) unless PARM_TTOPUT=-1 printstring(mess) select output(parm_lpoput) unless PARM_TTOPUT=-1 finish if n=13 start mess=" ? Warning: No dope vector found for array access at line ".SWRITE(WORKA_LINE,2)." Lower bound(s) of zero perforce assumed " select output( PARM_TTOPUT) unless PARM_TTOPUT=-1 printstring(mess) select output(parm_lpoput) unless PARM_TTOPUT=-1 finish END EXTERNALROUTINE PRHEX(INTEGER VALUE, PLACES) CONSTBYTEINTEGERARRAY HEX(0:15)='0','1','2','3','4', '5','6','7','8','9','A','B','C','D','E','F' INTEGER I CYCLE I=PLACES<<2-4, -4, 0 PRINT SYMBOL(HEX(VALUE>>I&15)) REPEAT END EXTERNALROUTINE PRINT THIS TRIP(RECORD(TRIPF)ARRAYNAME TRIPS, INTEGER I) !*********************************************************************** !* OUTPUTS A TRIPLE IN READABLE FORM * !*********************************************************************** CONSTSTRING(5)ARRAY OPERATION(0:192)= C " ? ","RT HD","RDSPY","RDARE","RDPTR", "RTBAD","RTXIT","XSTOP"," ? "," ? ", " ¬ "," -U "," FLT "," ABS ","SHRNK", "STRCH"," JAM "," ??? ","NO OP","PRELD", " ? ","SSPTR","RSPTR","ASPTR","DARRY", "SLINE","STPCK","FRPRE","FPOST","FRPR2", "PRECL","RCALL","RCRFR","RCRMR"," ? ", "GETAD"," INT ","INTPT","TOSTR","MNITR", "PPROF","RTFP ","ONEV1","ONEV2","DVSTT", "DVEND","FREND","DMASS"," ? "(2), "UCNOP","UCB1 ","UCB2 ","UCB3 "," UCW ", "UCBW ","UCWW ","UCLW ","UCB2W","UCNAM", " ? "(68), " + "," - "," !! "," ! "," * ", " // "," / "," & "," >> "," << ", " REXP"," COMP","DCOMP"," VMY "," COMB", " = "," <- "," IEXP"," ADJ ","AINDX", "IFTCH","LASS ","FORCK","PRECC","CNCAT", "IOCPC","PASS1","PASS2","PASS3", "PASS4","PASS5","PASS6", "BJUMP","FJUMP","REMLB","TLAB ","DCLSW", "SETSW","-> SW"," S=1 "," S=2 "," S<- ", "AHASS","PTRAS","MAPRS","FNRES","SCOMP", "SDCMP","PRES1","PRES2","RESLN","RESFN", "SIGEV","RECAS","AAINC","AHADJ","CTGEN", "GETPR","SINDX","ZCOMP","CLSFT","CASFT", "DVBPR","RSTRE","MULTX"; RECORD(TRIPF)NAME CURR ROUTINESPEC OPOUT(RECORD(RD)NAME OPND) NEWLINE CURR==TRIPS(I) WRITE(I,2) SPACE PRINTSTRING(OPERATION(CURR_OPERN)) SPACE PRHEX(CURR_OPTYPE,2) WRITE(CURR_CNT,2) WRITE(CURR_DPTH,2) SPACES(1) PRHEX(CURR_FLAGS,4) WRITE(CURR_PUSE,3) SPACE PRHEX(CURR_X1,8) SPACE OPOUT(CURR_OPND1) OPOUT(CURR_OPND2) IF CURR_OPERN>=128 RETURN ROUTINE OPOUT(RECORD(RD)NAME OPND) STRING(17)T STRING(8)S INTEGER I,J SWITCH SW(0:11) PRHEX(OPND_PTYPE,4) J=OPND _FLAG ->SW(J) UNLESS J>11 PRINTSTRING("?") PRHEX(OPND_S1&X'FFFF',4) SPACE PRHEX(OPND_D,8) SPACE PRHEX(OPND_XTRA,8) RETURN SW(0):SW(1): ! CONSTANT if j=0 then printstring("s") else PRINTSTRING(" ") IF OPND_PTYPE&7=5 START; ! STRING CONSTS I=WORKA_A(OPND_D) I=17 IF I>17 LENGTH(T)=I CYCLE I=1,1,I J=WORKA_A(OPND_D+I) J='_' IF J<=31 CHARNO(T,I)=J REPEAT T<-T." " PRINTSTRING(T) FINISH ELSE START PRHEX(OPND_D,8) SPACES(4) IF OPND_PTYPE>>4>5 THEN PRHEX(OPND_XTRA,8) ELSE SPACES(8) FINISH SPACES(2) RETURN SW(2): ! NAME PRINTSTRING(" NAME ") NAM: S<-PRINTNAME(OPND_D)." " PRINTSTRING(S) IF OPND_XTRA#0 THEN PRHEX(OPND_XTRA,8) ELSE SPACES(8) SPACE RETURN sw(3): printstring(" AR ptr "); write(opnd_d,2); spaces(10) return SW(4): ! VIA STORED POINTER @TRIPLE PRINTSTRING("OFFSET-PTR") ->COM SW(5): ! 32 BIT ADDRESS PRINTSTRING(" PNTR ") ->NAM SW(7): ! IN A STACK FRAME PRINTSTRING(" TEMP ") PRHEX(OPND_D,8) SPACE PRHEX(OPND_XTRA,8) RETURN SW(6): ! INDIRECT PRINTSTRING(" IND-OFFST") COM: WRITE(OPND_D,2) SPACE PRHEX(OPND_XTRA,8) SPACE RETURN SW(8): ! A TRIPLE PRINTSTRING(" TRIPLE ") WRITE(OPND_D,2) SPACES(12) RETURN SW(9): ! REGISTER ITEM PRINTSTRING(" ITEM IN REGSTR ") SPACES(4) RETURN SW(10): ! B-D FORFM PRINTSTRING("BASE&DIS ") PRHEX(OPND_XB,2) SPACE PRHEX(OPND_D,8) RETURN SW(11): ! VIA LA ON B&D PRINTSTRING("ADDR(B&D)") PRHEX(OPND_XB,2) SPACE PRHEX(OPND_D,8) END END EXTERNALROUTINE PRINT TRIPS(RECORD(TRIPF)ARRAYNAME TRIPS) INTEGER I ! %RETURN %IF PARM_Y=0 %AND PARM_Z=0;! TRIPLES ON CODE+PARMY OR Z PRINTSTRING(" TRIPLES FOR LINE"); WRITE(WORKA_LINE,3) PRINTSTRING(" NO OPRN PT C D FLGS PUSE X1 OPERAND 1 OPERAND 2") I=TRIPS(0)_FLINK WHILE I>0 CYCLE PRINT THIS TRIP(TRIPS,I) I=TRIPS(I)_FLINK REPEAT END EXTERNALROUTINE INITASL(RECORD(LISTF)ARRAYNAME SPACE,INTEGERNAME PTR) !*********************************************************************** !* INITIALISES THE ASL AND REMEMBERS IT LOCATION !*********************************************************************** INTEGER I ASLIST==SPACE ASL==PTR WORKA_ASL CUR BTM=ASL-240 WORKA_CONST LIMIT=4*WORKA_ASL CUR BTM-8 CYCLE I=WORKA_ASL CUR BTM,1,ASL-1 aslist(i+1)=0 ASLIST(I+1)_LINK=I REPEAT ASLIST(WORKA_ASL CUR BTM)_LINK=0 ASLIST(0)_S1=-1 ASLIST(0)_S2=-1 ASLIST(0)_S3=-1 ASLIST(0)_LINK=0 END EXTERNALROUTINE PRINT LIST(INTEGER HEAD) !*********************************************************************** !* A DEBUGGING ONLY ROUTINE. !*********************************************************************** RECORD(LISTF)NAME LCELL INTEGER I,J,K PRINTSTRING(" PRINT OF LIST ") WRITE(HEAD,2) NEWLINE WHILE HEAD#0 CYCLE LCELL==ASLIST(HEAD) WRITE(HEAD,3) SPACES(3) PRHEX(LCELL_S1,8) SPACES(3) PRHEX(LCELL_S2,8) SPACES(3) PRHEX(LCELL_S3,8) SPACES(3) PRHEX(LCELL_LINK,8) NEWLINE HEAD=LCELL_LINK&X'FFFF'; ! EXTRA LINK IN TAGS LIST!! REPEAT END EXTERNALROUTINE CHECK ASL !*********************************************************************** !* CHECK ASL AND PRINT NO OF FREE CELLS. DEBUGGING SERVICE ONLY * !*********************************************************************** INTEGER N,Q Q=ASL; N=0 WHILE Q#0 CYCLE N=N+1 Q=ASLIST(Q)_LINK REPEAT NEWLINE PRINTSTRING("FREE CELLS AFTER LINE ") WRITE(WORKA_LINE,3) PRINTSYMBOL('=') WRITE(N,3) END EXTERNALINTEGERFN MORE SPACE !*********************************************************************** !* FORMATS UP SOME MORE OF THE ASL * !*********************************************************************** INTEGER I,N,CL,AMOUNT N=WORKA_ASL CUR BTM-1 AMOUNT=(WORKA_NNAMES+1)>>3; ! EIGHTTH OF NNAMES I=WORKA_ASL CUR BTM-((WORKA_CONST PTR+8)>>2);! GAP BETWEEN CONSTS &ASL IF I>>1<AMOUNT THEN AMOUNT=I>>1; ! TAKE ONLY HALF THE REMAINDER IF AMOUNT<20 THEN AMOUNT=0 WORKA_ASL CUR BTM=WORKA_ASL CUR BTM-AMOUNT IF WORKA_ASL CUR BTM<=1 THEN WORKA_ASL CUR BTM=1 CL=4*WORKA_ASL CUR BTM-8 IF WORKA_ASL CUR BTM>=N OR WORKA_CONST PTR>CL THEN START FAULT(102, WORKA_WKFILEK,0) FINISH ELSE WORKA_CONST LIMIT=CL; ! NEW VALUE WITH BIGGER ASL CYCLE I=WORKA_ASL CUR BTM,1,N-1 ASLIST(I+1)_LINK=I REPEAT ASLIST(WORKA_ASL CUR BTM)_LINK=0 ASL=N; RESULT=N END !%EXTERNALINTEGERFN NEW CELL !*********************************************************************** !* PROVIDE A NEW LIST PROCESSING CELL. CRAPOUT IF NONE AVAILABLE * !*********************************************************************** !%INTEGER I ! %IF ASL=0 %THEN ASL=MORE SPACE ! I=ASL ! ASL=ASLIST(ASL)_LINK ! ASLIST(I)_LINK=0 ! %RESULT =I !%END EXTERNALROUTINE PUSH(INTEGERNAME CELL, INTEGER S1, S2, S3) !*********************************************************************** !* PUSH A CELL CONTAINING THE 3 STREAMS OF INFORMATION GIVEN * !* ONTO THE TOP OF THE LIST POINTED AT BY CELL. * !*********************************************************************** RECORD(LISTF)NAME LCELL INTEGER I I=ASL IF I=0 THEN I=MORE SPACE LCELL==ASLIST(I) ASL=LCELL_LINK LCELL_LINK=CELL CELL=I LCELL_S1=S1 LCELL_S2=S2 LCELL_S3=S3 END EXTERNALROUTINE POP(INTEGERNAME CELL, S1, S2, S3) !*********************************************************************** !* COPY THE INFORMATION FROM THE TOP CELL OF LIST 'CELL' INTO * !* S1,S2&S3 AND THEN POP THE LIST UP 1 CELL. EMPTYLIST GIVE -1S* !*********************************************************************** INTEGER I RECORD(LISTF)NAME LCELL I=CELL LCELL==ASLIST(I) S1=LCELL_S1 S2=LCELL_S2 S3=LCELL_S3 IF I# 0 THEN START CELL=LCELL_LINK LCELL_LINK=ASL ASL=I FINISH END EXTERNALROUTINE BINSERT(INTEGERNAME TOP,BOT,INTEGER S1,S2,S3) !*********************************************************************** !* INSERT A CELL AT THE BOTTOM OF A LIST * !* UPDATING TOP AND BOTTOM POINTERS APPROPIATELY * !*********************************************************************** INTEGER I,J RECORD(LISTF)NAME LCELL I=ASL IF I=0 THEN I=MORE SPACE LCELL==ASLIST(I) ASL=LCELL_LINK LCELL_S1=S1; LCELL_S2=S2 LCELL_S3=S3; LCELL_LINK=0 J=BOT IF J=0 THEN BOT=I AND TOP=BOT ELSE START ASLIST(J)_LINK=I BOT=I FINISH END EXTERNALROUTINE INSERT AFTER(INTEGERNAME PLACE,INTEGER S1,S2,S3) !*********************************************************************** !* ADDS A CELL INT THE MIDDLE OF A LIST AFTER "CELL" WHICH * !* IS UPDATED * !*********************************************************************** INTEGER I RECORD(LISTF)NAME OLDCELL,CELL FAULT(109,0,0) IF PLACE<=0 I=ASL IF I=0 THEN I=MORE SPACE CELL==ASLIST(I) ASL=CELL_LINK OLDCELL==ASLIST(PLACE) CELL_S1=S1; CELL_S2=S2 CELL_S3=S3 CELL_LINK=OLDCELL_LINK OLDCELL_LINK=I PLACE=I END EXTERNALROUTINE INSERT AT END(INTEGERNAME CELL, INTEGER S1, S2, S3) !*********************************************************************** !* ADD A CELL TO THE BOTTOM OF THE LIST HEADED BY 'CELL' * !*********************************************************************** INTEGER I,J,N RECORD(LISTF)NAME LCELL I=CELL; J=I WHILE I#0 CYCLE J=I I=ASLIST(J)_LINK REPEAT N=ASL IF N=0 THEN N=MORE SPACE LCELL==ASLIST(N) ASL=LCELL_LINK IF J=0 THEN CELL=N ELSE ASLIST(J)_LINK=N LCELL_S1=S1 LCELL_S2=S2 LCELL_S3=S3 LCELL_LINK=0 END EXTERNALINTEGERFN 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. * !*********************************************************************** WHILE LIST#0 CYCLE RESULT=LIST IF LAB=ASLIST(LIST)_S2 LIST=ASLIST(LIST)_LINK REPEAT RESULT=-1 END EXTERNALROUTINE CLEAR LIST(INTEGERNAME OPHEAD) !*********************************************************************** !* THROW AWAY A COMPLETE LIST (MAY BE NULL!) * !*********************************************************************** INTEGER I, J I=OPHEAD; J=I WHILE I#0 CYCLE J=I I=ASLIST(J)_LINK REPEAT IF J#0 START ASLIST(J)_LINK=ASL ASL=OPHEAD; OPHEAD=0 FINISH END !%EXTERNALROUTINE CONCAT(%INTEGERNAME LIST1, LIST2) !!*********************************************************************** !!* ADDS LIST2 TO BOTTOM OF LIST1 * !!*********************************************************************** !%INTEGER I,J ! I=LIST1 ! J=I ! %WHILE I#0 %THEN J=I %AND I=ASLIST(J)_LINK ! %IF J=0 %THEN LIST1=LIST2 %ELSE ASLIST(J)_LINK=LIST2 ! LIST2=0 !%END; ! AN ERROR PUTS CELL TWICE ONTO ! FREE LIST - CATASTROPHIC! ROUTINE PutError(STRING (255) s) !*********************************************************************** !* Compilation ends in disarray. Message and stop tidily * !*********************************************************************** INTEGER bad printstring("** PUT error **"); newline bad=addr(s)+1 monitor; STOP END {PutError} externalroutine free space(integer ad) !*********************************************************************** !* This is EPCs interface to FREE * !* Enables monitoring or checking to take place * !************************************************************************ printstring(" FREE "); write(ad,1) newline end; ! Free space !* EXTERNAL INTEGER FN Get Space(INTEGER size{bytes}) !************************************************************************ !* This is EPC's interface to MALLOC * !* Enables monitoring or checking to take place * !************************************************************************ INTEGER flag size=(size+7)&(-8) { keep everything d-w aligned } IF malmon#0 START printstring(" MALLOC "); write(size,1) flag=MALLOC(size) printstring(" flag = "); phex(flag) newline IF flag+size>maxdata THEN maxdata=flag+size FINISH ELSE flag=MALLOC(size) IF flag=0 THEN PutError(" MALLOC out of space ") RESULT=flag END externalroutine changesex end externalroutine pownarrayhead end externalroutine emonon end externalroutine prdata end externalroutine generate end externalroutine pinitown end externalroutine esetoptions end externalroutine psetfiles end externalroutine epilogue end externalroutine impabort end externalroutine mcodeon end externalroutine reformatc end externalroutine pfaulty end externalroutine prologue end externalroutine filldtabrefs end externalroutine cxref end externalroutine esetgisoptions end externalroutine pdata end externalroutine pgenerateobject end externalroutine pmonon end END OF FILE