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

/VE.TK 9-SEP-80
/EMULATOR FOR VENUS INPUT/OUTPUT VIA PDP8
/SERIAL INTERFACE.
/THIS TASK IS USED TO CONNECT A VENUS TERMINAL
/VIRTUALLY TO A USER TERMINAL. ONCE CONNECTED, THE TASK
/IS UNACCESSABLE FOR OTHER USERS, UNTIL THE USER RETURNS
/TO THE OS/8 MONITOR (JMP TO 07600).
/THIS EMULATOR EMULATES ALL REASONABLE INSTRUCTIONS
/WITH DEVICE CODE XX/YY
/	6XX1		/SKIP IF INPUT FROM VENUS FLAG SET
/	6XX2		/CLEAR INPUT FLAG
/	6XX4		/CLEAR FLAG, READ INPUT CHAR.
/	6XX6		/CLEAR FLAG, READ INPUT CHAR.
/
/	6YY1		/SKIP IF OUTPUT TO VENUS IS DONE
/	6YY2		/CLEAR OUTPUT FLAG
/	6YY4		/CLEAR FLAG, SEND CHAR TO VENUS
/	6YY6		/CLEAR FLAG, SEND CHAR TO VENUS
/
/ALL OTHER IOTS WITH DEVICE CODE XX/YY ARE TREATED AS NOP.
/CHARACTERS SEND TO THE VENUS ARE "DIRECTLY" EMULATED.
/CHARACTERS RECIEVED FROM THE VENUS ARE STORED INTO
/A CYCLIC BUFFER (400 LOCS) IN ORDER TO PREVENT OVERRUN
/DUE TO HIGH BAUDRATE.
/REMEMBER IT IS NOT ALWAYS POSSIBLE TO STOP OUTPUT FROM
/THE VENUS-PROCESSOR.
/IF OVERRUN OCCURS, THE THE NEXT CHARACTER TAKEN FROM THE
/INPUT BUFFER (IOT 6XX4/6XX6) IS FLAGGED WITH AN ERROR BIT
/(BIT 0), SO THE BG CAN TEST FOR THIS CONDITION.
/
XXIOT=VENUS&770;YYIOT=XXIOT+10		/DEVICE CODE=XX/YY
/
*0			/PUT "VE" IN EMTAB
	CDF 10		/EMTAB IS IN FLD 1
	XXIOT%10+EMTAB
	"V^100+"E	/"VE"
*0
	CDF 10
	YYIOT%10+EMTAB
	"V^100+"E

PAGE
	"V^100+"E	/NAME IS "VE"
	601		/3 PAGES, 1 CONNECT
	VENUSI		/CONNECT "VENUSI"
	VENINP		/TO VENINP
FNCTAB,
IFZERO VENUS&10 <
	VENOP		/6XX0 IS NOP
	VESKP		/6XX1 IS SKIP IF INPUT FLAG
	VECLR		/6XX2 IS CLEAR FLAG
	VENOP		/6XX3 IS NOP
	VEINP		/6XX4 IS INPUT CHAR
	VENOP		/6XX5 IS NOP
	VEINP		/6XX6 IS INPUT CHAR
	VENOP		/6XX7 IS NOP
	>
	VONOP		/6YY0 IS NOP
	VOSKP		/6YY1 IS SKIP ON FLAG
	VOCLR		/6YY2 IS CLEAR FLAG
	VONOP		/6YY3 IS NOP
	VOOUT		/6YY4 IS OUTPUT CHAR
	VONOP		/6YY5 IS NOP
	VOOUT		/6YY6 IS OUTPUT CHAR
	VONOP		/6YY7 IS NOP
IFNZRO VENUS&10 <
	VENOP		/6XX0 IS NOP
	VESKP		/6XX1 IS SKIP IF INPUT FLAG
	VECLR		/6XX2 IS CLEAR FLAG
	VENOP		/6XX3 IS NOP
	VEINP		/6XX4 IS INPUT CHAR
	VENOP		/6XX5 IS NOP
	VEINP		/6XX6 IS INPUT CHAR
	VENOP		/6XX7 IS NOP
	>
