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

⟦45b089063⟧

    Length: 26816 (0x68c0)
    Notes: pts_type(SC)
    Names: »DRKB01.SC«

Derivation

└─⟦dab19bdd7⟧ Bits:30009677 Philips computer tape "600218"
    └─⟦this⟧ »M:261/DRKB01.SC« 

PTS(SC)

	IDENT DRKB01 	9.2DK 1 79-11-16  870105040920 

			=DK1, TIME OUT =2400 
			80-03-11 

* 
* 
******************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRKB01 = DRIVER KEYBOARD
* 
* 
* 
* 
* 
* 
******************************************* 
* 
* 
*    THIS DRIVER HANDLES INPUT FROM NUMERIC 
*    AND ALPHANUMERIC KEYBOARDS PTS 6231, 
*    6232, 6233, 6234, 6331,AND 6342
*    CONNECTED TO CPU VIA CHLT OR CHRT. 
* 
*    ONLY INPUT DATA FROM DEPRESSED KEYS
*    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 04: 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
* 
	EJECT
* 
* 
*    SYSTEM ADAPTATION
* 
*    KEYBOARD TYPE MUST BE DEFINED IN FIRST WORD
*    IN DWT. BIT 10 IS RELEVANT FOR ALPHANUMERIC READ 
*    AND BIT 11 FOR NUMERIC READ. 
* 
*    BIT 10 = 0 FOR PTS 6231, 6233, 6234
*    BIT 10 = 1 FOR PTS 6232, 6331 AND 6342 
*    BIT 11 = 0 FOR ALL KEYBOARDS BUT PTS 6342 AND 6234 
*    BIT 11 = 1 FOR PTS 6234,6342 
* 
*    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 
*    -----STANDARD READ 
*    -----TIME-OUT-FUNCTION 
*    -----CODE CONVERSION VIA "8-BIT" SETTING 
*         AND CONVERSION TABLES 
*    BY MEANS OF CONDITIONAL ASSEMBLY IT IS ALSO
*    POSSIBLE TO GIVE A KEY THE MEANING OF TWO, 
*    THREE OR MORE ZEROES.
* 
*    THE DRIVER IS PREPARED TO HANDLE THE SPECIAL 
*    NORWAY-PROBLEM, WITH BETWEEN THEMSELVES
*    DEPENDENT KEYBOARDS CONNECTED TO THE SAME
*    SELECTOR UNIT. 
*    BY ASSEMBLING THE DRIVER CONDITIONALLY THIS
*    FUNCTION IS INCLUDED.
	EJECT
* 
* 
**************
* ENTRIES    *
**************
* 
	ENTRY	KBAD	ADDRESS-BLOCK 
	ENTRY	EOQUEU	QUEUE POINTER ROUTINE 
	ENTRY	DWTINQ,DWTUTQ	QUEUE POINTERS 
* 
* 
* 
**********************************************
*    EXTERNAL TOSS MODULE ENTRIES            *
**********************************************
* 
	EXTRN	DISIOE	I/0 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,A3,A5,A7,A8 AND RETURN 
	EXTRN	STREG	STORE REGISTERS AND GO TO DISPATCHER 
	EXTRN	LDREGE	RETURN FROM ECHO HANDLING 
	EXTRN	LDREGF 
	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 ECHO 
* 
	EJECT
* 
************************* 
*    DWT PARAMETERS     * 
************************* 
* 
	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	DWTTP	TIMER POINTER
	EXTRN	DWTWAT	SAVE INPUT DWT
* 
*************** 
*  CONSTANTS  * 
*************** 
* 
OVMASK	EQU	/2	OVERFLOW IN INPUT BUFFER
* 
X:F	EQU	8	LENGTH OF CIRCULAR INPUT BUFFER 
DWTLNG	EQU	40	NUMBER OF BYTES IN DECIMAL FORM 
* 
*    TIME BEFORE TIME-OUT 
* 
TIME	EQU	2400	TIME OUT CONSTANT (FROM 300)	DK1
* 
	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 
