ER[SLH];

*I = 36

TARGET[ILC];

%THIS FILE CONTAINS ALL THE SKIP, LOGIC, HALF-WORD, FULL-WORD, AND
COMPARE INSTRUCTIONS.%


%THE UMOVE INSTRUCTIONS USE USER MODE ONLY IF CFM=0.  IN THAT CASE
THEY SET ALL OF THE XCTN FLAGS AND CONTINUE THE MAIN LOOP (IF EFFECTIVE
ADDRESS IS INDIRECT) OR ELSE RETURN (NO INDIRECTION).
TIMING = MOVE TIMING + 3 (MOVE TIMING IS GIVEN BELOW)
I = 2
%
UMOVE:	SETF[XCTN], MAPVA←P, Q←LAC, GOTO[RETN,H=1];
	GOTO[INDLP];

DIS[100,UMOVE,RARG,PTOAC];	*UMOVE
DIS[101,UMOVE,PTOAC,SPUNT];	*UMOVEI
DIS[102,UMOVE,WREFQ,SPUNT];	*UMOVEM
DIS[103,UMOVE,RMWARG,PTOS];	*UMOVES


%MOVE INSTRUCTIONS
TIMING:	MOVE = M + R +3
	MOVEI = M + 1
	MOVEM = M + W + 1
	MOVES = M + R + 3 + W
%

DI[200,RARG,PTOAC,SPUNT];	*MOVE
DI[201,PTOAC,SPUNT,SPUNT];	*MOVEI
DI[202,WREFQ,SPUNT,SPUNT];	*MOVEM
DI[203,RMWARG,PTOS,SPUNT];	*MOVES
DI[204,SRARG,PTOAC,SPUNT];	*MOVS
DI[205,ESWAP,PTOAC,SPUNT];	*MOVSI
DI[206,Q22H,WREFP,SPUNT];	*MOVSM
DI[207,RMWQARG,Q22H,PTOS];	*MOVSS
DI[210,RARG,MINP,SPUNT];	*MOVN
DI[211,MINP,SPUNT,SPUNT];	*MOVNI
DI[212,NEGQTOP,SPUNT,SPUNT];	*MOVNM
DI[213,RMWARG,NEGPS,SPUNT];	*MOVNS
DI[214,RARG,MAGPTOAC,SPUNT];	*MOVM
DI[215,PTOAC,SPUNT,SPUNT];	*MOVMI (SAME AS MOVEI)
DI[216,AQQ,MAGQTOP,SPUNT];	*MOVMM
DI[217,RMWARG,MAGPTOS,SPUNT];	*MOVMS

%TIMING = M + 3 + R + W
I = 1
%
EXCH:  MDR←Q, LAC←P, WRESTART, GOTO[QTOMCHK];

DI[250,RMWARG,EXCH,SPUNT];

LMOVE:	LAC←P, INCAC, P←MDRL, RETURN;

LMOVEM:	MDR←Q, INCAC;
	Q←LAC;
	MDRL←Q, RETURN;

DI[105,RARG,LMOVE,PTOAC];	*LMOVE
DI[106,LMOVEM,WTOP1,SPUNT];	*LMOVEM

