DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦3ef9b0ba1⟧

    Length: 23630 (0x5c4e)
    Notes: pts_type(SC)
    Names: »X.SC«

Derivation

└─⟦245262b9f⟧ Bits:30009679 Philips computer tape "600220"
    └─⟦this⟧ »M:92SP/X.SC« 
└─⟦a25d6defe⟧ Bits:30009676 Philips computer tape "600210"
    └─⟦this⟧ »M:92SP/X.SC« 

PTS(SC)

	IDENT DRKB03 	REL 9.2 79-11-16  870105040920 

* 
******************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRKB01 = DRIVER KEYBOARD
* 
* 
* 
* 
* 
* 
******************************************* 
* 
* 
*    THIS DRIVER HANDLES INPUT FROM NUMERIC 
*    AND ALPHANUMERIC KEYBOARDS PTS 6236, 
*    CONNECTED TO CPU VIA CHLT OR CHRT. 
* 
*    ONLY INPUT DATA FROM DEPRESSED KEYS AND KEY-LOCKS
*    ARE HANDLED BY THE DRIVER. 
* 
*    AN ECHO-DEVICE CAN BE ATTACHED TO EVERY
*    KEYBOARD WHERE RECEIVED CHARACTERS ARE 
*    ECHOED.
* 
*    THE DRIVER CONSISTS OF FOLLOWING PARTS:
* 
*    A C K B : ACTIVATION PART
* 
*    I H K B : INTERRUPT HANDLER
* 
*    E C H O : ECHO HANDLER 
* 
*    R C K B : RECOVERY ROUTINE 
* 
	EJECT
* 
* 
*    THE FOLLOWING ORDERS ARE THREATED: 
* 
*    ORDER 01: BASIC READ 
*    ORDER 02: STANDARD READ
*    ORDER 03: NUMERIC READ 
*    ORDER 31: RESET INPUT BUFFER 
* 
* 
*    NORMAL REGISTER USAGE :
* 
*    REGISTER A1 : RETURN CODE
*             A2 : INPUT CHARACTER
*             A3 : BUFFER INDEX 
*             A4 : WORK REGISTER
*             A5 : STACK BASE 
*             A6 : DWT-ADDRESS
*             A7 : ORDER
*             A8 : ECB-ADDRESS
* 
* 
* 
*    SYSTEM ADAPTATION
* 
*    CODES FOR SPECIAL CHARACTERS CLEAR, BACKSPACE, 
*    MULTIPLE ZERO AND STANDARD EOR MUST BE DEFINED 
*    IN DWT.
* 
*    DWT-ADDRESS OF ECHO-OUTPUT-DEVICE MUST BE
*    DEFINED IN DWT.
* 
*    IF TIMING IS WANTED, TIMER POINTER 
*    IN DWT MUST BE SET UNEQUAL TO ZERO.
*    STANDARD VALUE FOR TIME-OUT IS 30 SECONDS
*    SINCE LAST DEPRESSED KEY. IF ANOTHER VALUE 
*    IS WANTED FOR A SYSTEM, INDICATOR
*    IN DRIVER MUST BE CHANGED. 
* 
*    THE LENGTH OF THE CIRCULAR INPUT BUFFER IS 
*    DEFINED IN DWT. STANDARD VALUE IS 7 CHARACTERS 
*    NOTE !!!  THAT LENGTH MUST BE THE SAME FOR ALL 
*    DWT:S IN SYSTEM
	EJECT
* 
*    BY MEANS OF CONDITIONAL ASSEMBLY IT IS POSSIBLE
*    TO EXCLUDE FROM THE DRIVER FOLLOWING FUNCTIONS:
* 
*    -----ECHO-FUNCTION 
*    -----POWER ON INDICATION 
*    -----TIME-OUT-FUNCTION 
*    -----NUMERIC SHIFT-FUNCTION
*    -----KEYBOARD LOCK IF NO KEYLOCK ON
* 
*   ENTRIES 
* 
* 
	ENTRY	KBAD3	ADDRESS-BLOCK