* 
*    STANDARD READ MAY BE EXCLUDED BY 
*    SETTING X:C = 0. 
* 
X:C	EQU	1 
CSTAND	EQU	1
* 
*    DOUBLE ZERO MAY BE INCLUDED IN SYSTEM
*    BY SETTING X:D = 2. SETTING X:D
*    = 3 GIVES A THREE ZERO FUNCTION AND
*    X:D = 4 GIVES FOUR-ZERO FUNCTION AND SO ON 
*    X:D = 0 EXCLUDES THE MULTIPLE ZERO FUNCTION
* 
X:D	EQU	2 
CMULTZ	EQU	2
* 
	EJECT
* 
*    BY SETTING X:E = 1 FOLLOWING POWER OFF FUNCTION
*    CAN BE INCLUDED IN THE DRIVER. 
*    IF THERE IS A READ REQUEST, THIS IS COMPLETED WITH -2
*    SET IN THE CONTROL WORD OF ECB. IF NOT A POWER OFF FLAG
*    IS SET, CAUSING THE FIRST READ REQUEST AFTER POWER ON TO 
*    BE COMPLETED WITH CONTROL WORD SET TO -2.
* 
X:E	EQU	0 
POWOFF	EQU	1
**
**
*    BY SETTING X:G TO 1 THE CODE CONVERSION VIA
*    "8-BIT" SETTING AND CONVERSION TABLES IS 
*    INCLUDED IN THE DRIVER.
**
X:G	EQU	0 
CONVER	EQU	1

* 
* 
*   THIS DRIVER CAN BE MADE TO HANDLE CREDIT ORDERS 
*   BY SETTING CREDIT = 1 
*   ORDER /04 IS THEN REPLACED BY ORDER /31 
*    BY SETTING CREDIT=1 THIS DRIVER INDEX THE EOR-KEYS 
*     IN THE FOLOWING WAY: THE FIRST KEY IN THE EOR-KEY-TABLE 
*    IS GIVEN INDEX =1, THE SECOND EOR-KEY IS GIVEN INDEX=1 
*    AND SO ON.   (INDEX= 1,2,3,4,... ) 
*    CONTROL WORD OF ECB IS SET TO ZERO INSTED OF -2
* 
* 

CREDIT	EQU	1
* 
*    BY SETTING NOLJE=1 THIS DRIVER IS PREPARED 
*    TO HANDLE THE NORWAY-CASE WITH BETWEEN 
*    THEMSELVES DEPENDENT KEYBOARDS ON THE
*    SAME SELECTOR UNIT.
* 
NOLJE	EQU	0 
* 
*	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 
KBEOF	EQU	START+/16	EOR-CHARACTER 
KBMZ	EQU	START+/17	DOUBLE ZERO CHARACTER
* 
	EJECT
* 
* 
**************
* TABLES     *
**************
* 
	DATA	DVBKTB	KEY TABLE SIZE 
	DATA	DVBLEN	MMU BUFFER SIZE
	DATA	6	DEVICE INDEX
KBAD	EQU	*
	DATA	ACKB	ACTIVATION DRIVER
	DATA	0	ABORT ROUTINE ADDRESS 
	DATA	IHKB	INTERRUPT HANDLER
* 
	IFF	POWOFF=1 
* 
	DATA	0	NO RECOVERY 
* 
	XIF
* 
* 
	IFT	POWOFF=1 
* 
	DATA	RCKB	RECOVERY ROUTINE 
	EJECT
* 
* 
*    R C K B
* 
*    THIS IS THE RECOVERY ROUTINE FOR KEYBOARD
*    ENTERED FROM CHLT/CHRT DRIVER
* 
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 OCCURED 
	ABL	TDISP
RCKB10	CF	A5,LDREGE	LOAD REGISTERS
	RF	AKB202
* 
	XIF
* 
	EJECT
* 
* 
*    A C K B
* 
*    ACTIVATION PART: 
* 
*    CHECKS VALIDITY OF ORDERS AND EXAMINES 
*    INPUT BUFFER TO SEE IF SOME QUEUED 
*    TO THREAT. 
* 
* 
ACKB	EQU	*
	LDKL	A1,/FEFF
	ANS	A1,DWTST,A6	RESET INTERRUPTS ALLOWED FLAG
	LDK	A1,0 
	LDK	A3,0	START BUFFER INDEX
	LDR	A4,A7
	RF(NG)	AKB100	ILLEGEAL ORDER 
	IFT	NOLJE=1
	CWK	A7,/37	SELECT KEYBOARD 
	RF(E)	AKBSEL 
	XIF
	IFT	CSTAND=0 
	SUK	A4,2 
	RF(Z)	AKB100	STANDARD READ NOT ALLOWED 
	ADK	A4,2 
	XIF

	SUK	A4,4 

	IFT	CREDIT=1 
	SUK	A4,/2D 
	RF(Z)	CRE:10	SKIP INPUT BUFFER 
	ADK	A4,/2D 
