; ; PDP-10 ITS IMPLEMENTATION OF CMAC MACHINE ; ; ALAN SNYDER ; 17 APRIL 1977 ; ; C EXTERNAL VARIABLE NAMES ARE PREFIXED WITH "Z" IN ORDER ; TO AVOID CONFLICTS WITH STANDARD SYMBOLS ; STATIC VARIABLES ARE REFERENCED BY SYMBOLS OF THE FORM ; I1234. STRING LITERALS ARE REFERENCED BY SYMBOLS OF THE ; FORM S1234. INTERNAL LABELS ARE IMPLEMENTED USING SYMBOLS ; OF THE FORM L1234. RELOCATABLE .MLLIT==1 A==1 ; "A" REGISTER B==2 ; "B" REGISTER T==3 ; SCRATCH REGISTER L==14 ; STACK FRAME POINTER M==15 ; PARAMETER LIST POINTER P==17 ; STACK TOP POINTER RADIX 10. ; STUFF FOR STATISTICS GATHERING %MOVE==0 ; COUNT OF MOVE INSTRUCTIONS %OPR==0 ; COUNT OF OPERATE INSTRUCTIONS %JUMP==0 ; COUNT OF CONDITIONAL JUMP INSTRUCTIONS %CONT==0 ; COUNT OF CONTROL INSTRUCTIONS %KEY==0 ; COUNT OF MISCELLANEOUS KEYWORD MACROS %DATA==0 ; SIZE OF STATIC DATA AREA DEFINE INFORM A,B IF2,[ PRINTX / A = B /] TERMIN ; END OF STATISTICS STUFF DEFINE LAUTO R,OFFSET ; LOAD AUTO VARIABLE %MOVE==%MOVE+1 MOVE R,OFFSET(L) TERMIN DEFINE LEXTRN R,NAME ; LOAD EXTERNAL VARIABLE %MOVE==%MOVE+1 MOVE R,Z!NAME TERMIN DEFINE LSTAT R,N ; LOAD STATIC VARIABLE %MOVE==%MOVE+1 MOVE R,I!N TERMIN DEFINE LLIT R,N ; LOAD INTEGER LITERAL %MOVE==%MOVE+1 MOVE R,[!N!] TERMIN DEFINE LPARM R,N ; LOAD PARAMETER %MOVE==%MOVE+1 MOVE R,N(M) TERMIN DEFINE LVPTR R1,R2 ; LOAD VIA POINTER %MOVE==%MOVE+1 MOVE R1,(R2) TERMIN DEFINE LREG R1,R2 ; LOAD FROM REGISTER %MOVE==%MOVE+1 MOVE R1,R2 TERMIN DEFINE STAUTO R,OFFSET ; STORE INTO AUTO VARIABLE %MOVE==%MOVE+1 MOVEM R,OFFSET(L) TERMIN DEFINE STEXTN R,NAME ; STORE INTO EXTERNAL VARIABLE %MOVE==%MOVE+1 MOVEM R,Z!NAME TERMIN DEFINE STSTAT R,N ; STORE INTO STATIC VARIABLE %MOVE==%MOVE+1 MOVEM R,I!N TERMIN DEFINE STPARM R,N ; STORE INTO PARAMETER %MOVE==%MOVE+1 MOVEM R,N(M) TERMIN DEFINE STVPTR R1,R2 ; STORE VIA POINTER %MOVE==%MOVE+1 MOVEM R1,(R2) TERMIN DEFINE LAAUTO R,OFFSET ; LOAD ADDRESS OF AUTO VARIABLE %MOVE==%MOVE+1 MOVEI R,OFFSET(L) TERMIN DEFINE LAEXTN R,NAME ; LOAD ADDRESS OF EXTERNAL VARIABLE %MOVE==%MOVE+1 MOVEI R,Z!NAME TERMIN DEFINE LASTAT R,N ; LOAD ADDRESS OF STATIC VARIABLE %MOVE==%MOVE+1 MOVEI R,I!N TERMIN DEFINE LAPARM R,N ; LOAD ADDRESS OF PARAMETER %MOVE==%MOVE+1 MOVEI R,N(M) TERMIN DEFINE LASTRG R,N ; LOAD ADDRESS OF STRING LITERAL %MOVE==%MOVE+1 MOVEI R,S!N TERMIN DEFINE CMINUS R ; ARITHMETIC MINUS %OPR==%OPR+1 MOVN R,R TERMIN DEFINE CNOT R ; BITWISE NEGATION %OPR==%OPR+1 SETCA R, TERMIN DEFINE CADD ; INTEGER ADDITION %OPR==%OPR+1 ADD A,B TERMIN DEFINE CSUB ; INTEGER SUBSTRACTION %OPR==%OPR+1 SUB A,B TERMIN DEFINE CMUL ; INTEGER MULTIPLICATION %OPR==%OPR+1 IMUL A,B TERMIN DEFINE CDIV ; INTEGER DIVISION %OPR==%OPR+1 MOVE T,B IDIV A,B MOVE B,T TERMIN DEFINE CMOD ; INTEGER REMAINDER %OPR==%OPR+1 MOVE T,B IDIV A,B MOVE A,B MOVE B,T TERMIN DEFINE CLS ; LEFT SHIFT %OPR==%OPR+1 LSH A,(B) TERMIN DEFINE CRS ; RIGHT SHIFT %OPR==%OPR+1 MOVN T,B LSH A,(T) TERMIN DEFINE CAND ; BITWISE AND %OPR==%OPR+1 AND A,B TERMIN DEFINE COR ; BITWISE OR %OPR==%OPR+1 IOR A,B TERMIN DEFINE CXOR ; BITWISE XOR %OPR==%OPR+1 XOR A,B TERMIN DEFINE PINC ; POINTER INCREMENT %OPR==%OPR+1 ADD A,B TERMIN DEFINE PDEC ; POINTER DECREMENT %OPR==%OPR+1 SUB A,B TERMIN DEFINE PSUB ; POINTER SUBTRACT %OPR==%OPR+1 SUB A,B TERMIN DEFINE JNULL N ; JUMP IF NULL POINTER %JUMP==%JUMP+1 JUMPE A,L!N TERMIN DEFINE JNNULL N ; JUMP IF NON-NULL POINTER %JUMP==%JUMP+1 JUMPN A,L!N TERMIN DEFINE JEQ N ; JUMP IF EQUAL %JUMP==%JUMP+1 CAMN A,B JRST L!N TERMIN DEFINE JNE N ; JUMP IF NOT EQUAL %JUMP==%JUMP+1 CAME A,B JRST L!N TERMIN DEFINE JLT N ; JUMP IF LESS THAN %JUMP==%JUMP+1 CAMGE A,B JRST L!N TERMIN DEFINE JGT N ; JUMP IF GREATER THAN %JUMP==%JUMP+1 CAMLE A,B JRST L!N TERMIN DEFINE JLE N ; JUMP IF LESS THAN OR EQUAL %JUMP==%JUMP+1 CAMG A,B JRST L!N TERMIN DEFINE JGE N ; JUMP IF GREATER THAN OR EQUAL %JUMP==%JUMP+1 CAML A,B JRST L!N TERMIN DEFINE HEAD ; HEADER MACRO %KEY==%KEY+1 TERMIN DEFINE CEND ; END MACRO %KEY==%KEY+1 INFORM [TOTAL NO. OF INSTRUCTIONS]\%MOVE+%OPR+%JUMP+%CONT INFORM [STATIC DATA AREA]\%DATA INFORM [NO. OF MOVE INSTRUCTIONS]\%MOVE INFORM [NO. OF OPERATE INSTRUCTIONS]\%OPR INFORM [NO. OF CONDITIONAL JUMPS]\%JUMP INFORM [NO. OF OTHER CONTROL INSTRUCTIONS]\%CONT INFORM [NO. OF OTHER KEYWORD MACROS]\%KEY END TERMIN DEFINE CENTRY NAME ; DECLARE ENTRY NAME %KEY==%KEY+1 .GLOBAL Z!NAME TERMIN DEFINE CEXTRN NAME ; DECLARE EXTERNAL NAME %KEY==%KEY+1 .GLOBAL Z!NAME TERMIN DEFINE PURE ; BEGIN PURE STUFF %KEY==%KEY+1 TERMIN DEFINE IMPURE ; BEGIN IMPURE STUFF %KEY==%KEY+1 TERMIN DEFINE CEQU NAME ; DEFINE EXTERNAL SYMBOL %KEY==%KEY+1 Z!NAME: TERMIN DEFINE LABDEF N ; DEFINE LABEL %KEY==%KEY+1 L!N: TERMIN DEFINE STATIC N ; DEFINE STATIC VARIABLE %KEY==%KEY+1 I!N: TERMIN DEFINE STRDEF N ; DEFINE STRING CONSTANT %KEY==%KEY+1 S!N: TERMIN DEFINE LINNUM N ; LINE NUMBER MACRO %KEY==%KEY+1 TERMIN DEFINE ADCON NAME ; DEFINE ADDRESS CONSTANT %KEY==%KEY+1 %DATA==%DATA+1 Z!NAME TERMIN DEFINE SADCON N ; DEFINE STATIC ADDRESS CONSTANT %KEY==%KEY+1 %DATA==%DATA+1 I!N TERMIN DEFINE INTCON I ; DEFINE INTEGER CONSTANT %KEY==%KEY+1 %DATA==%DATA+1 I TERMIN DEFINE LABCON N ; DEFINE LABEL CONSTANT %KEY==%KEY+1 %DATA==%DATA+1 L!N TERMIN DEFINE STRCON N ; DEFINE STRING CONSTANT %KEY==%KEY+1 %DATA==%DATA+1 S!N TERMIN DEFINE CZERO N ; DEFINE BLOCK OF ZEROES %KEY==%KEY+1 %DATA==%DATA+N BLOCK N TERMIN DEFINE PROLOG FNO,FNAME ; DEFINE FUNCTION PROLOG %CONT==%CONT+1 Z!FNAME: PUSH P,L PUSH P,M MOVE M,A HRRZI L,-3(P) ADDI P,FS!FNO-1 TERMIN DEFINE EPILOG FNO,FSIZ ; DEFINE FUNCTION EPILOG %CONT==%CONT+1 JRST EPILG" ; USE AUX ROUTINE FS!FNO==FSIZ ; MAKE SYMBOL FOR PROLOG TERMIN DEFINE CCALL NARGS,ARGP,NAME ; CALL FUNCTION %CONT==%CONT+1 HRRZI A,ARGP(L) ; SET UP ARG PTR HRLI A,-NARGS ; SET UP NARGS PUSHJ P,Z!NAME ; DO THE CALL TERMIN DEFINE CALREG NARGS,ARGP,REG ; CALL FUNCTION VIA POINTER %CONT==%CONT+1 MOVE T,REG HRRZI A,ARGP(L) ; SET UP ARG PTR HRLI A,-NARGS ; SET UP NARGS PUSHJ P,(T) ; DO THE CALL TERMIN DEFINE CRETRN ; RETURN %CONT==%CONT+1 JRST EPILG" TERMIN DEFINE CGOTO N ; UNCONDITIONAL JUMP %CONT==%CONT+1 JRST L!N TERMIN DEFINE LSWITCH N,DEFLT ; LIST SWITCH %CONT==%CONT+1 MOVE T,[-N,,.+5] CAMN A,(T) JRST @N(T) AOBJN T,.-2 JRST L!DEFLT TERMIN DEFINE ELSWIT N,DEFLT TERMIN DEFINE TSWITCH LO,HI,DEFLT ; TABLE SWITCH %CONT==%CONT+1 SUB A,[LO] JUMPL A,L!DEFLT CAILE A,HI-LO JRST L!DEFLT JRST @.+1(A) TERMIN DEFINE ETSWIT LO,HI,DEFLT TERMIN