XINIT,	VEINIT		/INITIALIZE
XBUF,	VEBUF
PUTPNT,	VEBUF
GETPNT,	VEBUF
INPCNT,	0		/FREE LOCS FOR INPUT CHARS
/
VE,	JMS I XINIT	//INIT, WILL BE SZL CLA
	 JMP VEQUIT	//USER WANTS TO QUIT
	TAD I VEUINS	//EXAMINE INSTRUCTION
	AND C17		//GET CODE
	TAD (JMP I FNCTAB	//MAKE INDIRECT JUMP
	DCA .+1		//EXECUTE INLINE
	JMP I FNCTAB
/
VOOUT,	TAD (-DGNTICK
	JMS MONITOR	/WAIT FOR OUTPUT READY
	 WAIT
	 VENUSO		/TRANSMITTER
	AC0003		/READY OR TIMEOUT
	XXIOT+6005	/ENABLE INTERRUPT&ERRORS
	CLA CLL
	CDF 10
	TAD I VEUAC	//GET CHAR.
	YYIOT+6006	//SEND IT OVER
VERET,	DCA VENOUT	//SET OR CLEAR OUT SWITCH
VENOP,
VONOP,	JMS MONITOR	//AND RETURN
	   RETURN

VOSKP,	ISZ I VEUPC	//UPDATE UPC
	JMP VONOP
/SKIP IF CHARACTER IN INPUT BUFFER
/
VESKP,	TAD INPCNT	/SEE IF EMPTY
	TAD (400
	SZA CLA
	 JMP VOSKP	/NOT EMPTY
	TAD VENOUT	/DID USER USE VENUS OUT ?
	TAD I VEUFIN	/DOES USER HAVE TYPE-IN ?
	SZA CLA
	JMP VERET	/YES, BUT VENUS EMPTY
	JMS MONITOR
	   STALL	/WAIT A WHILE
	   1
	CLA
	JMP VERET	/TRY AGAIN
/
/INPUT A CHARACTER FROM THE BUFFER
/
VEINP,	CDTOIF
	TAD INPCNT	/NO:WAS THERE A CHARACTER ??
	TAD (400	/-400 IS EMPTY
	SZA CLA
	 JMP NOWAIT	/YES, PROCES CHAR.
	TAD VECHR	/GIVE BG LAST CHAR.
	JMP CHRPUT
NOWAIT,	CLA CMA		/DECREMENT COUNT
	IOF		/DON'T LET VENUS INTERFERE
	TAD INPCNT
	DCA INPCNT
	ION		/INTRPT ON AFTER NEXT INSTR
	TAD I GETPNT	/GET NEW CHAR.
	TAD ERRBIT	/ADD ERROR BIT IF ANY
	CDF 10
	DCA I VEUAC	//STORE CHAR IN UAC
	TAD GETPNT	//UPDATE PNTR
	IAC
	AND (377	//WRAP IF NECESSARY
	TAD XBUF
	DCA GETPNT
	DCA ERRBIT	//CLEAR ERROR BIT
	JMP VENOP
/
VECLR,	CDTOIF
	DCA I GETPNT
	JMP VEINP

VOCLR,			/CLEAR IS CLEAR AC
CHRPUT,	CDF 10
	DCA I VEUAC	//TO USER AC
	JMP VENOP
/
VEQUIT,	JMS MONITOR	//SWAP OUT
	   RETURN CLEAR SWPOUT
/VENUS CAUSES AN INTERRUPT
/
VENINP,	XXIOT+6006	///CLEAR,READ CHAR.
	DCA VECHR	///SAVE TEMP.
	TAD INPCNT	///SEE IF THERE IS SPACE
	SNA
	 JMP INPERR	///NO SPACE
	IAC
	DCA INPCNT	///UPDATE COUNT
	TAD VECHR	///GET CHAR.
	DCA I PUTPNT	///TO BUFFER
	TAD PUTPNT	///UPDATE PNTR
	IAC
	AND (377
	TAD XBUF
	DCA PUTPNT
	JMP INPRET
INPERR,	CLA CLL CML RAR	///SET ERROR BIT TO 4000
	DCA ERRBIT
INPRET,	CIF CDF 00	///
	JMP I ZFSTEXT	///EXIT

VECHR,	0		/TEMP.
VEUAC,	X		/WILL BE INITIALIZED
VEUINS,	X		/WILL BE INITIALIZED
VEUPC,	X		/WILL BE INITIALIZED
VEUFIN,	X		/WILL BE INITIALIZED
ERRBIT,	0		/4000 IF OVERRUN
VENOUT,	1		/OUTPUT SWITCH

PAGE
/THIS PAGE IS USED ONCE FOR INITIALIZING, THEN
/IT IS USED FOR BUFFER SPACE.
/
VEBUF,	VE
XVEUAC,	VEUAC
XVEUIN,	VEUINS
XVEUPC,	VEUPC
XVEUFI,	VEUFIN
XVECNT,	INPCNT
VEBASE,	0
	/0
VEINIT,	0		/INITIALIZE SOME POINTERS
	DCA VEBASE
	TAD VEBASE
	CDTOIF
	TAD (UAC
	DCA I XVEUAC	/SET VEUAC
	TAD VEBASE
	TAD (UINST
	DCA I XVEUIN	/SET VEUINS
	TAD VEBASE
	TAD (UPC	/SET VEUPC
	DCA I XVEUPC
	TAD VEBASE
	TAD (UBUFIN
	DCA I XVEUFI	/SET UBUFIN
	TAD (SZL CLA
	DCA I VEBUF	/CHANGE JMS INIT
	TAD C7400	/OPEN INPUT
	DCA I XVECNT
	TAD VEBASE
	TAD (UASEM-1	/FIND FREE UASEM ENTRY
	DCA ZTEM1
VEUALP,	CDF 10
	ISZ ZTEM1
	TAD I ZTEM1	/SEARCH
	SNA		/IS IT FREE ?
	JMP VEUAFR	/YES
	CIA
	TAD VENAME	/IS IT MY NAME ?
	SZA CLA
	JMP VEUALP	/NO, SEARCH
VEUAFR,	TAD VENAME
	DCA I ZTEM1	/STORE NAME
	ISZ VEINIT	/SKIP OVER JMP VEQUIT
	JMP I VEINIT	/RETURN
VENAME,	"V^100+"E&3777

PAGE
	ZBLOCK 200	/BUFFER SPACE
$$$$