%HALF-WORD INSTRUCTIONS.
%
DI[500,RHARG,HLLA,SPUNT];	*HLL
DI[501,ACHARG,PAQA,SPUNT];	*HLLI (CLEARS L.H. OF AC)
DI[502,RMWHARG,HLLM,REMAPPC];	*HLLM
DI[503,RMWARG,PTOS,SPUNT];	*HLLS
DI[504,RQARG,Q22H,HLLA];	*HRL
DI[505,IQARG,Q22H,HLLA];	*HRLI
DI[506,RMWHARG,HRLM,REMAPPC];	*HRLM
DI[507,RMWHARG,HRLS,SPUNT];	*HRLS
DI[510,RHARG,PANQA,SPUNT];	*HLLZ
DI[511,SETZ,SPUNT,SPUNT];	*HLLZI (SAME AS SETZ)
DI[512,ACHARG,WPANQM,SPUNT];	*HLLZM
DI[513,RMWHARG,PANQS,SPUNT];	*HLLZS
DI[514,RQARG,Q22H,PANQA];	*HRLZ
DI[515,IQARG,Q22H,PANQA];	*HRLZI
DI[516,Q22H,WPANQM,SPUNT];	*HRLZM
DI[517,RMWQARG,Q22H,PANQS];	*HRLZS
DI[520,RHARG,POQA,SPUNT];	*HLLO
DI[521,EHARG,QTOAC,SPUNT];	*HLLOI (SAME AS MOVEI 777777)
DI[522,ACHARG,WPOQM,SPUNT];	*HLLOM
DI[523,RMWHARG,POQS,SPUNT];	*HLLOS
DI[524,RQARG,Q22H,POQA];	*HRLO
DI[525,IQARG,Q22H,POQA];	*HRLOI
DI[526,Q22H,WPOQM,SPUNT];	*HRLOM
DI[527,RMWQARG,Q22H,POQS];	*HRLOS
DI[530,RHARG,HLLEA,SPUNT];	*HLLE
DI[531,SETZ,SPUNT,SPUNT];	*HLLEI (SAME AS SETZ)
DI[532,ACHARG,HLLEM,SPUNT];	*HLLEM
DI[533,RMWHARG,HLLES,REMAPPC];	*HLLES
DI[534,RQARG,Q22H,HLLEA];	*HRLE
DI[535,IQARG,Q22H,HLLEA];	*HRLEI
DI[536,Q22H,HLLEM,SPUNT];	*HRLEM
DI[537,RMWQARG,Q22H,HLLES];	*HRLES
DI[540,RHARG,HRRA,SPUNT];	*HRR
DI[541,EHARG,HRRA,SPUNT];	*HRRI
DI[542,RMWHARG,HRRM,REMAPPC];	*HRRM
DI[543,RMWARG,PTOS,SPUNT];	*HRRS (SAME AS MOVES
DI[544,RQARG,Q22H,HRRA];	*HLR
DI[545,ACHARG,PANQA,SPUNT];	*HLRI (CLEARS R.H. OF AC)
DI[546,RMWHARG,HLRM,SPUNT];	*HLRM
DI[547,RMWHARG,HLRS,SPUNT];	*HLRS
DI[550,RHARG,PAQA,SPUNT];	*HRRZ
DI[551,PTOAC,SPUNT,SPUNT];	*HRRZI (SAME AS MOVEI)
DI[552,ACHARG,WPAQM,SPUNT];	*HRRZM
DI[553,RMWHARG,PAQS,SPUNT];	*HRRZS
DI[554,RQARG,Q22H,PAQA];	*HLRZ
DI[555,SETZ,SPUNT,SPUNT];	*HLRZI (SAME AS SETZ)
DI[556,Q22H,WPAQM,SPUNT];	*HLRZM
DI[557,RMWQARG,Q22H,PAQS];	*HLRZS
DI[560,RHARG,PONQA,SPUNT];	*HRRO
DI[561,EHARG,PONQA,SPUNT];	*HRROI
DI[562,ACHARG,WPONQM,SPUNT];	*HRROM
DI[563,RMWHARG,PONQS,SPUNT];	*HRROS
DI[564,RQARG,Q22H,PONQA];	*HLRO
DI[565,IQARG,Q22H,PONQA];	*HLROI
DI[566,Q22H,WPONQM,SPUNT];	*HLROM
DI[567,RMWQARG,Q22H,PONQS];	*HLROS
DI[570,RARG,HRREA,SPUNT];	*HRRE
DI[571,HRREA,SPUNT,REMAPPC];	*HRREI
DI[572,HRREM,SPUNT,SPUNT];	*HRREM
DI[573,RMWQARG,Q22H,HLRES];	*HRRES
DI[574,RARG,HLREA,SPUNT];	*HLRE
DI[575,HLREA,SPUNT,REMAPPC];	*HLREI
DI[576,HLREM,SPUNT,SPUNT];	*HLREM
DI[577,RMWARG,HLRES,REMAPPC];	*HLRES

%LOGIC INSTRUCTIONS
%
DI[400,SETZ,SPUNT,SPUNT];	*SETZ
DI[401,SETZ,SPUNT,SPUNT];	*SETZI
DI[402,SETZM,SPUNT,SPUNT];	*SETZM
DI[403,SETZB,SPUNT,SPUNT];	*SETZB
DI[404,RARG,PAQA,SPUNT];	*AND
DI[405,PAQA,SPUNT,SPUNT];	*ANDI
DI[406,RMWARG,PAQM,SPUNT];	*ANDM
DI[407,RMWARG,PAQB,SPUNT];	*ANDB
DI[410,RARG,PANQA,SPUNT];	*ANDCA
DI[411,PANQA,SPUNT,SPUNT];	*ANDCAI
DI[412,RMWARG,PANQM,SPUNT];	*ANDCAM
DI[413,RMWARG,PANQB,SPUNT];	*ANDCAB
DI[414,RARG,PTOAC,SPUNT];	*SETM (SAME AS MOVE)
DI[415,PTOAC,SPUNT,SPUNT];	*SETMI (SAME AS MOVEI)
DI[416,RMWARG,PTOM,SPUNT];	*SETMM (NOOP REFERENCING MEMORY BY R-M-W)
DI[417,RMWARG,PTOB,SPUNT];	*SETMB
DI[420,RARG,NPAQA,SPUNT];	*ANDCM
DI[421,NPAQA,SPUNT,SPUNT];	*ANDCMI
DI[422,RMWARG,NPAQM,SPUNT];	*ANDCMM
DI[423,RMWARG,NPAQB,SPUNT];	*ANDCMB
DI[424,REMAPPC,SPUNT,SPUNT];	*SETA (NOOP)
DI[425,REMAPPC,SPUNT,SPUNT];	*SETAI (NOOP)
DI[426,WREFQ,SPUNT,SPUNT];	*SETAM (SAME AS MOVEM)
DI[427,WREFQ,SPUNT,SPUNT];	*SETAB (SAME AS MOVEM)
DI[430,RARG,PXQA,SPUNT];	*XOR
DI[431,PXQA,SPUNT,SPUNT];	*XORI
DI[432,RMWARG,PXQM,SPUNT];	*XORM
DI[433,RMWARG,PXQB,SPUNT];	*XORB
DI[434,RARG,POQA,SPUNT];	*IOR
DI[435,POQA,SPUNT,SPUNT];	*IORI
DI[436,RMWARG,POQM,SPUNT];	*IORM
DI[437,RMWARG,POQB,SPUNT];	*IORB
DI[440,RARG,NPANQA,SPUNT];	*ANDCB
DI[441,NPANQA,SPUNT,SPUNT];	*ANDCBI
DI[442,RMWARG,NPANQM,SPUNT];	*ANDCBM
DI[443,RMWARG,NPANQB,SPUNT];	*ANDCBB
DI[444,RARG,PEQA,SPUNT];	*EQV
DI[445,PEQA,SPUNT,SPUNT];	*EQVI
DI[446,RMWARG,PEQM,SPUNT];	*EQVM
DI[447,RMWARG,PEQB,SPUNT];	*EQVB
DI[450,NQA,SPUNT,SPUNT];	*SETCA
DI[451,NQA,SPUNT,SPUNT];	*SETCAI
DI[452,NQM,SPUNT,SPUNT];	*SETCAM
DI[453,NQB,SPUNT,SPUNT];	*SETCAB
DI[454,RARG,PONQA,SPUNT];	*ORCA
DI[455,PONQA,SPUNT,SPUNT];	*ORCAI
DI[456,RMWARG,PONQM,SPUNT];	*ORCAM
DI[457,RMWARG,PONQB,SPUNT];	*ORCAB
DI[460,RARG,NPA,SPUNT];		*SETCM
DI[461,NPA,SPUNT,SPUNT];	*SETCMI
DI[462,RMWARG,NPM,SPUNT];	*SETCMM
DI[463,RMWARG,NPB,SPUNT];	*SETCMB
DI[464,RARG,NPOQA,SPUNT];	*ORCM
DI[465,NPOQA,SPUNT,SPUNT];	*ORCMI
DI[466,RMWARG,NPOQM,SPUNT];	*ORCMM
DI[467,RMWARG,NPOQB,SPUNT];	*ORCMB
DI[470,RARG,NPONQA,SPUNT];	*ORCB
DI[471,NPONQA,SPUNT,SPUNT];	*ORCBI
DI[472,RMWARG,NPONQM,SPUNT];	*ORCBM
DI[473,RMWARG,NPONQB,SPUNT];	*ORCBB
DI[474,SETO,SPUNT,SPUNT];	*SETO
DI[475,SETO,SPUNT,SPUNT];	*SETOI
DI[476,SETOM,SPUNT,SPUNT];	*SETOM
DI[477,SETOB,SPUNT,SPUNT];	*SETOB

%THE INSTRUCTION CLASSES CAM, AOS, SOS, CAI, AND SKIP ALL USE THE
FOLLOWING TERMINATION ROUTINES.
TIMING:
   CAIX   M + 2 + 1 IF IT SKIPS
   CAMX   M + R + 4 + 1 IF IT SKIPS
   SKIPX  M + R + 4 + 1 IF IT SKIPS
   AOSX   M + R + 3 + W
   SOSX   M + R + 3 + W
I = 25 TOTAL
%
*NO SKIP IS REMAPPC
LCSKIP:	FRZBALUBC, GOTO[GSKIP,H=1];
LSKIP:	ENDM[ALU>=0];
	P←MAPVA←P+1, SAMASK[22], GOTO[REMAP1];

PAQES:	P AND Q;
ESKIP:	ENDM[ALU#0];
	P←MAPVA←P+1, SAMASK[22], GOTO[REMAP1];

LECSKIP: FRZBALUBC, GOTO[GSKIP,H=1];
LESKIP:	ENDM[ALU>0];
	P←MAPVA←P+1, SAMASK[22], GOTO[REMAP1];

ASKIP:	P←PC, GOTO[ASKIP1];

GECSKIP: FRZBALUBC, GOTO[LSKIP,H=1];
GESKIP:	ENDM[ALU<0];
ASKIP1:	P←MAPVA←P+1, SAMASK[22], Q←1R, GOTO[REMAP1];

PAQNS:	P AND Q;
NSKIP:	ENDM[ALU=0];
	P←MAPVA←P+1, SAMASK[22], GOTO[REMAP1];

GCSKIP:	FRZBALUBC, GOTO[LSKIP,H=1];
GSKIP:	ENDM[ALU<=0];
	P←MAPVA←P+1, SAMASK[22], GOTO[REMAP1];

%THE ROUTINES BELOW IMPLEMENT THE CAM, CAI, AOS, SOS, AND SKIP
INSTRUCTION CLASSES%
COMP:	P-Q, SETHOVF, RETURN;

SKIP:  LACS←P, MAPVA←P←PC, ACFS, Q←1R, RETURN;

AOS:   Q←1R, WRESTART;
       MDR←LACS←Q←P+Q, SETOVPC01, RETURN[G=0];
       LX←Q, RETURN;

SOS:   Q←A1, WRESTART, GOTO[.-2];

DI[300,REMAPPC,SPUNT,SPUNT];	*CAI (NO-OP) TIMING = M
DI[301,COMP,GCSKIP,SPUNT];	*CAIL
DI[302,COMP,ESKIP,SPUNT];	*CAIE
DI[303,COMP,GECSKIP,SPUNT];	*CAILE
DI[304,ASKIP,SPUNT,SPUNT];	*CAIA
DI[305,COMP,LECSKIP,SPUNT];	*CAIGE
DI[306,COMP,NSKIP,SPUNT];	*CAIN
DI[307,COMP,LCSKIP,SPUNT];	*CAIG

DI[310,RARG,REMAPPC,SPUNT];	*CAM (RARG FOR MAP LOADING COMPATIBILITY)
DI[311,RARG,COMP,GCSKIP];	*CAML
DI[312,RARG,COMP,ESKIP];	*CAME
DI[313,RARG,COMP,GECSKIP];	*CAMLE
DI[314,RARG,ASKIP,SPUNT];	*CAMA
DI[315,RARG,COMP,LECSKIP];	*CAMGE
DI[316,RARG,COMP,NSKIP];	*CAMN
DI[317,RARG,COMP,LCSKIP];	*CAMG

DI[330,RARG,SKIP,REMAP1];
DI[331,RARG,SKIP,LSKIP];
DI[332,RARG,SKIP,ESKIP];
DI[333,RARG,SKIP,LESKIP];
DI[334,RARG,SKIP,ASKIP1];
DI[335,RARG,SKIP,GESKIP];
DI[336,RARG,SKIP,NSKIP];
DI[337,RARG,SKIP,GSKIP];

DI[350,RMWARG,AOS,REMAPPC];
DI[351,RMWARG,AOS,LSKIP];
DI[352,RMWARG,AOS,ESKIP];
DI[353,RMWARG,AOS,LESKIP];
DI[354,RMWARG,AOS,ASKIP];
DI[355,RMWARG,AOS,GESKIP];
DI[356,RMWARG,AOS,NSKIP];
DI[357,RMWARG,AOS,GSKIP];

DI[370,RMWARG,SOS,REMAPPC];
DI[371,RMWARG,SOS,LSKIP];
DI[372,RMWARG,SOS,ESKIP];
DI[373,RMWARG,SOS,LESKIP];
DI[374,RMWARG,SOS,ASKIP];
DI[375,RMWARG,SOS,GESKIP];
DI[376,RMWARG,SOS,NSKIP];
DI[377,RMWARG,SOS,GSKIP];

%THE 64 TEST-AND-SET INSTRUCTIONS REQUIRE ONLY A SMALL NUMBER OF ROUTINES
BECAUSE OF COMMON USAGE BY MANY INSTRUCTIONS OF EACH ONE.  THE TRANSLATION
OF INSTRUCTIONS TO ROUTINES IS DIAGRAMMED BELOW:
     R  O  -
T    L  Z  E
     D  C  N
     S  N  A
R  ---     O  TIOR     -  REMAPPC
L  ESWAP   Z  TANDCM   E  ESKIP
D  RARG    C  TXOR     N  NSKIP
S  SRARG   N  APANDQ   A  ASKIP1
ESWAP, RARG, AND SRARG ARE IN THE "MAIN" PACKAGE WITH THE OTHER PREPARATION
ROUTINES.
I=4
%

APANDQ: P AND Q, RETURN, P←MAPVA←PC, ACFS;
TIOR:	LAC←P OR Q, GOTO[APANDQ];
TANDCM:	LAC←NOT P AND Q, GOTO[APANDQ];
TXOR:	LAC←P#Q, GOTO[APANDQ];

DI[600,REMAPPC,SPUNT,SPUNT];	*TRN IS NO-OP
DI[601,REMAPPC,SPUNT,SPUNT];	*TLN IS NO-OP
DI[602,APANDQ,ESKIP,SPUNT];	*TRNE
DI[603,ESWAP,APANDQ,ESKIP];	*TLNE
DI[604,ASKIP,SPUNT,SPUNT];	*TRNA
DI[605,ASKIP,SPUNT,SPUNT];	*TLNA
DI[606,APANDQ,NSKIP,SPUNT];	*TRNN
DI[607,ESWAP,APANDQ,NSKIP];	*TLNN
DI[610,RARG,REMAPPC,SPUNT];	*TDN (NO-OP REFERENCING MEMORY)
DI[611,RARG,REMAPPC,SPUNT];	*TSN
DI[612,RARG,APANDQ,ESKIP];	*TDNE
DI[613,SRARG,APANDQ,ESKIP];	*TSNE
DI[614,RARG,ASKIP,SPUNT];	*TDNA
DI[615,RARG,ASKIP,SPUNT];	*TSNA
DI[616,RARG,APANDQ,NSKIP];	*TDNN
DI[617,SRARG,APANDQ,NSKIP];	*TSNN
DI[620,NPAQA,SPUNT,SPUNT];	*TRZ SAME AS ANDCMI
DI[621,ESWAP,NPAQA,SPUNT];	*TLZ
DI[622,TANDCM,ESKIP,SPUNT];	*TRZE
DI[623,ESWAP,TANDCM,ESKIP];	*TLZE
DI[624,TANDCM,ASKIP1,SPUNT];	*TRZA
DI[625,ESWAP,TANDCM,ASKIP1];	*TLZA
DI[626,TANDCM,NSKIP,SPUNT];	*TRZN
DI[627,ESWAP,TANDCM,NSKIP];	*TLZN
DI[630,RARG,NPAQA,SPUNT];	*TDZ
DI[631,SRARG,NPAQA,SPUNT];	*TSZ
DI[632,RARG,TANDCM,ESKIP];	*TDZE
DI[633,SRARG,TANDCM,ESKIP];	*TSZE
DI[634,RARG,TANDCM,ASKIP1];	*TDZA
DI[635,SRARG,TANDCM,ASKIP1];	*TSZA
DI[636,RARG,TANDCM,NSKIP];	*TDZN
DI[637,SRARG,TANDCM,NSKIP];	*TSZN
DI[640,PXQA,SPUNT,SPUNT];	*TRC (SAME AS XORI)
DI[641,ESWAP,PXQA,SPUNT];	*TLC
DI[642,TXOR,ESKIP,SPUNT];	*TRCE
DI[643,ESWAP,TXOR,ESKIP];	*TLCE
DI[644,TXOR,ASKIP1,SPUNT];	*TRCA
DI[645,ESWAP,TXOR,ASKIP1];	*TLCA
DI[646,TXOR,NSKIP,SPUNT];	*TRCN
DI[647,ESWAP,TXOR,NSKIP];	*TLCN
DI[650,RARG,PXQA,SPUNT];	*TDC SAME AS XOR
DI[651,SRARG,PXQA,SPUNT];	*TSC
DI[652,RARG,TXOR,ESKIP];	*TDCE
DI[653,SRARG,TXOR,ESKIP];	*TSCE
DI[654,RARG,TXOR,ASKIP1];	*TDCA
DI[655,SRARG,TXOR,ASKIP1];	*TSCA
DI[656,RARG,TXOR,NSKIP];	*TDCN
DI[657,SRARG,TXOR,NSKIP];	*TSCN
DI[660,POQA,SPUNT,SPUNT];	*TRO SAME AS IORI

DI[661,ESWAP,POQA,SPUNT];	*TLO
DI[662,TIOR,ESKIP,SPUNT];	*TROE
DI[663,ESWAP,TIOR,ESKIP];	*TLOE
DI[664,TIOR,ASKIP1,SPUNT];	*TROA
DI[665,ESWAP,TIOR,ASKIP1];	*TLOA
DI[666,TIOR,NSKIP,SPUNT];	*TRON
DI[667,ESWAP,TIOR,NSKIP];	*TLON
DI[670,RARG,POQA,SPUNT];	*TDO SAME AS IOR
DI[671,SRARG,POQA,SPUNT];	*TSO
DI[672,RARG,TIOR,ESKIP];	*TDOE
DI[673,SRARG,TIOR,ESKIP];	*TSOE
DI[674,RARG,TIOR,ASKIP1];	*TDOA
DI[675,SRARG,TIOR,ASKIP1];	*TSOA
DI[676,RARG,TIOR,NSKIP];	*TDON
DI[677,SRARG,TIOR,NSKIP];	*TSON