* 
* 
* 
*    EXTERNAL TOSS MODULE ENTRIES 
* 
* 
* 
	EXTRN	DISIOE	I/O REQUEST ERROR 
	EXTRN	DISEND	END I/O AND GO TO DISPATCHER
	EXTRN	TENDIO	END I/O 
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	LDREG	LOAD REGISTERS A2-A8 AND RETURN
	EXTRN	STREG	STORE REGISTERS AND GO TO DISPATCER
	EXTRN	LDREGE	RETURN FROM ECHOE HANDLING
	EXTRN	LDREGF	PANIK EXTERN
	EXTRN	SETIME	SET TIME
	EXTRN	SETIMP	SET TIME
	EXTRN	SAVE8	SAVE 8 REGISTERS 
	EXTRN	ECHRTN	RETURN FROM ECHO
	EXTRN	ECHO	ECHO ROUTINE
	EXTRN	ECHEND	END OF ECHOING
* 
* 
* 
*     DWT PARAMETERS
* 
* 
* 
	EXTRN	DWTCHP	CHANEL PARAMETER
	EXTRN	DWTST	STATUS 
	EXTRN	DWTBC	BYTE COUNTER 
	EXTRN	DWTADR	DRIVER ADDRESS BLOCK
	EXTRN	DWTA3	SAVE AREA A3 
	EXTRN	DWTA4	SAVE AREA A4 
	EXTRN	DWTA5	SAVE AREA A5 
	EXTRN	DWTSB2	STACK BASE 2 IN DWT 
	EXTRN	DWTECH	ECHO DEVICE DWT 
	EXTRN	DWTTP	TIMER POINTER
	EXTRN	DWTWAT	SAVE INPUT DWT
	EJECT
* 
* 
* 
*     CONSTANTS 
* 
* 
* 
OVMASK	EQU	/2	OVERFLOW IN INPUT BUFFER
* 
X:F	EQU	20	LENGTH OF CIRCULAR INPUT BUFFER
DWTLNG	EQU	120	NUMBER OF BYTES IN DECIMAL FORM
* 
* 
*     TIME BEFORE TIME OUT
* 
TIME	EQU	1200	TIME OUT CONSTANT 
* 
	EJECT
* 
* 
****************************************
*    CONDITIONAL ASSEMBLY              *
****************************************
* 
*    TIME OUT FUNCTION MAY BE EXCLUDED BY 
*    SETTING X:A = 0. 
* 
X:A	EQU	0 
CTIMUT	EQU	1
* 
*    ECHO FUNCTION MAY BE EXCLUDED BY 
*    SETTING X:B = 0. 
* 
X:B	EQU	1 
CECHO	EQU	1 
* 
*      BY SETTING X:E = 1 THE FOLOWING POWER OFF FUNCTION 
*      IS INCLUDED IN THE DRIVER. 
*      IF THERE IS A READ REQUEST THIS IS COMPLETED WITH
*      ZERO IN THE CONTROL WORD OF ECB. 
*      IF THERE IS NO READ REQUEST , THE FIRST READ REQUEST 
*      AFTER POWER ON IS COMPLETED WITH ZERO IN CONTROL WORD
*      OF ECB 
* 
* 
X:E	EQU	0 
POWOFF	EQU	1
* 
* 
* 
*     BY SETTING X:H = 1 THE KEY A15IS USED AS A NUMERIC SHIFT ON KB 71/72
X:H	EQU	0 
NSHIFT	EQU	1
* 
* 
*     BY SETTING X:I = 1 KEYBOARD IS LOCKED IF NO KEYLOCK ON. 
X:I	EQU	0 
KBLOCK	EQU	1
* 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	1
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	0
* 
* 
*   MMU BUFFER SIZE 
* 
* 
X:J	EQU	10
DVBLEN	EQU	040
* 
* 
*   MMU KEY TABLE SIZE
* 
* 
X:K	EQU	10
DVBKTB	EQU	40 
* 
	EJECT
* 
* 
*     DWT-DISPLACEMENT
* 
* 
DWTDRD	EQU	/10	START OF DRIVER DEFINED PART 
* 
	IFT	MMUPAG=0 
START	EQU	DWTDRD
	XIF
* 
	IFT	MMUPAG=1 