CRE:10	EQU	*
	XIF
	RF(Z)	AKB110	ORDER 4 
	RF(N)	AKB200	ORDER 1,2 OR 3
AKB100	ORKL	A1,/8000	I/O REQUEST ERROR
	ABL	ENDI10 
	EJECT
* 
* 
*    ORDER 4 RESET INPUT BUFFER 
* 
AKB110	LD	A2,DWTINQ,A6	ORDER 4
	SCR	A1,A2	RESET OVERFLOW IF OCCURED
	ST	A2,DWTUTQ,A6	RESET OUTPUT QUEUE 
	ABL	ENDI05	END I/O 
	IFT	NOLJE=1
* 
* 
*    ORDER 37  SELECT KEYBOARD
* 
AKBSEL	LDKL	A2,/FF7F
	ANRS	A2,A6	RESET ALLOW BITS IN DWTCHP
	ABL	ENDI10 
	XIF
	EJECT
* 
* 
*    ORDER 1   2   3
* 
* 
AKB200	EQU	*
* 
	IFT	POWOFF=1 
* 
	LD	A2,DWTST,A6 
	ANKL	A2,/200	POWER OFF ? 
	RF(E)	AKB205 
	XRS	A2,DWTST,A6	RESET BIT
	XIF
AKB202	EQU	*
	IFT	CREDIT-POWOFF=-1 
	LDKL	A1,-2	INDICATE POWER ON 
	ST	A1,10,A8
	XIF
	IFT	CREDIT+POWOFF=2
	CM	10,A8	INDICATE POWER ON 
	XIF
	IFT	POWOFF=1 
	ABL	AKB380 
* 
	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 
	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
* 
AKB210	LD	A2,4,A8	REQUESTED LENGTH
AKB220	RF(E)	AKB380	RESET A1 AND END I/O
	LDR	A3,A3	FIRST TIME ? 
	RF(NE)	AKB240	NO 
	LD	A1,2,A8	BUFFER ADDRESS
	SUK	A1,1 
	ADR	A1,A2	ADDRESS IN BUFFER
AKB230	SCR	A3,A1	STORE CHARACTER
	SUK	A1,1	NEXT CHAR. POSITION 
	SUK	A2,1	LAST ?
	RB(NE)	AKB230	NO 
	EJECT
* 
*    READ CHARACTER FROM INPUT BUFFER OR
*    WAIT FOR KEY-BOARD INTERRUPT 
* 
AKB240	EQU	*
	LD	A1,DWTUTQ,A6
	LCR	A2,A1	CHAR. TO A2
	LDR	A4,A2
	XRK	A4,/FF	OVERFLOW ?
	RF(NE)	AKB250
	SCR	A4,A1	RESET OVERFLOW MARK
	LDK	A1,OVMASK	OVERFLOW SET 
	RF	ENDIO 
AKB250	CW	A1,DWTINQ,A6	SOMETHING IN QUEUE?
	RF(NE)	AKB260
	CF	A5,STREG	NOTHING IN QUEUE 
	IFT	CTIMUT=1 
	LDR	A1,A1	CHECK TIME OUT RETURN CODE 
	RF(Z)	AKB270	NO TIME-OUT 
	RF	ENDI05	END I/O AT TIME OUT
	XIF
	IFT	CTIMUT=0 
	RF	AKB270
	XIF
AKB260	CF	A15,EOQUEU	NEXT OUT QUEUE POINTER 
	ST	A1,DWTUTQ,A6	STORE NEW POINTER
AKB270	LDR	A4,A7
	SUK	A4,2 
	RF(NN)	AKB310	ORDER 2 OR 3 
	EJECT
* 
* 
*    ORDER 1  BASIC READ
* 
	CF	A15,STORE	STORE CHARACTER IN ECB-BUFFER 
	IFT	CECHO=1
	CF	A5,ECHO	ECHO INPUTTED CHARACTER 
	XIF
	CW	A3,4,A8	EFFECTIVE LENGTH = REQ. LENGTH? 
	RB	AKB220
	EJECT
