1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-21 10:13:35 +00:00
PDP-10.its/src/c/cmac.insert
Lars Brinkhoff aec62f3117 Edit SAIL files to be like the originals from ITS.
Rename according to SAIL file C.LIB[C,SYS].  Fix E stuff and remove
trailing ^C and ^@s.
2018-10-30 08:36:56 +01:00

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