Trailing-Edge
-
PDP-10 Archives
-
bb-d868b-bm_tops20_v3a_2020_dist
-
3a-sources/dr3n.bli
There are 18 other files named dr3n.bli in the archive. Click here to see a list.
!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]<LEFTHALF>+.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]<LEFTHALF> + .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<RIGHTHALF>+1)^(-10),10,0,1);
EOUTSTR (" + ",3);
%3.20% OUTNUM (((.?.JBHRL<RIGHTHALF> 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]<NEXTF>,1]<OPLEFTF> EQL 0
%2.25% THEN CT[.CT[.IND,0]<NEXTF>,0]<PREVF> _ .CT[.IND,0]<PREVF>;
%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]<PREVF>,.CT[.CT[.IND,0]<PREVF>,0]<HDRF>]<NEXTF>_.CT[.IND,0]<NEXTF>;
%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]<PREVF>$; !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]<NEXTF>; !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]<NEXTF>;
%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]<NEXTF>_.CT[.M,0]<NEXTF>;
%4.01% CT[.CT[.M,0]<NEXTF>,0]<PREVF>_.PX;
%4.01% DELCELL(.M);
%4.01% PX_.CT[.PX,0]<PREVF>
%4.01% END
%4.01% END
%4.01% ELSE BEGIN
%4.01% M_.CT[.PX,0]<PREVF>;
%4.01% CT[.CT[.PX,0]<NEXTF>,0]<PREVF>_.CT[.PX,0]<PREVF>;
%4.01% CT[.CT[.PX,0]<PREVF>,0]<NEXTF>_.CT[.PX,0]<NEXTF>;
%4.01% DELCELL(.PX);
%4.01% PX_.M
%4.01% END;
%4.01% PX_.CT[.PX,0]<NEXTF>
%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]<OPLEFTF> NEQ 0 THEN !WE CAN ZERO PREVF
%2.25% LABF(.N)_0; !TO INDICATE NO NUM ASSIGNED YET
%2.25% N_.CT[.N,0]<NEXTF>;
%2.25% END;
N_.CT[.H,1]<NEXTF>;
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]<FUNCF> EQL 0 THEN
BEGIN
M_.CT[.N,0]<NEXTF>;
%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]<HDRF>_0;
%3.19% N_.CT[.N,0]<NEXTF>;
%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]<TYPEF> 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]<NEXTF>
END;
UNTIL .N EQL .H DO
BEGIN
IF .CT[.N,1]<FUNCF> EQL 0 THEN
BEGIN
%2.25% IF (.LNSEEN EQL 0) THEN
%2.25% LNSEEN_.CT[.N,1]^(-4); !LINE NUMBER
M_.CT[.N,0]<NEXTF>;
%2.25% DELFLINK(.N);
N_.M
END
ELSE
BEGIN
IF .(M_CT[.N,0]<HDRF>) 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]<FUNCF> EQL #777 THEN CT[.N,1]<FUNCF> _ 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<FUNCF>,0);
%2.25% !OUTPUT AC FIELD
A_.M<ACCF>;
%3.19% IF .M<FUNCF> 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<INDRF> THEN OCHAR("@");
%2.25% !OUTPUT ADDRESS IN CORRECT FORMAT
%3.19% A_.M<ADDRESSF>; I_.M<INDXF>; T_-1;
IF (R_.CT[.N,0]<RELOCF>) 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]<HDRCLASSF> 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]<LEFTF>)+
%3.23% OUTOFFSET(.ST[.A,1]<OFFSETF>)-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]<RELOCF> EQL LOCRELOC !MAKE IT A LITERAL
%2.25% THEN
%2.25% BEGIN
%2.25% R_CT[.N,0]<RELOCF>_LTRELOC;
%2.25% A_CT[.N,1]<ADDRESSF>_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]<HDRCLASSF> 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<INDRF>+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]<NEXTF>
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<RIGHTHALF>;
ENDOFSPACE_.RETOT<LEFTHALF>;
FREEHEAD_AMNTFREE_ENDLK_0;
CCLINIT();
!NOW SHRINK CORE BACK DOWN TO ORIGINAL SIZE
IF .?.JBREL NEQ .SAVJBREL THEN
BEGIN
IF (.?.JBSYM<RIGHTHALF> GTR 0) AND (.?.JBSYM<RIGHTHALF> 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<RIGHTHALF>) 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]<RIGHTHALF>_1;
OWNHEAD_HEADER(2,0,1);
GLOHEAD_HEADER(2,0,1);
CT[.OWNHEAD,2]<RIGHTHALF>_1;
CT[.GLOHEAD,2]<RIGHTHALF>_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<LEFTHALF>$;
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<LEFTHALF>
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<LEFTHALF> NEQ HEQL THEN .NFUTDEL ELSE 0;
(-1);
IF .FUTDEL<LEFTHALF> 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<LEFTHALF> NEQ HEQL OR
.FUTSYM NEQ HEMPTY OR
.FUTDEL<LEFTHALF> NEQ HROPEN
THEN SYNER(.NDEL);
HRUND(); ENTHED_HEADER(0,0,0);
DO
(HRUND();
IF .SYM<LSF> THEN
(NEWCELL_GETSPACE(1);
NEWCELL[0]_.NEWCELL^15+.NEWCELL;
NEWCELL[1]_.SYM<STEF>;
NUMENT_.NUMENT+1;
PUSHBOT(.ENTHED,.NEWCELL))
ELSE SYNER(.NSYM))
WHILE .DEL<LEFTHALF> EQL HCOMMA;
IF .DEL<LEFTHALF> 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]<NEXTF>;
WHILE .CDR NEQ .ENTHED DO
(IDERROR(ERSMNOENT,.CDR[1]);
CDR_.CDR[0]<NEXTF>);
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<LEFTHALF> EQL HELUDOM THEN
IF .FUTDEL<LEFTHALF> NEQ HEND AND .BUFF<0,36> NEQ ' MODU'
THEN READALINE(); ! 7-11-77
WHILE .DEL<LEFTHALF> NEQ HELUDOM AND NOT.FINFLG DO
( HRUND(); IF .DEL<LEFTHALF> EQL HSEMCOL AND .FUTDEL<LEFTHALF> 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