* 
* 
*    ORDER 2 OR 3   STANDARD AND NUMERIC READ 
* 
*    CHECK IF READ CHARACTER IS FOUND IN KEY-TABLE
* 
* 
AKB310	LD	A1,10,A8	KEY-TABLE ADDRESS
	RF(Z)	AKB359	NO KEYTABLE 
	LCR	A4,A1	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-CHARACTER? 
	RB(NE)	AKB355	NO 
	IFT	CREDIT=0 
	ADR	A4,A4	YES DOUBLE INDEX 
	XIF
	IFT	CREDIT=1 
	ADK	A4,1	INDEX STARTS AT ONE,INCR=1
	XIF
	ST	A4,10,A8	STORE INDEX IN CONTROLWORD 
AKB358	CF	A15,STORE	STORE CHARACTER 
	RF	AKB370
* 
* 
AKB359	CC	A2,KBEOF,A6	STANDARD END OF RECORD KEY
	RB(E)	AKB358	YES 
	EJECT
* 
*    CHARACTER NOT FOUND IN KEY-TABLE.
*    CHECK CHARACTER CODE.
* 
AKB360	EQU	*
	CF	A5,CHEK	CHECK CHARACTER 
	LDR*	A4,A6	GET CHANNEL PARAMETER 
	ANK	A4,/20	SHIFT BIT 9 ? 
	RF(E)	AKB361	YES 
	LDR	A4,A2	CHARACTER
	RF	AKB363
AKB361	EQU	*
	LDR*	A4,A6 
	ANK	A4,/10	PTS 6234 ?
	RF(E)	AKB362 
	LDR	A4,A2
	ANK	A4,/80 
	RF(NE)	AKB362
	LDR	A4,A2
	RF	AKB363
AKB362	EQU	*
	LDR	A4,A2	CHARACTER
	ANK	A4,/BF	RESET BIT 9 
AKB363	EQU	*
	IFF	CMULTZ=0 
	CC	A4,KBMZ,A6	MULTIPLE ZERO ?
	RF(E)	KBMZ10	YES!
	XIF
	CC	A4,KBCLR,A6	CLEAR?
	RF(E)	KBCL10 
	CC	A4,KBBSP,A6	BACKSPACE?
	RF(E)	KBSP10 
	LDR	A1,A1	RETURN CODE? 
	RF(NE)	AKB369	YES,STORE AND END I/O
	CF	A15,STORE 
AKB365	EQU	*
	IFT	CECHO=1
	CF	A5,ECHO	ECHOCHARACTER 
	XIF
	CW	A3,4,A8	LENGTH OVERFLOW?
	RB(L)	AKB210	NO
AKB368	LDK	A1,8	SET RETURN CODE 
	RF	ENDIO	AND END I/O 
AKB369	CF	A15,STORE	STORE CHARACTER IN ECB BUFFER 
	RF	ENDIO	END I/O REQUEST 
	EJECT
* 
* 
*    CHECK CODE OF END OF RECORD KEY
* 
* 
AKB370	EQU	*
	IFT	CECHO=1
	CF	A5,CHEK	CHECK CHARACTER 
	ORK	A2,/80	INDICATE END OF RECORD
	LDR	A1,A1	RETURN CODE? 
	RF(NE)	AKB380
	CF	A5,ECHO	ECHO CHARACTER
* 
	XIF
* 
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	* 
* 
	IFT	CTIMUT=1 
	INH
	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	END I/O ON KEYBOARD AND DISPATCH
	EJECT
* 
*    MULTIPLE ZERO
* 
	IFF	CMULTZ=0 
KBMZ10	EQU	*
	LDK	A4,CMULTZ	LOAD NUMBER OF ZEROES
KBMZ20	LDK	A2,/30	ZERO TO STORE AND ECHO
	SUK	A4,1 
	RB(L)	AKB240	ALL DONE
	LDR	A1,A4	SAVE A4
	CF	A15,STORE	STORE ZOERO IN ECB-BUFFER 
	LDR	A4,A1	RESTORE A4 
* 
	IFT	CECHO=1
* 
	CF	A5,ECHO	ECHO ZERO 
	XIF
* 
* 
	IFF	CMULTZ=0 
