                                 ;	KEYBOARD AND TELEPRINTER DRIVER - PART 3
;
;	VERSION	V006A
;		001
;
;	COPYRIGHT 1973,1974 DIGITAL EQUIPMENT CORP. MAYNARD, MASS.
;	ECHO BUFFER INPUT POINTER
	.WORD	EB		;CONSOLE
EPI:	LOC=EB
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON CONSOLE
	.=EPI+TK.NOU+TK.NOU
;	ECHO BUFFER OUTPUT POINTER
	.WORD	EB		;CONSOLE
EPO:	LOC=EB
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+EBSZ
	.WORD	LOC		;NON-CONSOLE
	.=EPO+TK.NOU+TK.NOU
;	TYPE AHEAD BUFFER INPUT POINTERS
	.WORD	KC.BUF		;COMMAND
	.WORD	KI.BUF		;CONSOLE
K.IN:	LOC=KI.BUF
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE

	.=K.IN+TK.NOU+TK.NOU
;	TYPE AHEAD BUFFER OUTPUT POINTER
	.WORD	KC.BUF		;COMMAND
	.WORD	KI.BUF		;CONSOLE
K.OUT:	LOC=KI.BUF
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	.=K.OUT+TK.NOU+TK.NOU
;	TERMINATOR FLAG/RUBOUT MODE
	.WORD	0		;COMMAND
	.WORD	0		;CONSOLE
K.TRM:	K.ROM=.+1
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.=K.TRM+TK.NOU+TK.NOU
;	INTERNAL BYTE COUNT
	.WORD	1		;COMMAND
	.WORD	1		;CONSOLE
K.BC:
	.WORD	1		;NON-CONSOLE
	.WORD	1		;NON-CONSOLE
	.WORD	1		;NON-CONSOLE
	.WORD	1		;NON-CONSOLE
	.WORD	1		;NON-CONSOLE
	.WORD	1		;NON-CONSOLE
	.WORD	1		;NON-CONSOLE
	.WORD	1		;NON-CONSOLE
	.=K.BC+TK.NOU+TK.NOU
;	INTERNAL DATA POINTER
	.WORD	0		;CONSOLE
K.DP:
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.WORD	0		;NON-CONSOLE
	.=K.DP+TK.NOU+TK.NOU
;	BUFFER POINTERS
	.WORD	KC.BUF		;COMMAND
	.WORD	KI.BUF		;CONSOLE
K.BUF:	LOC=KI.BUF
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	LOC=LOC+KBSZ+1
	.WORD	LOC		;NON-CONSOLE
	.=K.BUF+TK.NOU+TK.NOU
;	PTR TO SPECIAL OUTPUT STRING
	.WORD	KO.MA+2		;CONSOLE
K.MPTR:
	.WORD	KO.MA+2		;NON-CONSOLE
	.WORD	KO.MA+2		;NON-CONSOLE
	.WORD	KO.MA+2		;NON-CONSOLE
	.WORD	KO.MA+2		;NON-CONSOLE
	.WORD	KO.MA+2		;NON-CONSOLE
	.WORD	KO.MA+2		;NON-CONSOLE
	.WORD	KO.MA+2		;NON-CONSOLE
	.WORD	KO.MA+2		;NON-CONSOLE
	.=K.MPTR+TK.NOU+TK.NOU
;	ECHO BUFFER POINTERS
	.WORD	EB		;CONSOLE
EBP:	LOC=EB
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	LOC=EB+EBSZ
	.WORD	LOC		;NON CONSOLE
	.=EBP+TK.NOU+TK.NOU
;	OPEN CLOSE FLAG/ECHO SUPPRESS FLAG
	.WORD	0		;ALWAYS 0
	.WORD	0
                        
K.OPF:	K.ESF=.+1
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.=K.OPF+TK.NOU+TK.NOU
;	STORE FOR CONTROL CHARACTERS/EOD FLAG
	.WORD	0		;COMMAND
	.WORD	0
CCTMP:	K.ENFL=.+1
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.WORD	0
	.=CCTMP+TK.NOU+TK.NOU
;	COMMAND BUFFER
	.WORD	0	;CMDST MUST START ON EVEN BOUNDRY .
CMDST:
KC.BUF:	.=.+KBSZ
;	NORMAL BUFFER
	.BYTE	0
KI.BUF:	.=.+KBSZ
	.IFGE	TK.NOU-1
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.IFGE	TK.NOU-2
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.IFGE	TK.NOU-3
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.IFGE	TK.NOU-4
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.IFGE	TK.NOU-5
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.IFGE	TK.NOU-6
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.IFGE	TK.NOU-7
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.IFGE	TK.NOU-8.
	.BYTE	0
	.=.+KBSZ		;NON CONSOLE
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
;	ECHO BUFFER
EB:	.=.+EBSZ		;CONSOLE
	.IFGE	TK.NOU-1
	.=.+EBSZ		;NON-CONSOLE
	.IFGE	TK.NOU-2
	.=.+EBSZ		;NON-CONSOLE
	.IFGE	TK.NOU-3
	.=.+EBSZ		;NON-CONSOLE
	.IFGE	TK.NOU-4
	.=.+EBSZ		;NON-CONSOLE
	.IFGE	TK.NOU-5
	.=.+EBSZ		;NON-CONSOLE
	.IFGE	TK.NOU-6
	.=.+EBSZ		;NON-CONSOLE
	.IFGE	TK.NOU-7
	.=.+EBSZ		;NON-CONSOLE
	.IFGE	TK.NOU-8.
	.=.+EBSZ		;NON-CONSOLE
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
;	CHARACTER CHECK STRING
	.BYTE	177,25,3
