mirror of
https://github.com/PDP-10/its.git
synced 2026-01-21 10:13:35 +00:00
414 lines
6.5 KiB
Plaintext
414 lines
6.5 KiB
Plaintext
;
|
|
; 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
|