* 
	CW	A3,4,A8	LENGTH OVERFLOW ? 
	RB(L)	KBMZ20	NO
KBMZ25	SUK	A4,1	ANY MORE ZEROES TO STORE ?
	RB(L)	AKB368	NO
	INH
	LD	A1,DWTUTQ,A6	GET OUTQUEUE POINTER 
	SUR	A1,A6
	CWK	A1,DWTSQ	FIRST POSITION ?
	RF(NE)	KBMZ30	NO 
	LDK	A1,DWTEQ	GET LAST POSITION IN QUEUE
	ADR	A1,A6
	SUK	A1,1 
	RF	KBMZ40
KBMZ30	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	KBMZ25	ONCE MORE TIME !!
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 
	RB	ENDIO	LENGTH AND THRUGHPUT ERRORS 
	XIF
* 
*    CLEAR
* 
KBCL10	LDK	A3,0	RESET BUFFER INDEX
	LDK	A2,/18	CHANGE CHARACTER-CODE 
	RB	AKB365
* 
*    BACKSPACE
* 
KBSP10	LDR	A3,A3	FIRST CHARACTER? 
	RF(Z)	KBSP15 
	SUK	A3,1	DECREMENT BUFFER INDEX
	LDK	A2,/00	CLEAR ECB-BUFFER
	CF	A15,STORE 
	SUK	A3,1	DECREMENT INDEX 
KBSP15	LDK	A2,/8	CHANGE CHARACTER-CODE
	RB	AKB365
	EJECT
* 
*    C H E K
* 
* 
*    SUBROUTINE TO CHECK INPUT CHARACTER
* 
*    ON ENTRY:
* 
*    A2 = CHARACTER 
*    A3 = BUFFER INDEX
*    A6 = DWT-ADDRESS 
*    A7 = ORDER 
* 
* 
*    ON EXIT: 
* 
*    A1 = RETURN CODE 
* 
CHEK	EQU	*
	STR	A2,A15	SAVE A2 ON STACK
	ANK	A2,/FF 
	LDR*	A1,A6	CHANNEL PARAMETER 
* 
	IFT	CSTAND=1 
* 
	CWK	A7,2	ORDER 2?
	RF(NE)	CHEK05	NO 
	ANK	A1,/20 
	ORK	A1,/5F	5F OR 7F AS UPPER LIMIT 
	LDK	A4,/20	LOWER LIMIT 
	RF	CHEK08
* 
	XIF
* 
CHEK05	ANK	A1,/10 
	RF(NE)	CHEK06
	ANK	A2,/3F	RESET BIT 9 
CHEK06	LDK	A1,/39	UPPER LIMIT 
	LDK	A4,/30	LOWER LIMIT 
CHEK08	SUR	A1,A2
	RF(N)	CHERRO	CODE CHECK ERROR
	SUR	A4,A2
	RF(P)	CHERRO	CODE CHECK ERROR
	LDR*	A1,A15
CHEK10	LDK	A1,0	RETURN CODE 
CHEK20	RTN	A5 
* 
* 
*    CODE CHECK ERROR 
* 
CHERRO	LDK	A1,4	SET RETURN CODE AND RETURN
	LDR*	A2,A15	RELOAD CHARACTER 
	RB	CHEK20
	EJECT
* 
* 
*    I H K B
* 
*    THIS IS THE INTERRUPT HANDLER ENTERED FROM CHLT/CHRT DRIVER
* 
* 
IHKB	EQU	*
	IFT	NOLJE=1
	LDR*	A3,A6	GET ALLOW BITS
	ANK	A3,/C0 
	RF(E)	IHNOL3	INPUT ALLOWED FROM BOTH KEYBOARDS 
	LDK	A4,1 
	ANK	A3,/80 
	RF(E)	IHNOL1 
	LDK	A4,5 
IHNOL1	LDR	A3,A2
	SRL	A3,12
	CWR	A3,A4
	RF(NE)	EXIT
IHNOL2	EQU	*
	XIF
* 
	IFT	CONVER=1 
* 
	LDR	A4,A2	INPUT WORD 
	SRL	A4,11	DEVICE ADDRESS * 2 
	ANK	A4,/E
	CC	A4,DWTBC,A6	8-BIT SETTING ? 
	RF(NE)	IHKB03
	LDR	A3,A2
	ANK	A3,/3F 
	SUK	A3,/30 
	RF(N)	IHKB01 
	SUK	A3,/A
	RF(N)	IHKB02 
