2127 lines
		
	
	
	
		
			82 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			2127 lines
		
	
	
	
		
			82 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
30000 (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | 
						|
30010  (*+84() FUNCTION TX(M: MODE): XTYPE; FORWARD;  ()+84*)
 | 
						|
30020  (*+86() PROCEDURE STACKSB (SB:PSB);  FORWARD; ()+86*)
 | 
						|
30030  (*+86() PROCEDURE UNSTACKSB ;   FORWARD; ()+86*)
 | 
						|
30040  (*+87()
 | 
						|
30050  (**)
 | 
						|
30060                  (*CODE EMITTER*)
 | 
						|
30070                  (**************)
 | 
						|
30080  (**)
 | 
						|
30090  (*+01()   (*$T-+)   ()+01*)
 | 
						|
30110  (*-05()
 | 
						|
30120  PROCEDURE LOAD (WHERE:SBTTYP; SB:PSB); FORWARD;
 | 
						|
30130  PROCEDURE EMITEND; FORWARD;
 | 
						|
30140  PROCEDURE EMITX1 (OPCOD:POP;TYP1:OPDTYP;OPND1:ADDRINT); FORWARD;
 | 
						|
30150  PROCEDURE EMITX2 (OPCOD:POP;TYP1:OPDTYP;OPND1:ADDRINT;TYP2:OPDTYP;OPND2:ADDRINT); FORWARD;
 | 
						|
30160  FUNCTION GENLCLGBL (VAR OPCOD:POP; SB:PSB):OFFSETR; FORWARD;
 | 
						|
30170  PROCEDURE FIXUPF(ALABL:LABL);FORWARD;
 | 
						|
30180  FUNCTION FIXUPM: LABL; FORWARD;
 | 
						|
30200  PROCEDURE CLEAR (SB:PSB); FORWARD;
 | 
						|
30210  PROCEDURE UNSTKP1(TYP:OPDTYP; OPND:PSB); FORWARD;
 | 
						|
30220  ()-05*)
 | 
						|
30230  PROCEDURE EMITOP (OPCOD:POP); FORWARD;
 | 
						|
30240  PROCEDURE GENDENOT (OPCOD:POP; SB:PSB); FORWARD;
 | 
						|
30250  PROCEDURE EMITCONST (OPERAND:A68INT); FORWARD;
 | 
						|
30260  FUNCTION GETNEXTLABEL: LABL;
 | 
						|
30270      BEGIN GETNEXTLABEL := NEXTLABEL; NEXTLABEL := NEXTLABEL+1 END;
 | 
						|
30280  (**)
 | 
						|
30290  (**)
 | 
						|
30300  (*+32()
 | 
						|
30310  (*-01() (*-02() PROCEDURE HALT; VAR I,K: INTEGER; BEGIN I:=0;K := K DIV I END; ()-02*) ()-01*)
 | 
						|
30320  PROCEDURE ASERT (ASERTION:BOOLEAN; REASON:ALFA);
 | 
						|
30330    BEGIN
 | 
						|
30340      IF NOT (ASERTION) THEN
 | 
						|
30350        BEGIN
 | 
						|
30360        WRITELN(OUTPUT,' ASSERT FAILED ',REASON);
 | 
						|
30370  (*+01() PUTSEG(OUTPUT); ()+01*)
 | 
						|
30380        EMITEND;
 | 
						|
30390        HALT
 | 
						|
30400        END
 | 
						|
30410      END;
 | 
						|
30420  (**)
 | 
						|
30430  ()+32*)
 | 
						|
30440  (*-24()
 | 
						|
30450  PROCEDURE TAKELINE;
 | 
						|
30460      BEGIN
 | 
						|
30462 (*+23()WRITELN(LSTFILE);()+23*)
 | 
						|
30470 (*+02()WRITELN(LGO); ()+02*)
 | 
						|
30480 (*+23()LSTCNT:=LSTCNT+1;
 | 
						|
30490      IF LSTCNT > LINESPERPAGE THEN CHECKPAGE
 | 
						|
30492 ()+23*)
 | 
						|
30500      END;
 | 
						|
30510  ()-24*)
 | 
						|
30520  (*+23()
 | 
						|
30530  PROCEDURE EMITOP (*  (OPCOD:POP)  *);
 | 
						|
30540    VAR FLAG,I:  INTEGER;
 | 
						|
30550        NAME:  ALFA;
 | 
						|
30560    BEGIN
 | 
						|
30570      FLAG := 0;
 | 
						|
30580      NAME := CODETABLE[OPCOD].ROUTINE;
 | 
						|
30590      WHILE NAME = '          ' DO
 | 
						|
30600        BEGIN
 | 
						|
30610          IF OPCOD >= 0 THEN
 | 
						|
30620            BEGIN OPCOD := OPCOD-1; FLAG := FLAG+1 END
 | 
						|
30630          ELSE BEGIN OPCOD := OPCOD+1; FLAG := FLAG-1 END;
 | 
						|
30640          NAME := CODETABLE[OPCOD].ROUTINE
 | 
						|
30650        END;
 | 
						|
30660        IF NUMPARAMS=0 THEN WRITE(LSTFILE,' ':25);
 | 
						|
30670        FOR I:=3 DOWNTO NUMPARAMS+1 DO WRITE(LSTFILE,' ':20);
 | 
						|
30680      WRITE (LSTFILE,NAME);
 | 
						|
30690      IF FLAG >0 THEN WRITELN (LSTFILE,'+',FLAG:2)
 | 
						|
30700      ELSE IF FLAG < 0 THEN WRITELN (LSTFILE,FLAG:3)
 | 
						|
30710           ELSE WRITELN (LSTFILE);
 | 
						|
30720      NUMPARAMS:=0;
 | 
						|
30730    END;
 | 
						|
30740  (**)
 | 
						|
30750  PROCEDURE WRITEOPERAND (TYP:OPDTYP; OPERAND:ADDRINT);
 | 
						|
30760    VAR REC:  RECORD CASE SEVERAL OF
 | 
						|
30770                 1: (INT:  INTEGER);
 | 
						|
30780                 2: (LEX:  PLEX   ) ;
 | 
						|
30790                3,4,5,6,7,8,9,10: () ;
 | 
						|
30800                 END;
 | 
						|
30810    BEGIN
 | 
						|
30820    IF NUMPARAMS=1 THEN WRITE(LSTFILE,' ':25);
 | 
						|
30830      CASE TYP OF
 | 
						|
30840        OCVIMMED:  WRITE (LSTFILE,'   IMMED',OPERAND:10,', ');
 | 
						|
30850        OCVMEM  :  WRITE (LSTFILE,'     MEM',OPERAND:10,', ');
 | 
						|
30860        OCVEXT  :  BEGIN REC.INT := OPERAND; WRITE(LSTFILE,'     EXT  ');
 | 
						|
30870                     WRITE(LSTFILE,REC.LEX^.S10)
 | 
						|
30880                   END;
 | 
						|
30890        OCVFREF :  WRITE (LSTFILE,'    FREF',OPERAND:10,', ');
 | 
						|
30900        OCVFIM  :  WRITE (LSTFILE,'     FIM',OPERAND:10,', ')
 | 
						|
30910      END
 | 
						|
30920    END;
 | 
						|
30930  (**)
 | 
						|
30940  PROCEDURE UPPER;
 | 
						|
30950    BEGIN WRITELN(LSTFILE,'   UPPER.')  END;
 | 
						|
30960  PROCEDURE FILL(WHERE:SBTTYP;SB:PSB);
 | 
						|
30970      BEGIN
 | 
						|
30980      WITH SB^ DO
 | 
						|
30990        BEGIN
 | 
						|
31000        IF NOT (WHERE IN [SBTSTKN,SBTDL,SBTXN]) THEN SBLEN:=SZWORD;
 | 
						|
31010        IF WHERE IN [SBTSTK..SBTSTKN] THEN
 | 
						|
31020          BEGIN
 | 
						|
31030          RTSTKDEPTH:=RTSTKDEPTH+SBLEN;
 | 
						|
31040          WITH ROUTNL^ DO
 | 
						|
31050            IF RTSTKDEPTH > RNLENSTK THEN RNLENSTK:=RTSTKDEPTH;
 | 
						|
31060          END;
 | 
						|
31070        SBTYP:=WHERE;
 | 
						|
31080        END;
 | 
						|
31090      END;
 | 
						|
31100  (**)
 | 
						|
31110  FUNCTION SETINLINE(OPCOD:POP):BOOLEAN;
 | 
						|
31120      BEGIN
 | 
						|
31130      SETINLINE:=TRUE;
 | 
						|
31140      END;
 | 
						|
31150  (**)
 | 
						|
31160  FUNCTION NORMAL(SB:PSB) : SBTTYP;
 | 
						|
31170      BEGIN
 | 
						|
31180      WITH SB^ DO WITH SBMODE^.MDV DO
 | 
						|
31190        IF(NOT(SBUNION IN SBINF)) AND (NOT MDPILE) AND (MDLEN=0) THEN
 | 
						|
31200          NORMAL:=SBTVOID
 | 
						|
31210        ELSE
 | 
						|
31220          NORMAL:=SBTSTK;
 | 
						|
31230      END;
 | 
						|
31240  (**)
 | 
						|
31250  PROCEDURE LOADSTK(SB: PSB);
 | 
						|
31260    VAR LEN: INTEGER;
 | 
						|
31270      BEGIN
 | 
						|
31280      WITH SB^ DO WITH SBMODE^.MDV DO
 | 
						|
31290        IF  SBUNION IN SBINF THEN LEN:=SZWORD ELSE IF MDPILE THEN LEN:=SZADDR ELSE LEN:=MDLEN;
 | 
						|
31300      IF LEN=0 THEN LOAD(SBTVOID,SB)
 | 
						|
31310      ELSE LOAD(SBTSTK,SB);
 | 
						|
31320      END;
 | 
						|
31330  (**)
 | 
						|
31340  PROCEDURE TWIST;
 | 
						|
31350    VAR TEMPPTR:PSB;
 | 
						|
31360      BEGIN
 | 
						|
31370      WITH RTSTACK^ DO
 | 
						|
31380        BEGIN
 | 
						|
31390        IF (SBTYP >= SBTSTK) AND (SBRTSTK^.SBTYP >= SBTSTK) THEN
 | 
						|
31400          BEGIN  TAKELINE;  EMITOP(PSWAP);  END;
 | 
						|
31410        TEMPPTR:=SBRTSTK;
 | 
						|
31420        SBRTSTK:=TEMPPTR^.SBRTSTK;
 | 
						|
31430        TEMPPTR^.SBRTSTK:=RTSTACK;
 | 
						|
31440        RTSTACK:=TEMPPTR;
 | 
						|
31450        END;
 | 
						|
31460      END;
 | 
						|
31470  (**)
 | 
						|
31480  PROCEDURE LOAD (*+05() (WHERE: SBTTYP; SB: PSB) ()+05*);
 | 
						|
31490    VAR TEMPOP:POP;
 | 
						|
31500        TOFFSET:INTEGER;
 | 
						|
31510        TEMPTYP:SBTTYP;
 | 
						|
31520        TWISTED:BOOLEAN;
 | 
						|
31530        SB1: PSB;
 | 
						|
31540      BEGIN
 | 
						|
31550      WITH SB^ DO
 | 
						|
31560        BEGIN
 | 
						|
31570        IF SBRTSTK <> NIL THEN
 | 
						|
31580          IF SBSTKDELAY IN SBRTSTK^.SBINF THEN
 | 
						|
31590            BEGIN
 | 
						|
31600            LOADSTK(SBRTSTK);
 | 
						|
31610            SBRTSTK^.SBINF:=SBRTSTK^.SBINF-[SBSTKDELAY];
 | 
						|
31620            END;
 | 
						|
31630          TWISTED:=FALSE;
 | 
						|
31640        IF (WHERE IN [SBTVOID,SBTSTK..SBTXN]) AND (SBTYP IN [SBTID..SBTRPROC]) THEN
 | 
						|
31650          BEGIN
 | 
						|
31660          SB1 := RTSTACK;
 | 
						|
31670          WHILE (SB1^.SBTYP IN [SBTID..SBTRPROC]) AND (SB1<>SB) DO
 | 
						|
31680            SB1 := SB1^.SBRTSTK;
 | 
						|
31690          IF SB1<>SB THEN
 | 
						|
31700            BEGIN  TWISTED:=TRUE; TWIST;
 | 
						|
31710  (*+32()   ASERT (RTSTACK =SB,'LOAD-A    ');     ()+32*)
 | 
						|
31720            END;
 | 
						|
31730          CASE SBTYP OF
 | 
						|
31740            SBTVAR:BEGIN
 | 
						|
31750                   TEMPOP:=PLOADVAR;
 | 
						|
31760                   TOFFSET:=GENLCLGBL(TEMPOP,SB);
 | 
						|
31770                   EMITX2(TEMPOP,OCVIMMED,SBLOCRG,OCVLCLGBL,TOFFSET);
 | 
						|
31780                   END;
 | 
						|
31790            SBTID,SBTIDV:BEGIN
 | 
						|
31800                         TEMPOP:=PPUSH;
 | 
						|
31810                         TOFFSET:=GENLCLGBL(TEMPOP,SB);
 | 
						|
31820                         EMITX1(TEMPOP,OCVLCLGBL,TOFFSET);
 | 
						|
31830                         END;
 | 
						|
31840            SBTLIT:EMITX1(PPUSHIM,OCVIMMED,SBVALUE);
 | 
						|
31850            SBTDEN:GENDENOT(PPUSHIM,SB);
 | 
						|
31860            END; (*OF CASE*)
 | 
						|
31870          END;
 | 
						|
31880        END;
 | 
						|
31890      FILL(WHERE,SB);
 | 
						|
31900      IF TWISTED THEN TWIST;
 | 
						|
31910      END;
 | 
						|
31920  (**)
 | 
						|
31930  PROCEDURE PROC1OP(OPCOD:POP;TYP:OPDTYP;OPND:ADDRINT;NOTINL:BOOLEAN);
 | 
						|
31940    VAR SB:PSB;
 | 
						|
31950      BEGIN
 | 
						|
31960      SB:=ASPTR(OPND);
 | 
						|
31970      IF RTSTACK<>SB THEN TWIST;
 | 
						|
31980      LOADSTK(SB);
 | 
						|
31990      UNSTKP1(TYP,SB);
 | 
						|
32000      END;
 | 
						|
32010  (**)
 | 
						|
32020  PROCEDURE PROC2OP(OPCOD:POP;TYP1:OPDTYP;OPND1:ADDRINT;TYP2:OPDTYP;OPND2:ADDRINT;NOTINL:BOOLEAN);
 | 
						|
32030    VAR SB1,SB2:PSB;
 | 
						|
32040      BEGIN
 | 
						|
32050      SB1:=ASPTR(OPND1);
 | 
						|
32060      SB2:=ASPTR(OPND2);
 | 
						|
32070      LOADSTK(SB1);
 | 
						|
32080      LOADSTK(SB2);
 | 
						|
32090      IF SB2<>RTSTACK THEN TWIST;
 | 
						|
32100      UNSTKP1(TYP2,SB2);
 | 
						|
32110      UNSTKP1(TYP1,SB1);
 | 
						|
32120      END;
 | 
						|
32130  (**)
 | 
						|
32140  PROCEDURE PARAM(TYP:OPDTYP;OPND:ADDRINT;OPCOD:POP);
 | 
						|
32150      BEGIN
 | 
						|
32180      IF TYP <> OCVNONE THEN
 | 
						|
32190        BEGIN
 | 
						|
32200        NUMPARAMS:=NUMPARAMS+1;
 | 
						|
32210        WRITEOPERAND(TYP,OPND);
 | 
						|
32220        END;
 | 
						|
32230      END;
 | 
						|
32240  (**)
 | 
						|
32250  (**)
 | 
						|
32260  PROCEDURE FIXUPF (*+05() (ALABL:LABL) ()+05*);
 | 
						|
32270    BEGIN
 | 
						|
32280      TAKELINE;
 | 
						|
32290      WRITELN (LSTFILE,' ':20,ALABL:6,':')
 | 
						|
32300    END;
 | 
						|
32310  (**)
 | 
						|
32320  FUNCTION FIXUPM (*+05(): LABL()+05*);
 | 
						|
32330    VAR L:  LABL;
 | 
						|
32340    BEGIN
 | 
						|
32350      TAKELINE;
 | 
						|
32360      L := GETNEXTLABEL;
 | 
						|
32370      FIXUPM := L;
 | 
						|
32380      WRITELN (LSTFILE,' ':20,L:6,':')
 | 
						|
32390    END;
 | 
						|
32400  (**)
 | 
						|
32410  PROCEDURE EMITXWORD (TYP:OPDTYP; OPERAND:A68INT);
 | 
						|
32420    BEGIN
 | 
						|
32430      TAKELINE;
 | 
						|
32440      WRITE(LSTFILE,' ':25);
 | 
						|
32450      WRITEOPERAND (TYP,OPERAND);
 | 
						|
32460      WRITELN (LSTFILE)
 | 
						|
32470    END;
 | 
						|
32480  (**)
 | 
						|
32490  PROCEDURE EMITALF(OPERAND: ALFA);
 | 
						|
32500    VAR I: INTEGER;
 | 
						|
32510      BEGIN
 | 
						|
32520      TAKELINE;
 | 
						|
32530      WRITE(LSTFILE, ' ':25, '''');
 | 
						|
32540      FOR I := 1 TO 10 DO WRITE(LSTFILE, OPERAND[I]);
 | 
						|
32550      WRITELN(LSTFILE, '''');
 | 
						|
32560      END;
 | 
						|
32570  (**)
 | 
						|
32580  PROCEDURE FIXUPFIM (ALABL:LABL; VALUE:A68INT);
 | 
						|
32590    BEGIN
 | 
						|
32600      TAKELINE;
 | 
						|
32610      WRITELN (LSTFILE,' ':20,ALABL:6,':   EQU  ',VALUE:8)
 | 
						|
32620    END;
 | 
						|
32630  (**)
 | 
						|
32640  PROCEDURE FIXLABL (OLDLABL, NEWLABL:  LABL; KNOWN: BOOLEAN);
 | 
						|
32650    BEGIN
 | 
						|
32660      TAKELINE;
 | 
						|
32670      WRITELN (LSTFILE,' ':20,OLDLABL:6, '   EQU  ', NEWLABL:8,':')
 | 
						|
32680    END;
 | 
						|
32690  (**)
 | 
						|
32700  ()+23*)
 | 
						|
32710                                                 (* EM-1 CODE EMITTER *)
 | 
						|
32720                                                 (*********************)
 | 
						|
32730  (*+02()
 | 
						|
32740  PROCEDURE PARAM(TYP:OPDTYP; OPND:ADDRINT; OPCOD: POP); FORWARD;
 | 
						|
32750  (*-24()
 | 
						|
32760  PROCEDURE WRITEBYTE(B:INTEGER); BEGIN WRITE(LGO,B:5) END;
 | 
						|
32770  PROCEDURE WRITEINSTN(INST:COMPACT);
 | 
						|
32775  VAR COUNT:INTEGER;
 | 
						|
32780      BEGIN IF INST=EOOPNDS THEN TAKELINE
 | 
						|
32782            ELSE BEGIN
 | 
						|
32783            WRITE(LGO,' ');
 | 
						|
32784            FOR COUNT:=1 TO 3 DO
 | 
						|
32785            BEGIN
 | 
						|
32787                WRITE(LGO,CHR(ORD(INST[COUNT])+32)); (*TRANSLATE TO LOWER CASE*)
 | 
						|
32788            END;
 | 
						|
32789            END;
 | 
						|
32790      END;
 | 
						|
32792  PROCEDURE WRITECON(COMMON, SIZE: INTEGER; OPERAND: ADDRINT);
 | 
						|
32793      BEGIN WRITE(LGO,' ',OPERAND);
 | 
						|
32794      IF SIZE<>SZWORD THEN 
 | 
						|
32796        WRITE(LGO, 'I', SIZE:1);
 | 
						|
32799      END;
 | 
						|
32800  PROCEDURE WRITELABEL(GLOBAL:BOOLEAN;OPERAND:INTEGER);
 | 
						|
32810      BEGIN
 | 
						|
32821      IF GLOBAL THEN WRITE(LGO,'.'); WRITE(LGO,OPERAND:0); TAKELINE; END;
 | 
						|
32841  PROCEDURE WRITEOFFSET(L:LABL;OFFSET:INTEGER);
 | 
						|
32842      BEGIN WRITE(LGO,'  .',L:0);
 | 
						|
32843      IF OFFSET<>0 THEN
 | 
						|
32844        BEGIN IF OFFSET>0 THEN WRITE(LGO,'+');
 | 
						|
32845        WRITE(LGO,OFFSET:0);
 | 
						|
32846        END;
 | 
						|
32848      END;
 | 
						|
32850  ()-24*)
 | 
						|
32860  (*+24()
 | 
						|
32870  PROCEDURE WRITEBYTE(B:BYTE);
 | 
						|
32880      (*PROCEDURE TO WRITE A BYTE OF COMPACT ASSEMBLER CODE *)
 | 
						|
32890      BEGIN
 | 
						|
32900      WRITE(LGO,B);
 | 
						|
32910      END;
 | 
						|
32920  (**)
 | 
						|
32930  PROCEDURE WRITEINSTN(INST:COMPACT);
 | 
						|
32940      BEGIN WRITE(LGO,INST) END;
 | 
						|
32950  (**)
 | 
						|
32960  PROCEDURE WRITECON(COMMON,SIZE:INTEGER;OPERAND:ADDRINT);
 | 
						|
32970  (* WRITES A POSITIVE INTEGER IN BASE 256,OR AS AN OFFSET FROM 120 *)
 | 
						|
32980    VAR I,COUNT,T:INTEGER;
 | 
						|
32982         OUTSTR:PACKED ARRAY[1..10] OF CHAR;
 | 
						|
32990      BEGIN
 | 
						|
33000      IF (OPERAND < 120) AND (OPERAND >= -120) AND (COMMON=CPACTCONS) AND (SIZE=SZWORD) THEN
 | 
						|
33010      WRITEBYTE(OPERAND+120)
 | 
						|
33020      ELSE
 | 
						|
33030      BEGIN
 | 
						|
33040      COUNT := 1;
 | 
						|
33050      CASE COMMON OF
 | 
						|
33060       CPACTLCL:BEGIN
 | 
						|
33070       (*+32() ASERT(OPERAND<65536,'WRITECON-A');  ()+32*)
 | 
						|
33075           COUNT := 2;
 | 
						|
33080           END;
 | 
						|
33090       CPACTGBL:BEGIN
 | 
						|
33100           (*+32() ASERT(OPERAND < 32768 ,'WRITECON-B');  ()+32*)
 | 
						|
33110           IF OPERAND > 255 THEN BEGIN COMMON := COMMON+1; COUNT := 2 END
 | 
						|
33120           END;
 | 
						|
33130       CPACTCONS:BEGIN
 | 
						|
33140           COUNT := 2;
 | 
						|
33170           IF OPERAND > 32767 THEN BEGIN COMMON := COMMON+1; COUNT := 4 END;
 | 
						|
33180           END;
 | 
						|
33191      END;
 | 
						|
33193      IF SIZE<>SZWORD THEN
 | 
						|
33194      BEGIN
 | 
						|
33195        T := 1;
 | 
						|
33196        REPEAT
 | 
						|
33197          OUTSTR[T] := CHR((OPERAND MOD 10)+ORD('0'));
 | 
						|
33198          OPERAND := OPERAND DIV 10; T := T+1;
 | 
						|
33199        UNTIL OPERAND=0; 
 | 
						|
33200        WRITEBYTE(CPACTUNS);
 | 
						|
33201        WRITECON(CPACTCONS,SZWORD,SIZE);
 | 
						|
33202        T := T-1;
 | 
						|
33203        WRITEBYTE(120+T);
 | 
						|
33204        FOR I := T DOWNTO 1 DO
 | 
						|
33208            WRITEBYTE(ORD(OUTSTR[I]))
 | 
						|
33209      END
 | 
						|
33212      ELSE
 | 
						|
33213        BEGIN
 | 
						|
33214        WRITEBYTE(COMMON);
 | 
						|
33220        FOR I := 1 TO COUNT DO
 | 
						|
33230          BEGIN
 | 
						|
33232          T := OPERAND MOD 256;
 | 
						|
33244          WRITEBYTE(T);
 | 
						|
33250          OPERAND := (OPERAND-T) DIV 256;
 | 
						|
33260          END;
 | 
						|
33265        END;
 | 
						|
33270      END;
 | 
						|
33280    END;
 | 
						|
33290  (**)
 | 
						|
33300  PROCEDURE WRITELABEL(GLOBAL:BOOLEAN;OPERAND:INTEGER);
 | 
						|
33310      BEGIN
 | 
						|
33320      IF GLOBAL THEN WRITECON(CPACTGBL, SZWORD, OPERAND) ELSE WRITECON(CPACTLCL, SZWORD, OPERAND);
 | 
						|
33330      END;
 | 
						|
33340  (**)
 | 
						|
33350  (**)
 | 
						|
33401  PROCEDURE WRITEOFFSET(L:LABL;OFFSET:INTEGER);
 | 
						|
33402      BEGIN
 | 
						|
33403      IF OFFSET<>0 THEN WRITEBYTE(CPACTLBL);
 | 
						|
33404      WRITECON(CPACTGBL,SZWORD,L);
 | 
						|
33407      IF OFFSET <>0 THEN WRITECON(CPACTCONS,SZWORD,OFFSET);
 | 
						|
33408      END;
 | 
						|
33409  (**)
 | 
						|
33410  ()+24*)
 | 
						|
33411  PROCEDURE SETTEXTSTATE;
 | 
						|
33412  BEGIN
 | 
						|
33413    IF DATASTATE=INDATA THEN WRITEINSTN(EOOPNDS);
 | 
						|
33414    DATASTATE := ENDDATA
 | 
						|
33415  END;
 | 
						|
33416  (**)
 | 
						|
33420  PROCEDURE EMITXWORD(TYP:OPDTYP;OPERAND:ADDRINT);
 | 
						|
33430    VAR REC: RECORD CASE SEVERAL OF
 | 
						|
33440          1: (INT:ADDRINT);
 | 
						|
33450          2: (LEX:PLEX);
 | 
						|
33455          3,4,5,6,7,8,9,10: ();
 | 
						|
33460          END;
 | 
						|
33470        I,K,STRLEN,HI:INTEGER;
 | 
						|
33471 (*-24()J:CHAR;()-24*)
 | 
						|
33480      BEGIN
 | 
						|
33482  (* IN THE -24 MACHINE 'CON <DATA>' IS PRODUCED ON EACH LINE *)
 | 
						|
33483  (* IN THE +24 MACHINE 'CON <DATA> <DATA> <DATA> ...' IS PRODUCED *)
 | 
						|
33485      IF (DATASTATE=STARTDATA) (*-24() OR (DATASTATE=INDATA) ()-24*) THEN
 | 
						|
33486      BEGIN
 | 
						|
33487          WRITEINSTN(CON);DATASTATE:=INDATA;
 | 
						|
33488      END;
 | 
						|
33490      CASE TYP OF
 | 
						|
33500  OCVIMMED: WRITECON(CPACTCONS, SZWORD, OPERAND);
 | 
						|
33502  OCVIMMLONG: WRITECON(CPACTCONS, SZLONG, OPERAND);
 | 
						|
33504  OCVIMMPTR: WRITECON(CPACTCONS, SZADDR, OPERAND);
 | 
						|
33510  (*+24()OCVFREF: WRITELABEL(FALSE,OPERAND);
 | 
						|
33520   OCVMEM,OCVFIM: WRITELABEL(TRUE,OPERAND);  ()+24*)
 | 
						|
33530  (*-24()OCVFREF: BEGIN
 | 
						|
33532                       WRITE(LGO,'  *',OPERAND:0);
 | 
						|
33533                  END;
 | 
						|
33540   OCVMEM,OCVFIM: BEGIN
 | 
						|
33542                       WRITE(LGO,'  .',OPERAND:0);
 | 
						|
33543                  END; ()-24*)
 | 
						|
33550          OCVEXT: BEGIN
 | 
						|
33560                  REC.INT := OPERAND;
 | 
						|
33562                  STRLEN:=REC.LEX^.LXCOUNT*SZWORD;
 | 
						|
33563                  HI := 1;
 | 
						|
33564                  WHILE (HI<=RTNLENGTH) AND (REC.LEX^.S10[HI]<>' ') DO HI := HI+1;
 | 
						|
33566                  HI := HI-1;
 | 
						|
33570       (*+24()    WRITEBYTE(CPACTPNAM);
 | 
						|
33575                  WRITECON(CPACTCONS,SZWORD,HI);
 | 
						|
33591                  FOR I := 1 TO HI DO
 | 
						|
33600                      WRITEBYTE(ORD(REC.LEX^.S10[I]));
 | 
						|
33604       ()+24*)
 | 
						|
33610       (*-24()    WRITE(LGO,' $');
 | 
						|
33611                  FOR I:=1 TO HI DO
 | 
						|
33612                  BEGIN
 | 
						|
33613                      J:=REC.LEX^.S10[I];
 | 
						|
33616                      WRITE(LGO,J);
 | 
						|
33617                  END;
 | 
						|
33619                  IF HI<RTNLENGTH THEN
 | 
						|
33620                     FOR K:=I+1 TO RTNLENGTH DO
 | 
						|
33624                       WRITE(LGO,' ');
 | 
						|
33626       ()-24*)
 | 
						|
33628                  END
 | 
						|
33630        END;
 | 
						|
33632 (*-24()IF DATASTATE=INDATA THEN WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
33640      END;
 | 
						|
33650  (**)
 | 
						|
33652  PROCEDURE EMITXPROC (TYP:OPDTYP;OPERAND:ADDRINT);
 | 
						|
33654  VAR
 | 
						|
33656    TEMP :PLEX;
 | 
						|
33658    DIGIT,INDEX :INTEGER;
 | 
						|
33660    ADDRESS :LABL;
 | 
						|
33662  BEGIN
 | 
						|
33664    ENEW (TEMP, LEX1SIZE+ (9*CHARPERWORD) DIV CHARPERWORD * SZWORD);
 | 
						|
33666    WITH TEMP^ DO
 | 
						|
33668    BEGIN
 | 
						|
33670      S10:='          ';
 | 
						|
33672      S10[1]:='R';
 | 
						|
33674      DIGIT:=OPERAND;
 | 
						|
33676      INDEX:=1;
 | 
						|
33678      WHILE DIGIT>0 DO BEGIN DIGIT:=DIGIT DIV 10; INDEX:=INDEX+1; END;
 | 
						|
33680      DIGIT:=OPERAND;
 | 
						|
33682      WHILE DIGIT>0 DO
 | 
						|
33684      BEGIN
 | 
						|
33686        S10[INDEX]:= CHR ((DIGIT MOD 10) + ORD('0')); (*ONLY WORKS FOR NUMBERS THEN RUN CONTIGUOUSLY*)
 | 
						|
33688        DIGIT:=DIGIT DIV 10; INDEX := INDEX-1;
 | 
						|
33690      END;
 | 
						|
33691      LXCOUNT:= (9*CHARPERWORD) DIV CHARPERWORD * SZWORD;
 | 
						|
33692    END;
 | 
						|
33693    EMITXWORD(OCVEXT,ORD(TEMP));
 | 
						|
33694    EDISPOSE(TEMP, LEX1SIZE+ (9*CHARPERWORD) DIV CHARPERWORD * SZWORD);
 | 
						|
33695  END;
 | 
						|
33696  PROCEDURE EMITALF(ALF: BIGALFA);
 | 
						|
33697    VAR I,L: INTEGER;
 | 
						|
33702      BEGIN
 | 
						|
33703  (*+24() IF DATASTATE=STARTDATA THEN WRITEINSTN(CON);
 | 
						|
33704      WRITEBYTE(CPACTSTRING);
 | 
						|
33706      WRITECON(CPACTCONS,SZWORD,10); FOR I := 1 TO 10 DO WRITEBYTE(ORD(ALF.ALF[I]));
 | 
						|
33707      WRITECON(CPACTCONS,1,ALF.IDSIZE); WRITECON(CPACTCONS,1,ALF.XMODE); ()+24*)
 | 
						|
33708  (*-24()  WRITEINSTN(CON);
 | 
						|
33709      WRITE(LGO, ' '''); FOR I := 1 TO 8 DO WRITE(LGO, ALF.ALF[I]);
 | 
						|
33710      WRITE(LGO,''',',ALF.IDSIZE:1,'U1,',ALF.XMODE:1,'U1'); WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
33711      DATASTATE:=INDATA;
 | 
						|
33712      END;
 | 
						|
33713  (**)
 | 
						|
33714  PROCEDURE EMITRNTAIL (LEN :INTEGER);
 | 
						|
33715  BEGIN
 | 
						|
33716  SETTEXTSTATE;
 | 
						|
33717    WRITEINSTN(EEND);EMITXWORD(OCVIMMED,LEN);(*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
33718  END;
 | 
						|
33719  (**)
 | 
						|
33720  FUNCTION STKSPACE (INSTR:COMPACT;PARAM:INTEGER) :INTEGER;
 | 
						|
33722  (*FUNCTION CALCULATES HOW MANY WORDS WILL BE PUT ON THE STACK*)
 | 
						|
33723  (*BY THE INSTRUCTION INSTR*)
 | 
						|
33730  BEGIN
 | 
						|
33731      (*+32() ASERT(INSTR<>LOS,'STKSPACE-A'); ()+32*)
 | 
						|
33735      IF (INSTR=LFR)OR(INSTR=LOI)OR(INSTR=DUP) THEN STKSPACE:=PARAM
 | 
						|
33737      ELSE IF (INSTR=LDC)OR(INSTR=LDL)OR(INSTR=LDE)OR(INSTR=LDF) THEN STKSPACE:=SZWORD+SZWORD
 | 
						|
33738      ELSE IF (INSTR=ADP)OR(INSTR=LAL)OR(INSTR=LAE)OR(INSTR=LXL)OR(INSTR=LXA)OR(INSTR=LOR) THEN STKSPACE:=SZADDR
 | 
						|
33739      ELSE STKSPACE:=SZWORD;
 | 
						|
33740  END;
 | 
						|
33743 (**)
 | 
						|
33744 (**)
 | 
						|
33745  PROCEDURE EMITOP (* (OPCOD:POP) *);
 | 
						|
33747   CONST MAXLABL = 2; (* MAXIMUM NUMBER OF OVERLAPPING LABELS *)
 | 
						|
33748 (*-24() NOP='NOP'; ()-24*)
 | 
						|
33750    VAR I,TEMPCNT,STRWLEN:INTEGER;  TEMPLABL:LABL; TEMP:PLEX;
 | 
						|
33760        COUNT : ARRAY [1..MAXLABL] OF INTEGER;
 | 
						|
33765        JUMPOVER : ARRAY [1..MAXLABL] OF LABL;
 | 
						|
33770        PARAMNOTUSED: BOOLEAN;
 | 
						|
33772        SAVOPRAND: ADDRINT;
 | 
						|
33780      BEGIN
 | 
						|
33790      SETTEXTSTATE;
 | 
						|
33810      PARAMNOTUSED := TRUE;
 | 
						|
33811      FOR I:=1 TO MAXLABL DO COUNT[I]:=0;
 | 
						|
33812      IF OCV=OCVLCLGBL THEN
 | 
						|
33813        BEGIN
 | 
						|
33814        IF LCLGBL<>0 THEN
 | 
						|
33815          BEGIN CLEAR(RTSTACK); (*IN CASE ANYTHING IN PRR*)
 | 
						|
33816          SAVOPRAND := OPRAND;
 | 
						|
33817          EMITX1(PENVCHAIN+ORD(OPRAND>0),OCVIMMED,LCLGBL);
 | 
						|
33818          OPRAND := SAVOPRAND;
 | 
						|
33819          END;
 | 
						|
33820        OCV := OCVIMMED;
 | 
						|
33821        PARAMNOTUSED := FALSE; (*SPECIAL FIDDLE FOR PLOADRTA AND PCALLA*)
 | 
						|
33822        END;
 | 
						|
33824      WHILE OPCOD <> 0 DO WITH CODETABLE[OPCOD] DO
 | 
						|
33830        BEGIN
 | 
						|
33835 (*+21()WRITELN(OUTPUT,'EMITTING P-OP',OPCOD,' ADJUSTSP=',ADJUSTSP);()+21*)
 | 
						|
33840        IF INLINE THEN
 | 
						|
33850          BEGIN
 | 
						|
33860          IF EMCOD<>NOP THEN WRITEINSTN(EMCOD);
 | 
						|
33870          CASE PARTYP OF
 | 
						|
33880  ACP,ANP,WOP,WNP : (* OPERAND SUPPLIED BY,AND NEGATION DONE BY,CODETABLE*)
 | 
						|
33890                    WRITECON(CPACTCONS, SZWORD, PARM);
 | 
						|
33892          WLB,ACB : (*OPERAND SUPPLIED BY CODETABLE, GLOBAL LABEL OFFSET*)
 | 
						|
33894                    WRITEOFFSET(HOLTOP,PARM);
 | 
						|
33900          OPX,ACX : (* OPERAND IS SUPPLIED BY CODE GENERATOR *)
 | 
						|
33910                    BEGIN IF OCV<=OCVIMMPTR THEN WRITECON(CPACTCONS, SZWORD, OPRAND+PARM)
 | 
						|
33912                    ELSE EMITXWORD(OCV, OPRAND+PARM); PARAMNOTUSED := FALSE END;
 | 
						|
33920          ONX,ANX : (* NEGATIVE OF OPERAND SUPPLIED BY CODE GENERATOR *)
 | 
						|
33930                    BEGIN IF OCV<=OCVIMMPTR THEN WRITECON(CPACTCONS, SZWORD, -(OPRAND+PARM))
 | 
						|
33932                    ELSE EMITXWORD(OCV, -(OPRAND+PARM)); PARAMNOTUSED := FALSE END;
 | 
						|
33933          OPL,ACL : (*OPERAND (SUPPLIED BY CODE GEN) IS A GLOBAL LABEL OFFSET*)
 | 
						|
33934                    BEGIN WRITEOFFSET(HOLTOP,OPRAND+PARM); PARAMNOTUSED:=FALSE; END;
 | 
						|
33937          ONL,ANL : (*AS ABOVE BUT NEGATE OPERAND FIRST*)
 | 
						|
33939                    BEGIN WRITEOFFSET(HOLTOP,-(OPRAND+PARM));PARAMNOTUSED:=FALSE; END;
 | 
						|
33940              JMP : (* P-OP GENERATES ITS OWN LABELS FOR LOOPS ETC. *)
 | 
						|
33950                    BEGIN
 | 
						|
33960                       TEMPCNT := PARM;
 | 
						|
33970                       TEMPLABL := GETNEXTLABEL;
 | 
						|
33980                       EMITXWORD(OCVFREF,TEMPLABL);
 | 
						|
33990                       IF TEMPCNT < 0 THEN (* A BACKWARD JUMP IS REQUIRED,USE THE EXC COMMAND *)
 | 
						|
34000                       BEGIN
 | 
						|
34005                           WRITELABEL(FALSE,TEMPLABL);
 | 
						|
34007                           WRITEINSTN(EXC); WRITECON(CPACTCONS, SZWORD, -TEMPCNT);
 | 
						|
34010                           WRITECON(CPACTCONS, SZWORD, 1); (*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
34015                       END
 | 
						|
34017                       ELSE
 | 
						|
34018                       BEGIN (*FORWARD JUMP SO STORE IN ARRAYS*)
 | 
						|
34020                          I:=0;
 | 
						|
34022                          REPEAT I:=I+1; (*+32()ASERT(I<=MAXLABL,'EMITOP-A  ');()+32*) UNTIL COUNT[I] = 0;
 | 
						|
34024                          COUNT[I]:=TEMPCNT; JUMPOVER[I]:=TEMPLABL;
 | 
						|
34026                       END;
 | 
						|
34028                    END;
 | 
						|
34030              NON : ;
 | 
						|
34040              GBX : (* GLOBAL LABEL EXPECTED *)
 | 
						|
34050                     BEGIN
 | 
						|
34055                     WRITEOFFSET(OPRAND, PARM);
 | 
						|
34056                     PARAMNOTUSED:=FALSE; END;
 | 
						|
34060              LCX : (* INSTRUCTION LABEL EXPECTED *)
 | 
						|
34070                    (*+24() BEGIN WRITELABEL(FALSE,OPRAND); PARAMNOTUSED := FALSE END; ()+24*)
 | 
						|
34072                    (*-24() BEGIN WRITE(LGO,' *',OPRAND:0);
 | 
						|
34073                            PARAMNOTUSED:=FALSE; END; ()-24*)
 | 
						|
34074              MOR : (* LONG (2-BYTE) OPERAND SUPPLIED BY CODETABLE *)
 | 
						|
34076                    EMITXWORD(OCVIMMED,PARM);
 | 
						|
34080          END; (* OF CASE *)
 | 
						|
34085  (*-24() TAKELINE; ()-24*)
 | 
						|
34087          IF PARTYP>= ACP THEN
 | 
						|
34090          BEGIN
 | 
						|
34092           CASE PARTYP OF
 | 
						|
34093        ANP,ACP: ADJUSTSP:=ADJUSTSP+STKSPACE(EMCOD,PARM(*-24()-120()-24*));
 | 
						|
34094            ACX: ADJUSTSP:=ADJUSTSP+STKSPACE(EMCOD,OPRAND+PARM);
 | 
						|
34095            ANX: ADJUSTSP:=ADJUSTSP+STKSPACE(EMCOD,-(OPRAND+PARM));
 | 
						|
34096    ACB,ACL,ANL: ADJUSTSP:=ADJUSTSP+STKSPACE(EMCOD,0);
 | 
						|
34097           END;
 | 
						|
34099          END;
 | 
						|
34100          OPCOD := NEXT;
 | 
						|
34110          END
 | 
						|
34120        ELSE
 | 
						|
34130          BEGIN
 | 
						|
34140          IF PARAMNOTUSED THEN PARAM(OCVNONE, 0, OPCOD);
 | 
						|
34190          WRITEINSTN(LXL); WRITECON(CPACTCONS, SZWORD, 0); (*-24()  TAKELINE; ()-24*) (*STATIC LINK*)
 | 
						|
34200          WRITEINSTN(CAL);
 | 
						|
34205          STRWLEN:=(RTNLENGTH+CHARPERWORD) DIV CHARPERWORD *SZWORD;
 | 
						|
34210          ENEW(TEMP,LEX1SIZE+STRWLEN);
 | 
						|
34220          WITH TEMP^ DO
 | 
						|
34230          BEGIN
 | 
						|
34240             FOR I:=1 TO RTNLENGTH DO S10[I]:=ROUTINE[I];
 | 
						|
34250             LXCOUNT:=STRWLEN;
 | 
						|
34260          END;
 | 
						|
34262          EMITXWORD(OCVEXT,ORD(TEMP));
 | 
						|
34264          EDISPOSE(TEMP,LEX1SIZE+STRWLEN);
 | 
						|
34266  (*-24() TAKELINE ; ()-24*)
 | 
						|
34270          OPCOD := 0;
 | 
						|
34280          WRITEINSTN(ASP); WRITECON(CPACTCONS, SZWORD, ADJUSTSP+SZADDR);
 | 
						|
34300  (*-24() TAKELINE ; ()-24*)
 | 
						|
34310          END;
 | 
						|
34312        FOR I:=1 TO MAXLABL DO
 | 
						|
34320        IF COUNT[I] > 0 THEN  (* ONE OF P-OPS REQUIRES A LABEL *)
 | 
						|
34322        BEGIN
 | 
						|
34330          IF COUNT[I] = 1 THEN WRITELABEL(FALSE,JUMPOVER[I]) ;
 | 
						|
34340          COUNT[I] := COUNT[I]-1;
 | 
						|
34342        END;
 | 
						|
34350        END;
 | 
						|
34360      END;
 | 
						|
34370  (**)
 | 
						|
34380  PROCEDURE FIXUPF (* (ALABL:LABL) *);
 | 
						|
34390      BEGIN
 | 
						|
34392      IF DATASTATE <> ENDDATA THEN BEGIN
 | 
						|
34394      (*+24() IF DATASTATE=INDATA THEN BEGIN DATASTATE:=STARTDATA; WRITEINSTN(EOOPNDS) END; ()+24*)
 | 
						|
34396       WRITELABEL(TRUE,ALABL); END
 | 
						|
34398      ELSE
 | 
						|
34400       WRITELABEL(FALSE,ALABL);
 | 
						|
34410      END;
 | 
						|
34420  (**)
 | 
						|
34430  FUNCTION FIXUPM (* :LABL *);
 | 
						|
34440    VAR L:LABL;
 | 
						|
34450      BEGIN
 | 
						|
34455      L := GETNEXTLABEL;
 | 
						|
34456      FIXUPM := L;
 | 
						|
34460      IF DATASTATE <> ENDDATA THEN (*GLOBAL DATA*)
 | 
						|
34470        BEGIN
 | 
						|
34480        (*+24() IF DATASTATE=INDATA THEN BEGIN DATASTATE:=STARTDATA;  WRITEINSTN(EOOPNDS) END; ()+24*)
 | 
						|
34500        WRITELABEL(TRUE,L);
 | 
						|
34510        END
 | 
						|
34520      ELSE
 | 
						|
34530        BEGIN
 | 
						|
34560        WRITELABEL(FALSE,L);
 | 
						|
34570        END;
 | 
						|
34580      END;
 | 
						|
34590  (**)
 | 
						|
34600  PROCEDURE FIXUPFIM(ALABL:LABL;VALUE:A68INT);
 | 
						|
34610      BEGIN
 | 
						|
34620      WRITELABEL(TRUE,ALABL); WRITEINSTN(CON);
 | 
						|
34630      WRITECON(245, SZWORD, VALUE);
 | 
						|
34640      WRITEINSTN(EOOPNDS);
 | 
						|
34650      END;
 | 
						|
34660  (**)
 | 
						|
34670  PROCEDURE FIXLABL(OLDLABL,NEWLABL:LABL; KNOWN:BOOLEAN);
 | 
						|
34680    VAR JUMPOVER: LABL;
 | 
						|
34690      BEGIN
 | 
						|
34700      JUMPOVER := GETNEXTLABEL;
 | 
						|
34710      WRITEINSTN(BRA); (*+24() WRITELABEL(FALSE,JUMPOVER); ()+24*)
 | 
						|
34712 (*-24()WRITE(LGO,' *',JUMPOVER:0); TAKELINE; ()-24*)
 | 
						|
34720      WRITELABEL(FALSE,OLDLABL);
 | 
						|
34730      WRITEINSTN(BRA); (*+24() WRITELABEL(FALSE,NEWLABL); ()+24*)
 | 
						|
34732 (*-24()WRITE(LGO,' *',NEWLABL:0); TAKELINE; ()-24*)
 | 
						|
34740      WRITELABEL(FALSE,JUMPOVER);
 | 
						|
34750  (*-24() TAKELINE; ()-24*)
 | 
						|
34760      END;
 | 
						|
34770  (**)
 | 
						|
34780  FUNCTION NORMAL(SB: PSB): SBTTYP;
 | 
						|
34790  (*RETURNS THE SBTTYP IN WHICH VALUES OF MODE SB^.SBMODE SHOULD BE STORED DURING BALANCES*)
 | 
						|
34800      BEGIN WITH SB^ DO WITH SBMODE^.MDV DO
 | 
						|
34810        IF SBTYP=SBTDL THEN NORMAL := SBTDL
 | 
						|
34820        ELSE IF SBUNION IN SBINF THEN NORMAL := SBTSTKN
 | 
						|
34825        ELSE IF SBNAKED IN SBINF THEN NORMAL := SBTSTK4
 | 
						|
34830        ELSE IF MDPILE THEN NORMAL := SBTSTK(*+19()2()+19*)
 | 
						|
34840        ELSE CASE MDLEN OF
 | 
						|
34850          0:      NORMAL := SBTVOID;
 | 
						|
34860          SZWORD: NORMAL := SBTSTK;
 | 
						|
34870 (*+19()  SZADDR: NORMAL := SBTSTK2; ()+19*)
 | 
						|
34880          SZREAL: NORMAL := SBTSTK4;
 | 
						|
34890          END;
 | 
						|
34900      END;
 | 
						|
34910  (**)
 | 
						|
34920  FUNCTION LENOF(SB: PSB): INTEGER;
 | 
						|
34930     BEGIN
 | 
						|
34940     WITH SB^,SBMODE^.MDV DO
 | 
						|
34950       IF (SBUNION IN SBINF) OR (SBTYP=SBTDL) THEN LENOF := SBLEN
 | 
						|
34952       ELSE IF SBNAKED IN SBINF THEN LENOF := SZNAKED
 | 
						|
34954       ELSE IF MDPILE THEN LENOF := SZADDR
 | 
						|
34956       ELSE LENOF := MDLEN;
 | 
						|
34960     END;
 | 
						|
34970  (**)
 | 
						|
34980  PROCEDURE LOADSTK(SB:  PSB);
 | 
						|
34990      BEGIN
 | 
						|
34995      IF NOT(SB^.SBTYP IN [SBTSTKN,SBTDL]) THEN
 | 
						|
35000      CASE LENOF(SB) OF
 | 
						|
35010          0: LOAD(SBTVOID, SB);
 | 
						|
35020          SZINT: LOAD(SBTSTK, SB);
 | 
						|
35030  (*+19() SZADDR: LOAD(SBTSTK2, SB);
 | 
						|
35032          6: LOAD(SBTSTK2A, SB); ()+19*)
 | 
						|
35040          SZREAL: LOAD(SBTSTK4, SB);
 | 
						|
35050        END;
 | 
						|
35060      END;
 | 
						|
35070  (**)
 | 
						|
35080  PROCEDURE TWIST;
 | 
						|
35090    VAR TEMPPTR : PSB;
 | 
						|
35095        L1, L2, SAVE: INTEGER;
 | 
						|
35100      BEGIN
 | 
						|
35110      WITH RTSTACK^ DO BEGIN
 | 
						|
35120        IF (SBRTSTK^.SBTYP IN [SBTSTK..SBTDL]) AND (SBTYP IN [SBTSTK..SBTPRR]) THEN
 | 
						|
35121          BEGIN
 | 
						|
35122          IF SBTYP=SBTPRR THEN LOADSTK(RTSTACK);
 | 
						|
35123          SAVE := ADJUSTSP;
 | 
						|
35124          L1:=LENOF(RTSTACK);L2:=LENOF(SBRTSTK);
 | 
						|
35126          IF L1=L2 THEN
 | 
						|
35128            CASE L1 OF
 | 
						|
35130               SZWORD: EMITOP(PSWAP);
 | 
						|
35132 (*+19()       SZADDR: EMITOP(PSWAP+1); ()+19*)
 | 
						|
35134               SZREAL: EMITOP(PSWAP+2);
 | 
						|
35136            END
 | 
						|
35138          ELSE (*STACK OBJECTS TO BE SWAPPED ARE NOT THE SAME SIZE*)
 | 
						|
35140             EMITX2(PSWAP+3,OCVIMMED,L1,OCVIMMED,L2);
 | 
						|
35141          ADJUSTSP := SAVE;
 | 
						|
35142          END;
 | 
						|
35144        TEMPPTR := SBRTSTK;
 | 
						|
35150        SBRTSTK := TEMPPTR^.SBRTSTK;
 | 
						|
35160        TEMPPTR^.SBRTSTK := RTSTACK;
 | 
						|
35170        RTSTACK := TEMPPTR;
 | 
						|
35180        END
 | 
						|
35190      END;
 | 
						|
35200  (**)
 | 
						|
35210  PROCEDURE PROC1OP(OPCOD:POP;TYP:OPDTYP;OPND:ADDRINT;NOTINL:BOOLEAN);
 | 
						|
35220    VAR SB:PSB;
 | 
						|
35230      BEGIN
 | 
						|
35240      SB:=ASPTR(OPND);
 | 
						|
35250        IF RTSTACK<>SB THEN TWIST;
 | 
						|
35255        IF NOTINL THEN CLEAR (RTSTACK^.SBRTSTK);
 | 
						|
35260        LOAD(CODETABLE[OPCOD].P1,SB);
 | 
						|
35270      UNSTKP1(TYP,SB);
 | 
						|
35280      OCV := OCVNONE; (*FOR 1ST CALL OF PARAM*)
 | 
						|
35290      END;
 | 
						|
35300  (**)
 | 
						|
35310  PROCEDURE PROC2OP(OPCOD:POP;TYP1:OPDTYP;OPND1:ADDRINT;TYP2:OPDTYP;OPND2:ADDRINT;NOTINL:BOOLEAN);
 | 
						|
35320    VAR SB1,SB2:PSB;
 | 
						|
35330      BEGIN
 | 
						|
35340      SB1:=ASPTR(OPND1);
 | 
						|
35350      SB2:=ASPTR(OPND2);
 | 
						|
35360      IF RTSTACK<>SB2 THEN TWIST;
 | 
						|
35365      IF NOTINL THEN CLEAR (RTSTACK^.SBRTSTK^.SBRTSTK);
 | 
						|
35370      WITH CODETABLE[OPCOD] DO
 | 
						|
35380        BEGIN
 | 
						|
35390        IF NOT (SB2^.SBTYP IN [SBTSTK..SBTSTKN,SBTVAR]) THEN
 | 
						|
35400          BEGIN LOAD(P1,SB1); LOAD(P2,SB2) END
 | 
						|
35410        ELSE BEGIN LOAD(P2,SB2); LOAD(P1,SB1); LOAD(P2,SB2) END;
 | 
						|
35420        END;
 | 
						|
35430      UNSTKP1(TYP2,SB2);
 | 
						|
35440      UNSTKP1(TYP1,SB1);
 | 
						|
35450      OCV := OCVNONE; (*FOR 1ST CALL OF PARAM*)
 | 
						|
35460      END;
 | 
						|
35470  (**)
 | 
						|
35480  PROCEDURE FILL (WHERE:SBTTYP; SB:PSB);
 | 
						|
35490      BEGIN
 | 
						|
35500      WITH SB^ DO
 | 
						|
35510        BEGIN
 | 
						|
35515        IF SBTYP IN [SBTSTK..SBTDL] THEN RTSTKDEPTH:=RTSTKDEPTH-SBLEN;
 | 
						|
35520        IF NOT(WHERE IN [SBTSTKN,SBTDL,SBTPRR,SBTXN]) THEN SBLEN := LENARRAY[WHERE];
 | 
						|
35522        (*ELSE IF WHERE=SBTPRR THEN IT GET IT WRONG - SEE FIX IN SUBSTLEN*)
 | 
						|
35530        IF WHERE IN [SBTSTK..SBTDL] THEN
 | 
						|
35540          BEGIN
 | 
						|
35550          RTSTKDEPTH := RTSTKDEPTH+SBLEN;
 | 
						|
35560          WITH ROUTNL^ DO
 | 
						|
35570            IF RTSTKDEPTH>RNLENSTK THEN RNLENSTK:=RTSTKDEPTH
 | 
						|
35580          END;
 | 
						|
35590        SBTYP:=WHERE;
 | 
						|
35600        END
 | 
						|
35610      END;
 | 
						|
35620  (**)
 | 
						|
35630  FUNCTION SETINLINE (OPCOD:POP):BOOLEAN;
 | 
						|
35640     VAR INL:BOOLEAN;
 | 
						|
35650      BEGIN
 | 
						|
35660      OCV := OCVNONE; (*FOR 1ST CALL OF PARAM*)
 | 
						|
35670      REPEAT WITH CODETABLE[OPCOD] DO
 | 
						|
35680        BEGIN
 | 
						|
35690        INL := INLINE;
 | 
						|
35700        OPCOD := NEXT
 | 
						|
35710        END
 | 
						|
35720      UNTIL NOT(INL) OR (OPCOD=0);
 | 
						|
35730      SETINLINE := INL
 | 
						|
35740      END;
 | 
						|
35750  (**)
 | 
						|
35760  (**)
 | 
						|
35770  PROCEDURE LOAD (* (WHERE:SBTTYP; SB:PSB) *);
 | 
						|
35780  (*EMITS CODE TO MOVE SB TO WHERE: CALLS FILL TO RECORD THE MOVE*)
 | 
						|
35790    VAR TEMPOP: POP;
 | 
						|
35800        TOFFSET: OFFSETR;
 | 
						|
35810        TEMPTYP: SBTTYP;
 | 
						|
35812        OCVFIX: OPDTYP;
 | 
						|
35820        TWISTED: BOOLEAN;
 | 
						|
35830        SB1 :PSB;
 | 
						|
35840        SAVE:INTEGER;
 | 
						|
35850    BEGIN
 | 
						|
35855 (*+21() WRITELN(OUTPUT,'LOAD ',ORD(SB),ORD(SB^.SBTYP):3,' TO ',ORD(WHERE):3, SB=RTSTACK); ()+21*)
 | 
						|
35860    WITH SB^ DO
 | 
						|
35870      BEGIN
 | 
						|
35880    (*IF (SB=RTSTACK) AND (SBRTSTK<>NIL) THEN
 | 
						|
35890        IF SBSTKDELAY IN SBRTSTK^.SBINF THEN
 | 
						|
35900          BEGIN LOADSTK(SBRTSTK); SBRTSTK^.SBINF:=SBRTSTK^.SBINF-[SBSTKDELAY] END; *)
 | 
						|
35902      IF WHERE IN [SBTSTK..SBTDL] THEN CLEAR(SBRTSTK);
 | 
						|
35910        TWISTED := FALSE;
 | 
						|
35930      IF WHERE IN [SBTSTKN,SBTPR1,SBTPR2] THEN
 | 
						|
35940        LOADSTK(SB)
 | 
						|
35950      ELSE IF WHERE=SBTXN THEN LOAD(NORMAL(SB),SB)
 | 
						|
35960      ELSE
 | 
						|
35970        IF (WHERE<>SBTVOID) AND (WHERE<>SBTYP) THEN
 | 
						|
35980          BEGIN
 | 
						|
35990          SB1 := RTSTACK;
 | 
						|
36000          WHILE (SB1^.SBTYP IN [SBTID..SBTRPROC]) AND (SB1<>SB) DO
 | 
						|
36010            SB1 := SB1^.SBRTSTK;
 | 
						|
36020          IF SB1<>SB THEN
 | 
						|
36030            BEGIN TWISTED:=TRUE; TWIST;
 | 
						|
36032            IF WHERE IN [SBTSTK..SBTDL] THEN CLEAR(SBRTSTK);
 | 
						|
36040  (*+32()   ASERT (RTSTACK =SB,'LOAD-B    ');     ()+32*)
 | 
						|
36050            END;
 | 
						|
36080          IF WHERE IN [SBTPR1..SBTPRR] THEN TEMPOP := POPARRAY[NORMAL(SB),SBTYP]
 | 
						|
36090          ELSE TEMPOP := POPARRAY[WHERE,SBTYP];
 | 
						|
36100  (*+32() ASERT(TEMPOP<>PNONE,'LOAD-C    '); ()+32*)
 | 
						|
36110          IF TEMPOP<>PNOOP THEN
 | 
						|
36120            CASE SBTYP OF
 | 
						|
36130              SBTPROC,SBTRPROC,SBTVAR: BEGIN
 | 
						|
36140                      SAVE := ADJUSTSP;
 | 
						|
36150                      IF WHERE <> SBTPRR THEN BEGIN LOAD(SBTPRR,SB); LOAD(WHERE,SB) END
 | 
						|
36160                      ELSE BEGIN TOFFSET:=GENLCLGBL(TEMPOP,SB);
 | 
						|
36162                        IF SBTYP=SBTVAR THEN
 | 
						|
36170                          EMITX2(TEMPOP,OCVIMMED,SBLOCRG,OCVLCLGBL,TOFFSET)
 | 
						|
36172                        ELSE BEGIN (*SBTYP=SBTPROC OR SBTRPROC*)
 | 
						|
36174                          IF SBTYP=SBTPROC THEN OCVFIX := OCVMEM
 | 
						|
36176                          ELSE  (* SBTRPROC *)  OCVFIX := OCVFREF;
 | 
						|
36177                          EMITX2(TEMPOP,OCVFIX,SBXPTR,OCVLCLGBL,-SZADDR(*ANYTHING -VE*));
 | 
						|
36178                          END;
 | 
						|
36179                        END;
 | 
						|
36180                      ADJUSTSP := SAVE;
 | 
						|
36190                      END;
 | 
						|
36200  (**)
 | 
						|
36210              SBTID,SBTIDV: BEGIN TOFFSET:=GENLCLGBL(TEMPOP,SB);EMITX1(TEMPOP,OCVLCLGBL,TOFFSET) END;
 | 
						|
36220              SBTLIT:         EMITX1(TEMPOP, OCVIMMED, SBVALUE);
 | 
						|
36230              SBTDEN:         GENDENOT(TEMPOP,SB);
 | 
						|
36240              SBTPR1,SBTPR2,SBTPRR,
 | 
						|
36250              SBTSTK,SBTSTK2,SBTDL,SBTSTK4: EMITOP(TEMPOP);
 | 
						|
36260            END;
 | 
						|
36270            FILL(WHERE,SB);
 | 
						|
36280          END;
 | 
						|
36290        IF TWISTED THEN TWIST;
 | 
						|
36300      END;
 | 
						|
36310    END;
 | 
						|
36320  (**)
 | 
						|
36330  PROCEDURE PARAM (*(TYP:OPDTYP; OPND:ADDRINT; OPCOD: POP)*);
 | 
						|
36340    VAR TEMPOP:POP;
 | 
						|
36350        OPERANDUSED, INL: BOOLEAN;
 | 
						|
36360      BEGIN
 | 
						|
36370      IF OCV<>OCVNONE THEN
 | 
						|
36380        BEGIN
 | 
						|
36390        TEMPOP := PPUSHIM;
 | 
						|
36392 (*+19()IF OCV = OCVIMMLONG THEN TEMPOP:=TEMPOP+2 ELSE
 | 
						|
36395        IF OCV = OCVIMMPTR THEN TEMPOP:=TEMPOP+2 ELSE ()+19*)
 | 
						|
36400        IF OCV IN [OCVMEM,OCVFIM,OCVFREF] THEN TEMPOP:=TEMPOP+1; (*NOT FOR OCVFIM*)
 | 
						|
36410        EMITOP(TEMPOP);ADJUSTSP:=ADJUSTSP+STKSPACE(CODETABLE[TEMPOP].EMCOD,0)
 | 
						|
36420        END;
 | 
						|
36450      IF TYP<>OCVNONE THEN
 | 
						|
36460        BEGIN OPRAND:=OPND; OCV := TYP END;
 | 
						|
36470      END;
 | 
						|
36480  (**)
 | 
						|
36490  ()+02*)
 | 
						|
36500  (**)
 | 
						|
36510  (*+01()   (*+31()   (*$T+ +)   ()+31+)   ()+01*)
 | 
						|
36530  (**)
 | 
						|
36540  (**)
 | 
						|
36550                                                 (* CYBER CODE EMITTER *)
 | 
						|
36560                                                 (**********************)
 | 
						|
36570  (*-23()
 | 
						|
36580  (*+01()
 | 
						|
36590  PROCEDURE PUTLINK(OPCOD: POP);
 | 
						|
36600  (*EMITS LINK TABLE FOR LINKINS CHAIN OF OPCOD*)
 | 
						|
36610    VAR TABLEWORD: PACKED RECORD CASE INTEGER OF
 | 
						|
36620            1: (INT: INTEGER);
 | 
						|
36630            2: (ENTRY: PACKED ARRAY [1..7] OF CHAR; FILLER: 0..777777B);
 | 
						|
36640            END;
 | 
						|
36650        APFILLCHAIN, BPFILLCHAIN: PFILLCHAIN;
 | 
						|
36660        SEQWORD, C: INTEGER;
 | 
						|
36670      BEGIN WITH TABLEWORD, CODETABLE[OPCOD] DO
 | 
						|
36680        BEGIN
 | 
						|
36690        WRITE(LGO, 44000002000000000000B+(LINKINS^.COUNT DIV 2)*1000000000000B); (*LINK TABLE*)
 | 
						|
36700        INT := 0;
 | 
						|
36710        FOR C := 1 TO 7 DO
 | 
						|
36720          IF ROUTINE[C]<>' ' THEN ENTRY[C] := ROUTINE[C];
 | 
						|
36730        WRITE(LGO, INT);
 | 
						|
36740        SEQWORD := 0;
 | 
						|
36750        APFILLCHAIN := LINKINS;
 | 
						|
36760        C := 1;
 | 
						|
36770        REPEAT
 | 
						|
36780          WITH APFILLCHAIN^ DO
 | 
						|
36790            BEGIN
 | 
						|
36800            SEQWORD := SEQWORD*10000000000B+(7-FFOUR)*1000000000B+1000000B+FSEGLOC;
 | 
						|
36810            C := C+1;
 | 
						|
36820            IF ODD(C) THEN BEGIN WRITE(LGO, SEQWORD); SEQWORD := 0 END;
 | 
						|
36830            BPFILLCHAIN := APFILLCHAIN; APFILLCHAIN := LINK; DISPOSE(BPFILLCHAIN)
 | 
						|
36840            END
 | 
						|
36850        UNTIL APFILLCHAIN=NIL;
 | 
						|
36860        IF NOT ODD(C) THEN
 | 
						|
36870          BEGIN SEQWORD := SEQWORD*10000000000B; WRITE(LGO, SEQWORD) END;
 | 
						|
36880        LINKINS := NIL
 | 
						|
36890        END
 | 
						|
36900      END;
 | 
						|
36910  (**)
 | 
						|
36920  PROCEDURE PLANTWORD;
 | 
						|
36930  (*CALLED WHENEVER A COMPLETE WORD OF 15 OR 30 BIT INSTRUCTIONS IS COMPLETE*)
 | 
						|
36940    VAR I: INTEGER;
 | 
						|
36950      BEGIN
 | 
						|
36960      WITH XSEG DO
 | 
						|
36970        BEGIN
 | 
						|
36980        FOUR := 1;
 | 
						|
36990        IF FIFTEEN<15 THEN
 | 
						|
37000          FIFTEEN := FIFTEEN+1
 | 
						|
37010        ELSE
 | 
						|
37020          BEGIN
 | 
						|
37030          SEGLOC := SEGLOC+15;
 | 
						|
37040          WITH BUFFER[LAST] DO CODEWORD := CODEWORD+RELOCATION; RELOCATION := 0;
 | 
						|
37050          LAST := (LAST+16) MOD 128;
 | 
						|
37060          FIFTEEN := 1;
 | 
						|
37070          IF LAST=FIRST THEN WITH HEADERWORD DO
 | 
						|
37080            BEGIN
 | 
						|
37090            WRITE(LGO, WORD);
 | 
						|
37100            FOR I := FIRST TO FIRST+15 DO
 | 
						|
37110              WRITE(LGO, BUFFER[I].CODEWORD);
 | 
						|
37120            FIRST := (FIRST+16) MOD 128;
 | 
						|
37130            S := S+15
 | 
						|
37140            END;
 | 
						|
37150          BUFFER[LAST].CODEWORD := 0 (*NEXT RELOCATION*)
 | 
						|
37160          END;
 | 
						|
37170        BUFFER[LAST+FIFTEEN].CODEWORD := 0
 | 
						|
37180        END
 | 
						|
37190      END;
 | 
						|
37200  (**)
 | 
						|
37210  (**)
 | 
						|
37220  PROCEDURE UPPER;
 | 
						|
37230  (*FORCES NEXT INSTRUCTION TO BE AT START OF A WORD*)
 | 
						|
37240    CONST SHIFT1=100000B; SHIFT2=10000000000B; SHIFT3=1000000000000000B;
 | 
						|
37250          NOOP1=46000B; NOOP2=4600046000B; NOOP3=460004600046000B;
 | 
						|
37260      BEGIN WITH XSEG DO WITH BUFFER[LAST+FIFTEEN] DO
 | 
						|
37270        CASE FOUR OF
 | 
						|
37280          1: (*NO ACTION*);
 | 
						|
37290          2: BEGIN
 | 
						|
37300             CODEWORD := CODEWORD*SHIFT3+NOOP3;
 | 
						|
37310             RELOCATION := RELOCATION*8;
 | 
						|
37320             PLANTWORD
 | 
						|
37330             END;
 | 
						|
37340          3: BEGIN
 | 
						|
37350             CODEWORD := CODEWORD*SHIFT2+NOOP2;
 | 
						|
37360             RELOCATION := RELOCATION*4;
 | 
						|
37370             PLANTWORD
 | 
						|
37380             END;
 | 
						|
37390          4: BEGIN
 | 
						|
37400             CODEWORD := CODEWORD*SHIFT1+NOOP1;
 | 
						|
37410             RELOCATION := RELOCATION*2;
 | 
						|
37420             PLANTWORD
 | 
						|
37430             END
 | 
						|
37440          END
 | 
						|
37450      END;
 | 
						|
37460  (**)
 | 
						|
37470  (**)
 | 
						|
37480  PROCEDURE DOFREF(OPERAND: INTEGER);
 | 
						|
37490    VAR APFCHAIN: PFCHAIN;
 | 
						|
37500      BEGIN NEW(APFCHAIN); WITH XSEG, APFCHAIN^ DO
 | 
						|
37510        BEGIN
 | 
						|
37520        FLAST := LAST; FFIFTEEN := FIFTEEN; FFOUR := FOUR;
 | 
						|
37530        FSEGLOC := SEGLOC; FLABL := OPERAND;
 | 
						|
37540        LINK := TPFCHAIN^.LINK; TPFCHAIN^.LINK := APFCHAIN
 | 
						|
37550        END
 | 
						|
37560      END;
 | 
						|
37570  (**)
 | 
						|
37580  (**)
 | 
						|
37590  PROCEDURE EMITXWORD(TYP: OPDTYP; OPERAND: INTEGER);
 | 
						|
37600      BEGIN
 | 
						|
37610      UPPER;
 | 
						|
37620      WITH XSEG DO WITH BUFFER[LAST+FIFTEEN] DO
 | 
						|
37630        CASE TYP OF
 | 
						|
37640          OCVIMMED:
 | 
						|
37650            BEGIN CODEWORD := OPERAND; RELOCATION := RELOCATION*16 END;
 | 
						|
37660          OCVMEM:
 | 
						|
37670            BEGIN CODEWORD := OPERAND; RELOCATION := RELOCATION*16+2 END;
 | 
						|
37680          OCVFIM,OCVFREF:
 | 
						|
37690            BEGIN CODEWORD := 0; RELOCATION := RELOCATION*16; FOUR := 3; DOFREF(OPERAND) END;
 | 
						|
37700          END;
 | 
						|
37710      PLANTWORD
 | 
						|
37720      END;
 | 
						|
37730  (**)
 | 
						|
37740  (**)
 | 
						|
37750  PROCEDURE EMITALF(OPERAND: BIGALFA);
 | 
						|
37760    VAR ALFWD: RECORD CASE SEVERAL OF
 | 
						|
37770                 1: (INT: INTEGER);
 | 
						|
37780                 2: (ALF: BIGALFA);
 | 
						|
37790                 END;
 | 
						|
37800      BEGIN
 | 
						|
37810      ALFWD.ALF := OPERAND;
 | 
						|
37820      EMITXWORD(OCVIMMED, ALFWD.INT);
 | 
						|
37830      END;
 | 
						|
37840  (**)
 | 
						|
37850  (**)
 | 
						|
37860  (**)
 | 
						|
37870  (**)
 | 
						|
37880  PROCEDURE FILL (WHERE:SBTTYP; SB:PSB);
 | 
						|
37890      BEGIN
 | 
						|
37900      WITH SB^ DO
 | 
						|
37910        BEGIN
 | 
						|
37920        IF NOT(WHERE IN [SBTSTKN,SBTDL,SBTXN]) THEN SBLEN := LENARRAY[WHERE];
 | 
						|
37930        IF WHERE IN [SBTSTK..SBTDL] THEN
 | 
						|
37940          BEGIN
 | 
						|
37950          RTSTKDEPTH := RTSTKDEPTH+SBLEN;
 | 
						|
37960          WITH ROUTNL^ DO
 | 
						|
37970            IF RTSTKDEPTH>RNLENSTK THEN RNLENSTK:=RTSTKDEPTH
 | 
						|
37980          END
 | 
						|
37990  (*+32()ELSE  ASERT(REGISTERS[WHERE]*(REGSINUSE-REGISTERS[SBTYP])=[],'FILL-A    ') ()+32*);
 | 
						|
38000        IF SBTYP IN [SBTSTK..SBTDL] THEN RTSTKDEPTH:=RTSTKDEPTH-SBLEN+ORD(WHERE=SBTDL);
 | 
						|
38010        REGSINUSE:=REGSINUSE-REGISTERS[SBTYP]+REGISTERS[WHERE];
 | 
						|
38020        SBTYP:=WHERE
 | 
						|
38030        END
 | 
						|
38040      END;
 | 
						|
38050  (**)
 | 
						|
38060  FUNCTION SETINLINE (OPCOD:POP):BOOLEAN;
 | 
						|
38070    VAR INL:BOOLEAN;
 | 
						|
38080      BEGIN
 | 
						|
38090      OCV := OCVNONE; (*FOR 1ST CALL OF PARAM*)
 | 
						|
38100      REPEAT WITH CODETABLE[OPCOD] DO
 | 
						|
38110        BEGIN
 | 
						|
38120        INL := INLINE;
 | 
						|
38130        OPCOD := NEXT
 | 
						|
38140        END
 | 
						|
38150      UNTIL NOT(INL) OR (OPCOD=0);
 | 
						|
38160      SETINLINE := INL
 | 
						|
38170      END;
 | 
						|
38180  (**)
 | 
						|
38190  FUNCTION NORMAL(SB: PSB): SBTTYP;
 | 
						|
38200  (*RETURNS THE SBTTYP IN WHICH VALUES OF MODE SB^.SBMODE SHOULD BE STORED DURING BALANCES*)
 | 
						|
38210      BEGIN WITH SB^ DO WITH SBMODE^.MDV DO
 | 
						|
38220        IF SBTYP=SBTDL THEN NORMAL := SBTDL
 | 
						|
38230        ELSE IF SBUNION IN SBINF THEN NORMAL := SBTSTKN
 | 
						|
38240        ELSE IF MDPILE THEN NORMAL := SBTX1
 | 
						|
38250        ELSE CASE MDLEN OF
 | 
						|
38260          0: NORMAL := SBTVOID;
 | 
						|
38270          1: NORMAL := SBTX1;
 | 
						|
38280  (*+61() 2: NORMAL := SBTX12; ()+61*)
 | 
						|
38290          END;
 | 
						|
38300      END;
 | 
						|
38310  (**)
 | 
						|
38320  (**)
 | 
						|
38330  (**)
 | 
						|
38340  PROCEDURE LOADSTK(SB:  PSB);
 | 
						|
38350    VAR LEN: 0..MAXSIZE;
 | 
						|
38360      BEGIN
 | 
						|
38370      WITH SB^ DO WITH SBMODE^.MDV DO
 | 
						|
38380        BEGIN
 | 
						|
38390        IF  SBUNION IN SBINF THEN LEN := SBLEN ELSE IF MDPILE THEN LEN:=SZADDR ELSE LEN := MDLEN;
 | 
						|
38400        IF SBTYP<>SBTDL THEN
 | 
						|
38410          CASE LEN OF
 | 
						|
38420            0: LOAD(SBTVOID, SB);
 | 
						|
38430            1: LOAD(SBTSTK, SB);
 | 
						|
38440            2: (*+61() LOAD(SBTSTK2, SB);
 | 
						|
38450            3: ()+61*) (*LEAVE IT WHERE IT IS*);
 | 
						|
38460            END;
 | 
						|
38470        END;
 | 
						|
38480      END;
 | 
						|
38490  ()+01*)
 | 
						|
38500  ()-23*)
 | 
						|
38510  (**)
 | 
						|
38520  PROCEDURE CLEAR (* (SB:PSB) *);
 | 
						|
38530  (*ENSURES THAT NOTHING ON RTSTACK FROM SB DOWNWARDS IS IN A REGISTER*)
 | 
						|
38540    VAR TEMPPTR:PSB;  BOOL:BOOLEAN;
 | 
						|
38550      BEGIN
 | 
						|
38560      TEMPPTR:=SB;
 | 
						|
38570      BOOL := TRUE;
 | 
						|
38580      IF TEMPPTR<>NIL THEN IF TEMPPTR^.SBTYP<SBTSTK THEN
 | 
						|
38590        REPEAT
 | 
						|
38600          BEGIN
 | 
						|
38610          TEMPPTR:=TEMPPTR^.SBRTSTK;
 | 
						|
38620          IF TEMPPTR<>NIL THEN IF TEMPPTR^.SBTYP>SBTSTKN THEN BOOL:=FALSE;
 | 
						|
38630          END
 | 
						|
38640        UNTIL NOT(BOOL) OR (TEMPPTR=NIL);
 | 
						|
38650      IF TEMPPTR<>NIL THEN IF TEMPPTR^.SBTYP>SBTSTKN THEN LOADSTK(TEMPPTR);
 | 
						|
38660      END;
 | 
						|
38670  (**)
 | 
						|
38680  (*-23()
 | 
						|
38690  (*+01()
 | 
						|
38700  (**)
 | 
						|
38710  PROCEDURE TWIST;
 | 
						|
38720    VAR TEMPPTR : PSB;
 | 
						|
38730      BEGIN
 | 
						|
38740      WITH RTSTACK^ DO BEGIN
 | 
						|
38750        IF (SBRTSTK^.SBTYP IN [SBTSTK..SBTSTKN])AND(SBTYP>=SBTSTK) THEN (*PHYSICAL UNTWISTING NEEDED*)
 | 
						|
38760          BEGIN
 | 
						|
38770  (*+32() ASERT(SBTYP>SBTDL, 'TWIST-A   '); ()+32*)
 | 
						|
38780          LOAD(NORMAL(SBRTSTK),SBRTSTK);
 | 
						|
38790          END;
 | 
						|
38800        TEMPPTR := SBRTSTK;
 | 
						|
38810        SBRTSTK := TEMPPTR^.SBRTSTK;
 | 
						|
38820        TEMPPTR^.SBRTSTK := RTSTACK;
 | 
						|
38830        RTSTACK := TEMPPTR;
 | 
						|
38840        END
 | 
						|
38850      END;
 | 
						|
38860  (**)
 | 
						|
38870  PROCEDURE LOAD (* (WHERE:SBTTYP; SB:PSB) *);
 | 
						|
38880  (*EMITS CODE TO MOVE SB TO WHERE: CALLS FILL TO RECORD THE MOVE*)
 | 
						|
38890    VAR TEMPOP: POP;
 | 
						|
38900        TOFFSET: OFFSETR;
 | 
						|
38910        TEMPTYP: SBTTYP;
 | 
						|
38920        OCVFIX: OPDTYP;
 | 
						|
38930    BEGIN
 | 
						|
38940    WITH SB^ DO
 | 
						|
38950      BEGIN
 | 
						|
38960  (*+21() WRITELN('LOAD',ORD(SB):6 OCT,ORD(SB^.SBTYP):3,ORD(WHERE):3);()+21*)
 | 
						|
38970      IF SBRTSTK<>NIL THEN
 | 
						|
38980        IF SBSTKDELAY IN SBRTSTK^.SBINF THEN
 | 
						|
38990          BEGIN LOADSTK(SBRTSTK); SBRTSTK^.SBINF:=SBRTSTK^.SBINF-[SBSTKDELAY] END;
 | 
						|
39000      IF WHERE IN [SBTSTK..SBTDL] THEN CLEAR(SBRTSTK)
 | 
						|
39010      ELSE
 | 
						|
39020        BEGIN  (*WHERE IS SOME REGISTER*)
 | 
						|
39030  (*+32()ASERT((SB=RTSTACK)OR(SB=RTSTACK^.SBRTSTK)OR(SBTYP IN [SBTVAR,SBTPROC,SBTRPROC]),'LOAD-A    '); ()+32*)
 | 
						|
39040        IF SB=RTSTACK^.SBRTSTK THEN (*SB IS SECOND ON RTSTACK*) WITH RTSTACK^ DO
 | 
						|
39050          BEGIN
 | 
						|
39060          IF REGISTERS[WHERE]*REGISTERS[SBTYP]<>[] THEN
 | 
						|
39070            IF WHERE IN [SBTX1,SBTX5(*+61(),SBTX12,SBTX45()+61*)] THEN
 | 
						|
39080              IF (SB^.SBTYP IN [SBTX1,SBTX5]) AND (SBTYP IN [SBTX1,SBTX5]) THEN
 | 
						|
39090                BEGIN EMITOP(PSWAP); TEMPTYP := SBTYP; SBTYP := SB^.SBTYP; SB^.SBTYP := TEMPTYP END
 | 
						|
39100              ELSE IF SBTYP=SBTX1 THEN LOAD(SBTX5,RTSTACK)
 | 
						|
39110  (*+61()          ELSE IF SBTYP=SBTX12 THEN LOAD(SBTX45,RTSTACK)
 | 
						|
39120                   ELSE IF SBTYP=SBTX45 THEN LOAD(SBTX12,RTSTACK)
 | 
						|
39130  ()+61*)
 | 
						|
39140                   ELSE LOAD(SBTX1,RTSTACK)
 | 
						|
39150            ELSE IF REGISTERS[WHERE]*(REGSINUSE-REGISTERS[SB^.SBTYP])<>[] THEN CLEAR(SBRTSTK)
 | 
						|
39160          END
 | 
						|
39170        ELSE (*SB IS FIRST ON RTSTACK*)
 | 
						|
39180          IF REGISTERS[WHERE]*(REGSINUSE-REGISTERS[SBTYP])<>[] THEN
 | 
						|
39190            IF REGISTERS[SBRTSTK^.SBTYP]*REGISTERS[WHERE]<>[] THEN CLEAR(SBRTSTK)
 | 
						|
39200            ELSE CLEAR(SBRTSTK^.SBRTSTK)
 | 
						|
39210        END;
 | 
						|
39220      IF WHERE = SBTXN THEN
 | 
						|
39230        LOAD(NORMAL(SB), SB)
 | 
						|
39240      ELSE IF WHERE = SBTSTKN THEN
 | 
						|
39250        LOADSTK(SB)
 | 
						|
39260      ELSE
 | 
						|
39270        BEGIN
 | 
						|
39280        IF WHERE<>SBTVOID THEN
 | 
						|
39290          BEGIN
 | 
						|
39300          TEMPOP := POPARRAY[WHERE,SBTYP];
 | 
						|
39310  (*+32()ASERT(TEMPOP<>PNONE,'LOAD-C    '); ()+32*)
 | 
						|
39320          IF TEMPOP<>PNOOP THEN
 | 
						|
39330            BEGIN
 | 
						|
39340            CASE SBTYP OF
 | 
						|
39350              SBTRPROC,SBTPROC,SBTVAR: IF WHERE<>SBTX6 THEN
 | 
						|
39360                              BEGIN LOAD(SBTX6, SB); LOAD(WHERE, SB) END
 | 
						|
39370                             ELSE BEGIN TOFFSET:=GENLCLGBL(TEMPOP,SB);
 | 
						|
39380                              IF SBTYP=SBTVAR THEN
 | 
						|
39390                              EMITX2(TEMPOP,OCVIMMED,SBLOCRG,OCVLCLGBL,TOFFSET)
 | 
						|
39400                              ELSE BEGIN (*SBTYP=SBTPROC OR SBTRPROC*)
 | 
						|
39410                                   IF SBTYP=SBTPROC THEN OCVFIX := OCVMEM
 | 
						|
39420                                   ELSE  (* SBTRPROC *)  OCVFIX := OCVFREF;
 | 
						|
39430                                   EMITX2(TEMPOP,OCVFIX,SBXPTR,OCVLCLGBL,TOFFSET);
 | 
						|
39440                                   END
 | 
						|
39450                              END;
 | 
						|
39460  (**)
 | 
						|
39470              SBTID,SBTIDV: BEGIN TOFFSET:=GENLCLGBL(TEMPOP,SB);EMITX1(TEMPOP,OCVLCLGBL,TOFFSET) END;
 | 
						|
39480              SBTLIT:         EMITX1(TEMPOP, OCVIMMED, SBVALUE);
 | 
						|
39490              SBTDEN:         GENDENOT(TEMPOP,SB);
 | 
						|
39500              SBTSTK,SBTDL,(*+61()SBTSTK2,SBTX12,SBTX45,()+61*)SBTX5,SBTX6,SBTX0,SBTX1: EMITOP(TEMPOP)
 | 
						|
39510              END;
 | 
						|
39520            END
 | 
						|
39530          END;
 | 
						|
39540        FILL(WHERE,SB);
 | 
						|
39550        END;
 | 
						|
39560      END
 | 
						|
39570    END;
 | 
						|
39580   (**)
 | 
						|
39590  (**)
 | 
						|
39600  ()+01*)
 | 
						|
39610  ()-23*)
 | 
						|
39620  PROCEDURE UNSTKP1 (*+05() (TYP:OPDTYP; OPND:PSB) ()+05*);
 | 
						|
39630    BEGIN
 | 
						|
39640    IF TYP = OCVSBS THEN
 | 
						|
39650      (*ASSERT: OPND = RTSTACK*)
 | 
						|
39660      REPEAT
 | 
						|
39670        OPND := RTSTACK;
 | 
						|
39680        UNSTACKSB;
 | 
						|
39690        IF OPND^.SBTYP IN [SBTSTK..SBTDL] THEN ADJUSTSP := ADJUSTSP+OPND^.SBLEN;
 | 
						|
39700        OPND^.SBTYP := SBTVOID;
 | 
						|
39710      UNTIL OPND^.SBRTSTK =SRSTK[SRSUBP+1].SB^.SBRTSTK
 | 
						|
39720    ELSE IF TYP <> OCVSBP THEN
 | 
						|
39730         BEGIN UNSTACKSB;
 | 
						|
39740         IF OPND^.SBTYP IN [SBTSTK..SBTDL] THEN ADJUSTSP := ADJUSTSP+OPND^.SBLEN;
 | 
						|
39750         OPND^.SBTYP:=SBTVOID;
 | 
						|
39760         END
 | 
						|
39770  (*+02() ELSE (*TYP=OCVSBP*) ADJUSTSP := ADJUSTSP-LENOF(OPND); ()+02*)
 | 
						|
39780    END;
 | 
						|
39790  (**)
 | 
						|
39800  (*-23()
 | 
						|
39810  (*+01()
 | 
						|
39820  (**)
 | 
						|
39830  PROCEDURE PROC1OP (OPCOD:POP; TYP:OPDTYP; OPND:INTEGER; NOTINL:BOOLEAN);
 | 
						|
39840     VAR SB:PSB;
 | 
						|
39850      BEGIN
 | 
						|
39860      SB := ASPTR(OPND);
 | 
						|
39870      WITH CODETABLE[OPCOD] DO
 | 
						|
39880        BEGIN
 | 
						|
39890  (*+32()ASERT((P1<>SBTVOID)AND(P2=SBTVOID),'PROC1OP-A ');  ()+32*)
 | 
						|
39900        IF RTSTACK<>SB THEN TWIST;
 | 
						|
39910  (*+32()ASERT(RTSTACK=SB,'PROC1OP-B ');   ()+32*)
 | 
						|
39920        LOAD(P1,SB);
 | 
						|
39930        IF NOTINL THEN CLEAR(RTSTACK^.SBRTSTK);
 | 
						|
39940        NEXTREG := ORD(P1 IN [SBTX0,SBTX1]);
 | 
						|
39950        UNSTKP1(TYP,SB);
 | 
						|
39960        END;
 | 
						|
39970      OCV := OCVNONE; (*FOR 1ST CALL OF PARAM*)
 | 
						|
39980      END;
 | 
						|
39990  (**)
 | 
						|
40000  PROCEDURE PROC2OP (OPCOD:POP; TYP1:OPDTYP;OPND1:INTEGER; TYP2:OPDTYP;OPND2:INTEGER; NOTINL:BOOLEAN);
 | 
						|
40010      VAR SB1,SB2:PSB;
 | 
						|
40012          TEMP:PSB;
 | 
						|
40020      BEGIN
 | 
						|
40030      SB1 := ASPTR(OPND1);
 | 
						|
40040      SB2 := ASPTR(OPND2);
 | 
						|
40050      WITH CODETABLE[OPCOD] DO
 | 
						|
40060        BEGIN
 | 
						|
40070  (*+32()ASERT((P1 <>SBTVOID)AND(P2<>SBTVOID),'PROC2OP-A ');  ()+32*)
 | 
						|
40080        IF RTSTACK<>SB2 THEN TWIST;
 | 
						|
40090  (*+32()ASERT(RTSTACK=SB2,'PROC2OP-B ');  ()+32*)
 | 
						|
40100        IF NOT (SB2^.SBTYP IN [SBTSTK..SBTSTKN,SBTVAR,SBTPROC]) THEN
 | 
						|
40110          BEGIN LOAD(P1,SB1); LOAD(P2,SB2) END
 | 
						|
40120        ELSE BEGIN LOAD(P2,SB2); LOAD(P1,SB1); LOAD(P2,SB2) (*IN CASE SB1^.SBTYP WAS SBTVAR*) END;
 | 
						|
40130        IF NOTINL THEN CLEAR(RTSTACK^.SBRTSTK^.SBRTSTK);
 | 
						|
40140        NEXTREG:= ORD(P1 IN [SBTX0,SBTX1])+ ORD(P2 IN [SBTX0,SBTX1]);
 | 
						|
40150  (*+32()ASERT((TYP1=OCVSBP)OR NOT(TYP2 IN[OCVSBP,OCVSBS]),'PROC2OP-C '); ()+32*)
 | 
						|
40160        UNSTKP1(TYP2,SB2);
 | 
						|
40170        UNSTKP1(TYP1,SB1)
 | 
						|
40180        END;
 | 
						|
40190      OCV := OCVNONE; (*FOR 1ST CALL OF PARAM*)
 | 
						|
40200      END;
 | 
						|
40210  (**)
 | 
						|
40220  PROCEDURE PARAM (TYP:OPDTYP; OPND:INTEGER; OPCOD: POP);
 | 
						|
40230    VAR TEMPOP:POP;
 | 
						|
40240        TEMPREG: INTEGER;
 | 
						|
40250      BEGIN
 | 
						|
40260      IF OCV<>OCVNONE THEN
 | 
						|
40270        BEGIN
 | 
						|
40280        CASE NEXTREG OF
 | 
						|
40290          0: TEMPOP := PLOADX0IM;
 | 
						|
40300          1: TEMPOP := PLOADX1IM;
 | 
						|
40310          2: TEMPOP := PLOADX2IM;
 | 
						|
40320          3: TEMPOP := PLOADX3IM;
 | 
						|
40330          4: TEMPOP := PLOADX4IM
 | 
						|
40340          END;
 | 
						|
40350        NEXTREG := NEXTREG+1;
 | 
						|
40360        IF (OPRAND<400000B)AND(OPRAND>-400000B) THEN EMITOP(TEMPOP)
 | 
						|
40370        ELSE BEGIN
 | 
						|
40380           TEMPREG := NEXTREG;
 | 
						|
40390           EMITCONST(OPRAND);
 | 
						|
40400           NEXTREG := TEMPREG;
 | 
						|
40410           OCV := OCVMEM; OPRAND := FIXUPM-1;
 | 
						|
40420           EMITOP(TEMPOP+1)
 | 
						|
40430           END
 | 
						|
40440        END;
 | 
						|
40470      OPRAND:=OPND; OCV := TYP;
 | 
						|
40480      END;
 | 
						|
40490  (**)
 | 
						|
40500  PROCEDURE EMITOP (* (OPCOD: POP) *) ;
 | 
						|
40510    LABEL 11;
 | 
						|
40520    CONST NOOP1=46000B; NOOP2=4600046000B; SETX7=7170000000B; EQ=0400000000B;
 | 
						|
40530           SHIFT1=100000B; SHIFT2=10000000000B;
 | 
						|
40540    VAR LINKP: PFILLCHAIN; APFCHAIN: PFCHAIN;
 | 
						|
40550        ALFWD: RECORD CASE SEVERAL OF
 | 
						|
40560            1: (INT: INTEGER);
 | 
						|
40570            2: (LEX: PLEX)
 | 
						|
40580            END;
 | 
						|
40590        I: INTEGER;
 | 
						|
40600        FMIJKCOPY: 0..7777777777B;
 | 
						|
40610        FORCOUNT, COUNT: INTEGER; FORLABL: LABL;
 | 
						|
40620        VP1, VP2 : SBTTYP;
 | 
						|
40630        PARAMNOTUSED: BOOLEAN;
 | 
						|
40640      BEGIN
 | 
						|
40650      (*SEMCLKS := SEMCLKS+1;
 | 
						|
40660      EMITCLK := EMITCLK-CLOCK;*)
 | 
						|
40670      COUNT := 0; FORCOUNT := 0; PARAMNOTUSED := TRUE;
 | 
						|
40671      IF OCV=OCVLCLGBL THEN
 | 
						|
40672        BEGIN
 | 
						|
40673        IF LCLGBL<>0 THEN
 | 
						|
40674          FOR I := 1 TO LCLGBL DO
 | 
						|
40675            IF I=1 (*FIRST CASE*) THEN EMITX0(PENVCHAIN)
 | 
						|
40676            ELSE EMITX0(PENVCHAIN+1);
 | 
						|
40677        OCV := OCVIMMED;
 | 
						|
40678        END;
 | 
						|
40680      WHILE OPCOD<>0 DO WITH XSEG, CODETABLE[OPCOD] DO
 | 
						|
40690        BEGIN
 | 
						|
40700        IF INLINE THEN
 | 
						|
40710          BEGIN
 | 
						|
40720      11: WITH BUFFER[LAST+FIFTEEN] DO
 | 
						|
40730            BEGIN
 | 
						|
40740            CASE LEN OF
 | 
						|
40750              F0:
 | 
						|
40760                  FORLABL := FIXUPM;
 | 
						|
40770              F15:
 | 
						|
40780                  BEGIN
 | 
						|
40790                  CODEWORD := CODEWORD*SHIFT1+FMIJK;
 | 
						|
40800                  FOUR := FOUR+1; RELOCATION := RELOCATION*2
 | 
						|
40810                  END;
 | 
						|
40820              F30:
 | 
						|
40830                  IF FOUR<4 THEN
 | 
						|
40840                    BEGIN
 | 
						|
40850                    IF REL >= 0 THEN
 | 
						|
40860                      BEGIN
 | 
						|
40870                      IF REL > 0 THEN
 | 
						|
40880                        BEGIN  FORCOUNT:=COUNT+REL; FORLABL:=GETNEXTLABL;
 | 
						|
40890                        DOFREF(FORLABL)  END;
 | 
						|
40900                      CODEWORD := CODEWORD*SHIFT2+FMIJK;
 | 
						|
40910                      FOUR := FOUR+2; RELOCATION := RELOCATION*4
 | 
						|
40920                      END
 | 
						|
40930                    ELSE IF REL < 0 THEN
 | 
						|
40940                      BEGIN
 | 
						|
40950                      CODEWORD := CODEWORD+SHIFT2+FMIJK+FORLABL;
 | 
						|
40960                      RELOCATION := RELOCATION*4+2
 | 
						|
40970                      END;
 | 
						|
40980                    END
 | 
						|
40990                  ELSE
 | 
						|
41000                    BEGIN
 | 
						|
41010                    CODEWORD := CODEWORD*SHIFT1+NOOP1;
 | 
						|
41020                    RELOCATION := RELOCATION*2;
 | 
						|
41030                    PLANTWORD; GOTO 11
 | 
						|
41040                    END;
 | 
						|
41050              F30K:
 | 
						|
41060                  IF FOUR<4 THEN
 | 
						|
41070                    BEGIN
 | 
						|
41080                    IF ODD(FMIJK) THEN
 | 
						|
41090                      BEGIN
 | 
						|
41100  (*+32()             ASERT(OCV IN [OCVIMMED,OCVIMMLONG], 'EMITOP-A  '); ()+32*)
 | 
						|
41110                      FMIJKCOPY := FMIJK-1; OPRAND := -OPRAND;
 | 
						|
41120                      END
 | 
						|
41130                    ELSE FMIJKCOPY := FMIJK;
 | 
						|
41140                    CASE OCV OF
 | 
						|
41150                      OCVIMMED,OCVIMMLONG,OCVIMMPTR:
 | 
						|
41160                        BEGIN
 | 
						|
41170                        IF OPRAND<0 THEN OPRAND := OPRAND+777777B;
 | 
						|
41180                        CODEWORD := CODEWORD*SHIFT2+FMIJKCOPY+OPRAND;
 | 
						|
41190                        RELOCATION := RELOCATION*4
 | 
						|
41200                        END;
 | 
						|
41210                      OCVMEM:
 | 
						|
41220                        BEGIN
 | 
						|
41230                        CODEWORD := CODEWORD*SHIFT2+FMIJKCOPY+OPRAND;
 | 
						|
41240                        RELOCATION := RELOCATION*4+2
 | 
						|
41250                        END;
 | 
						|
41260                      OCVEXT:
 | 
						|
41270                        BEGIN
 | 
						|
41280                        CODEWORD := CODEWORD*SHIFT2+FMIJKCOPY;
 | 
						|
41290                        RELOCATION := RELOCATION*4;
 | 
						|
41300                        NEW(LINKP); WITH LINKP^, ALFWD, CODETABLE[PPOP] DO
 | 
						|
41310                          BEGIN
 | 
						|
41320                          FSEGLOC := SEGLOC+FIFTEEN-1; FFOUR := FOUR;
 | 
						|
41330                          COUNT := 0;
 | 
						|
41340                          LINK := NIL;
 | 
						|
41350                          INT := OPRAND;
 | 
						|
41360                          FOR I := 1 TO 7 DO
 | 
						|
41370                            WITH LEX^ DO
 | 
						|
41380                            IF S10[I]=' ' THEN ROUTINE[I] := ':' ELSE ROUTINE[I] := S10[I];
 | 
						|
41390                          LINKINS := LINKP; PUTLINK(PPOP)
 | 
						|
41400                          END
 | 
						|
41410                        END;
 | 
						|
41420                      OCVFIM, OCVFREF:
 | 
						|
41430                        BEGIN
 | 
						|
41440                        CODEWORD := CODEWORD*SHIFT2+FMIJKCOPY;
 | 
						|
41450                        RELOCATION := RELOCATION*4;
 | 
						|
41460                        DOFREF(OPRAND);
 | 
						|
41470                        END
 | 
						|
41480                      END;
 | 
						|
41490                    FOUR := FOUR+2;
 | 
						|
41500                    PARAMNOTUSED := FALSE;
 | 
						|
41510                    END
 | 
						|
41520                  ELSE
 | 
						|
41530                    BEGIN
 | 
						|
41540                    CODEWORD := CODEWORD*SHIFT1+NOOP1;
 | 
						|
41550                    RELOCATION := RELOCATION*2;
 | 
						|
41560                    PLANTWORD; GOTO 11
 | 
						|
41570                    END
 | 
						|
41580              END;
 | 
						|
41590            IF FOUR>4 THEN PLANTWORD;
 | 
						|
41600            OPCOD := NEXT
 | 
						|
41610            END
 | 
						|
41620          END
 | 
						|
41630        ELSE
 | 
						|
41640          BEGIN
 | 
						|
41650          IF PARAMNOTUSED THEN PARAM(OCVNONE, 0, OPCOD);
 | 
						|
41660          EMITOP(PSTATICLINK);
 | 
						|
41670          UPPER;
 | 
						|
41680          NEW(LINKP); WITH LINKP^ DO
 | 
						|
41690            BEGIN
 | 
						|
41700            FSEGLOC := SEGLOC+FIFTEEN-1; FFOUR := 3;
 | 
						|
41710            IF LINKINS=NIL THEN COUNT :=0 ELSE COUNT := LINKINS^.COUNT+1;
 | 
						|
41720            LINK := LINKINS; LINKINS := LINKP;
 | 
						|
41730            IF COUNT=31 THEN PUTLINK(OPCOD)
 | 
						|
41740            END;
 | 
						|
41750          BUFFER[LAST+FIFTEEN].CODEWORD := (SETX7+SEGLOC+FIFTEEN)*SHIFT2+EQ;
 | 
						|
41760          RELOCATION := RELOCATION*16+8;
 | 
						|
41770          PLANTWORD;
 | 
						|
41780          OPCOD := 0;
 | 
						|
41790          IF ADJUSTSP<>0 THEN EMITX1(PASP, OCVIMMED, ADJUSTSP);
 | 
						|
41800          END;
 | 
						|
41810        COUNT := COUNT+1;
 | 
						|
41820        IF COUNT=FORCOUNT THEN FIXUPF(FORLABL)
 | 
						|
41830        END;
 | 
						|
41840      (*EMITCLK := EMITCLK+CLOCK;
 | 
						|
41850      EMITCLKS := EMITCLKS+1*)
 | 
						|
41860      END;
 | 
						|
41870  (**)
 | 
						|
41880  ()+01*)
 | 
						|
41890  ()-23*)
 | 
						|
41900  (**)
 | 
						|
41910  PROCEDURE EMITX0(OPCOD: POP);
 | 
						|
41920      BEGIN  IF NOT SETINLINE(OPCOD) THEN BEGIN ADJUSTSP := 0; CLEAR(RTSTACK) END;
 | 
						|
41930  (*+05() PARAM(OCVNONE,0,OPCOD,EVEN,NOT SETINLINE(OPCOD)); ()+05*)
 | 
						|
41940      EMITOP(OPCOD);
 | 
						|
41950      END;
 | 
						|
41960  (**)
 | 
						|
41970  (**)
 | 
						|
41980  PROCEDURE EMITX1 (*+05() (OPCOD:POP; TYP1:OPDTYP;OPND1:ADDRINT) ()+05*);
 | 
						|
41990      VAR SB1:PSB; NOTINL:BOOLEAN;
 | 
						|
42000      BEGIN
 | 
						|
42010  (*-24()(*+23()  TAKELINE;  ()+23*) ()-24*)
 | 
						|
42020      IF TYP1 = OCVRES THEN
 | 
						|
42030        BEGIN
 | 
						|
42040        SB1 := ASPTR(OPND1);
 | 
						|
42050        EMITX0 (OPCOD);
 | 
						|
42060  (*+32() ASERT(CODETABLE[OPCOD].PR<>SBTVOID,'EMITX1-A  ');
 | 
						|
42070          ASERT(SB1^.SBTYP=SBTVOID,'EMITX1-B  ');   ()+32*)
 | 
						|
42080        FILL(CODETABLE[OPCOD].PR,SB1);
 | 
						|
42090        SB1^.SBRTSTK:=RTSTACK; RTSTACK:=SB1;
 | 
						|
42100        END
 | 
						|
42110      ELSE
 | 
						|
42120        BEGIN
 | 
						|
42130        NOTINL := NOT(SETINLINE(OPCOD));
 | 
						|
42140        IF NOTINL THEN ADJUSTSP := 0;
 | 
						|
42150        IF TYP1 >= OCVSB THEN
 | 
						|
42160          PROC1OP(OPCOD,TYP1,OPND1,NOTINL(*+05(),ODDD()+05*))
 | 
						|
42170        ELSE
 | 
						|
42180          BEGIN
 | 
						|
42190          IF NOTINL THEN CLEAR(RTSTACK);
 | 
						|
42200  (*+01() NEXTREG := 0; ()+01*)
 | 
						|
42210          PARAM(TYP1,OPND1,OPCOD(*+05(),ODDD,NOTINL()+05*));
 | 
						|
42220          END;
 | 
						|
42230        EMITOP(OPCOD)
 | 
						|
42240        END
 | 
						|
42250      END;
 | 
						|
42260  (**)
 | 
						|
42270  (**)
 | 
						|
42280  PROCEDURE EMITX2 (*+05() (OPCOD:POP; TYP1:OPDTYP;OPND1:ADDRINT;
 | 
						|
42290                               TYP2:OPDTYP; OPND2:ADDRINT) ()+05*);
 | 
						|
42300      VAR SB2:PSB; NOTINL:BOOLEAN;
 | 
						|
42310      BEGIN
 | 
						|
42320  (*+23()  TAKELINE;  ()+23*)
 | 
						|
42330      IF TYP2 = OCVRES THEN
 | 
						|
42340        BEGIN
 | 
						|
42350        SB2 := ASPTR(OPND2);
 | 
						|
42360        EMITX1 (OPCOD, TYP1,OPND1);
 | 
						|
42370  (*+32() ASERT(CODETABLE[OPCOD].PR<>SBTVOID,'EMITX2-A  ');
 | 
						|
42380          ASERT(SB2^.SBTYP=SBTVOID,'EMITX2-B  ');   ()+32*)
 | 
						|
42390        FILL(CODETABLE[OPCOD].PR,SB2);
 | 
						|
42400        SB2^.SBRTSTK:=RTSTACK; RTSTACK:=SB2;
 | 
						|
42410        END
 | 
						|
42420      ELSE
 | 
						|
42430        BEGIN
 | 
						|
42440        NOTINL := NOT(SETINLINE(OPCOD));
 | 
						|
42450        IF NOTINL THEN ADJUSTSP := 0;
 | 
						|
42460        IF TYP1 >= OCVSB THEN
 | 
						|
42470          IF TYP2 >= OCVSB THEN PROC2OP(OPCOD,TYP1,OPND1,TYP2,OPND2,NOTINL(*+05(),EVEN()+05*))
 | 
						|
42480          ELSE BEGIN PROC1OP(OPCOD,TYP1,OPND1,NOTINL(*+05(),EVEN()+05*));
 | 
						|
42490                     PARAM(TYP2,OPND2,OPCOD(*+05(),ODDD,FALSE()+05*)) END
 | 
						|
42500        ELSE
 | 
						|
42510          BEGIN
 | 
						|
42520          IF NOTINL THEN CLEAR(RTSTACK);
 | 
						|
42530  (*+01() NEXTREG:=0; ()+01*)
 | 
						|
42540          PARAM(TYP1,OPND1,OPCOD(*+05(),EVEN,NOTINL()+05*));
 | 
						|
42550          PARAM(TYP2,OPND2,OPCOD(*+05(),ODDD,FALSE()+05*))
 | 
						|
42560          END;
 | 
						|
42570        EMITOP(OPCOD)
 | 
						|
42580        END
 | 
						|
42590      END;
 | 
						|
42600  (**)
 | 
						|
42610  (**)
 | 
						|
42620  PROCEDURE EMITX3 (OPCOD:POP; TYP1:OPDTYP;OPND1:ADDRINT; TYP2:OPDTYP;OPND2:ADDRINT;
 | 
						|
42630                               TYP3:OPDTYP; OPND3:ADDRINT);
 | 
						|
42640      VAR SB3:PSB; NOTINL:BOOLEAN;
 | 
						|
42650      BEGIN
 | 
						|
42660  (*+23()  TAKELINE;  ()+23*)
 | 
						|
42670      IF TYP3 = OCVRES THEN
 | 
						|
42680        BEGIN
 | 
						|
42690        SB3 := ASPTR(OPND3);
 | 
						|
42700        EMITX2 (OPCOD, TYP1,OPND1, TYP2,OPND2);
 | 
						|
42710  (*+32() ASERT(CODETABLE[OPCOD].PR<>SBTVOID,'EMITX3-A  ');
 | 
						|
42720          ASERT(SB3^.SBTYP=SBTVOID,'EMITX3-B  ');   ()+32*)
 | 
						|
42730        FILL(CODETABLE[OPCOD].PR,SB3);
 | 
						|
42740        SB3^.SBRTSTK:=RTSTACK; RTSTACK:=SB3;
 | 
						|
42750        END
 | 
						|
42760      ELSE
 | 
						|
42770        BEGIN
 | 
						|
42780        NOTINL := NOT(SETINLINE(OPCOD));
 | 
						|
42790        IF NOTINL THEN ADJUSTSP := 0;
 | 
						|
42800        IF TYP1 >= OCVSB THEN
 | 
						|
42810          IF TYP2 >= OCVSB THEN PROC2OP(OPCOD,TYP1,OPND1,TYP2,OPND2,NOTINL(*+05(),ODDD()+05*))
 | 
						|
42820          ELSE BEGIN PROC1OP(OPCOD,TYP1,OPND1,NOTINL(*+05(),ODDD()+05*));
 | 
						|
42830                     PARAM(TYP2,OPND2,OPCOD(*+05(),EVEN,FALSE()+05*)) END
 | 
						|
42840        ELSE
 | 
						|
42850          BEGIN
 | 
						|
42860          IF NOTINL THEN CLEAR(RTSTACK);
 | 
						|
42870  (*+01() NEXTREG:=0; ()+01*)
 | 
						|
42880          PARAM(TYP1,OPND1,OPCOD(*+05(),ODDD,NOTINL()+05*));
 | 
						|
42890          PARAM(TYP2,OPND2,OPCOD(*+05(),EVEN,FALSE()+05*))
 | 
						|
42900          END;
 | 
						|
42910        PARAM(TYP3,OPND3,OPCOD(*+05(),ODDD,FALSE()+05*));
 | 
						|
42920        EMITOP(OPCOD)
 | 
						|
42930        END
 | 
						|
42940      END;
 | 
						|
42950  (**)
 | 
						|
42960  (**)
 | 
						|
42970  PROCEDURE EMITX4 (OPCOD:POP; TYP1:OPDTYP;OPND1:ADDRINT; TYP2:OPDTYP;OPND2:ADDRINT;
 | 
						|
42980                               TYP3:OPDTYP; OPND3:ADDRINT; TYP4:OPDTYP;OPND4:ADDRINT);
 | 
						|
42990      VAR SB4:PSB; NOTINL:BOOLEAN;
 | 
						|
43000      BEGIN
 | 
						|
43010  (*+23()  TAKELINE;  ()+23*)
 | 
						|
43020      IF TYP4 = OCVRES THEN
 | 
						|
43030        BEGIN
 | 
						|
43040        SB4 := ASPTR(OPND4);
 | 
						|
43050        EMITX3 (OPCOD, TYP1,OPND1, TYP2,OPND2, TYP3,OPND3);
 | 
						|
43060  (*+32() ASERT(CODETABLE[OPCOD].PR<>SBTVOID,'EMITX4-A  ');
 | 
						|
43070          ASERT(SB4^.SBTYP=SBTVOID,'EMITX4-B  ');   ()+32*)
 | 
						|
43080        FILL(CODETABLE[OPCOD].PR,SB4);
 | 
						|
43090        SB4^.SBRTSTK:=RTSTACK; RTSTACK:=SB4;
 | 
						|
43100        END
 | 
						|
43110      ELSE
 | 
						|
43120        BEGIN
 | 
						|
43130        NOTINL := NOT(SETINLINE(OPCOD));
 | 
						|
43140        IF NOTINL THEN ADJUSTSP := 0;
 | 
						|
43150        IF TYP1 >= OCVSB THEN
 | 
						|
43160          IF TYP2 >= OCVSB THEN PROC2OP(OPCOD,TYP1,OPND1,TYP2,OPND2,NOTINL(*+05(),EVEN()+05*))
 | 
						|
43170          ELSE BEGIN PROC1OP(OPCOD,TYP1,OPND1,NOTINL(*+05(),EVEN()+05*));
 | 
						|
43180                     PARAM(TYP2,OPND2,OPCOD(*+05(),ODDD,FALSE()+05*)) END
 | 
						|
43190        ELSE
 | 
						|
43200          BEGIN
 | 
						|
43210          IF NOTINL THEN CLEAR(RTSTACK);
 | 
						|
43220  (*+01() NEXTREG:=0; ()+01*)
 | 
						|
43230          PARAM(TYP1,OPND1,OPCOD(*+05(),EVEN,NOTINL()+05*));
 | 
						|
43240          PARAM(TYP2,OPND2,OPCOD(*+05(),ODDD,FALSE()+05*))
 | 
						|
43250          END;
 | 
						|
43260        PARAM(TYP3,OPND3,OPCOD(*+05(),EVEN,FALSE()+05*));
 | 
						|
43270        PARAM(TYP4,OPND4,OPCOD(*+05(),ODDD,FALSE()+05*));
 | 
						|
43280        EMITOP(OPCOD)
 | 
						|
43290        END
 | 
						|
43300      END;
 | 
						|
43310  (**)
 | 
						|
43320  (**)
 | 
						|
43330  PROCEDURE EMITX5 (OPCOD:POP; TYP1:OPDTYP;OPND1:ADDRINT; TYP2:OPDTYP;OPND2:ADDRINT;
 | 
						|
43340                  TYP3:OPDTYP;OPND3:ADDRINT;TYP4:OPDTYP;OPND4:ADDRINT;TYP5:OPDTYP;OPND5:ADDRINT);
 | 
						|
43350      VAR SB5:PSB; NOTINL:BOOLEAN;
 | 
						|
43360      BEGIN
 | 
						|
43370  (*+23()  TAKELINE;  ()+23*)
 | 
						|
43380      IF TYP5 = OCVRES THEN
 | 
						|
43390        BEGIN
 | 
						|
43400        SB5 := ASPTR(OPND5);
 | 
						|
43410        EMITX4 (OPCOD, TYP1,OPND1, TYP2,OPND2, TYP3,OPND3,TYP4,OPND4);
 | 
						|
43420  (*+32() ASERT(CODETABLE[OPCOD].PR<>SBTVOID,'EMITX5-A  ');
 | 
						|
43430          ASERT(SB5^.SBTYP=SBTVOID,'EMITX5-B  ');   ()+32*)
 | 
						|
43440        FILL(CODETABLE[OPCOD].PR,SB5);
 | 
						|
43450        SB5^.SBRTSTK:=RTSTACK; RTSTACK:=SB5;
 | 
						|
43460        END
 | 
						|
43470      ELSE
 | 
						|
43480        BEGIN
 | 
						|
43490        NOTINL := NOT(SETINLINE(OPCOD));
 | 
						|
43500        IF NOTINL THEN ADJUSTSP := 0;
 | 
						|
43510        IF TYP1 >= OCVSB THEN
 | 
						|
43520          IF TYP2 >= OCVSB THEN PROC2OP(OPCOD,TYP1,OPND1,TYP2,OPND2,NOTINL(*+05(),ODDD()+05*))
 | 
						|
43530          ELSE BEGIN PROC1OP(OPCOD,TYP1,OPND1,NOTINL(*+05(),ODDD()+05*));
 | 
						|
43540                     PARAM(TYP2,OPND2,OPCOD(*+05(),EVEN,FALSE()+05*)) END
 | 
						|
43550        ELSE
 | 
						|
43560          BEGIN
 | 
						|
43570          IF NOTINL THEN CLEAR(RTSTACK);
 | 
						|
43580  (*+01() NEXTREG:=0; ()+01*)
 | 
						|
43590          PARAM(TYP1,OPND1,OPCOD(*+05(),ODDD,NOTINL()+05*));
 | 
						|
43600          PARAM(TYP2,OPND2,OPCOD(*+05(),EVEN,FALSE()+05*))
 | 
						|
43610          END;
 | 
						|
43620        PARAM(TYP3,OPND3,OPCOD(*+05(),ODDD,FALSE()+05*));
 | 
						|
43630        PARAM(TYP4,OPND4,OPCOD(*+05(),EVEN,FALSE()+05*));
 | 
						|
43640        PARAM(TYP5,OPND5,OPCOD(*+05(),ODDD,FALSE()+05*));
 | 
						|
43650        EMITOP(OPCOD)
 | 
						|
43660        END
 | 
						|
43670      END;
 | 
						|
43680  (**)
 | 
						|
43690  (**)
 | 
						|
43700  PROCEDURE EMITCONST (*OPERAND: A68INT*);
 | 
						|
43710     VAR JUMPOVER: LABL;
 | 
						|
43720      BEGIN JUMPOVER := GETNEXTLABEL;
 | 
						|
43730      EMITX1(PJMP, OCVFREF, JUMPOVER);
 | 
						|
43740       EMITXWORD(OCVIMMED, OPERAND);
 | 
						|
43750       FIXUPF(JUMPOVER)
 | 
						|
43760       END;
 | 
						|
43770  (**)
 | 
						|
43780  (*-23()
 | 
						|
43790  (*+01()
 | 
						|
43800  (**)
 | 
						|
43810  PROCEDURE FIXUPFORW(ALABL: LABL; VALUE, NFOUR: INTEGER);
 | 
						|
43820    CONST SHIFT1=100000B;
 | 
						|
43830    VAR APFCHAIN, BPFCHAIN: PFCHAIN;
 | 
						|
43840        I: INTEGER;
 | 
						|
43850        TABLEWORD: PACKED RECORD CASE INTEGER OF
 | 
						|
43860            1: (INT: INTEGER);
 | 
						|
43870            2: (ENTRY: PACKED ARRAY [1..7] OF CHAR; FILLER: 0..777777B);
 | 
						|
43880            END;
 | 
						|
43890        TVALUE, TNFOUR: INTEGER;
 | 
						|
43900      BEGIN
 | 
						|
43910      TABLEWORD.INT := 0;
 | 
						|
43920      APFCHAIN := TPFCHAIN;
 | 
						|
43930      WHILE APFCHAIN^.LINK<>NIL DO
 | 
						|
43940        BEGIN
 | 
						|
43950        IF APFCHAIN^.LINK^.FLABL=ALABL THEN
 | 
						|
43960          BEGIN WITH XSEG, APFCHAIN^.LINK^ DO
 | 
						|
43970            IF FSEGLOC>=HEADERWORD.S THEN (*CODE TO BE ALTERED IS STILL IN BUFFER*)
 | 
						|
43980              BEGIN
 | 
						|
43990              TVALUE := VALUE; TNFOUR := NFOUR;
 | 
						|
44000              IF FSEGLOC+FFIFTEEN=SEGLOC+FIFTEEN THEN UPPER; (*CAN ONLY HAPPEN FROM CGLABD*)
 | 
						|
44010              FOR I := 2-FFOUR DOWNTO 0 DO
 | 
						|
44020                BEGIN TNFOUR := TNFOUR*2; TVALUE := TVALUE*SHIFT1 END;
 | 
						|
44030              WITH BUFFER[FLAST+FFIFTEEN] DO
 | 
						|
44040                CODEWORD := CODEWORD+TVALUE;
 | 
						|
44050              FOR I := 14-FFIFTEEN DOWNTO 0 DO
 | 
						|
44060                TNFOUR := TNFOUR*16;
 | 
						|
44070              WITH BUFFER[FLAST] DO
 | 
						|
44080                CODEWORD := CODEWORD+TNFOUR
 | 
						|
44090              END
 | 
						|
44100            ELSE WITH TABLEWORD DO
 | 
						|
44110              BEGIN
 | 
						|
44120              IF INT=0 THEN
 | 
						|
44130                BEGIN
 | 
						|
44140                WRITE(LGO, 36000002000000000000B); (*ENTR TABLE*)
 | 
						|
44150                FOR I := 1 TO 7 DO
 | 
						|
44160                  BEGIN ENTRY[I] := CHR(ORD('A') + FLABL MOD 10); FLABL := FLABL DIV 10 END;
 | 
						|
44170                WRITE(LGO, INT);
 | 
						|
44180                WRITE(LGO, VALUE+ORD(NFOUR<>0)*1000000B);
 | 
						|
44190                END;
 | 
						|
44200              WRITE(LGO, 44000002000000000000B); (*LINK TABLE*)
 | 
						|
44210              WRITE(LGO, INT);
 | 
						|
44220              WRITE(LGO, ((7-FFOUR)*1000000000B+1000000B+FSEGLOC+FFIFTEEN-1)*10000000000B)
 | 
						|
44230              END;
 | 
						|
44240          WITH APFCHAIN^ DO
 | 
						|
44250            BEGIN
 | 
						|
44260            BPFCHAIN := LINK;
 | 
						|
44270            LINK := LINK^.LINK;
 | 
						|
44280            DISPOSE(BPFCHAIN)
 | 
						|
44290            END
 | 
						|
44300          END
 | 
						|
44310        ELSE APFCHAIN := APFCHAIN^.LINK
 | 
						|
44320        END
 | 
						|
44330      END;
 | 
						|
44340  (**)
 | 
						|
44350  (**)
 | 
						|
44360  PROCEDURE FIXUPF (* (ALABL: LABL) *);
 | 
						|
44370      BEGIN UPPER; WITH XSEG DO FIXUPFORW(ALABL, SEGLOC+FIFTEEN-1, 2) END;
 | 
						|
44380  (**)
 | 
						|
44390  (**)
 | 
						|
44400  PROCEDURE FIXUPFIM(ALABL: LABL; VALUE: INTEGER);
 | 
						|
44410      BEGIN WITH XSEG DO FIXUPFORW(ALABL, VALUE, 0) END;
 | 
						|
44420  (**)
 | 
						|
44430  (**)
 | 
						|
44440  FUNCTION FIXUPM(*: LABL *);
 | 
						|
44450      BEGIN
 | 
						|
44460      UPPER;
 | 
						|
44470      WITH XSEG DO
 | 
						|
44480        FIXUPM := SEGLOC+FIFTEEN-1
 | 
						|
44490      END;
 | 
						|
44500  (**)
 | 
						|
44510  (**)
 | 
						|
44520  PROCEDURE FIXLABL(OLDLABL,  NEWLABL: LABL; KNOWN: BOOLEAN);
 | 
						|
44530  (*IF KNOWN, NEWLABL IS THE ACTUAL VALUE TO BE GIVEN TO OLDLABEL;
 | 
						|
44540    OTHERWISE, IT IS JUST ANOTHER LABL TO BE FIXED UP LATER*)
 | 
						|
44550    VAR APFCHAIN: PFCHAIN;
 | 
						|
44560      BEGIN
 | 
						|
44570      IF KNOWN THEN
 | 
						|
44580        FIXUPFORW(OLDLABL, NEWLABL, 2)
 | 
						|
44590      ELSE
 | 
						|
44600        BEGIN
 | 
						|
44610        APFCHAIN := TPFCHAIN^.LINK;
 | 
						|
44620        WHILE APFCHAIN<>NIL DO WITH APFCHAIN^ DO
 | 
						|
44630          BEGIN
 | 
						|
44640          IF FLABL=OLDLABL THEN FLABL := NEWLABL;
 | 
						|
44650          APFCHAIN := LINK
 | 
						|
44660          END
 | 
						|
44670        END
 | 
						|
44680      END;
 | 
						|
44690  (**)
 | 
						|
44700  ()+01*)
 | 
						|
44710  ()-23*)                                         (* MORE EM-1 DEPENDENT ROUTINES *)
 | 
						|
44720  (**)                                            (********************************)
 | 
						|
44730  (*+02()
 | 
						|
44732  FUNCTION EMITRTNHEAD :LABL;
 | 
						|
44734  VAR
 | 
						|
44740    ADDRESS :LABL;
 | 
						|
44742  BEGIN
 | 
						|
44750    (*+42() DATASTATE:=ENDDATA; ()+42*)
 | 
						|
44760    ADDRESS:=GETNEXTLABEL;
 | 
						|
44770    WRITEINSTN(PRO);EMITXPROC(OCVEXT,ADDRESS);
 | 
						|
44771    WRITEINSTN(EOOPNDS);
 | 
						|
44774    DATASTATE := STARTDATA;
 | 
						|
44776    EMITXWORD(OCVMEM, HOLBOTTOM); (*DUMMY TO LOAD BSS BLOCKS IN CORRECT ORDER ON VAX*)
 | 
						|
44778    EMITRTNHEAD:=ADDRESS;
 | 
						|
44780  END;
 | 
						|
44784  PROCEDURE EMITBEG;
 | 
						|
44786    VAR TEMP : PLEX;
 | 
						|
44788      BEGIN
 | 
						|
44790      REWRITE(LGO);
 | 
						|
44791  (*+24() WRITEBYTE(173); WRITEBYTE(0); ()+24*)
 | 
						|
44792  (*-24() TAKELINE; ()-24*)
 | 
						|
44794      NEXTLABEL := 500;
 | 
						|
44795      LCLGBL := 0; (*SO AS TO BE DEFINED ON FIRST USE*)
 | 
						|
44796      DATASTATE := ENDDATA;
 | 
						|
44800      ADJUSTSP := 0;
 | 
						|
44810      WRITEINSTN(MES);       (* DECLARE WORD,POINTER SIZES *)
 | 
						|
44820      EMITXWORD(OCVIMMED,2); (*-24() WRITE(LGO,','); ()-24*)
 | 
						|
44830      EMITXWORD(OCVIMMED,SZWORD);(*-24() WRITE(LGO,',');()-24*)
 | 
						|
44840      EMITXWORD(OCVIMMED,SZADDR);
 | 
						|
44850      WRITEINSTN(EOOPNDS);
 | 
						|
44900      ENEW(TEMP,LEX1SIZE + (9+CHARPERWORD) DIV CHARPERWORD * SZWORD);
 | 
						|
44908      WITH TEMP^ DO
 | 
						|
44909      BEGIN
 | 
						|
44910      S10 := 'M_A_I_N   ';
 | 
						|
44911      S10[1]:=CHR(109);  (*M*) (*THIS IS IN ASCII*)
 | 
						|
44912      S10[3]:=CHR(97);   (*A*)
 | 
						|
44913      S10[5]:=CHR(105);  (*I*)
 | 
						|
44914      S10[7]:=CHR(110);  (*N*)
 | 
						|
44915      LXCOUNT:=(9+CHARPERWORD) DIV CHARPERWORD * SZWORD;
 | 
						|
44916      END;
 | 
						|
44920      WRITEINSTN(EXP);EMITXWORD(OCVEXT,ORD(TEMP)); (*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
44930      WRITEINSTN(PRO);EMITXWORD(OCVEXT,ORD(TEMP));
 | 
						|
44935 (*-24()WRITE(LGO,','); ()-24*)
 | 
						|
44940      EMITXWORD(OCVIMMED,0);(*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
44950      EDISPOSE(TEMP,LEX1SIZE + (9+CHARPERWORD) DIV CHARPERWORD * SZWORD);
 | 
						|
44951      HOLTOP:=GETNEXTLABEL;HOLBOTTOM:=GETNEXTLABEL;
 | 
						|
44957      DATASTATE := STARTDATA;
 | 
						|
44958      EMITXWORD(OCVMEM, HOLBOTTOM); (*DUMMY TO LOAD BSS BLOCKS IN CORRECT ORDER ON VAX*)
 | 
						|
44960      EMITX0(PPBEGIN); (*CALL ESTART0*)
 | 
						|
44970      WRITEINSTN(LAE); (*LOAD NEW ADDRESS OF M_A_I_N*)
 | 
						|
44971      WRITEOFFSET(HOLTOP,-FIRSTIBOFFSET); (*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
44972      WRITEINSTN(STR); (*PLACE IN LB*)
 | 
						|
44973      EMITXWORD(OCVIMMED,0); (*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
44974      EMITX0(PPBEGIN+1); (*CALL START68, AND THUS ESTART_*)
 | 
						|
44979      END;
 | 
						|
44980  (**)
 | 
						|
44981  PROCEDURE EMITEND;
 | 
						|
44982  VAR I: INTEGER;
 | 
						|
44990      BEGIN
 | 
						|
44991      IF DATASTATE=ENDDATA THEN DATASTATE := STARTDATA;
 | 
						|
44992      EMITXWORD(OCVIMMED, 0); WRITEINSTN(EOOPNDS); (*TO ENSURE THAT ANY OUTSTANDING DATA LABELS SEE CON RATHER THAN BSS*)
 | 
						|
44995      WRITELABEL(TRUE,HOLBOTTOM);
 | 
						|
44996	   I := ROUTNL^.RNLENIDS+SIZIBTOP+SZWORD+FIRSTIBOFFSET;
 | 
						|
45000      REPEAT
 | 
						|
45010          WRITEINSTN(CON);
 | 
						|
45015	       WRITECON(CPACTCONS, SZWORD, 0);
 | 
						|
45020          I := I - SZWORD;
 | 
						|
45021          WRITEINSTN(EOOPNDS);
 | 
						|
45022      UNTIL I <= 0;
 | 
						|
45024      WRITELABEL(TRUE,HOLTOP);
 | 
						|
45026      WRITEINSTN(CON); WRITECON(CPACTCONS, SZWORD, 0); WRITEINSTN(EOOPNDS);
 | 
						|
45034      WRITEINSTN(HOL); (*DUMMY HOL FOR RUNTIME AND FILE ACCESS*)
 | 
						|
45036      EMITXWORD(OCVIMMED,SZWORD);(*-24() WRITE(LGO,','); ()-24*)
 | 
						|
45038      EMITXWORD(OCVIMMED,-32000-768); (*-24() WRITE(LGO,','); ()-24*)
 | 
						|
45040      EMITXWORD(OCVIMMED,0);(*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
45041      DATASTATE := ENDDATA;
 | 
						|
45042      EMITX0(PPEND);
 | 
						|
45045      WRITEINSTN(RET);EMITXWORD(OCVIMMED,0); (*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
45046      WRITEINSTN(EEND);EMITXWORD(OCVIMMED,0);(*-24() WRITEINSTN(EOOPNDS); ()-24*)
 | 
						|
45048      END;
 | 
						|
45050  PROCEDURE GENDENOT (* (OPCOD: POP; SB: PSB) *) ;
 | 
						|
45060    VAR  I,J: INTEGER;
 | 
						|
45065        THING: OBJECTP;
 | 
						|
45066        MAP  : RECORD CASE BOOLEAN OF
 | 
						|
45067                    TRUE : (OPTR: OBJECTP);
 | 
						|
45068                    FALSE: (IPTR: ^INTEGER);
 | 
						|
45069               END;
 | 
						|
45070        ALABL: LABL;
 | 
						|
45080      BEGIN WITH SB^ DO
 | 
						|
45090        WITH SBLEX^ (*A LEXEME*) DO
 | 
						|
45100          IF SBMODE^.MDV.MDID IN [MDIDCHAN,MDIDPASC] THEN
 | 
						|
45110            EMITX1(OPCOD, OCVEXT, ORD(SBLEX))
 | 
						|
45120          ELSE IF SBLEX=LEXFALSE THEN
 | 
						|
45130            EMITX1(OPCOD, OCVIMMED, 0)
 | 
						|
45140          ELSE IF SBLEX=LEXTRUE THEN
 | 
						|
45150            EMITX1(OPCOD, OCVIMMED, TRUEVALUE)
 | 
						|
45160          ELSE IF ((LXDENMD=MDINT) OR (LXDENMD=MDBITS) OR (LXDENMD=MDCHAR))
 | 
						|
45170                AND (LXTOKEN=TKDENOT)  THEN
 | 
						|
45180            EMITX1(OPCOD, OCVIMMED, LXDENRP)
 | 
						|
45190          ELSE
 | 
						|
45200            BEGIN
 | 
						|
45210            IF LXV.LXPYPTR=0 THEN
 | 
						|
45220              BEGIN
 | 
						|
45230              IF DATASTATE=ENDDATA THEN DATASTATE := STARTDATA; ALABL := FIXUPM;
 | 
						|
45240              LXV.LXPYPTR := ALABL;
 | 
						|
45250              IF LXDENMD^.MDV.MDPILE THEN
 | 
						|
45251              BEGIN
 | 
						|
45255                  NEW(THING);
 | 
						|
45256                  WITH THING^ DO
 | 
						|
45257                  BEGIN
 | 
						|
45258                  FIRSTWORD:=0; (*+13() DBLOCK:=NIL; ANCESTOR:=NIL; IHEAD:=NIL; DUMMY:=0; ()+13*)
 | 
						|
45259                  SORT:=0;PCOUNT:=255;LENGTH:=LXDENRP;
 | 
						|
45260                  MAP.OPTR:=THING;
 | 
						|
45261                  (*IF PACKING CHANGES THEN THIS FORMULA WILL HAVE TO AS WELL*)
 | 
						|
45262                  (* THIS IS (PCOUNT)+(SCOPE,SORT)+(LENGTH) *)
 | 
						|
45263                  FOR I:=1 TO (SZWORD+SZWORD+SZWORD(*+13() +SZWORD+SZWORD ()+13*)) DIV SZWORD DO
 | 
						|
45264                  BEGIN
 | 
						|
45267                       EMITXWORD(OCVIMMED,MAP.IPTR^);
 | 
						|
45268                       MAP.IPTR:=INCPTR(MAP.IPTR,SZWORD);
 | 
						|
45269                  END;
 | 
						|
45271  (*-24()         WRITEINSTN(CON); ()-24*)
 | 
						|
45272                  J:=(((SZADDR+SZINT) DIV SZINT) * CHARPERWORD) + 1;
 | 
						|
45273  (*+24()         WRITEBYTE(CPACTSTRNG);WRITECON(CPACTCONS,SZWORD,LXDENRP);
 | 
						|
45280                  FOR I:=J TO LXDENRP+J-1 DO
 | 
						|
45290                    WRITEBYTE(ORD(STRNG[I]));       ()+24*)
 | 
						|
45300  (*-24()         WRITE(LGO,' ','''');
 | 
						|
45310                  FOR I:=J TO LXDENRP+J-1 DO
 | 
						|
45311                    BEGIN
 | 
						|
45312                    IF STRNG[I]='''' THEN
 | 
						|
45313                      WRITE(LGO, '\');
 | 
						|
45315                    WRITE(LGO,STRNG[I]);
 | 
						|
45317                    END;
 | 
						|
45320                  WRITE(LGO,'''');()-24*)
 | 
						|
45325                  WRITEINSTN(EOOPNDS);
 | 
						|
45326                  END; (* OF WITH *)
 | 
						|
45330                  DISPOSE(THING);
 | 
						|
45336              END
 | 
						|
45340              ELSE
 | 
						|
45342                  BEGIN
 | 
						|
45343                  J := (((SZADDR+SZREAL) DIV SZINT) * CHARPERWORD) + 1;
 | 
						|
45345  (*+24()         IF DATASTATE=STARTDATA THEN
 | 
						|
45346                    BEGIN WRITEINSTN(CON); DATASTATE := INDATA END;
 | 
						|
45347                  WRITEBYTE(CPACTFLOAT);
 | 
						|
45348                  WRITECON(CPACTCONS,SZWORD,SZREAL);
 | 
						|
45349                  WRITECON(CPACTCONS,SZWORD,LXDENRP);
 | 
						|
45350                  FOR I:=J TO LXDENRP+J-1 DO
 | 
						|
45351                    WRITEBYTE(ORD(STRNG[I]));       ()+24*)
 | 
						|
45352  (*-24()         WRITEINSTN(CON);
 | 
						|
45353                  FOR I:=J TO LXDENRP+J-1 DO
 | 
						|
45354                    WRITE(LGO,STRNG[I]);
 | 
						|
45355                  WRITE(LGO,'F',SZREAL:1);          ()-24*)
 | 
						|
45356                  WRITEINSTN(EOOPNDS);
 | 
						|
45358                  END;
 | 
						|
45360              END;
 | 
						|
45365            DATASTATE:=ENDDATA;
 | 
						|
45370            EMITX1(OPCOD+1, OCVMEM, LXV.LXPYPTR)
 | 
						|
45380            END;
 | 
						|
45390      END;
 | 
						|
45400  (**)
 | 
						|
45410  PROCEDURE GENDP(M: MODE);
 | 
						|
45420  (*FUNCTION: RETURNS THE ADDRESS OF THE DBLOCK FOR MODE M, OR THE VALULENGTH,
 | 
						|
45430      IN GLOBAL VARIABLE GENDPVAL, WITH CORRESPONDING OPDTYP IN GENDPOCV.
 | 
						|
45440  *)
 | 
						|
45450    VAR OFFSET: 0..127;
 | 
						|
45460    PROCEDURE DBLOCK(M: MODE);
 | 
						|
45470      VAR I, J: INTEGER;
 | 
						|
45480        BEGIN WITH M^ DO
 | 
						|
45490          FOR I := 0 TO MDV.MDCNT-1 DO
 | 
						|
45500            WITH MDSTRFLDS[I] DO WITH MDSTRFMD^.MDV DO
 | 
						|
45510              IF MDDRESSED THEN
 | 
						|
45520                BEGIN EMITXWORD(OCVIMMED, OFFSET); OFFSET := OFFSET+MDLEN END
 | 
						|
45530              ELSE IF MDID=MDIDSTRUCT THEN
 | 
						|
45540                DBLOCK(MDSTRFMD)
 | 
						|
45550              ELSE OFFSET := OFFSET+MDLEN
 | 
						|
45560        END;
 | 
						|
45570    PROCEDURE DBLOCKM(M: MODE);
 | 
						|
45580      VAR I: INTEGER; X: XTYPE;
 | 
						|
45590        BEGIN WITH M^ DO
 | 
						|
45600          FOR I := 0 TO MDV.MDCNT-1 DO
 | 
						|
45610            WITH MDSTRFLDS[I] DO
 | 
						|
45620            BEGIN X := TX(MDSTRFMD);
 | 
						|
45630              IF X=12 THEN DBLOCKM(MDSTRFMD)
 | 
						|
45640              ELSE EMITXWORD(OCVIMMED, X+1)
 | 
						|
45650              END
 | 
						|
45660        END;
 | 
						|
45670      BEGIN WITH M^ DO
 | 
						|
45680        IF MDV.MDID=MDIDROW THEN GENDP(MDPRRMD)
 | 
						|
45690        ELSE IF MDV.MDID=MDIDSTRUCT THEN
 | 
						|
45700          BEGIN
 | 
						|
45710          IF MDSTRSDB=0 THEN  (*DBLOCK MUST BE CREATED*)
 | 
						|
45720            BEGIN
 | 
						|
45730            IF DATASTATE=ENDDATA THEN DATASTATE := STARTDATA; MDSTRSDB := FIXUPM;
 | 
						|
45740            EMITXWORD(OCVIMMED, MDV.MDLEN);
 | 
						|
45750            OFFSET := 0; DBLOCK(M);
 | 
						|
45760            EMITXWORD(OCVIMMED, -1);
 | 
						|
45770            DBLOCKM(M);
 | 
						|
45780            END;
 | 
						|
45790          GENDPOCV := OCVMEM; GENDPVAL :=MDSTRSDB
 | 
						|
45800          END
 | 
						|
45810        ELSE IF MDV.MDDRESSED THEN
 | 
						|
45820          BEGIN GENDPVAL:=0; GENDPOCV:=OCVIMMPTR END
 | 
						|
45830        ELSE
 | 
						|
45840          BEGIN GENDPVAL := MDV.MDLEN; GENDPOCV := OCVIMMPTR END;
 | 
						|
45850      END;
 | 
						|
45860  (**)
 | 
						|
45870  (**)
 | 
						|
45880  ()+02*)
 | 
						|
45890  (*+01()
 | 
						|
45900  (**)
 | 
						|
45910  PROCEDURE EMITBEG;
 | 
						|
45920    VAR I: INTEGER;
 | 
						|
45930        TEMP: PLEX;
 | 
						|
45940      BEGIN
 | 
						|
45950      NEXTLABEL := 1;
 | 
						|
45960      REWRITE(LGO);
 | 
						|
45970  (*-23()
 | 
						|
45980      WITH XSEG DO
 | 
						|
45990        BEGIN
 | 
						|
46000        BUFFER[3].ALFWORD := DAT; BUFFER[4].ALFWORD := TIM;
 | 
						|
46010        (*WITH BUFFER[16] DO    (*THIS WAS INTENDED TO IMPLEMENT THE SPACE PRAGMAT, BUT IT DOESN'T WORK
 | 
						|
46020          BEGIN ALFWORD := '       :::'; CODEWORD := CODEWORD+WORDS END; *)
 | 
						|
46030        FOR I := 1 TO BUFFER[0].CODEWORD DO
 | 
						|
46040          WRITE(LGO, BUFFER[I].CODEWORD);
 | 
						|
46050        END;
 | 
						|
46060      NEW(TPFCHAIN); TPFCHAIN^.LINK := NIL;
 | 
						|
46070      WITH XSEG DO
 | 
						|
46080        BEGIN
 | 
						|
46090        FIRST := 0; LAST := 0; SEGLOC := 0;
 | 
						|
46100        BUFFER[FIRST].CODEWORD := 0; RELOCATION := 0;
 | 
						|
46110        FOUR := 1; FIFTEEN := 1;
 | 
						|
46120        BUFFER[LAST+FIFTEEN].CODEWORD := 0;
 | 
						|
46130        HEADERWORD.WORD := 40000020000001000000B
 | 
						|
46140        END;
 | 
						|
46150      ENEW(TEMP,LEX1SIZE+5);
 | 
						|
46160      TEMP^.S10 := 'PDERR     '; (* ENTRY POINT FOR PASCAL DETECTED ERRORS *)
 | 
						|
46170      EMITX1(PJMP, OCVEXT, ORD(TEMP));
 | 
						|
46180      EMITX1(PJMP, OCVIMMED, OUTPUTEFET);
 | 
						|
46190      EMITXWORD(OCVIMMED,01414320221707000000B); EMITXWORD(OCVIMMED,0);
 | 
						|
46200      TEMP^.S10 := 'P.INIT    ';
 | 
						|
46210      EMITX1 (PPBEGIN,OCVEXT,ORD(TEMP));
 | 
						|
46220      EDISPOSE(TEMP,LEX1SIZE+5);
 | 
						|
46230  ()-23*)
 | 
						|
46240      WITH ROUTNL^ DO BEGIN
 | 
						|
46250        RNPROCBLK := GETNEXTLABEL;
 | 
						|
46260        EMITX1 (PPBEGIN+1,OCVFIM,RNPROCBLK) END
 | 
						|
46270      END;
 | 
						|
46280  (**)
 | 
						|
46290  (**)
 | 
						|
46300  PROCEDURE EMITEND;
 | 
						|
46310    VAR I: INTEGER;
 | 
						|
46320      BEGIN
 | 
						|
46330      FIXUPFIM(ROUTNL^.RNPROCBLK,ROUTNL^.RNLENIDS+SIZIBTOP+SZWORD+FIRSTIBOFFSET);
 | 
						|
46340      EMITOP (PPEND);
 | 
						|
46350  (*-23()
 | 
						|
46360      UPPER; WHILE XSEG.FIFTEEN<>1 DO EMITXWORD( OCVIMMED, 0);
 | 
						|
46370      WITH XSEG DO WITH HEADERWORD DO
 | 
						|
46380        WHILE FIRST<>LAST DO
 | 
						|
46390          BEGIN
 | 
						|
46400          WRITE(LGO, WORD);
 | 
						|
46410          FOR I := FIRST TO FIRST+15 DO
 | 
						|
46420            WRITE(LGO, BUFFER[I].CODEWORD);
 | 
						|
46430          FIRST := (FIRST+16) MOD 128; S := S+15
 | 
						|
46440          END;
 | 
						|
46450      FOR I := PNONE TO PLAST DO
 | 
						|
46460        WITH CODETABLE[I] DO IF NOT INLINE THEN IF LINKINS<>NIL THEN PUTLINK(I);
 | 
						|
46470  ()-23*)
 | 
						|
46480      END;
 | 
						|
46490  (**)
 | 
						|
46500  (**)
 | 
						|
46510  FUNCTION EMITRTNHEAD: LABL;
 | 
						|
46520      BEGIN EMITRTNHEAD := FIXUPM END;
 | 
						|
46530  ()+01*)
 | 
						|
46540  (**)
 | 
						|
46550  (**)
 | 
						|
46560  (*-01() (*-02() (*-05()
 | 
						|
46570  (*MODEL EMITBEG AND EMITEND FOR THOSE WHO HAVE NOT WRITTEN THEIR OWN YET*)
 | 
						|
46580  PROCEDURE EMITBEG;
 | 
						|
46590      BEGIN
 | 
						|
46600      NEXTLABEL := 1;
 | 
						|
46610      REWRITE(LGO);
 | 
						|
46620      (*NOW INITIALIZE YOUR CODE BUFFER, OR WHATEVER, AND EMIT INIAL CODE*)
 | 
						|
46630      END;
 | 
						|
46640  (**)
 | 
						|
46650  (**)
 | 
						|
46660  PROCEDURE EMITEND;
 | 
						|
46670      BEGIN
 | 
						|
46680      (*EMIT YOUR FINAL CODE*)
 | 
						|
46690      (*FLUSH YOUR CODE BUFFER, OR WHATEVER*)
 | 
						|
46700      END;
 | 
						|
46710  ()-05*) ()-02*) ()-01*)
 | 
						|
46720  (**)
 | 
						|
46730  (**)
 | 
						|
47110  (*-02() (*-05()
 | 
						|
47120  (**)
 | 
						|
47130  PROCEDURE GENDP(M: MODE);
 | 
						|
47140  (*FUNCTION: RETURNS THE ADDRESS OF THE DBLOCK FOR MODE M, OR THE VALULENGTH,
 | 
						|
47150      IN GLOBAL VARIABLE GENDPVAL, WITH CORRESPONDING OPDTYP IN GENDPOCV.
 | 
						|
47160  *)
 | 
						|
47170    VAR JUMPOVER: LABL;
 | 
						|
47180        OFFSET: 0..127;
 | 
						|
47190    PROCEDURE DBLOCK(M: MODE);
 | 
						|
47200      VAR I, J: INTEGER;
 | 
						|
47210        BEGIN WITH M^ DO
 | 
						|
47220          FOR I := 0 TO MDV.MDCNT-1 DO
 | 
						|
47230            WITH MDSTRFLDS[I] DO WITH MDSTRFMD^.MDV DO
 | 
						|
47240              IF MDDRESSED THEN
 | 
						|
47250                BEGIN EMITXWORD(OCVIMMED, OFFSET); OFFSET := OFFSET+MDLEN END
 | 
						|
47260              ELSE IF MDID=MDIDSTRUCT THEN
 | 
						|
47270                DBLOCK(MDSTRFMD)
 | 
						|
47280              ELSE OFFSET := OFFSET+MDLEN
 | 
						|
47290        END;
 | 
						|
47300    PROCEDURE DBLOCKM(M: MODE);
 | 
						|
47310      VAR I: INTEGER; X: XTYPE;
 | 
						|
47320        BEGIN WITH M^ DO
 | 
						|
47330          FOR I := 0 TO MDV.MDCNT-1 DO
 | 
						|
47340            WITH MDSTRFLDS[I] DO
 | 
						|
47350            BEGIN X := TX(MDSTRFMD);
 | 
						|
47360              IF X=12 THEN DBLOCKM(MDSTRFMD)
 | 
						|
47370              ELSE EMITXWORD(OCVIMMED, X+1)
 | 
						|
47380              END
 | 
						|
47390        END;
 | 
						|
47400      BEGIN WITH M^ DO
 | 
						|
47410        IF MDV.MDID=MDIDROW THEN GENDP(MDPRRMD)
 | 
						|
47420        ELSE IF MDV.MDID=MDIDSTRUCT THEN
 | 
						|
47430          BEGIN
 | 
						|
47440          IF MDSTRSDB=0 THEN  (*DBLOCK MUST BE CREATED*)
 | 
						|
47450            BEGIN
 | 
						|
47460            JUMPOVER := GETNEXTLABEL; EMITX1(PJMP, OCVFREF, JUMPOVER);
 | 
						|
47470            MDSTRSDB := FIXUPM;
 | 
						|
47480            EMITXWORD(OCVIMMED, MDV.MDLEN);
 | 
						|
47490            OFFSET := 0; DBLOCK(M);
 | 
						|
47500            EMITXWORD(OCVIMMED, -1);
 | 
						|
47510            DBLOCKM(M);
 | 
						|
47520            FIXUPF(JUMPOVER)
 | 
						|
47530            END;
 | 
						|
47540          GENDPOCV := OCVMEM; GENDPVAL :=MDSTRSDB
 | 
						|
47550          END
 | 
						|
47560        ELSE IF MDV.MDDRESSED THEN
 | 
						|
47570          BEGIN GENDPVAL:=0; GENDPOCV:=OCVIMMED END
 | 
						|
47580        ELSE
 | 
						|
47590          BEGIN GENDPVAL := MDV.MDLEN; GENDPOCV := OCVIMMED END
 | 
						|
47600      END;
 | 
						|
47610  (**)
 | 
						|
47620  ()-05*) ()-02*)
 | 
						|
47630  (**)
 | 
						|
47640  FUNCTION GETCASE(M: MODE; OLST: OLSTTYP; SB: PSB): STATE;
 | 
						|
47650  (*FUNCTION: COMPUTES AN ADDITION TO SOME OPCOD.
 | 
						|
47660        THE SB HERE AND IN RELATED PLACES IS A TEMPORARY KLUDGE ??????
 | 
						|
47670  *)
 | 
						|
47680    VAR WHICH: STATE;
 | 
						|
47690        WEAKREF: BOOLEAN;
 | 
						|
47700      BEGIN WITH M^ DO
 | 
						|
47710        BEGIN
 | 
						|
47720        IF SB<>NIL THEN WEAKREF:=(SBWEAKREF IN SB^.SBINF) ELSE WEAKREF:=FALSE;
 | 
						|
47730        IF NOT MDV.MDPILE THEN
 | 
						|
47740          IF MDV.MDLEN=SZINT THEN WHICH := 0 ELSE WHICH := 1
 | 
						|
47750        ELSE IF WEAKREF THEN WHICH:=2
 | 
						|
47760        ELSE IF MDV.MDID=MDIDROW THEN WHICH:=3
 | 
						|
47770        ELSE IF MDV.MDDRESSED THEN WHICH:=4
 | 
						|
47780        ELSE WHICH:=5;
 | 
						|
47790        NEEDDP := OLST[WHICH].DP;
 | 
						|
47800        GETCASE := OLST[WHICH].OVAL
 | 
						|
47810        END
 | 
						|
47820      END;
 | 
						|
47830  (**)
 | 
						|
47840  (**)
 | 
						|
47850  PROCEDURE GENOP(VAR OPCOD: POP; M: MODE; VAR OLIST: OLSTTYP; SB: PSB);
 | 
						|
47860  (*USES GETCASE TO MODIFY OPCOD AND DOES GENDP IF NECESSARY*)
 | 
						|
47870      BEGIN
 | 
						|
47880      OPCOD := OPCOD+GETCASE(M, OLIST, SB);
 | 
						|
47890      IF NEEDDP THEN
 | 
						|
47900        BEGIN
 | 
						|
47910        IF SB<>NIL THEN
 | 
						|
47920          IF SBWEAKREF IN SB^.SBINF THEN M := M^.MDPRRMD;
 | 
						|
47930        GENDP(M);
 | 
						|
47940        END
 | 
						|
47950      ELSE BEGIN GENDPOCV:=OCVNONE; GENDPVAL:=0 END
 | 
						|
47960      END;
 | 
						|
47970  (**)
 | 
						|
47980  (**)
 | 
						|
47990  FUNCTION GENLCLGBL (*+05() (VAR OPCOD: POP; SB: PSB):INTEGER ()+05*) ;
 | 
						|
48000    VAR I,X: INTEGER;
 | 
						|
48010        VP : SBTTYP;
 | 
						|
48030    BEGIN WITH SB^ DO
 | 
						|
48040      BEGIN
 | 
						|
48050        (*-41() GENLCLGBL:=SBOFFSET; ()-41*)
 | 
						|
48060        (*+41() GENLCLGBL:=-SBOFFSET; ()+41*)
 | 
						|
48062        LCLGBL := 0;
 | 
						|
48070        IF (SBLEVEL = 0) (*+05() AND (SBLEVEL<>ROUTNL^.RNLEVEL) ()+05*) THEN (*GLOBAL*)
 | 
						|
48080          BEGIN X:=1;
 | 
						|
48086     (*-05() (*-41() GENLCLGBL:=SBOFFSET+FIRSTIBOFFSET; ()-41*)
 | 
						|
48087             (*+41() GENLCLGBL:=-(SBOFFSET+FIRSTIBOFFSET); ()+41*) ()-05*)
 | 
						|
48090          (*+05() GENLCLGBL:=256-SBOFFSET ()+05*) END
 | 
						|
48100        ELSE
 | 
						|
48110        BEGIN
 | 
						|
48120          IF SBLEVEL=ROUTNL^.RNLEVEL THEN(*LOCAL*) X:=0
 | 
						|
48130          ELSE
 | 
						|
48140            BEGIN (*INTERMEDIATE*)
 | 
						|
48150            X:=2;
 | 
						|
48152            LCLGBL := ROUTNL^.RNLEVEL-SBLEVEL;
 | 
						|
48240            END
 | 
						|
48250        END;
 | 
						|
48260        OPCOD := OPCOD+X;
 | 
						|
48270      END
 | 
						|
48280    END;
 | 
						|
48290  (**)
 | 
						|
48300  (**)
 | 
						|
48310  (*-02() (*-05()
 | 
						|
48320  PROCEDURE GENDENOT (* (OPCOD: POP; SB: PSB) *) ;
 | 
						|
48330    VAR THING: OBJECT; I: INTEGER;
 | 
						|
48340        JUMPOVER: LABL;
 | 
						|
48350      BEGIN WITH SB^ DO
 | 
						|
48360        WITH SBLEX^ (*A LEXEME*) DO
 | 
						|
48370          IF SBMODE^.MDV.MDID IN [MDIDCHAN,MDIDPASC] THEN
 | 
						|
48380            EMITX1(OPCOD, OCVEXT, ORD(SBLEX))
 | 
						|
48390          ELSE IF SBLEX=LEXFALSE THEN
 | 
						|
48400            EMITX1(OPCOD, OCVIMMED, 0)
 | 
						|
48410          ELSE IF ((LXDENMD=MDINT) OR (LXDENMD=MDBITS) OR (LXDENMD=MDCHAR))
 | 
						|
48420               (*+01() AND (LXDENRP<400000B) ()+01*) AND (LXTOKEN=TKDENOT) THEN
 | 
						|
48430            EMITX1(OPCOD, OCVIMMED, LXDENRP)
 | 
						|
48440          ELSE
 | 
						|
48450            BEGIN
 | 
						|
48460            IF LXV.LXPYPTR=0 THEN
 | 
						|
48470              BEGIN
 | 
						|
48480              JUMPOVER := GETNEXTLABEL; EMITX1(PJMP, OCVFREF, JUMPOVER);
 | 
						|
48490              LXV.LXPYPTR := FIXUPM;
 | 
						|
48500              IF SBLEX=LEXTRUE THEN
 | 
						|
48510                EMITXWORD(OCVIMMED, TRUEVALUE)
 | 
						|
48520              ELSE IF LXDENMD^.MDV.MDPILE THEN WITH THING DO
 | 
						|
48530                BEGIN FIRSTWORD := 0; PCOUNT := 255;
 | 
						|
48540                LENGTH := (*-04() LXDENRP; ()-04*)(*+04() SHRINK(LXDENRP); ()+04*)
 | 
						|
48550                EMITXWORD(OCVIMMED, FIRSTWORD);
 | 
						|
48560                FOR I := 3 TO LXCOUNT DO
 | 
						|
48570                  EMITXWORD(OCVIMMED, INTEGERS[I])
 | 
						|
48580                END
 | 
						|
48590              ELSE EMITXWORD(OCVIMMED, LXDENRP);
 | 
						|
48600              FIXUPF(JUMPOVER)
 | 
						|
48610              END;
 | 
						|
48620            IF LXTOKEN=TKDENOT THEN (*NOT LEXTRUE*)
 | 
						|
48630              IF LXDENMD^.MDV.MDPILE THEN OPCOD := OPCOD-1;
 | 
						|
48640            EMITX1(OPCOD+1, OCVMEM, LXV.LXPYPTR)
 | 
						|
48650            END
 | 
						|
48660      END;
 | 
						|
48670  ()-05*) ()-02*)
 | 
						|
48680  ()+87*)
 |