!THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ! OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ! !COPYRIGHT (C) 1972,1973,1974,1977,1978 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 01754 !FILENAME: H3DRIV.BLI !DATE: 10 SEPTEMBER 1974 MGM/FLD/KR/GJB ! REVISION HISTORY : ! 12-29-77 ROUTINE MACHINECODE IS MODIFIED TO ADD KI10 ! INSTRUCTION SET TO KA10 INSTRUCTION SET. THE TABLE ! POC IS CHANGED IN NOONCE.MAC. ! ! 10-19-77 GLOBAL SYMBOL MODFLAG IS ADDED AND USED IN DUMPREG ROUTINE. ! IF MOD FUNCTION IS USED AND BLISS-10 SAVES ! A REGISTER ONTO A STACK, THEN CLEAR ALL ITS REFERENCES. ! ! 9-27-77 MODIFIED DRIVER ROUTINE AND DELETED WRNENT ROUTINE ! SO THAT NO WARNING IS GIVEN FOR ENTRIES. ! 9-19-77 GLOBAL VAR. NOIFOPTIS ADDED. NOIFOPT IS USED ! IN SIF,GENGRAPH TO FIX BUG#46. ! ! 7-15-77 ROUTINE REINIT AND DRIVER ARE MODIFIED SO THAT SREG,VREG, ! FREG,DREGS,RESREGM ARE MADE GLOBAL BIND.THE LINKER ! WILL GIVE WARNING IF REGISTER ASSIGNMENT IS DIFFERENT ! FOR EACH MODULE (COMPILED SEPARATELY).IT KEEPS ! TRACK OF REGISTER ASSIGNMENT FOR THE USER. !7-14-77 ROUTINE DRIVER IS MODIFIED SO THAT ANY THING ON ! ON ELUDOM LINE AFTER ELUDOM IS DISCARDED. ! ! 6-2-77 ROUTINE OUTTIME IS ADDED TO OUTPUT RUN TIME AND ! ELAPSED TIME. THE STATISTICS ARE OUTPUT ALWAYS FOR ! BLISS10 AND BLISS-36C MODULES. ! ROUTINE WRITEFINAL IS MODIFIED. ! SEMICOLON IS INSERTED INFRONT TO ASSEMBLE MULTIPLE ! MODULES FROM LIST FILE. ! ! 5-9-77 ROUTINES DRIVER,REINIT ARE MODIFIED TO HAVE MORE THAN ! ONE MODULE IN A FILE.BLISS-10 WILL COMEPILE MORE ! THAN ONE MODULE BUT PRODECES ONLY ONE REL FILE. ! ROUTINE MACHINE WAS MODIFIED TO HAVE FLTR,FIXR IN ! LIST FILE. ! EXTERNAL REGASSN; !7-8-77 %3.43,4.01,4.02,4.11% GLOBAL BIND H3DRV=18; !MODULE VERSION NUMBER %3-24-77% EXTERNAL NOMOREINPUT; !TO PROCESS MORE THAN ONE MODULE IN A FILE %7-13-77% EXTERNAL RREG; ! LCG NOTATION EXTERNAL ZFLAG; GLOBAL MODFLAG; GLOBAL NOIFOPT; %9-19-77% ! THE FOLLOWING 5 LINES ARE ADDED TO OUTPUT RUN TIME AND ! ELAPSED TIME OF A JOB. 5-18-77 (TWO MACROS) EXTERNAL BEGCPU,BEGTIME; MACRO RUNTIM= (REGISTER R; MACHOP CALLI=#047; R_0; CALLI(R,#27))$, MSTIME= (REGISTER R; MACHOP CALLI=#047; R_0; CALLI(R,#23))$; %3.19% ROUTINE CONCAT(A,B)= %3.19% BEGIN REGISTER IN, OUT; LABEL L1, L2; %3.19% IN_ (A)<36,7>; OUT_ (MMC)<36,7>; %3.19% L1: DECR I FROM 9 TO 0 DO %3.19% IF SCANI(IN) GTR " " THEN COPYNI(IN, OUT); %3.19% END; %3.1% GLOBAL ROUTINE MACHINECODE(IOX,OP,TOG)= BEGIN LOCAL J,X; MACHOP IDPB=#136; ! THIS ROUTINE GENERATES THE MNEMONIC FOR A MACHINE ! OP-CODE IN THE GLOBAL VARIABLE 'MMC' AND ITS SUCCESSOR. %2.25% STRUCTURE UUONAME[I,J]=(.UUONAME+.I*2+.J)<0,36>; %2.25% %2.25% !NOTE: EACH UUO NAME IN THIS PLIT MUST BE >= 6 CHARS AND <= 10 CHARS SO THAT IT WILL OCCUPY %2.25% !EXACTLY TWO WORDS IN THE PLIT %2.25% BIND UUONAME UUOOP=PLIT( %2.25% 'CALL ', %2.25% 'INIT ', %2.25% 'UUO ', %2.25% 'UUO ', %2.25% 'UUO ', %2.25% 'UUO ', %2.25% 'UUO ', %2.25% 'CALLI ', %2.25% 'OPEN ', %2.25% 'TTCALL', %2.25% 'UUO ', %2.25% 'UUO ', %2.25% 'UUO ', %2.25% 'RENAME', %2.25% 'IN ', %2.25% 'OUT ', %2.25% 'SETSTS', %2.25% 'STATO ', %2.25% 'GETSTS', %2.25% 'STATZ ', %2.25% 'INBUF ', %2.25% 'OUTBUF', %2.25% 'INPUT ', %2.25% 'OUTPUT', %2.25% 'CLOSE ', %2.25% 'RELEAS', %2.25% 'MTAPE ', %2.25% 'UGETF ', %2.25% 'USETI ', %2.25% 'USETO ', %2.25% 'LOOKUP', %2.25% 'ENTER '); MMC_(MMC+1)_0; CASE .OP<6,3> OF SET IF .OP LSS #040 THEN ! CASE 0 (MMC_IF .OP EQL DEBUGUUO THEN 'DEBUG' ELSE 'UUO') %2.25% ELSE %2.25% (MMC_.UUOOP[(.OP-#040),0]; %2.25% (MMC+1)<0,36>_.UUOOP[(.OP-#040),1]); IF .OP EQL #104 THEN ! CASE 1 MMC=.POC[9,0] ! JSYS ELSE IF .OP<5,1> THEN CONCAT(.POC[3,.OP<2,3>], .OCE[1,.OP<0,2>]) ELSE %THE FOLLOWING 4 LINES ARE ADDED TO ADD KI10 INST. TO KA10 INST. 12-29-77 % ( MMC=.POC[.OP<3,2>-1,.OP<0,3>]; IF ((.OP EQL #124) OR (.OP EQL #125)) THEN CONCAT(.MMC,'M'); ); IF .OP<5,1> ! CASE 2 THEN MMC_.POC[5,.OP<0,5>] %12-29-77% ELSE CONCAT(.POC[4,.OP<2,3>], .OCE[.OP<4,1>,.OP<0,2>]); %12-29-77% CONCAT(.POC[6,.OP<3,3>], .OCE[5,.OP<0,3>]); ! CASE 3 %12-29-77% CONCAT(.POC[7,.OP<2,4>], .OCE[1,.OP<0,2>]); ! CASE 4 %12-29-77% BEGIN ! CASE 5 MMC_ CASE (.OP<5,1>^1 OR .OP<2,1>) OF SET 'HLL'; 'HRL'; 'HRR'; 'HLR' TES; CONCAT( .MMC, .OCE[2,.OP<3,2>] ); CONCAT( .MMC, .OCE[0,.OP<0,2>]); END; BEGIN ! CASE 6 MMC_ CASE (.OP<3,1>^1 OR .OP<0,1>) OF SET 'TR'; 'TL'; 'TD'; 'TS' TES; CONCAT(.MMC, .OCE[3,.OP<4,2>] ); CONCAT(.MMC, .OCE[4,.OP<1,2>] ); END; %3.19% BEGIN %3.19% MMC_ .(PLIT ('BLKI', 'DATAI', 'BLKO', 'DATAO', !CASE 7 %3.19% 'CONO', 'CONI', 'CONSZ', 'CONSO'))[.IOX]; %3.19% MMC[1]_ 0; %3.19% END TES; %3.19% OP_ MMC<36,7>; %3.19% IF .TOG %3.19% THEN (ACCUM_ ACCUM[1]_ -2; %3.19% PACCUM_ ACCUM<36,7>; %3.19% UNTIL COPYII(OP, PACCUM) EQL 0 DO 0; %3.19% REPLACEN(PACCUM, #177)) !PUT #177 OVER NULL %3.19% ELSE (OUTPSTRING(.OP); %3.19% OCHAR(#11)) %3.19% END; ! OF MACHINECODE ROUTINE LTUSED = !COUNT THE NUMBER OF ENTRIES USED IN THE LITERAL TABLE !THE VALUE OF THE ROUTINE IS THE NUMBER OF ENTRIES USED. BEGIN %2.9% REGISTER R, !POINTER TO LT ENTRIES %2.9% COUNT; !COUNT OF ENTRIES USED IN LT COUNT_0; %2.27% INCR J FROM 0 TO LTNUM-1 DO %2.9% COUNT_.LTBASE[.J]+.COUNT; %2.9% RETURN .COUNT; END; ROUTINE OUTTIME(VALUE)= ! !FUNCTION 5-18-77 ! OUTPUT A TIME-VALUE TO THE CURRENT OUTPUT DEVICE ! IN THE FORMAT MM:SS ! ! !INPUTS ! VALUE - A TIME, EXPRESSED IN MILLISECONDS ! !OUTPUTS ! NONE ! BEGIN LOCAL SEC,TS; IF .VALUE LSS 0 THEN VALUE_.VALUE+(24*60*60*1000); ! VALUE_(.VALUE+500)/1000; SEC_(.VALUE+50)/1000; TS_((.VALUE+50) MOD 1000)/100; ! TENTH OF A SECOND OUTNUM(.SEC/60,10,0,1); !OUTPUT MINUTES ! OUTNUM(.VALUE/60,10,0,1); EOUTSTR(":",1); OUTNUM(.SEC MOD 60,10,0,1); !OUTPUT SECONDS IF .TS GTR 0 THEN (EOUTSTR(".",1); OUTNUM(.TS,10,0,1) ); !OUTPUT TENTH OF SECOND ! OUTNUM(.VALUE MOD 60,10,0,1); ENEWLINE(); END; ROUTINE STACKFREE = !DETERMINE HOW MUCH STACK SPACE WAS NOT USED AND RETURN !THE NUMBER OF UNUSED STACK LOCATIONS AS THE VALUE OF THE ROUTINE DECR I FROM DEPTH-1 TO 0 DO IF .STACK[.I] NEQ 0 THEN RETURN DEPTH -.I -1; %3.9-1% GLOBAL ROUTINE OUTOFFSET(A)= ! HANDLE OFFSETS PROPERLY %3.23% 6+(IF .A<15,3> NEQ 7 THEN OCHAR("+")+OUTMOC(.A) ! POSITIVE - PUT "+" ELSE OUTCONOC(.A)); ! NEGATIVE - CONOC PUTS "-" ROUTINE WRITEFINAL= %2.9% BEGIN ! THIS ROUTINE WRITES THE FINAL GOOD-BYE TO THE USER %5.200.36% EXTERNAL PRNTERLNS; %3.26% IF .CCLCTL NEQ 0 THEN CCLCTL<2,1>_ 1; !'SUPPRESS CRAP' ERRBIT_0; ENEWLINE(); NEWLINE(); NEWLINE(); EMESSAGE(";","Modul","e len","gth: ",4); %3.20% OUTNUM(.MODLENGTH %2.30% + (IF .LSTART THEN !ADD LENGTH OF PROLOGS AND EPILOGS %2.30% (((9+.NOSVR)*(.NOSVR)+10)/2)),10,0,1); %3.20% IF .LUNDEFLG THEN (EOCHAR("+");OUTNUM(.NODISC,10,0,1)); %2.9% EOCHAR("+"); OUTNUM(.PTREFNO + 1 + !PTREFNO = # PTRS - 1 %2.9% !ADD THE NUMBER OF LITERALS %2.9% BEGIN %2.9% REGISTER R; %2.9% R_0; %2.27% INCR I FROM 0 TO LTNUM-1 DO %2.9% R_.LTTBASE[.I] + .R; %2.9% .R %2.9% END %3.20% + .PLNEXT, 10,0,1);ENEWLINE(); IF .STATFLG THEN !OUTPUT ADDITIONAL STATISTICS ON /S BEGIN EMESSAGE(";","Liter","al ta","ble u","sed: ",5); %3.20% OUTNUM (LTUSED(),10,0,1); EOUTSTR (" of ",4); %3.20% OUTNUM ( %2.9% BEGIN %2.9% REGISTER R; %2.9% R_0; %2.27% INCR I FROM 0 TO LTNUM - 1 DO %2.9% IF .LTBASE[.I] EQL 0 THEN EXITLOOP %2.9% ELSE R_.R+1; %2.9% .R*LTSIZE %2.9% END %3.20% ,10,0,1); EMESSAGE (" Entr","ies",2); ENEWLINE(); !AMOUNT OF STACK USED EMESSAGE (";","Stack"," used",": ",4); %3.20% OUTNUM (DEPTH<0,0>-(STACKFREE()),10,0,1); EOUTSTR (" of ",4); %3.20% OUTNUM (DEPTH<0,0>,10,0,1); EMESSAGE (" Word","s",2); ENEWLINE(); END; !Run Time and Elapsed Time EMESSAGE(";","Run T","ime: ",3); OUTTIME(RUNTIM -.BEGCPU); EMESSAGE(";","Elaps","ed Ti","me: ",4); OUTTIME(MSTIME -.BEGTIME); !MAX AMOUNT OF CORE USED EMESSAGE (";","Max c","ore u","sed: ",4); %3.20% OUTNUM ((.?.JBREL+1)^(-10),10,0,1); EOUTSTR (" + ",3); %3.20% OUTNUM (((.?.JBHRL AND #377777) + 1)^(-10),10,0,1); EOUTSTR (" K",2); ENEWLINE(); ENEWLINE(); %3.18% IF .WARNINGFOUND NEQ 0 THEN %3.18% (EMESSAGE("%BLSW","RN ",2); OUTNUM(.WARNINGFOUND, 10, 0, 1); %3.18% EMESSAGE(" Warn","ing",2); %3.18% IF .WARNINGFOUND GTR 1 THEN EOCHAR("s"); %3.18% ENEWLINE()); %3.18% %3.18% IF .ERRORFOUND NEQ 0 THEN %3.18% (EMESSAGE("??BLSE","RR ",2); OUTNUM(.ERRORFOUND,10,0,1); %3.18% EMESSAGE(" erro","r",2); %3.18% IF .ERRORFOUND GTR 1 THEN EOCHAR("s"); %3.18% EMESSAGE(" dete","cted",2)) %3.18% ELSE (EMESSAGE(";","[BLSN","ED No"," erro","rs de","tecte","d]",7)); %3.18% %5.200.36% PRNTERLNS(); !IN DR0. RETURNS IF NO BUSINESS %3.18% ENEWLINE(); ENEWLINE(); CCLCTL<2,1>_0; % DONE SUPPRESSING % IF NOT.LSTFLG THEN FORCE(2); ! IF NOT.BINFLG THEN ( FORCE(1)); IF (NOT .BINFLG AND .FINFLG) THEN FORCE(1); !3-28-77 END; %2.25% ROUTINE DELFLINK(IND)= %2.25% !AT THIS POINT THE STRUCTURE OF THE TREE IN WHICH IND RESIDES %2.25% !HAS BEEN ALTERED A GREAT DEAL FROM THE STANDARD: %2.25% !CELLS ASSOCIATED WITH LABELS WILL HAVE THEIR HEADER BITS %2.25% !ON EVEN THO THEY AREN'T HEADERS. %2.25% !BACKWARD LINKS ARE NO LONGER VALID EXCEPT FOR LINE # REFERENCE %2.25% !CELLS WHICH MUST HAVE VALID BACKWARD LINKS. %2.25% !.IND IS THE INDEX OF THE CELL WE WISH TO DELETE FROM THIS %2.25% !NON-STANDARD TREE. %2.25% %2.25% BEGIN %2.25% %2.25% !IF THE CELL FOLLOWING .IND IS A LINE # CELL, WE MUST FIX %2.25% !UP ITS PREVF. %2.25% %2.25% IF .CT[.CT[.IND,0],1] EQL 0 %2.25% THEN CT[.CT[.IND,0],0] _ .CT[.IND,0]; %2.25% %2.25% %2.25% !LINK THE CELL BEFORE .IND TO POINT TO THE GUY .IND POINTS TO %2.25% !IF THE GUY BEFORE .IND IS A HEADER, UPDATE THE NEXTF OF WORD 1 %2.25% !OTHERWISE WORD 0. IT TURNS OUT THAT BY THE TIME WE REACH %2.25% !.IND AT THIS POINT, HEADER BITS FOR CELLS BEFORE .IND IN THE %2.25% !TREE VALIDLY INDICATE A TRUE LIST HEADER CONDITION WHEREAS %2.25% !HEADER BITS FOR CELLS WHICH FOLLOW .IND MAY OR MAY NOT INDICATE %2.25% !TRUE HEADERS %2.25% %2.25% CT[.CT[.IND,0],.CT[.CT[.IND,0],0]]_.CT[.IND,0]; %2.25% DELCELL(.IND); %2.25% %2.25% END; !OF ROUTINE DELFLINK %3.1% GLOBAL ROUTINE WRITECODE(H)= %2.25% BEGIN LOCAL OFSET,N,M,A,I,R,T,P; BIND LUNDEWORD=(.FCNSTATE NEQ 0) AND .LUNDEFLG; %5.200.33% EXTERNAL FIXUPOFF; %2.25% MACRO LABF(I)=CT[I,0]$; !LABEL NUM OF LABEL CELL %2.25% !IF NO LABEL # ASSIGNED, BUMP NEXTLAB AND %2.25% !ASSIGN ITS VALUE TO THE LABEL #. %2.25% !IN ANY CASE, RETURN THE LABEL NUMBER. %2.25% MACRO LABNUM(I)=IF .LABF(I) EQL 0 THEN (LABF(I)_(NEXTLAB_.NEXTLAB+1)) ELSE .LABF(I)$; %2.25% LOCAL LNSEEN; !0 => NO BLISS-10 LINE REFS !OTHERWISE LINE # %2.25% EXTERNAL OUTDEC, EOUTPSTRING, OUTPSTRING, RLTTRANS, R50TOASCIZ; %3.38% GLOBAL ROUTINE OUTCTREF(IND) = %3.19% IF .CT[.IND]<30,6> EQL #76 %3.19% THEN OUTSTN(.CT[.IND,2]) ELSE (OUTSTR("L.",2) + OUTMOC(LABNUM(.IND))); %2.25% !ZEROLABF FOR EACH CELL SO WE CAN USE IT TO HOLD THE %2.25% !CONVERTED LABEL NO. IN ORDER TO MAKE ALL LABEL NAMES %2.25% !WITHIN A MODULE UNIQUE, WE'LL ASSIGN THEM STARTING WITH %2.25% !L.1 IN CONSEQUTIVE ORDER. THE LABF WILL CONTAIN THE LABEL NO. %2.25% !CORRESPONDING TO THE PARTICULAR LABEL CELL. %5.200.33% FIXUPOFF(.H); %2.25% N_.CT[.H,1]; !GET START OF TREE %4.01% PSTKPTR_0; !INIT THE PEEP STACK POINTER %4.01% PEEPOK_-1; !PEEPING AT START %4.01% PSTOP_PEEPHDR_.H; %4.01% PX_.N; %4.11% IF NOT (.NPTFLG) THEN %4.11% BEGIN %4.01% UNTIL .PX EQL .PEEPHDR %4.01% DO %4.01% BEGIN %4.01% PX_NXTINSTR(.PX); %4.01% PEEPER(); %4.01% END; %4.01% PX_.N; %4.01% UNTIL .PX EQL .PEEPHDR %4.01% DO %4.01% BEGIN %4.01% IF (.POPCODE(.PX) EQL PEEPHOLE) %4.01% THEN IF .PLABEL(.PX) %4.01% THEN %4.01% BEGIN %(******SPECIAL KLUDGE FOR #777 OPCODE , SEE NEXT PAGE IN MACRO LISTER*****)% %4.01% M _ .CT[.PX,0]; %4.01% IF .PLABEL(.M) %4.01% OR .POPCODE(.M) EQL #777 %4.01% OR .POPCODE(.M) EQL 0 %4.01% THEN POPCODE(.PX)_CAI %4.01% ELSE %4.01% BEGIN %4.01% PRELOC(.PX)_.PRELOC(.M); %4.01% PCODEWD(.PX)_.PCODEWD(.M); %4.01% CT[.PX,0]_.CT[.M,0]; %4.01% CT[.CT[.M,0],0]_.PX; %4.01% DELCELL(.M); %4.01% PX_.CT[.PX,0] %4.01% END %4.01% END %4.01% ELSE BEGIN %4.01% M_.CT[.PX,0]; %4.01% CT[.CT[.PX,0],0]_.CT[.PX,0]; %4.01% CT[.CT[.PX,0],0]_.CT[.PX,0]; %4.01% DELCELL(.PX); %4.01% PX_.M %4.01% END; %4.01% PX_.CT[.PX,0] %4.01% END; %4.11% END; !OF OPTIMIZATION TEST BEGIN BLOCK %2.25% UNTIL .N EQL .H %2.25% DO %2.25% BEGIN %2.25% IF .CT[.N,1] NEQ 0 THEN !WE CAN ZERO PREVF %2.25% LABF(.N)_0; !TO INDICATE NO NUM ASSIGNED YET %2.25% N_.CT[.N,0]; %2.25% END; N_.CT[.H,1]; IF .FCNSTATE NEQ 0 THEN NODISC_.NODISC+1; %3.19% OFSET_0; LNSEEN_0; IF NOT .MLFLG THEN UNTIL .N EQL .H DO IF .CT[.N,1] EQL 0 THEN BEGIN M_.CT[.N,0]; %2.25%%3.19% IF NOT (.OFSET EQL 0 AND LUNDEWORD) %2.25% !BECAUSE WE HAVE REMOVED BACK LINKS, WE MUST NOT %2.25% !DO A STANDARD ERASE OF LINE # CELLS, SO WE LINK FORWARD %2.25% !ONLY ACROSS THIS CELL AND THEN SIMPLY RETURN IT. %2.25% THEN DELFLINK(.N) ELSE OFSET_ .OFSET + 1; N_.M END ELSE BEGIN %3.19% CT[.N,0]_0; %3.19% N_.CT[.N,0]; %3.19% OFSET_ .OFSET + 1; END ELSE BEGIN NEWLINE(); %2.25% !NOW OUTPUT MODULE OR ROUTINE OR FUNCTION NAME AS %2.25% !ADDRESS TAG. OUTPUT THE APPROPRIATE NAME TO THE LISTING DEVICE. %2.25% IF .FCNSTATE EQL 0 %2.25% THEN %3.19% (IF .STATFLG %3.19% THEN EOUTPSTRING %3.19% ELSE OUTPSTRING)(FNAME) %2.25% ELSE %3.19% (IF .STATFLG %3.19% THEN EOSTN %3.19% ELSE OUTSTN)(.CT[.H,2]); %2.25% !OUTPUT TAG DELIMITER FOR MACRO %2.25% OCHAR(":"); %2.25% !MAKE IT INTERNAL IF MODULE START ADDRESS OR GLOBAL ROUTINE %2.25% IF .FCNSTATE EQL 0 %2.25% THEN OCHAR(":") %2.25% ELSE %2.25% IF .ST[.CT[.H,2],0] EQL GROUTINET %2.25% THEN OCHAR(":"); %2.25% !NOW END THE LINE %3.19% (IF .STATFLG THEN ENEWLINE ELSE NEWLINE)(); NEWLINE(); IF LUNDEWORD THEN BEGIN OUTSTR(#11^28 OR " -1",5); OUTSTR(#11^7 OR #11,2); %3.20% OUTNUM(.CT[.N,1],8,12,0); NEWLINE(); N_.CT[.N,0] END; UNTIL .N EQL .H DO BEGIN IF .CT[.N,1] EQL 0 THEN BEGIN %2.25% IF (.LNSEEN EQL 0) THEN %2.25% LNSEEN_.CT[.N,1]^(-4); !LINE NUMBER M_.CT[.N,0]; %2.25% DELFLINK(.N); N_.M END ELSE BEGIN IF .(M_CT[.N,0]) THEN BEGIN %2.25% OUTSTR("L.",2); %2.25% OUTMOC(LABNUM(.N)); !WRITE OUT THE LABEL # %2.25% OCHAR(":"); !LABEL DELIMITER .M_0 END; IF .CT[.N,1] EQL #777 THEN CT[.N,1] _ 0; M_.CT[.N,1]; %2.25% !OUTPUT A TAB AFTER TAG FIELD %2.25% OCHAR(#11); %2.25% !OUTPUT OPCODE MNEMONIC %3.19% MACHINECODE(.M<23,3>,.M,0); %2.25% !OUTPUT AC FIELD A_.M; %3.19% IF .M GEQ #700 %3.20% THEN OUTNUM((.M<24,9> AND NOT 3),8,3,0) ! DEVICE CODE %3.19% ELSE MACOUT(.A); ! ACCUMULATOR OCHAR(","); %2.25% !OUTPUT INDIRECT SIGN IF .M THEN OCHAR("@"); %2.25% !OUTPUT ADDRESS IN CORRECT FORMAT %3.19% A_.M; I_.M; T_-1; IF (R_.CT[.N,0]) LEQ 9 THEN CASE .R OF SET IF .I EQL .FREG THEN !CASE 0 (T_0; P_OUTCONOC(.A)) ELSE P_OUTCONOC(.A); (T_1; P_OUTSTN(.A)); !CASE 1 %3.19% BEGIN !CASE 2 P _ OUTCTREF(.A); %3.19% IF NOT HEADERP(.A) !IF LABEL AND PASSED %3.19% THEN IF .CT[.A,0] NEQ FRC !HEADER BIT IS OFF %3.19% THEN T_ 3; !IF ROUTINE NAME IS LABEL %3.19% END; %3.9-1% (OUTPSTRING(ONAME); P_OUTOFFSET(.A)); !CASE 3 %3.9-1% (OUTPSTRING(GNAME); P_OUTOFFSET(.A)); !CASE 4 BEGIN T_1; !CASE 5 P_ OUTSTN(.ST[.A,1])+ %3.23% OUTOFFSET(.ST[.A,1])-6 END; %2.25% !ADDRESS OF CONSTANT !CASE 6 %2.25% !IF THIS CAN BE A LITERAL, MAKE IT ONE AND OUTPUT AS LITERAL ADDRESS %2.25% %2.25% IF .PT[.A,0] EQL LOCRELOC !MAKE IT A LITERAL %2.25% THEN %2.25% BEGIN %2.25% R_CT[.N,0]_LTRELOC; %2.25% A_CT[.N,1]_LTINSERT(OFFST(.PT[.A,1])); %2.25%%3.9-1% OUTPSTRING(LNAME); %2.25%%3.9-1% P_OUTOFFSET(RLTTRANS(.A)); %3.19% T_ 2; !NOTE LITERAL IS ACTUALLY A LOCAL %2.25% END %2.25% ELSE %2.25% BEGIN !ADDRESS OF CONSTANT POINTER %3.23% OUTPSTRING(CNAME); %3.23% P_OUTOFFSET(RPTTRANS(.A)); !CHANGE PT IND TO OFFSET %3.19% IF .PTREL[.A] EQL EXTRELOC %3.19% THEN T_ 1 !PT REFERENCES A LITERAL %3.19% ELSE IF .PTREL[.1] EQL CTRELOC !SEE IF LABEL %3.19% THEN IF NOT .HEADERP(.PTOPAD[.A]) %3.19% THEN IF .CT[.PTOPAD[.1],0] NEQ FRC %3.19% THEN T_ 3; %2.25% END; BEGIN !CASE 7 %2.25% !ADDRESS OF LITERAL %2.25%%3.9-1% OUTPSTRING(LNAME); %2.25%%3.9-1% P_OUTOFFSET(RLTTRANS(.A)); !CHANGE LT INDEX TO LTT OFFSET END; (T_2; P_OUTCONOC((.A-.FNSTAT) AND 1^18-1)); !CASE 8 %2.25%%3.9-1% (OUTPSTRING(PNAME); P_OUTOFFSET(.A)) !CASE 9 TES; %2.25% !NOW OUTPUT INDEX REG IF .I NEQ 0 THEN BEGIN P_.P+4; %3.19% OCHAR("("); MACOUT(.I); OCHAR(")") END; %2.25% !NOW OUTPUT COMMENT FIELD BEGIN P_(.P+.M+3)^(-3); ! IF .TTYLST THEN OCHAR(#11) ELSE OUTSTR(#11^21 OR #11^14 OR #11^7 OR #11,4-.P); OCHAR(";"); %2.25% !OUTPUT CODE LINE OFFSET %3.20% OUTNUM(.OFSET,8,5,0); %2.25% !THEN BLISS-10 LINE REF #, IF ANY %2.25% OCHAR(#11); !TAB %2.25% IF .LNSEEN NEQ 0 %2.25% THEN %2.25% BEGIN %3.20% OUTNUM(.LNSEEN,10,4,0); !LINE # IN DECIMAL %2.25% LNSEEN_0; !SO WE CAN GET NEXT ONE %2.25% END; %2.25% !THEN ADDRESS PARAMETER TYPE %3.19% IF .T GEQ 0 %2.25% THEN %2.25% BEGIN %2.25% OCHAR(#11); %2.25% OUTPSTRING (CASE .T OF SET %2.25% PLIT (ASCIZ 'Formal'); %2.25% PLIT (ASCIZ 'External'); %2.25% PLIT (ASCIZ 'Local'); %3.19% PLIT (ASCIZ '^^^') %2.25% TES) %2.25% END; END; NEWLINE(); %3.19% OFSET_ .OFSET + 1; N_.CT[.N,0] END; END; NEWLINE(); NEWLINE(); END; %3.19% MODLENGTH_ .MODLENGTH + .OFSET END; ! INITIALIZATION ROUTINE !------------------------ ROUTINE REINIT= BEGIN %5.200.33% EXTERNAL BLKFOROFF; %5.200.36% EXTERNAL HDERRLINE; EXTERNAL QUOTESEEN; ! IN MA1N/BODY A205.1 ! THIS ROUTINE IS THE PRIMARY INITIALIZATION OF THE COMPILER. ! IT IS CALLED TO RE-INIT THE SYSTEM FOR EACH COMPILATION. LOCAL C,J; REALFS_0; !CURRENT KLUGE %V2H% LABIND_0; !ZERO INDEX OF LABEL CHAIN ACCUM_(ACCUM+1)_-2; PACCUM_(ACCUM)<36,7>; TIMSTAT_0; !INITIALIZE TIMER DATA WORD CODETOG_1; %5.200.39% SESTOG_0; BLOCKPURGE(0); TOPOFTABLE_.RETOT; ENDOFSPACE_.RETOT; FREEHEAD_AMNTFREE_ENDLK_0; CCLINIT(); !NOW SHRINK CORE BACK DOWN TO ORIGINAL SIZE IF .?.JBREL NEQ .SAVJBREL THEN BEGIN IF (.?.JBSYM GTR 0) AND (.?.JBSYM LSS #400000) THEN !SAVE SYMBOL TABLE IF IN LOW SEG BEGIN REGISTER R; MACHOP HLRO = #564; BIND L= (NOT HLRO (R,?.JBSYM)), NEWSYM= (.SAVJBREL<0,18>-L), OLDSYM= (.?.JBSYM<0,18>); INCR I FROM 0 TO L DO NEWSYM[.I]_.OLDSYM[.I]; ?.JBSYM<0,18> _ NEWSYM; END; !NOW LET'S TRY TO GET RID OF THE EXCESS CORE IN THE LOWSEG IF DOCOREUUO (.SAVJBREL) THEN WARNEM (0,ERCANTSHRINK) END; %2.25% EXTCOUNT_-1; !COUNT OF EXTERNS OUT TO MACRO LISTING %2.25% TEXTHD_0; !POINTS TO TEMP EXT LIST FROM EXPHT %2.34% GLLIST_0; !CLEAR GLOBAL SYMBOL TABLE %2.19% DECR I FROM HTSIZE-1 TO 0 DO XHT[.I]_0; ! OUTPUT SREG,VREG,DREGS,FREG,RESREGM INTO REL FILE USING ZFLAG 7-15-77 IF NOT .NOMOREINPUT THEN (ZFLAG_0;INITIO()); !START/STOP BEGCPU_RUNTIM; !MUST BE DONE AFTER INITIO 5-18-77 BEGTIME_MSTIME; ! 5-18-77 GTP_CODEPROP_0; %2.32% !SET UP DEFAULT MODULE NAME MAIN %2.32% MNAM_'MAIN'+#177^1; MNAM+1_-2; BUFPT1_BUF1<0,2>; BUFPT2_BUF2<0,2>; BUF1_1^18; BUF2_2^18; ERRORFOUND_WARNINGFOUND_ERRLEVEL_0; LINCNT_NLINES_PGSL_0; %2.25% NEXTLAB_0; !INITIALIZE NEXT ADDRESS LABEL NUMBER %2.9% !CLEAR LIT TABLE BASE TABLE AND %2.9% !LTTRANS BASE TABLE %2.9% DECR I FROM LTNUM-1 TO 0 DO %2.9% LTBASE[.I]_LTTBASE[.I]_0; DECR I FROM PTMASK+1 TO 0 DO PT[.I,0]_PT[.I,1]_0; DECR I FROM 31 TO 0 DO GRAPHHEAD[.I]_0; DECR I FROM EXPHTSIZE-1 TO 0 DO EXPHT[.I]_0; %5.200.33% BLKFOROFF_-1; %5.200.36% HDERRLINE=0; TGRBLEVEL_0; MUSTDU_TRBLEVEL_STRDEF_MAPTB_SSTREX_STREXP_INDECS_0; VAL_ACCUMLENGTH_MACRODEF_0; CHAR_EOL; SYM_DEL_FUTSYM_FUTDEL_STRHED_FSTRHED_0; UNDECLEX_#300000; ENLEX_0;LOC2_0; ETP_-1; ETL_0; GTL_OTL_0; FREEVHEADER_0; LOADECREG_-1; OPTTOREGADDR_-1; MODLENGTH_0; BLOCKLEVEL_1; FCNSTATE_0; FUNCTIONLEVEL_NEEDDISP_0; NEXTOWN_NEXTGLOBAL_0; NOCSAV_0; NOPSAV_0; STARTBLOCK_ ERROPEN_ NOENGLISH_ B20FLG_ 0; ! VARIOUS SWITCHES NOGBGCOL_NORECVAL_0; CURST_CURSTI_STRDEF_0; PGM_HEADER(0,0,0); PROGRAM_HEADER(0,0,0); PUSHBOT(.PGM,.PROGRAM); CODEPTR_HEADER(0,0,0); PUSHBOT(.PROGRAM,.CODEPTR); FCNLIST_HEADER(0,0,0); PLNEXT_PLBOOL_0; PLHEAD_HEADER(2,0,1); CT[.PLHEAD,2]_1; OWNHEAD_HEADER(2,0,1); GLOHEAD_HEADER(2,0,1); CT[.OWNHEAD,2]_1; CT[.GLOHEAD,2]_1; OWNBLK_GLOBLK_STUTYPE_REGASSN_0; ENTHED_LSTART_NUMENT_0; VALIDBUF_0; QUOTESEEN=0; GBPHDR=0; PAGE(); SKAN(1); INITSYNTAX(); BEGIN MAP MNAM, ACCUM; MACRO SYNER(X,Y)=(WARNEM(X,Y); RETURN 1)$, LDEL=DEL$; LOCAL AVLREG, VALREG, CONTIG; MODREGM_RESREGM_0; NOIFOPT=MODFLAG=0; %9-19-77% NOSVR_5; %3.36% SREG_FREG_VREG_-1; %INDICATES NOT YET ALLOCATED% STKLEN(0)_STKLEN(1)_0; RREG[0]_#17;RREG[1]_#15;RREG[2]_1; RREG[3]_RREG[4]_0; IF .LDEL EQL HMODULE THEN %PROCESS MODULE DECLARATION% BEGIN MHTIME_1; IF (IF .REALFS NEQ 0 THEN (MNAM[0]_.ST[.REALFS,2]; MNAM[1]_.ST[.REALFS,3]; HPAROPEN) ELSE HROPEN) EQL .FUTDEL THEN (HRUND(); VALREG_SWITCHER(ALLSWL)) ELSE VALREG_2; MHTIME_.TTFLAG; IF 0 NEQ (VALREG_ (CASE .VALREG OF SET IF .LDEL NEQ HROCLO THEN .NDEL ELSE IF .FUTSYM NEQ HEMPTY THEN .NFUTSYM ELSE IF .FUTDEL NEQ HEQL THEN .NFUTDEL ELSE 0; (-1); IF .FUTDEL NEQ HEQL THEN .NFUTDEL ELSE 0; .NSYM TES)) THEN %LOOK FOR A BEGIN OR END OF FILE, THE LATTER BEING A TRIVIAL PROGRAM AND THEREFORE RECOMPILABLE% (IF .VALREG NEQ -1 THEN WARNEM(.VALREG,ERSYMODBEG); WHILE .LDEL NEQ HBEGIN DO (HRUND(); IF .LDEL EQL HELUDOM OR .FINFLG THEN (ERROR(.NDEL,ERSMNOPROG); RETURN 1)); WARNEM(.NSYM,ERSYMODBEG)) ELSE (HRUND(); HRUND()); END; %MODULE DECLARATION PROCESSING% % INITIALIZE REGISTER, LOADER, AND CONTROL IN THAT (CRITICAL) ORDER % RGINIT(); LIINIT(); CNINIT(); END; % END OF REGISTER/STACK INITIALIZATION BLOCK % NEXTLOCAL_2+.NOSVR; IF NOT .ZFLAG THEN BEGIN RREG[0]_.SREG; RREG[1]_.FREG; RREG[2]_.VREG END; RREG[3]_.SVREGM; BEGIN LOCAL AC0,AC1,TEMP; AC0_.ACCUM; AC1_.ACCUM[1]; ACCUM[1]_-2; INCR I FROM 0 TO 3 DO (ACCUM[0]_(CASE .I OF SET '.SREG';'.FREG';'.VREG';'.DREG' TES); IF .I EQL 3 THEN ACCUM[1]_'S' OR #3777777777; TEMP_STINSERT(GABSOLUTET^TYPEFP,.RREG[.I]); DEFGBC(.TEMP,-.RREG[.I])); ACCUM[0]_.AC0; ACCUM[1]_.AC1 END; 0 END; ! PROCESS THE "ENTRIES" SWITCH BY LEAVING STE POINTERS IN ! THE LIST "ENTHED". WRNENT CALLED BY DRIVER TO WARN USER OF ! UNDECLARED ENTRIES. GLOBAL ROUTINE PSWENT= BEGIN LOCAL STVEC NEWCELL; MACRO SYNER(A)=(WARNEM(A,ERSYENTINV); RETURN 1)$; IF .DEL NEQ HEQL OR .FUTSYM NEQ HEMPTY OR .FUTDEL NEQ HROPEN THEN SYNER(.NDEL); HRUND(); ENTHED_HEADER(0,0,0); DO (HRUND(); IF .SYM THEN (NEWCELL_GETSPACE(1); NEWCELL[0]_.NEWCELL^15+.NEWCELL; NEWCELL[1]_.SYM; NUMENT_.NUMENT+1; PUSHBOT(.ENTHED,.NEWCELL)) ELSE SYNER(.NSYM)) WHILE .DEL EQL HCOMMA; IF .DEL NEQ HROCLO OR .FUTSYM NEQ HEMPTY THEN SYNER(.NDEL); HRUND(); 0 END; % 9-27-77 ROUTINE WRNENT= BEGIN LOCAL STVEC CDR; CDR_.CT[.ENTHED,1]; WHILE .CDR NEQ .ENTHED DO (IDERROR(ERSMNOENT,.CDR[1]); CDR_.CDR[0]); ERASE(.ENTHED) END; % !--------------------------HERE IT IS FOLKS------------------------- ! ! ! BLISS COMPILER MAIN DRIVER CODE ! ---------------------------------- ! ! GLOBAL ROUTINE DRIVER= BEGIN %2.29% IF .BIO EQL 0 THEN ONCEONLY(); WHILE 1 DO BEGIN 0<0,36>_STACK; 0<18,18>_-#1400; 2<0,36>_.0<0,18>; IF NOT REINIT() THEN (EXPRESSION(2); IF .DEL EQL HELUDOM THEN IF .FUTDEL NEQ HEND AND .BUFF<0,36> NEQ ' MODU' THEN READALINE(); ! 7-11-77 WHILE .DEL NEQ HELUDOM AND NOT.FINFLG DO ( HRUND(); IF .DEL EQL HSEMCOL AND .FUTDEL EQL HELUDOM THEN WARNEM(.NDEL,35) ELSE RECOVER(.NDEL,34)); IF .ERRORFOUND EQL 0 THEN BEGIN IF (.TTFLAG AND (.STKLEN(0) NEQ 0)) THEN MPTIMOUT(); !MAIN PROGRAM TIMEOUT ROUTINE CONVEY(.SYM);CODE(#47,0,#12,0); CODEPTR_.PROGRAM; FNSTAT_(IF .NEEDDISP THEN BEGIN ACPDT(); %SET UP DISPLAY AND FAKE REGISTERS % CODE(PUSH,.SREG,.FREG,0); CODE(ADD,.SREG,LITA(LITLEXEME((.NOSVR+1)*#1000001)),0); CODEPTR_.PROGRAM; 0 END ELSE .NOSVR+1); PROMOTE(1^RELC OR 1^CNVEYC); CODEPTR _ .PGM; FLATFUNC(); WRITECODE(.PGM); LDINT(.PGM); IF .ENTHED NEQ 0 THEN ERASE(.ENTHED); %9-27-77% END;); IF .XREFLG THEN XREFWRITE(); WRITEFINAL(); ! FORCE(0); IF NOT .BINFLG THEN FORCE(1); IF NOT .LSTFLG THEN FORCE(2); IF .FINFLG THEN FINIO() ELSE NOMOREINPUT_1; !PROCESS NEXT MODULE END; END; ! START IT UP HERE ! ================ CCLCTL_.(3<0,36>); NOMOREINPUT_0; !START/STOP ... INITIALIZE (CONTROLS MODULE SKAN) DRIVER() !END OF H3DRIV.BLI