START	EQU	DWTDRD+4
	XIF
* 
DWTCON	EQU	START+/00	CONVERSION TABLE 
DWTINQ	EQU	START+/18	POINTER TO FIRST PLACE IN QUEUE
DWTUTQ	EQU	START+/1A	POINTER TO LAST PLACE IN QUEUE 
DWTSQ	EQU	START+/1C	START OF QUEUE
DWTEQ	EQU	DWTSQ+DWTLNG	END OF QUEUE 
* 
*       SPECIAL KEYS DEFINED IN DWT 
* 
* 
* 
KBBSP	EQU	START+/14	BACK-SPACE CHARACTER
KBCLR	EQU	START+/15	CLEAR CHARACTER 
KBMZ2	EQU	START+/17	DOUBLE ZERO CHARACTER 
KBMZ3	EQU	START+/16 
* 
	EJECT
*      TABLES 
* 
* 
	DATA	DVBKTB	MMU KEY TABLE SIZE 
	DATA	DVBLEN	MMU BUFFER SIZE
	DATA	6	DEVICE INDEX
* 
KBAD3	EQU	* 
	DATA	ACKB	ACTIVATION HANDLER 
	DATA	0	ABORT ROUTINE ADDRESS 
	DATA	IHKB	INTERRUPT HANDLER
	IFT	POWOFF=1 
	DATA	RCKB	RECOVERY ROUTINE 
	XIF
	IFT	POWOFF=0 
	DATA	0	NO RECOVERY 
	XIF
* 
	IFT	POWOFF=1 
	EJECT
*    RCKB 
* 
*    RECOVERY PART
* 
* 
RCKB	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	POWOFF=1 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFT	POWOFF=1 
	LD	A3,DWTST,A6	BUSY? 
	RF(NN)	RCKB10
	LDKL	A1,/200 
	ORS	A1,DWTST,A6	INDICATE POWER OFF 
	ABL	TDISP
RCKB10	CF	A5,LDREGE	LOAD REGISTERS
	RF	AKB202
	XIF
	EJECT
* 
* 
*      ACKB 
* 
*      ACTIVATION PART:  CHECS VALIDITY OF ORDERS AND 
* 
*      EXAMINES INPUT BUFFER TO SEE IF SOME QUEUED CHARACTER
* 
*      TO THREAT
* 
* 
* 
* 
ACKB	EQU	*
	LDKL	A1,/FEFF
	ANS	A1,DWTST,A6	RESET INETRRUPT ALLOWED FLAG 
	LDK	A1,0 
	LDK	A3,0	START BUFFER INDEX
	LDR	A4,A7
	RF(NG)	AKB100	ILLEGAL ORDER
	SUK	A4,4 
	RF(N)	AKB200	ORDER 1,2 OR 3
	SUK	A4,/2D 
	RF(Z)	AKB110	ORDER 31
AKB100	ORKL	A1,/8000	I/0 REQUEST ERROR
	ABL	ENDI10 
	EJECT
* 
* 
* 
*      ORDER 31 RESET INPUT BUFFER
* 
* 
* 
AKB110	EQU	*
	LD	A2,DWTINQ,A6
	SCR	A1,A2
	ST	A2,DWTUTQ,A6	RESET OUTPUT QUEUE 
	ABL	ENDIO
* 
	EJECT
* 
* 
*      ORDER 1,2,3
* 
* 
* 
AKB200	EQU	*
	IFT	POWOFF=1 
	LD	A2,DWTST,A6 
	ANKL	A2,/200	POWER OFF?
	RF(E)	AKB205	NO! 
	XRS	A2,DWTST,A6	RESET POWER OFF BIT
AKB202	EQU	*
	CWK	A7,1	IF BASIC READ DON'T COMPLEATE THE REQUEST 
	RF(E)	AKB205 
	CM	10,A8	INDICATE POWER OFF
	RF	AKB218
	XIF