KO.MA:KBO.CR:	.BYTE	15,12,0,40,11,13,14,7,10

KO.MB:	.BYTE	15,12,'.,0

	.EVEN
;	DDB'S
;	KB (KEYBOARD)
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN AND LEVEL COUNTS.
	+KB			;DVR ADR.
KBDDB:	+0,0,0,0,0,0,0,0,0,0,0,0 ;STANDARD DDB
	.BYTE	0		;TEMP FOR .READ/.WRITE
	.BYTE	1		;SUSPEND #
	+KBFSZ			;BUFFER SIZE IN BYTES.
	+KBBUF			;PTR TO BUFFER.
	+KBBUF,KBBUF		;IN,OUT CIRCULAR PTRS
	+0			;PTR TO INPUT CHANGE BLOCK
	.BYTE	0		;RESERVED TASK #
	.BYTE	0		;FLAGS
	+0,+0			;ROOM FOR CURRENT CHANGE BLOCK
	.WORD	0		;TIME OUT COUNT/INHIBIT
;
;	KB (TELEPRINTER)
	0,0			;ACTIVE DDB CHAIN
	+0,0,0
	+KB+16

TPDDB:	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	2
	+TPSZ
	+TPBUF,TPBUF,TPBUF
	+0
	.BYTE	0
	.BYTE	SY.DPR
	+0,0
	+0

;NON CONSOLE DDB'S
;	KEYBOARD
	.IFGE	TK.NOU-1
LOC=20
LOCA=0
TTDDB=.+14
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES.
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
                             
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.IFGE	TK.NOU-2
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES.
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.IFGE	TK.NOU-3
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.IFGE	TK.NOU-4
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.IFGE	TK.NOU-5
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.IFGE	TK.NOU-6
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.IFGE	TK.NOU-7
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.IFGE	TK.NOU-8.
	0,0			;ACTIVE DDB CHAIN
	+0,0,0			;MONITOR CHAIN & LEVEL COUNTS
	+TT			;DRIVER ADDRESS
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE	0
	.BYTE	LOC		;SUSPEND #
	LOC=LOC+1
	+KBFSZ			;BUFFER SIZE IN BYTES
	+TKBUF+LOCA	;BUFFER POINTER
	+TKBUF+LOCA	;IN POINTER
	+TKBUF+LOCA	;OUT POINTER
	LOCA=LOCA+KBFSZ
	+0,0,0,0		;PIC, FLAGS, CURRENT CHANGE BLOCK
	+0
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
;	TELEPRINTER
	.IFGE	TK.NOU-1
LOC=30
LOCA=0
TODDB=.+14
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.IFGE	TK.NOU-2
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.IFGE	TK.NOU-3
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.IFGE	TK.NOU-4
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.IFGE	TK.NOU-5
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.IFGE	TK.NOU-6
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.IFGE	TK.NOU-7
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.IFGE	TK.NOU-8.
	0,0			;ACTIVE DDB CHAIN
	+0,0,0,TT+16
	+0,0,0,0,0,0,0,0,0,0,0,0
	.BYTE 0
	.BYTE LOC
	LOC=LOC+1
	+TPSZ,TOBUF+LOCA,TOBUF+LOCA,TOBUF+LOCA
	LOCA=LOCA+TPSZ
	+0
	.BYTE	0,SY.DPR
	+0,0
	+0
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
	.ENDC
;	VECTOR SET UP FOR UNITS 1-N OF NON-CONSOLE
;	TELETYPE
;
;
	.IFNZ	TK.NOU
;
	.ASECT
;
	.IFDF	TT0VCT
TT1VCT=TT0VCT+10
	.ENDC
;
	.IFNDF	TT1VCT
	TT1VCT=310	;DEFAULT
	.ENDC
;
	.=TT1VCT
;
TK.VCT:	.WORD	TK.INT,341,TKO.INT,341	;TT01
	.WORD	TK.INT,342,TKO.INT,342	;TT02
	.WORD	TK.INT,343,TKO.INT,343	;TT03
	.WORD	TK.INT,344,TKO.INT,344	;TT04
	.WORD	TK.INT,345,TKO.INT,345	;TT05
	.WORD	TK.INT,346,TKO.INT,346	;TT06
	.WORD	TK.INT,347,TKO.INT,347	;TT07
	.ENDC
	.CSECT
	.END
                                                                                                                                                   