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*)
 |