AKB205	EQU	*
	IFT	CTIMUT=1 
	LDR*	A1,A6 
	ANK	A1,/40	TIMING? 
	RF(E)	AKB210	NO TIMING FOR THIS DEVICE!
	LD	A4,DWTTP,A6	CHECK IF ALREADY TIMING 
	RF(E)	AKBTIM 
	LDKL	A4,-TIME
	ST*	A4,DWTTP,A6
	RF	AKB210
AKBTIM	EQU	*
	LDKL	A4,DWTTP	TIMER POINTER
	ADR	A4,A6	ADD DWT-ADDRESS
	LDR	A1,A6
	CF	A15,SETIMP	SET TIME 
	DATA	AKBTUT,TIME	TIME OUT ROUTINE AND TIME 
	ST	A4,DWTTP,A6	STORE TIMER ADDRESS IN DWT
	XIF
* 
	EJECT
*      IF ANY KEY-LOCK: 
* 
*      RESET "CHANGED-KEY" FLAG AND MAKE KEY-CHARACTER
*      OF FLAG. STORE KEY-CHARACTER IN ECB-BUFFER.
*      IN CASE OF STANDARD OR NUMERIC READ MAKE ECB-CODE
*      AND END I/O. ELSE CONTINUE.
* 
* 
AKB210	EQU	*
	LD	A2,DWTST,A6	ANY KEY-LOCK? 
	ANK	A2,/F
	RF(Z)	AKB219 
	SLL	A2,1 
	SRN	A2,A4
	LDR	A1,A4
	CWK	A4,3 
	RF(N)	AKB212 
	RF(P)	AKB211 
	ADK	A4,1 
	RF	AKB212
AKB211	ADR	A4,A4
AKB212	XRS	A4,DWTST,A6	RESET OLD KEY-FLAG 
	LDR	A2,A4
	SLL	A4,4 
	AN	A4,DWTST,A6 
	STR	A4,A15	SAVE A4 
	STR	A3,A15 
	SRN	A2,A3	ORDER 1
	ADR	A3,A3	MAKE CHARACTER FLAG
	LDR	A4,A4
	RF(NE)	AKB213	 
	ADK	A3,1 
AKB213	ADK	A3,/70 
	LDR	A2,A3
	LDR*	A3,A15
	CF	A15,STORE	STORE KEY IN ECB BUFFER 
	LDR*	A4,A15	RESTORE A4 
	CWK	A7,1 
	RF(E)	AKB307	JUMP IF BASIC READ
AKB214	NGR	A2,A1	MAKE ECB CODE
	LDR	A4,A4	KEY FLAG 
	RF(E)	AKB215 
	SUK	A2,4 
AKB215	ST	A2,10,A8	KEY-LOCK CODE IN ECB 
AKB218	ABL	AKB380 
AKB219	LD	A2,4,A8	REQUESTED LENGTH=0
AKB220	ABL(E)	AKB380
AKB225	LDR	A3,A3	FIRTST RIME? 
	RF(NE)	AKB240	N0!
	LD	A1,2,A8	BUFFER ADDRESS
	SUK	A1,1 
	ADR	A1,A2
AKB230	SCR	A3,A1	CLEAR ECB BUFFER 
	SUK	A1,1 
	SUK	A2,1 
	RB(NE)	AKB230
AKB240	EQU	*
	LD	A1,DWTUTQ,A6
	LCR	A2,A1
AKB245	LDR	A4,A2
	XRK	A4,/FF	OVERFLOW? 
	RF(NE)	AKB250	N0!
AKB247	SCR	A4,A1	YES! 
	LDK	A1,OVMASK	OVERFLOW SET 
	ABL	ENDIX	END I/O
AKB250	CW	A1,DWTINQ,A6	SOMETHING IN QUEUE?
	RF(NE)	AKB255	 
	CF	A5,STREG	NOTHING IN QUEUE 
	IFT	CTIMUT=1 
	LDR	A1,A1	CHECK TIME OUT RETURN CODE 
	RF(Z)	AKB257	NO TIME OUT 
	ABL	ENDI05	END I/O AT TIME OUT 
	XIF
	IFT	CTIMUT=0 
	RF	AKB257
	XIF
AKB255	CF	A15,EOQUEU	NEXT OUT POINTER 
	ST	A1,DWTUTQ,A6	STORE NEW POINTER
