File F1099.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/TTY DRIVER TASK FOR RTS-8
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1974 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/

/TASK DATA BLOCK:

CUR=	0
INIWT=	0
	IFNDEF	KBDEV	<
KBDEV=	03
TTDEV=	04
	>
	IFNDEF	CONSOL	<CONSOL=1>	/DEFAULT IS CONSOLE
	IFNZRO	CONSOL	<TASK=	TTY>
	IFNDEF	TASK	<TASK=	10>	/A GOOD NUMBER FOR TESTING

KSFX=	KBDEV 10+6001
KCCX=	KBDEV 10+6002
KRSX=	KBDEV 10+6004
KRBX=	KBDEV 10+6006

TSFX=	TTDEV 10+6001
TCFX=	TTDEV 10+6002
TSKX=	TTDEV 10+6005	/PDP 8/E ONLY
TLSX=	TTDEV 10+6006


/THE RTS-8 TELETYPE DRIVER PRINTS AND INPUTS LINES OR CHARACTER
/STRINGS ON A TELETYPE. THE INPUT AND OUTPUT DEVICE CODES OF
/THE TELETYPE ARE SPECIFIED (RESPECIVELY) BY THE PARAMETERS
/"KBDEV" AND "TTDEV".  IF THE PARAMETER "CONSOL" IS NOT DEFINED TO
/BE ZERO, THE TELETYPE IS ASSUMED TO BE THE CONSOLE TELETYPE
/AND WILL INVOKE THE MCR WHENEVER  C IS TYPED ON IT.

/THE FORMAT OF TTY DRIVER MESSAGES ARE:

/WORD 1 	USED AS EVENT FLAG FOR MESSAGE
/WORDS 2-3	USED BY RTS-8
/WORD 4 	FLAGS WORD - FLAGS ARE:
/	BIT 0	0=PACKED OUTPUT MESSAGE, 1=UNPACKED
/	BIT 1	0=PUT CRLF AFTER MESSAGE, 1=DO NOT
/	BIT 2	0=OUTPUT MESSAGE BEGINS AT WORD 6, 1= OUTPUT MESSAGE
/		  POINTED TO BY WORD 6
/	BIT 3	0=INPUT IS LINE ORIENTED, WITH EDITING
/		1=INPUT IS COUNT ORIENTED W/O EDITING OR ECHOING
/	BIT 4	0=PERFORM I/O INDICATED BY OTHER BITS
/		1=ASSIGN TTY DRIVER TO TASK IN BITS 5-11
/    BITS 5-11	MAX # CHARS IN INPUT BUFFER (0 MEANS 4096)
/		OR TASK TO ASSIGN DRIVER TO (IF BIT 4=1)
/WORD 5 	IF ZERO, NO INPUT - ELSE POINTS AT INPUT BUFFER
/WORD 6 	OUTPUT MESSAGE OR POINTER TO MESSAGE
	FIELD CUR%10
	*3000
MEVFLG,
START,	CAL
FLAGS,	SKPINS
HALF,	TTINT
	IFZERO	PDP8E	<	/ONLY NEED 1 SKIP CHAIN ENTRY ON 8/E
	CAL
	SKPINS
	KBINT
	>
TTMSLP, TAD	ASGNEE	/GET ASIGNEE (IF ANY)
	CAL
	RECEIV		/TAKE THE MESSAGE OFF THE Q
