/ 36-BIT PDP-8/E SIMULATOR

/  TRIPLE PRECISION PACKAGE FOR PDP-8
/  SIMULATES 36-BIT PDP-8/E

/  SIMULATION BEGINS WITH A CALL TO 'TRIPLE',
/  ENDS WITH ANY 'HLT'

	ZZZ=0	/FOR FILL-INS


	*0
	HLT;JMP I 0	/FOR DEBUGGING
BA, 0	/BREAKPOINT ADDRESS
BF, 0	/BREAKPOINT FIELD (00N0)
MA, 0	/SIMULATED MA REGISTER

	*20

AC, ZBLOCK 3	/SIMULATED 36-BIT AC
TLINK, ZBLOCK 1	/SIMULATED LINK
MQ, ZBLOCK 3	/SIMULATED 36-BIT MQ
MB, ZBLOCK 3	/SIMULATED MB

/PB
/PB

	*6400

TRIPLE,	.-.		/ENTRY TO SIMULATOR
	JMS CLRAC	/ACTUALLY SETS LOW ORDER AC
	RAL
	DCA TLINK	/SAVE LINK
	RDF
	TAD (CDF
	DCA TRIPT1	/HOLD MOMENTARILY
	RIF
	TAD (CDF
	DCA .+1
IBIT,	HLT		/SET PRESENT DATA FIELD
	TAD .-1
	DCA TF		/'THIS FIELD'
	TAD TRIPT1	/OLD DF CONTAINS CALLING FIELD,
			/THEREFORE, 'IF' FOR SIMULATION
	DCA IF		/INSTRUCTION FIELD
	TAD IF
	DCA DF		/USE AS DATA FIELD AS WELL
	TAD IF
	DCA IB		/INSTRUCTION FIELD BUFFER
CYCLE,	TAD BA		/BREAKPOINT FIELD
	SNA		/ZERO MEANS NONE
	JMP CYCLE1
	CIA
	TAD TRIPLE
	SZA CLA		/SAME ADDRESS?
	JMP CYCLE1	/NO
	TAD IF
	AND (70
	CIA
	TAD BF
	SNA CLA		/SAME FIELD?
	JMS 0		/YES.  SNEAK OUT
CYCLE1,	JMS INIF	/NO.  PROCEED
	TAD I TRIPLE	/GET NEXT INSTRUCTION
	DCA MB		/SAVE
	TAD I TRIPLE
	CLL RTL
	RTL
	AND (7		/INSTRUCTION CLASS
	TAD TRIPL1
	DCA IR		/INSTRUCTION REGISTER
	JMS INHERE	/BACK TO 'TF'
	DCA IBIT	/INDIRECT BIT
	CLA STL RTR	/2000
	TAD MB
	SZL CLA		/ < 6000?
	JMP TRIP1	/NO
	TAD MB		/YES.  MEMORY REFERENCE
	AND (200	/PAGE BIT
	SZA CLA
	TAD TRIPLE
	AND (7600	/GIVES HIGH ORDER 5 BITS
	DCA TRIPT1	/SAVE
	TAD MB
	AND (177
	TAD TRIPT1
	DCA MA		/SAVE OPERAND ADDRESS
	TAD MB
	AND (400	/INDIRECT
	SNA CLA		/ ?
	JMP TRIP1	/NO
	ISZ IBIT	/YES
	JMS INIF
	TAD I MA	/GET DIRECT OPERAND ADDRESS
	DCA MA
	JMS INHERE
TRIP1,	ISZ TRIPLE	/POINT TO NEXT WORD
IR,	 ZZZ
TRIPL1,	JMP I .+1
	 TAND;TTAD;TISZ;TDCA;TJMS;TJMP;TIOT;TOPR

TRIPT1, 0

GETMB,	.-.		/GET CONTENTS OF MB ACCORDING TO MA
	JMS MBS1	/CHOOSE FIELD OF DATA
	TAD I MA
	ISZ MA
	DCA MB		/HIGH ORDER
	TAD I MA
	ISZ MA
	DCA MB+1	/MIDDLE ORDER
	TAD I MA
	DCA MB+2
	JMS INHERE
	JMP I GETMB

SAVEMB,	.-.		/PUT MB INTO ADDRESS IN MA
	JMS MBS1	/CHOOSE FIELD OF DATA
	TAD MB
	DCA I MA
	ISZ MA
	TAD MB+1
	DCA I MA
	ISZ MA
	TAD MB+2
	DCA I MA
	JMS INHERE
	JMP I SAVEMB

MBS1,	.-.		/CHOOSE FIELD
	TAD IBIT
	SZA CLA
	JMP .+3
	JMS INIF
	JMP I MBS1
	JMS INDF
	JMP I MBS1

/PB
/PB

	PAGE

TAND,	JMS GETMB	/'AND' SIMULATOR.  GET MB
	TAD MB
	AND AC
	DCA AC
	TAD MB+1
	AND AC+1
	DCA AC+1
	TAD MB+2
	AND AC+2
	DCA AC+2
	JMP CYCLE	/DO NEXT INSTRUCTION


TTAD,	JMS GETMB	/'TAD' SIMULATOR.  GET MB
	CLL
	TAD AC+2
	TAD MB+2
	DCA AC+2
	GLK
	TAD AC+1
	TAD MB+1
	DCA AC+1
	GLK
	TAD AC
	TAD MB
	DCA AC
	SZL		/ADDITION OVERFLOW?
	JMS CMPLNK	/YES.  COMPLEMENT LINK
	JMP CYCLE


TISZ,	JMS GETMB	/SIMULATE 'ISZ'.  GET MB
	ISZ MB+2
	JMP TISZ1
	ISZ MB+1
	JMP TISZ1
	ISZ MB
	SKP
	ISZ TRIPLE	/INCREMENT 'PC'
	NOP
TISZ1,	CMA CLL RAL	/-2
	TAD MA
	DCA MA		/BACK UP MA FROM FETCH AT TISZ
	JMS SAVEMB	/SAVE INCREMENTED MB
	JMP CYCLE


TDCA,	TAD AC		/SIMULATE 'DCA'.
	DCA MB
	TAD AC+1
	DCA MB+1
	TAD AC+2
	DCA MB+2
	JMS SAVEMB	/SAVE THIS MESS
	JMS CLRAC	/CLEAR AC
	JMP CYCLE

TJMS,	TAD TRIPLE	/SIMULATE 'JMS'
IB,	ZZZ		/ACTUALLY A 'CDF' TO ANY NEW 'IF'
	DCA I MA
	IAC
	JMS INHERE	/BACK TO THIS FIELD
TJMP,	TAD MA		/'JMP' SIMULATOR
	DCA TRIPLE	/CHANGE 'PC'
	TAD IB
	DCA IF		/CHANGE THE 'IF'
	JMP CYCLE



TIOT,	TAD MB		/'IOT' SIMULATION
	AND (700
	TAD (-200
	SZA CLA		/FOR EXTENDED MEMORY?
	JMP TIOT1	/NO
	TAD MB
	CLL RTR
	SMA CLA		/IS IT IOT 1?
	JMP .+4		/NO
	TAD MB		/YES.  USE AS CDF
	AND (7771
	DCA DF
	SNL		/IOT 2?
	JMP .+5
	TAD MB
	AND (7770
	IAC
	DCA IB		/MAKE IT A CDF
	TAD MB
	AND (4		/ONE OF THE WEIRDO INSTRUCTIONS?
	SNA CLA
	JMP CYCLE	/NO
	TAD MB		/YES.  DRAT!
	AND (30
	TAD (-20
	SMA SZA		/ > 622N?
	JMP TIOT1	/YES
	SPA CLA		/RIF?
	JMP .+3		/NO
	TAD IF		/YES
	SKP
	TAD DF
	AND (70
	DCA TIOTT1
	TAD AC+2
	AND (7707
	TAD TIOTT1	/SIMULATE JAM TRANSFER INSTEAD OF 'OR'
	DCA AC+2
	JMP CYCLE

/PB
/PB

	PAGE

TIOT1,	CLA
	TAD MB
	DCA TIOTT1	/SAVE INSTRUCTION
	TAD AC+2	/IN CASE OF ACTION
TIOTT1,	 ZZZ
	SKP		/CHECK FOR SKIP
	ISZ TRIPLE	/INCREMENT 'PC'
	NOP
	DCA AC+2	/SAVE AC
	JMP CYCLE


TOPR,	TAD MB		/SIMULATE 'OPR'
	AND (400	/CHECK FOR GROUP I
	SZA CLA		/IN GROUP I?
	JMP TOPR1	/NO
	JMS BITS	/YES
	 TOPRL1
	JMP CYCLE

BITS,	.-.		/CUTE LITTLE SUBROUTINE
	TAD I BITS	/GET LIST
	ISZ BITS
	DCA BITSP1
BITS1,	TAD I BITSP1	/GET MASK
	ISZ BITSP1
	SNA		/END OF LIST?
	JMP I BITS
	AND MB		/NO.  BIT SET IN MB?
	SNA CLA
	JMP BITS2	/NO
	TAD I BITSP1	/YES
	DCA BITSP2
	JMP I BITSP2
BITS2,	ISZ BITSP1	/NO
	JMP BITS1	/PROCEED

BITSP1, 0
BITSP2, 0



TCLA,	JMS CLRAC	/PERFORM CLA
	JMP BITS2

TCLL,	DCA TLINK	/CLEAR LINK
	JMP BITS2

TCMA,	TAD AC+2	/CMA
	CMA
	DCA AC+2
	TAD AC+1
	CMA
	DCA AC+1
	TAD AC
	CMA
	DCA AC
	JMP BITS2

TCML,	JMS CMPLNK	/CML
	JMP BITS2

TIAC,	ISZ AC+2	/IAC
	JMP BITS2
	ISZ AC+1
	JMP BITS2
	ISZ AC
	JMP BITS2
	JMP TCML	/COMPLEMENT LINK ON O'FLOW

TRR,	JMS ROTR	/RAR AND RTR
	STL RTL		/2
	AND MB
	SZA CLA		/DOUBLE ROTATE SET?
	JMS ROTR	/YES
	JMP BITS2

TRL,	JMS ROTL	/RAL AND RTL
	STL RTL
	AND MB
	SZA CLA
	JMS ROTL
	JMP BITS2

ROTR,	.-.		/ROTATE ONE RIGHT
	TAD TLINK
	CLL RAR
	JMS SHFTR
	RAL
	DCA TLINK
	JMP I ROTR

ROTL,	.-.		/ROTATE ONE LEFT
	TAD TLINK
	CLL RAR
	JMS SHFTL
	RAL
	DCA TLINK
	JMP I ROTL

SHFTR,	.-.		/SHIFT RIGHT ONE
	TAD AC
	RAR
	DCA AC
	TAD AC+1
	RAR
	DCA AC+1
	TAD AC+2
	RAR
	DCA AC+2
	JMP I SHFTR

SHFTL,	.-.		/SHIFT LEFT ONE
	TAD AC+2
	RAL
	DCA AC+2
	TAD AC+1
	RAL
	DCA AC+1
	TAD AC
	RAL
	DCA AC
	JMP I SHFTL

/PB
/PB

	PAGE

TOPR1,	IAC
	AND MB		/GROUP II OR III
	SZA CLA		/WHICH
	JMP TOPR2	/GROUP III
	DCA TOPRT1	/CLEAR SKIP FLAG
	JMS BITS	/GROUP II
	 TOPRL2
	TAD TOPRT1	/ANY SUCCESSFUL SKIPS?
	SZA CLA
	ISZ TRIPLE	/YES
	NOP
	STL RTL		/2
	AND MB
	SNA CLA		/'HLT' BIT SET?
	JMP CYCLE	/NO
	ISZ IF		/MAKE IT A CIF
	TAD TRIPLE
	DCA INIF	/FAKE JMS
	JMS INDF	/CHANGE DATA FIELD
	TAD TLINK
	CLL RAR		/SET UP LINK
	TAD AC+2	/AND LOW ORDER AC
	JMP IF		/JUMP INTO INIF


TSMA,	TAD AC
	SPA CLA		/CHECK HIGH ORDER BIT
	ISZ TOPRT1	/SET SKIP BIT
	JMP BITS2

TSZA,	TAD AC+2
	SZA CLA
	JMP BITS2
	TAD AC+1
	SZA CLA
	JMP BITS2
	TAD AC
	SNA CLA
	ISZ TOPRT1	/SET SKIP BIT
	JMP BITS2

TSNL,	TAD TLINK
	SZA CLA
	ISZ TOPRT1
	JMP BITS2

TREV,	TAD TOPRT1	/REVERSE SKIP SENSE
	SNA CLA		/SKIP SET?
	IAC		/NO.  IT WILL BE
	DCA TOPRT1
	JMP BITS2


TOSR,	TAD AC+2	/LOW ORDER 12 BITS ONLY
	OSR
	DCA AC+2
	JMP BITS2



TOPR2,	JMS BITS	/GROUP III OPR
	 TOPRL3
TOPR3,	JMP CYCLE


TOPRT1, 0

INIF,	.-.		/SET DATA FIELD TO 'IF'
IF,	HLT
	JMP I INIF

INDF,	.-.		/SET DATA FIELD TO 'DF'
DF,	HLT		/WILL CONTAIN CDF
	JMP I INDF

INHERE,	.-.		/SET DF TO SIMULATOR FIELD
TF,	HLT
	JMP I INHERE

CLRAC,	.-.
	DCA AC+2
	DCA AC+1
	DCA AC
	JMP I CLRAC

CMPLNK,	.-.		/COMPLEMENT LINK
	TAD TLINK
	SNA CLA
	IAC
	DCA TLINK
	JMP I CMPLNK

TOPRL1,	200;TCLA
	100;TCLL
	40;TCMA
	20;TCML
	1;TIAC
	10;TRR
	4;TRL;0	/END

TOPRL2,	100;TSMA
	40;TSZA
	20;TSNL
	10;TREV
	200;TCLA
	4;TOSR;0	/END

TOPRL3,	200;TCLA
	120;TMQAL
	100;TMQA
	20;TMQL;0	/END

/PB
/PB

	PAGE

TMQAL,	TAD MB		/'MQA', 'MQL', OR 'SWP'
	AND (120
	TAD (-120
	SZA CLA		/'SWP'?
	JMP BITS2	/NO.  PICK UP WHICH ONE THIS WAY
	JMS TMQS1	/SET UP SUBROUTINE
TMQAL1,	TAD I TOPRP1
	DCA TOPRT2
	TAD I TOPRP2
	DCA I TOPRP1
	TAD TOPRT2
	DCA I TOPRP2
	ISZ TOPRP1
	ISZ TOPRP2
	ISZ TOPRC1
	JMP TMQAL1
	JMP TOPR3

TMQL,	TAD AC
	DCA MQ
	TAD AC+1
	DCA MQ+1
	TAD AC+2
	DCA MQ+2
	JMS CLRAC
	JMP TOPR3

TMQA,	JMS TMQS1	/SET UP
	TAD I TOPRP1	/BEGIN 'OR'
	CMA
	AND I TOPRP2
	TAD I TOPRP1
	DCA I TOPRP2
	ISZ TOPRP1
	ISZ TOPRP2
	ISZ TOPRC1
	JMP TMQA+1
	JMP TOPR3

TMQS1,	.-.		/SET POINTERS AND COUNT
	TAD (MQ
	DCA TOPRP1
	TAD (AC
	DCA TOPRP2
	CMA CLL RTL	/-3
	DCA TOPRC1
	JMP I TMQS1

TOPRP1, 0
TOPRP2, 0
TOPRC1, 0
TOPRT2, 0

/PB
$