AKB257	EQU	*
	LDR	A4,A7
	SUK	A4,2 
	RF(NN)	AKB310	ORDER 2 OR 3 
	EJECT
* 
* 
*     ORDER 1 BASIC READ
* 
* 
* 
AKB305	CF	A15,STORE	STORE CHARACTER IN ECB-BUFFER 
	IFT	CECHO=1
	CF	A5,ECHO 
	XIF
AKB307	CW	A3,4,A8 
	RF(E)	AKB380	END I/O IF REQ=EFF LENGTH 
	LD	A2,DWTST,A6	MORE KEYS?
	ANK	A2,/F
	RB(NZ)	AKB210
	RB	AKB225
	EJECT
* 
* 
* 
*      ORDER 2 OR 3   STANDARD AND NUMERIC READ 
* 
*      CHECK IF READ CHARACTER IS FOUND IN KEY-TABLE (IF ANY) 
* 
* 
* 
* 
AKB310	EQU	*
	LD	A1,10,A8	KEY-TABLE ADDRESS
	RF(Z)	AKB360	NO KEY-TABLE
	LCR	A4,A1	KEY-TABLE LENGTH IN A4 
	ANK	A4,/FF 
	ADR	A1,A4	LAST PLACE IN KEY-TABLE
	ADK	A1,1 
AKB355	SUK	A4,1 
	RF(N)	AKB360	KEY NOT FOUND IN KEY-TABLE
	SUK	A1,1	NEXT KEY
	CCR	A2,A1	EOR? 
	RB(NE)	AKB355	NO!
	ADK	A4,1 
	ST	A4,10,A8	STORE INDEX IN CONTROL WORD
	CF	A15,STORE	STORE CHARACTER 
	IFT	CECHO=1
	ORK	A2,/80	INDICATE EOR-CHARACTER
	CF	A5,ECHO	ECHO EOR-CHARACTER
	XIF
	RF	AKB380
AKB360	EQU	*
	LDR	A4,A2
	CC	A4,KBMZ2,A6 
	RF(E)	KBMZ20 
	CC	A4,KBMZ3,A6 
	RF(E)	KBMZ30 
	CC	A4,KBBSP,A6 
	RF(E)	KBSP10 
	CC	A4,KBCLR,A6 
	RF(E)	KBCL10 
	CF	A15,STORE	STORE CHARACTER IN BUFFER 
	LDR	A4,A2
	SUK	A4,/20	CHEC CONVERTED CHARACTER
	RF(N)	AKB364	LESS THAN /20 
	SUK	A4,/5F	CHARACTER > /7F 
	RF(P)	AKB364	YES 
	CWK	A7,2 
	RF(E)	AKB366	STANDARD READ  OK 
	ADK	A4,/4F 
	RF(N)	AKB364 
	SUK	A4,/A
	RF(N)	AKB366	NUMERIC READ  OK
AKB364	LDK	A1,4	ERROR CODE
	RF	ENDIO 
AKB366	EQU	*
	IFT	CECHO=1
	ANK	A2,/7F 
	CF	A5,ECHO 
	XIF
	CW	A3,4,A8	LENGTH OVERFLOW?
AKB367	ABL(L)	AKB210	NO RETURN
AKB368	LDK	A1,8	YES SET ERROR CODE
	RF	ENDIO	END I/O 
	EJECT
KBMZ30	EQU	*	TRIPPLE ZERO 
	LDK	A4,3 
	RF	KBMZ25
KBMZ20	LDK	A4,2	DOUBLE ZERO 
KBMZ25	LDK	A2,/30 
	SUK	A4,1 
	RB(L)	AKB367 
	LDR	A1,A4
	CF	A15,STORE 
	LDR	A4,A1
	IFT	CECHO=1
	CF	A5,ECHO 
	XIF
	CW	A3,4,A8 
	RB(L)	KBMZ25 