IHKB01	ORK	A2,/80 
	RF	IHKB04
IHKB02	ANKL	A2,/FF3F
	RF	IHKB04
IHKB03	LD	A3,DWTCON,A6	CONVERSION TABLE ADDRESS 
	RF(E)	IHKB04 
	LDR	A4,A2
	ANK	A4,/FF 
	SRL	A4,3	LINE INDEX
	ADR	A3,A4
	LDR*	A3,A3	COLUMN TABLE ADDRESS
	RF(E)	IHKB04 
	LDR	A4,A2
	ANK	A4,/F
	ADR	A3,A4	ADD ROW INDEX
	LCR	A2,A3	GET CHARACTER
IHKB04	EQU	*
* 
	XIF
* 
* 
	IFT	NOLJE=1
* 
	LDR	A3,A2
	ANK	A3,/3F 
	SUK	A3,/22 
	RF(Z)	IHNOL6 
	SUK	A3,1 
	RF(NZ)	IHNOL8
	RF	IHNOL7
IHNOL6	ADK	A2,7 
IHNOL7	ANKL	A2,/FF3F
IHNOL8	EQU	*
* 
	XIF
* 
	LD	A3,DWTST,A6	I/O REQUEST?
	RF(N)	IHKB10 
	SLL	A3,7	INTERRUPTS ALLOWED? 
	RF(NN)	IHKB10	NO,STORE CHARACTER IN DWT-BUFFER 
* 
	IFT	CTIMUT=1 
* 
	LD	A3,DWTTP,A6 
	RF(E)	IHKB05	NO TIMING ON THIS DEVICE
	LDKL	A3,-TIME	RESTART TIME 
	ST*	A3,DWTTP,A6
* 
	XIF
* 
IHKB05	ABL	LDREG	RETURN TO READ ROUTINE 
IHKB10	LD	A1,DWTINQ,A6
	LCR	A4,A1
	XRK	A4,/FF	ALREADY OVERFLOW ?
	RF(E)	EXIT	YES 
	LDR	A3,A1
	CF	A15,EOQUEU	GET NEXT QUEUE POINTER ADDRESS 
	CW	A1,DWTUTQ,A6	OVERFLOW?
	RF(NE)	IHKB20	NO!
	ORK	A2,/FF	SET OVERFLOW BIT IN INPUT BUFFER
	RF	IHKB30
IHKB20	ST	A1,DWTINQ,A6	STORE INQUEUE POINTER
IHKB30	SCR	A2,A3	STORE CHARACTER IN INPUT BUFFER
EXIT	ABL	TDISP
	IFT	NOLJE=1
IHNOL3	LDR	A3,A2
	SRL	A3,12
	LDK	A4,/40 
	SUK	A3,1 
	RF(E)	IHNOL4 
	LDK	A4,/80 
	SUK	A3,4 
	RB(NE)	IHNOL2
IHNOL4	ORRS	A4,A6	SET ALLOW BIT 
	RB	IHNOL2
	XIF
	EJECT
* 
* 
*    A K B T U T
* 
*    THIS IS THE TIME-OUT ROUTINE 
* 
* 
	IFT	CTIMUT=1 
* 
AKBTUT	EQU	*
	LDR	A6,A1	GET DWT-ADDRESS
	CM	DWTTP,A6
	LD	A1,DWTST,A6 
	RB(N)	EXIT 
	LDK	A1,/40	SET RETURN CODE 
	RB	IHKB05	RESTORE REGISTERS AND END I/O
* 
	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
	ANK	A2,/7F 
	RF	EOQU20	RTN A15 AND ENB
	EJECT
* 
* 
*    EOQUEU = SUBROUTINE TO GET NEXT QUEUE POINTER
* 
*    ON ENTRY:
* 
*    A1 = QUEUE POINTER 
*    A6 = DWT-ADDRESS 
* 
*    ON EXIT: 
* 
*    A1 = NEW QUEUE POINTER 
EOQUEU	EQU	*
	INH
	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
EOQU20	ADKL	A15,2	RETURN AND ENABLE 
	ENB
	LDR*	P,A15 
* 
	END

Full view