MADDR,	0		/GETS ADDRESS OF MESSAGE
	DCA	MSGCDF	/FIELD OF MSG IN AC
	AC7775
	TAD	MADDR
	DCA	MEVFLG	/SAVE MESSAGE EVENT FLAG ADDRESS
	JMS	CDFMSG
	TAD I	MADDR
	DCA	FLAGS	/FIRST WORD OF MESSAGE IS FLAGS
	ISZ	MADDR
	TAD I	MADDR
	DCA	REPLYY	/2D WORD OF MESSAGE IS ADDRESS FOR
	ISZ	MADDR	/REPLY FROM KBD (0 IF NONE WANTED)
	TAD	FLAGS
	AND	(200
	SZA CLA 	/IS THIS AN ASSIGN CALL?
	JMP	ASSIGN	/YES - JUST ASSIGN TTY TO SENDER
	TAD	FLAGS
	RTL
	SMA CLA 	/BIT 1000 OF FLAG WORD INDICATES
	JMP	.+3	/IF MESSAGE OR POINTER TO IT FOLLOWS
	TAD I	MADDR
	DCA	MADDR
	STA
	DCA	HALF	/INITIALIZE LEFT/RIGHT SWITCH
/LOOP TO UNPACK AND OUTPUT MESSAGE

TTOLP,	JMS	CDFMSG
	TAD	FLAGS
	SPA CLA 	/BIT 0 IF FLAG WD TELLS WHETHER
	JMP	ONEPWD	/MESSAGE IS PACKED OR UNPACKED ASCII
	ISZ	HALF	/PACKED - WHICH HALF?
	JMP	RGHTHF
	AC7776
	DCA	HALF
	TAD I	MADDR
	CLL RTR
	RTR
	RTR
	JMP	.+3
RGHTHF, TAD I	MADDR
	ISZ	MADDR
	AND	(77
	SNA
	JMP	CKCRLF
	TAD	(240	/CONVERT SIXBIT TO ASCII
	AND	(77
	TAD	(240
OUTCH,	JMS	TTOUT
	JMP	TTOLP

ONEPWD, TAD I	MADDR
	ISZ	MADDR
	SZA
	JMP	OUTCH
CKCRLF, TAD	FLAGS
	RAL		/BIT 1 OF FLAGS TELLS WHETHER
	SMA CLA 	/TO FOLLOW MESSAGE BY A CR/LF
CTRLU,	JMS	CRLF
	TAD	REPLYY
	SZA		/IS THERE INPUT REQUIRED?
	JMP I	(EOMESS /YES - GO GET IT
EORPLY, CDF CUR 	/HERE IF NO INPUT OR IF INPUT FINISHED
	TAD	MSGCDF
	DCA	MF
	TAD	MEVFLG
	CAL		/POST THE SENDER'S EVENT FLAG
	POST		/SO HE'LL KNOW HE GOT HIS INPUT
MF,	0
	JMP	TTMSLP	/NNNNNNNNNNNNNNNNNNNEXT!

ASSIGN, TAD	FLAGS
	AND	(77	/GET TASK NUMBER
	DCA	ASGNEE	/SAVE AS ASSIGNED TASK
	JMP	EORPLY

ASGNEE, 0		/TASK ASSIGNMENT - 0 MEANS UNASSIGNED
REPLYY, 0		/ADDRESS OF REPLY BUFFER (IF ANY)
/LOW-LEVEL TTY OUTPUT CODE

TTOUT,	0
	DCA	CDFMSG
	CDF CUR
	TAD I	(INCH	/GET THE LAST CHAR TYPED ON THE KEYBOARD
	AND	(177	/STRIP OFF PARITY
	TAD	(-17	/WAS IT  O?
	SNA CLA
	JMP I	TTOUT	/YES - DON'T PRINT NOTHIN
	CAL
	WAITE		/WAIT FOR LAST CHAR TO FINISH
PTTOEV, TTOEV
	ISZ	TTOEV	/SET TTY BUSY  (IN ADVANCE)
	TAD	CDFMSG	/GET CHAR
	TLSX		/OUT WITH IT!
	CLA		/CL(E)A(N) UP
	JMP I	TTOUT

CRLF,	0
	TAD	(215
	JMS	TTOUT
	TAD	(212
	JMS	TTOUT
	JMP I	CRLF

TTINT,	ZBLOCK	2	/USED FOR LINKING INTO SKIP CHAIN
	IFZERO	PDP8E	<TSFX>
	IFNZRO	PDP8E	<TSKX>	/CHECK FOR KEYBOARD OR PRINTER
	JMP I	TTINT
	CDF CIF CUR
	IFNZRO	PDP8E	<
	TSFX		/WHICH ONE?
	JMP I	(KBINT	/KEYBOARD
	>
	CIF 0
	TCFX
	TAD	PTTOEV
	POSTDS		/POST "TTY COMPLETE" EVENT FLAG

TTOEV,	0

CDFMSG, 0
MSGCDF, HLT
	JMP I	CDFMSG
	PAGE
/INPUT REPLY FROM KEYBOARD

EOMESS, DCA	REPLY	/SAVE REPLY BUFFER POINTER IN THIS PAGE
	CDF CUR
	TAD I	(FLAGS
	AND	(177	/GET LOW ORDER BITS OF FLAG WORD
	CIA
RPLYL1, DCA	INPCNT	/SET INPUT CHAR COUNT
RPLYLP, CAL
	WAITE
PTTIEV, TTIEV		/WAIT FOR KEYBOARD STRIKE
	ISZ	TTIEV	/IMMEDIATELY SET EVENT FLAG AGAIN
	TAD I	(FLAGS
	JMS I	(CDFMSG
	AND	(400	/ARE WE EDITING INPUT?
	SZA CLA
	JMP	NOEDIT	/NO - JUST TAKE IT AS IT COMES
	TAD	INCH
	AND	(177	/STRIP PARITY BIT
	TAD	(200	/NOW FORCE IT BACK IN
	DCA I	REPLY	/SAVE CHAR IN REPLY MESSAGE
	TAD I	REPLY
	AND	(177	/AND OUT GOES THE PARITY BIT (AGAIN)
	SZA
	TAD	(-17	/IGNORE NULL AND  O
	SNA
	JMP	RPLYLP
	TAD	(17-176
	SMA SZA
	JMP	RUBOUT	/X - 176  GT 0 -  X MUST BE 177
	SZA
	IAC
	SZA
	TAD	(175-33 /CHECK FOR 3 FLAVORS OF ALTMODE
	SNA
	JMP	ALTMOD	/ALT MODE IS SPECIAL END-OF-LINE DELIMITER
	TAD	(33-15
	SNA		/IS THE CHAR A CARRIAGE RETURN?
	JMP	CARRET
	CDF CUR
	TAD	(15-25
	SNA CLA 	/ U?
	JMP I	(CTRLU	/YES
	ISZ	INPCNT	/IS THERE ROOM IN THE BUFFER?
	JMP	.+3	/YES
	STA
	JMP	RPLYL1	/NO - KEEP IT FULL
	JMS I	(CDFMSG
	TAD I	REPLY	/GET THE CHAR
	JMS I	(TTOUT	/ECHO IT
NEXTCH, ISZ	REPLY	/BUMP POINTER
	JMP	RPLYLP	/CONTINUE

INPCNT, 0
/SPECIAL CHARACTER PROCESSING

RUBOUT, CDF CUR
	TAD I	(REPLYY /AC=1 ON ENTRY!
	CIA
	TAD	REPLY	/ARE WE AT THE BEGINNING
	SPA CLA 	/OF THE REPLY LINE?
	JMP	RPLYLP	/YES
	TAD	(334
	JMS I	(TTOUT	/OUTPUT A BACKSLASH
	STA
	TAD	REPLY
	DCA	REPLY	/BUMP THE POINTER BACK ONE
	STA
	TAD	INPCNT	/REMEMBER TO INCREASE THE COUNT!
	JMP	RPLYL1

ALTMOD, TAD	(44
	JMS I	(TTOUT	/ECHO ALT MODE AS $
	STA		/PUT SPECIAL DELIMITER IN MESSAGE
	JMS I	(CDFMSG

CARRET, DCA I	REPLY	/SET THE LAST CHAR IN THE MESSAGE
	JMS I	(CRLF
	JMP I	(EORPLY

NOEDIT, TAD	INCH
	DCA I	REPLY	/NO PARITY, NO EDITING, NO ECHOING
	ISZ	INPCNT	/IF CONSOL=0, THIS MODE CAN
	JMP	NEXTCH	/BE USED TO READ BINARY PAPER TAPES
	JMP I	(EORPLY
/KEYBOARD INPUT INTERRUPT ROUTINE AND STORAGE

KBINT,	IFZERO	PDP8E	<
	ZBLOCK	2	/FOR LINKING INTO SKIP CHAIN
	KSFX
	JMP I	KBINT
	CDF CIF CUR
	>
	KRBX		/READ CHARACTER AND CLEAR FLAG
	DCA	INCH
	IFNZRO	CONSOL	<
	TAD	INCH
	AND	(177
	TAD	(-3
	SNA CLA 	/CHECK FOR  C TYPED
	JMP	GETMCR	/YES - SET "MCR REQUESTED" EVENT FLAG
	>
	CIF 0
	TAD	PTTIEV
	POSTDS		/POST "KEY STRUCK" EVENT FLAG

	IFNZRO	CONSOL	<
GETMCR, TAD	TTIEV	/ C WILL DELETE ANYTHING WHICH
	SNA CLA 	/IS CURRENTLY IN THE TTY BUFFER
	ISZ	TTIEV	/BY SETTING THE EVENT FLAG NON-ZERO
	CDF CIF 0	/THE MCR IS STARTED UP (IF QUIESCENT) BY
	TAD	(MCREF	/POSTING THE MCR EVENT FLAG IN PAGE 0
	POSTDS		/OF FIELD 0.
	>

REPLY,	0
INCH,	0
TTIEV,	1		/KEYBOARD NOT STRUCK INITIALLY
	PAGE
	$$$



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search