KBMZ27	EQU	*
	SUK	A4,1	ANY MORE ZEROES 
	RB(L)	AKB368	NO,SET RETURN CODE
	INH
	LD	A1,DWTUTQ,A6	GET OUTQUEUE POINTER 
	SUR	A1,A6
	CWK	A1,DWTSQ	FIRST POSITION ?
	RF(NE)	KBMZ29	NO 
	LDK	A1,DWTEQ	GET LAST POSITION IN QUEUE
	ADR	A1,A6
	SUK	A1,1 
	RF	KBMZ40
KBMZ29	ADR	A1,A6	GET PREIOUS POINTER POSITION 
	SUK	A1,1 
KBMZ40	CW	A1,DWTINQ,A6	ANY SPACE LEFT ? 
	RF(E)	KBMZ90	NO NOT REALY. 
	ST	A1,DWTUTQ,A6	STORE NEW OUTQUEUE POINTER 
	LDK	A2,/30	STORE ZERO IN CIRKULAR
	SCR	A2,A1	INPUT BUFFER 
	RB	KBMZ27
KBMZ90	EQU	*
	LDK	A4,/FF	INDICATE BUFFER OWERFLOW
	SCR	A4,A1
	ST	A1,DWTUTQ,A6	UPPDATE POINTER
	LDK	A1,/A	SET RETURN CODE FOR BOTH 
ENDIX	RF	ENDIO	LENGTH AND THRUGHPUT ERRORS
* 
* 
* 
KBCL10	EQU	*	CLEAR
	LDK	A3,0 
	LDK	A2,/18 
	RB	AKB366
* 
* 
* 
KBSP10	EQU	*
	LDR	A3,A3
	RF(Z)	KBSP15 
	SUK	A3,1 
	SUR	A2,A2	CLEAR LAST CHAR IN ECB-BUFFER
	CF	A15,STORE 
	SUK	A3,1 
KBSP15	LDK	A2,/8
	RB	AKB366
* 
* 
AKB380	LDK	A1,0	RETURN CODE 
	EJECT
* 
* 
*    THIS IS A COMMON END OF THE DRIVER 
* 
*    SET EFFECTIVE LENGTH AND PERFORM END I/O 
*    ON KEYBOARD AND ECHO-DEVICE
* 
* 
ENDIO	EQU	* 
* 
	INH
	IFT	CTIMUT=1 
	LD	A4,DWTTP,A6 
	RF(E)	ENDI05	NO TIMING ON THIS DEVICE
	CM*	DWTTP,A6	RESET TIMER 
	CM	DWTTP,A6
	XIF
* 
ENDI05	ST	A3,6,A8	STORE EFFECTIVE LENGTH
ENDI10	EQU	*
* 
	IFT	CECHO=1
	LDR	A4,A1	SAVE A1
	CF	A5,ECHEND	END I/O ON ECHO DEVICE
	LDR	A1,A4	RESTORE A1 
	XIF
	ABL	DISEND 
* 
	EJECT
* 
* 
* 
*     IHKB
* 
* 
*     THIS IS THE INTERRUPT HANDLER ENTERED FROM CHLT/CHRT DRIVER 
* 
* 
* 
IHKB	EQU	*
	ANK	A2,/FF 
	CF	A15,KONVER	CONVERT INPUT CHARACTER
	LDR	A4,A4	TEST TYPE OF CHAR
	RF(P)	EXIT	SHIFT/CTRL/SKIP 
	RF(N)	IHKB12	KEY-LOCK

	LD	A3,DWTST,A6	NORMAL CHAR 
	IFT	KBLOCK=1 
	ANK	A3,/FF 
	RF(Z)	EXIT 
	LD	A3,DWTST,A6	I/O REQUEST?
	XIF
	RF(N)	IHKB15	NO READ REQUEST PENDING 
	SLL	A3,7	INTERRUPT ALLOWED ? 
	RF(NN)	IHKB15	NO, STORE CHARACTER IN DWT-BUFFER
	IFT	CTIMUT=1 
	LD	A3,DWTTP,A6 
	RF(E)	IHKB07	NO TIMING ON THIS DEVICE
	LDKL	A3,-TIME	RESTART TIME 
	ST*	A3,DWTTP,A6
	XIF
