File: ME.TK of Disk: Disks/MyPDP/m8-blue-rka1-rkb1
(Source file text) 

/ME.TK 10-JUN-80
/**UASEM VERSION**
/THIS IS AN ALTERNATIVE MAGTAPE EMULATOR, WHICH
/TRULY EMULATES THE IOTS FOR A TM8E OR TC58
/MAGTAPE CONTROL. THIS APPROACH HAS THE ADVANTAGE
/THAT NON-OS/8 MAGTAPE HANDLERS WILL FUNCTION
/IN THE BACKGROUND OF MULTI8.

/PREAMBLE:
	ME="M^100+"E&3777

IFDEF TM8E <
	*0;CDF 10;EMTAB+70;ME
	*0;CDF 10;EMTAB+71;ME
	*0;CDF 10;EMTAB+72;ME

/TASK HEADER:
	*200
MENAME,	ME		/NAME IS 'ME'
	201		/ONE PAGE TASK ONE CONNECTED IR
XMTA,	MTA
	MEIR
MEBASE,	0		/POINTER TO BASE OF CALLING BG

/TASK CODE:
	DCA MEBASE	/
	SZL		/RELEASE CALL ?
	 JMP MEQUIT	/YES, CLEAN UP AND QUIT
	TAD MEBASE
	TAD (UASEM-1	/SETUP POINTER TO UASEM
	DCA MEUPC	/IN OUR BG TABLE
MEASLP,	ISZ MEUPC
	TAD I MEUPC	/LOOK AT ENTRY
	SNA		/IS IT FREE ?
	 JMP MEASFR	/YES, GO PUT IN MY NAME
	CIA
	TAD MENAME	/WAS IT ALREADY USED BY ME ?
	SZA CLA
	 JMP MEASLP	/NO, SOME OTHER TASK, LOOK FOR MORE
MEASFR,	TAD MENAME
	DCA I MEUPC	/OK, PUT MY NAME IN UASEM TABLE
MEOK,	AC0003		/PREPARE SOME POINTERS
	TAD MEBASE	/
	DCA MEUPC	/
	AC0002		/
	TAD MEUPC	/
	DCA MEUAC	/
	AC0001		/
	TAD MEUAC	/
	JMS DEFER	/GET TRAPPED INSTRUCTION
	AND C77		/
	TAD (JMP TABLE	/YES, MAKE DISPATCH JUMP
	DCA .+1
	HLT		/
TABLE,	JMP NOOP	/6700 .... NOT TM8E INSTRUCTION
	JMP DOIT	/6701 LWCR LOAD WORD COUNT REG
	JMP DOIT	/6702 CWCR CLEAR WORD COUNT REG
	JMP DOIT	/6703 LCAR LOAD CURRENT ADDRESS REG
	JMP DOIT	/6704 CCAR CLEAR CURRENT ADDRESS REG
	JMP DOLCMR	/6705 LCMR LOAD COMMAND REG
	JMP DOLFGR	/6706 LFGR LOAD FUNCTION REG AND (GO)
	JMP DOIT	/6707 LDBR LOAD DATA BUFFER REG
	JMP NOOP	/6710 .... NOT TM8E INSTRUCTION
	JMP DOIT	/6711 RWCR READ WORD COUNT REG
	JMP DOIT	/6712 CLT  CLEAR TRANSPORT
	JMP DOIT	/6713 RCAR READ CURRENT ADDRESS REG
	JMP DORMSR	/6714 RMSR READ MAIN STATUS REG
	JMP DORCMR	/6715 RCMR READ COMMAND REG
	JMP DOIT	/6716 RFSR READ FUNCTION REG & STATUS
	JMP DOIT	/6717 RDBR READ DATA BUFFER
	JMP NOOP	/6720 .... NOT TM8E INSTRUCTION
	JMP DOIT	/6721 SKEF SKIP IF ERROR FLAG
	JMP DOIT	/6722 SKCB SKIP IF CONTROL NOT BUSY
	JMP DOSKJD	/6723 SKJD SKIP WHEN JOB DONE
	JMP DOIT	/6724 SKTR SKIP WHEN TAPE READY
	JMP DOIT	/6725 CLF  CLEAR CONTROLLER & MASTER
	JMP DOIT	/6726 CKDL MAINTENANCE
	JMP NOOP	/6727 SBRM MAINTENANCE

MEQUIT,	6725		/CLF, CLEAR CONTROLLER
	JMS MONITOR
	   EXIT SWPOUT	/AND RETURN
DOIT,	TAD I X		/GET INSTRUCTION AGAIN
	DCA MEINST	/AND PUT IT AHEAD
	TAD I MEUAC	/GET USER AC IN AC
MEINST,	HLT		/THE IOT
	 SKP		/JUST IN CASE IT IS A SKIP
MESKP,	 ISZ I MEUPC	/INCREMENT USER PC
	NOP		/YOU NEVER KNOW
MECLA,	DCA I MEUAC	/RESTORE USER AC
NOOP,	JMS MONITOR	/AND RETURN
	   RETURN	/

DOLCMR,	TAD I MEUAC	/GET USERS AC
	DCA COMAND	/AND STORE IN COMMAND LATCH
	JMP MECLA	/FINISHED WITH THIS INSTRUCTION

DOLFGR,	TAD COMAND	/
	AND C70		/EXTRACT BUFFER FIELD
	TAD I MEBASE	/REQUEST BUFFER FIELD IN MEMORY
	TAD (-EMULATE+INCORE
	DCA I MEBASE	/
	JMS MONITOR	/KICK SCHEDULER ACTIVE
	   SIGNAL
	   BSSLOT
	TAD MEBASE
	TAD (USLOT
	JMS DEFER	/GET USERS EVENT #
	DCA .+3
	JMS MONITOR	/WAIT TILL FIELD RESIDENT
	   WAIT
MEUPC,	   0		/GETS USLOT
	MQL		/MQ CONTAINS REAL BUFFER FIELD
	TAD COMAND	/GET ORIGINAL COMMAND WORD
	AND (7407	/KILL DANGEROUS BITS
	TAD C100	/SET INTERRUPT ENABLE
	MQA		/INSERT REAL BUFFER FIELD BITS
	6705		/LCMR, THERE IT GOES !
	TAD I MEUAC	/GET USERS AC
	AND C7700	/ EMA INC: NOT ALLOWED!!
	6706		/LFGR, I HOPE THE USER GAVE A 'GO'
	JMP MECLA	/

DORCMR,	TAD COMAND	/READ COMMAND REGISTER
	JMP MECLA	/AND RETURN
DOSKJD,	JMS MONITOR	/WAIT FOR JOB DONE FLAG
	   WAIT
	   MTA
	CLA		/
	TAD I MEUAC	/DON'T DISTURB AC !
	JMP MESKP	/READY, LET BG SKIP

DORMSR,	TAD MESTAT	/GET ERROR-REG.
	JMP MECLA

MEIR,	6714		/IR-SERV-ROUT.
	DCA MESTAT	/STORE STAT-REG.
	6725		/CLEAR FLAGS
	TAD XMTA
	CIF 0
	JMS I ZSOFINT
MESTAT,	0

/VARIABLES:
COMAND,	0
MEUAC,	0
	PAGE		/ >
IFDEF TC58 <
	*0;CDF 10;EMTAB+70;ME
	*0;CDF 10;EMTAB+71;ME
	*0;CDF 10;EMTAB+72;ME
	*0;CDF 10;EMTAB+73;ME

/TASK HEADER:
	*200
	ME		/NAME IS 'ME'
	400		/TWO PAGE TASK

/PAGE HEADER:
XINIT,	INIT
XTABLE,	TABLE
MEBASE,	0		/POINTER TO BASE OF CALLING BG

/TASK CODE:
	JMS I XINIT	/INITIALIZATION
	DCA MEBASE	/
	TAD MEBASE	/PREPARE SOME POINTERS
	TAD (UAC	/
	DCA MEUAC	/
	TAD MEBASE	/
	TAD (UPC	/
	DCA MEUPC	/
	TAD MEBASE	/
	TAD (UINST	/
	JMS DEFER	/GET TRAPPED INSTRUCTION
	AND C37		/ONLY 6700 - 6737
	TAD XTABLE
	DCA ZTEM1	/INDEX IN TABLE
	CDTOIF		//
	TAD I ZTEM1	//
	DCA ZTEM1	//
	CDF 10		/RESTORE DATAFIELD
	JMP I ZTEM1	/
DOMTAF,	6711		/MTCR, CONTROL READY ?
	 SKP		/NO, DON'T CLEAR COMMAND LATCH
	DCA COMAND	/RESET COMMAND REGISTER
DOIT,	TAD I X		/GET INSTRUCTION AGAIN
	DCA MEINST	/AND PUT IT AHEAD
	TAD I MEUAC	/GET USER AC IN AC
MEINST,	HLT		/THE IOT
	 SKP		/JUST IN CASE IT IS A SKIP
MESKP,	 ISZ I MEUPC	/INCREMENT USER PC
	NOP		/SAFETY FIRST
MECLA,	DCA I MEUAC	/RESTORE USER AC
NOOP,	JMS MONITOR	/AND RETURN
	   RETURN	/

DOMTLF,	TAD I MEUAC	/GET USER AC
	DCA MEFLD	/AND STORE FIELD BITS
	JMP NOOP	/

DOMTRC,	TAD COMAND	/OR COMMAND REGISTER INTO AC
	MQL
	TAD I MEUAC
	MQA
	JMP MECLA	/AND STORE RESULT IN AC

DOMTCM,	TAD I MEUAC	/GET USER AC IN MQ
	MQL		/
	TAD COMAND	/
	AND (7707	/CLEAR BIT 6-8
	MQA		/OR AC 0-5, 9-11 IN COMMAND
	DCA COMAND	/NEW VALUE OF COMMAND LATCH
	JMP NOOP	/DO NOT CLEAR THE AC (?)

DOMTSF,	JMS MONITOR	/WAIT FOR DONE FLAG
	   WAIT
	   MTA
	CLA CLL
	JMS GETFLD	/GET USERS FIELD 0 IN CORE
	TAD C6201	/MAKE CDF TO VIRTUAL FIELD 0
	DCA MECDF	/
	CDF 0		//GET REAL CA AND WC FROM FIELD 0
	TAD I (7752	//
	MQL
	TAD I (7753	//
MECDF,	CDF		//SET DATAFIELD TO VIRTUAL FIELD 0
	DCA I (7753	//AND STORE RESULTING WC AND CA
	MQA		//
	DCA I (7752	//
	CDF 10		/RESTORE DATAFIELD
	TAD I MEUAC	/(DON'T DISTURB USER AC)
	JMP MESKP	/LET USER SKIP
DOMTLC,	TAD I MEUAC	/GET USER AC
	DCA COMAND	/AND STORE IN COMMAND LATCH
	JMP NOOP	/DONE

DOMTGO,	JMS GETFLD	/GET VIRTUAL FIELD 0 IN CORE
	CDTOAC		//CHANGE DATAFIELD TO VIRTUAL FIELD 0
	TAD I (7752	//GET USERS CURRENT ADDRESS REGISTER
	MQL		//SAVE FOR A WHILE
	TAD I (7753	//GET WORD COUNT AS WELL
	CDF 0		//NOW ADDRESS REAL FIELD 0
	DCA I (7753	//STORE REAL WORDCOUNT
	MQA		//
	DCA I (7752	//AND CURRENT ADDRESS
	CDF 10		/RESTORE DATAFIELD
	TAD MEFLD	/GET FIELD BITS
	CLL RTL		/SHIFT TO BIT 6-8
	RAL
	JMS GETFLD	/GET TARGET FIELD IN CORE
	CLL RTR		/SHIFT REAL FIELD # TO BITS 9-11
	RAR		/
	6734		/AND LOAD FIELD NUMBER IN CONTROL
	CLA		/
	TAD COMAND	/LOAD COMMAND IN CONTROL
	AND (7773	/
	TAD C4		/
	6716		/MTLC
	CLA		/
	6722		/MTGO START THE TAPE !
	JMP NOOP	/AND RETURN
GETFLD,	0		/ROUTINE TO GET A FIELD IN CORE
	AND C70		/CLEAR GARBAGE
	TAD I MEBASE	/ADD VIRTUAL FIELD BITS TO BG STATUS
	TAD (-EMULATE+INCORE /CLEAR EMULATE, SET INCORE
	DCA I MEBASE	/
	JMS MONITOR	/SIGNAL BACKGROUND SCHEDULER
	   SIGNAL
	   BSSLOT
	TAD MEBASE	/GET USERS EVENT NUMBER
	TAD (USLOT
	JMS DEFER	/
	DCA .+3		/
	JMS MONITOR	/AND WAIT TILL TARGET FIELD IN CORE
	   WAIT
	   0		/(GETS USER EVENT #)
	JMP I GETFLD	/RETURN

COMAND,	0
MEFLD,	0
MEUAC,	0
MEUPC,	0

PAGE
/PAGE HEADER:
TABLE,	NOOP	/6700
	DOMTSF	/6701 MTSF
	DOIT	/6702 
	NOOP	/6703
	DOIT	/6704
	NOOP	/6705
	DOIT	/6706 MTRS
	NOOP	/6707
	NOOP	/6710
	DOIT	/6711 MTCR
	DOMTAF	/6712 MTAF
	NOOP	/6713
	DOMTCM	/6714 MTCM
	NOOP	/6715
	DOMTLC	/6716 MTLC
	NOOP	/6717
	NOOP	/6720
	DOIT	/6721 MTTR
	DOMTGO	/6722 MTGO
	NOOP	/6723
	DOMTRC	/6724 MTRC
	NOOP	/6725
	NOOP	/6726
	NOOP	/6727
	NOOP	/6730
	NOOP	/6731
	NOOP	/6732
	NOOP	/6733
	DOMTLF	/6734 MTLF
	NOOP	/6735
	NOOP	/6736
	NOOP	/6737
MEPAT,	0
/INITIALISATION CODE:
INIT,	0
	DCA ZTEM1	/SAVE AC
	SZL		/EXIT CALL ?
	 JMP MEQUIT	/YES
	TAD ZTEM1
	TAD (UASEM-1	/SETUP POINTER TO UASEM
	DCA MEPAT	/IN OUR BG TABLE
MEASLP,	ISZ MEPAT
	TAD I MEPAT	/LOOK AT ENTRY
	SNA		/IS IT FREE ?
	 JMP MEASFR	/YES, GO PUT IN MY NAME
	CIA
	TAD MENAME	/WAS IT ALREADY USED BY ME ?
	SZA CLA
	 JMP MEASLP	/NO, SOME OTHER TASK, LOOK FOR MORE
MEASFR,	TAD MENAME
	DCA I MEPAT	/OK, PUT MY NAME IN UASEM TABLE
	TAD ZTEM1
	JMP I INIT	/EXECUTE TASK

MEQUIT,	JMS MONITOR	/EXIT
	   EXIT SWPOUT
MENAME,	"M^100+"E&3777

	PAGE		/ >
	$-$-$