IHKB07	ABL	LDREG	RETURN TO READ ROUTINE 
IHKB12	CF	A15,KEYSET	SET KEY CODE IN DWT
	LDR	A3,A3
	RF(Z)	EXIT	NO KEY CHANGE 
	LD	A3,DWTST,A6 
	RF(N)	EXIT	NO READ REQUEST PENDING 
	SLL	A3,7 
	RF(NN)	EXIT	INERRUPT NOT ALLOWED 
	LD	A3,DWTA3,A6	RESTORE BUFFER INDEX
	LDKL	A5,DWTSB2 
	ADR	A5,A6
	ABL	AKB210 

IHKB15	LD	A1,DWTINQ,A6
	LCR	A4,A1
	XRK	A4,/FF	ALREADY OVERFLOW? 
	RF(E)	EXIT	YES 
	LDR	A3,A1
	CF	A15,EOQUEU	GET NEXT OUTQUEUE POINTER ADDRESS
	CW	A1,DWTUTQ,A6	OVERFLOW?
	RF(NZ)	IHKB20	SAVE KEY-LOCK IF ANY 
	ORK	A2,/FF	SET OVERFLOWBIT IN INPUT BUFFER 
	RF	IHKB30
IHKB20	ST	A1,DWTINQ,A6	STORE INQUEUE POINTER
IHKB30	SCR	A2,A3
EXIT	ABL	TDISP
* 
	EJECT
* 
* 
* 
*     AKBTUT
* 
*     THIS IS THE TIME-OUT ROUTINE
* 
* 
* 
	IFT	CTIMUT=1 
AKBTUT	EQU	*
	LDR	A6,A1	RESTART DWT-ADDRESS
	LDK	A1,/40	SET RETURNE CODE
	CM	DWTTP,A6
	LD	A2,DWTST,A6 
	RB(N)	EXIT	DISPATCH IF NO REQUEST ON 
	RB	IHKB07	RESTORE REGISTER AND END I/O 
	XIF
	EJECT
* 
* 
* 
* 
*    KEYSET 
* 
* 
* 
*     ON ENTRY:  A4= NEG KEY-LOCK VALUE 
* 
*     ON EXIT:   A3= ZERO IF IF NO CHANGE IN KEYS, ELSE POS 
* 
* 
KEYSET	EQU	*
	STR	A4,A15 
	LD	A3,DWTST,A6 
	LDKL	A2,/100 
SET100	SRL	A2,1 
	ADK	A4,2	IN A4: 1=OFF  0=ON
	RB(N)	SET100 
	ANR	A3,A2	CHEC OLD KEY POSITION
	RF(NZ)	SET300	JUMP IF KEY ON 
	LDR	A4,A4
	RF(NZ)	SET500
	RF	SET400
SET300	LDR	A4,A4
	RF(Z)	SET500 
SET400	LD	A3,DWTST,A6 
	XRR	A3,A2
	SRL	A2,4 
	ORR	A2,A3
	ST	A2,DWTST,A6 
	LDK	A3,1	A3=1 IF KEY LOCK HAS CHANGED
SET500	LDR*	A4,A15
	RTN	A15
	EJECT
* 
* 
* 
*     KONVER
* 
*     KONVER CONVERTS INPUT CHARACTER 
* 
* 
*     ON ENTRY: A2= INPUT CHARACTER 
* 
* 
*     ON EXIT:  A2=COVERTED CHARACTER 
*               A4= NEG IF KEY-LOCK, ZERO IF CHARACTER,POS IF CTRL,SHIFT
*               A5 IS DESTROYED!
* 
* 
KONVER	EQU	*
	LDR	A4,A2
	IFT	NSHIFT=0 
	SUK	A4,/7C	CODE > /7B
	RF(NN)	KON500	YES
	LDR	A4,A2	RESTORE CHARACTER
	XIF
	STR	A2,A15	STORE CHARACTER IN CASE OF NO CONVERSION
	LDR*	A5,A6 
	SUK	A4,/20 
	RF(N)	KON105	FUNCTION
KON100	SUK	A4,/40 
	RF(N)	KON180	ALFANUMERIC 
	SUK	A4,/10	FUNCTION
	RF(NN)	KON110	NO 
	SUK	A2,/40	YES 
KON105	EQU	*
	ANK	A5,/10 
	SRL	A5,3 
	RF	KON200
KON110	SUK	A4,8	(UN)CTRL OR (UN)SHIFT 
	RF(N)	KON400	KEY-LOCK
	RF(Z)	KON140	SHIFT ON
	SUK	A4,2 
	RF(N)	KON160	SHIFT OFF 
	RF(Z)	KON170	CONTROL ON
	IFT	NSHIFT=1 
	SUK	A4,2 
	RF(N)	KON125	CONTROL OFF 
	RF(E)	KON140	NUMERICAL SHIFT ON
	RF	KON160	NUMERICAL SHIFT OFF
	XIF
KON125	EQU	*
	LDKL	A2,/FFDF	UNCTRL 
KON120	ANR	A5,A2
KON130	STR	A5,A6	DWTCHP 
	LDK	A4,/10 
	RF	KON400	GO HOME! 
KON140	EQU	*
	IFT	NSHIFT=1 
	LDR	A4,A5
	ANK	A4,/10 
	RF(Z)	KON145	SHIFT NOT ON
	LDK	A2,/90 
	RF	KON150
	XIF
KON145	EQU	*
	LDK	A2,/10	SHIFT 
KON150	ORR	A5,A2
	RB	KON130
KON160	EQU	*
	IFT	NSHIFT=1 
	LDR	A4,A5
	ANK	A4,/80 
	RF(Z)	KON165 
	LDKL	A2,/FF7F
	RB	KON120
	XIF
KON165	EQU	*
	LDKL	A2,/FFEF
	RB	KON120
	RB	KON120
KON170	LDK	A2,/20	CTRL
	RB	KON150
KON180	SUK	A2,/20	FIND INDEX
	ANK	A5,/30 
	SRL	A5,3 
	ADK	A5,4 
KON200	LD	A4,DWTCON,A6	GET CONVERSION TABLE ADDRESS 
	ADR	A4,A5
	LDR*	A4,A4 
	RF(Z)	KON400 
	ADR	A4,A2
	LDR*	A2,A15	RESTORE A2 AND A15-STACK 
	LCR	A2,A4	GET CHARACTER FROM TABLE 
KON250	LDK	A4,0	A4=0 IF NOT KEY-LOCK$$
KON300	RTN	A15
KON400	LDR*	A2,A15	NO CONVERSION, KEEP CHARACTER
	RB	KON300
	IFT	NSHIFT=0 
KON500	EQU	*
	LDR	A4,A4	KEY CODE /7C 
	RF(Z)	KON600	YES 
	LDK	A4,1	INDICATE SKIP CHARACTER 
	RTN	A15
KON600	EQU	*
	SUR	A2,A2
	RB	KONVER	DO START AGAIN 
	XIF
	EJECT
* 
*    STORE = SUBROUTINE TO STORE A CHARACTER IN 
*            ECB-BUFFER AND INCREMENT BUFFER INDEX
* 
*    ON ENTRY:
* 
*    A2 = CHARACTER TO STORE
*    A3 = BUFFER INDEX
* 
* 
STORE	EQU	* 
	LD	A4,2,A8	BUFFER ADDRESS
	ADR	A4,A3	ADD BUFFER INDEX 
	SCR	A2,A4	STORE CHARACTER IN BUFFER
	ADK	A3,1	INCREMENT BUFFER INDEX
STORTN	ADKL	A15,2 
	LDR*	P,A15 
	EJECT
* 
* 
*    EOQUEU = SUBROUTINE TO GET NEXT QUEUE POINTER
* 
*    ON ENTRY:
* 
*    A1 = QUEUE POINTER 
*    A6 = DWT-ADDRESS 
* 
*    ON EXIT: 
* 
*    A1 = NEW QUEUE POINTER 
EOQUEU	EQU	*
	ADK	A1,1 
	SUR	A1,A6
	CWK	A1,DWTEQ	END OF QUEUE? 
	RF(NE)	EOQU10
	LDK	A1,DWTSQ	SET QUEUE START ADDRESS 
EOQU10	ADR	A1,A6
	RB	STORTN
	END

Full view