DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

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

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦59ffcc0c3⟧ TextFile

    Length: 33892 (0x8464)
    Types: TextFile
    Names: »KEYB.SRC«

Derivation

└─⟦af81bc460⟧ Bits:30005550 8" CR80 Floppy CR80FD_0034 ( MATRIX Source and Abs-files )
└─⟦af81bc460⟧ Intel_ISIS_II
    └─ ⟦this⟧ »KEYB.SRC« 

TextFile

;******************************************************************************\r
;*                                                                            *\r
;* D O R A     A P P L I C A T I O N     S / W                                *\r
;*                                                                            *\r
;* DEVICE: MATRIX (I/F 104)                                                   *\r
;*                                                                            *\r
;* MODULE: KEYBOARD MODULE                                                    *\r
;*                                                                            *\r
;******************************************************************************\r
\r
	PUBLIC	TIMSCA		; SCAN ROUTINE\r
	PUBLIC	TIMOUT		; TIMEOUT ROUTINE\r
	PUBLIC	TIMOCC		; OCCUPIED ROUTINE\r
	PUBLIC	TIMIMP		; IMPOSSIBLE CONNECTION ROUTINE\r
	PUBLIC	KEYB		; KEYBOARD PROCESS\r
	PUBLIC	STAC06\r
;\r
	PUBLIC	CONDIT,STATUS,COUNT2	; DATA-BYTES USED IN PANEL PROCESS\r
;\r
;	QUEUE HEADS :\r
	EXTRN	QSK,QIK,QKI,QEK,QKE,QKT,QEMPTY\r
;\r
	EXTRN	SET,KR12,LOGDST,ACTTYP,DSTADR,KRNO,TEXT,LOGSRC,IOADDR\r
	EXTRN	SUBDEQ,SUBENQ,SCOMMON,ESTABR,SUSPND,UPDATE\r
	EXTRN	SYSRAM,INVEST,CPSTAT,TBONAIR\r
;\r
; INPUT / OUTPUT PORTS :\r
*************************\r
PORT1	EQU	0028H\r
PORT2	EQU	0020H\r
PORT3	EQU	0038H\r
PORT4	EQU	0030H\r
PORT5	EQU	0039H\r
PORT6	EQU	0031H\r
PORT7	EQU	003AH\r
PORT8	EQU	0032H\r
PORT9	EQU	003CH\r
PORT10	EQU	0034H\r
PORT11	EQU	0048H\r
PORT12	EQU	0040H\r
PORT13	EQU	0049H\r
PORT14	EQU	0041H\r
PORT15	EQU	4049H\r
PORT16	EQU	404AH\r
PORT17	EQU	404CH\r
PORT18	EQU	002AH\r
PORT19	EQU	002CH\r
PORT20	EQU	4020H\r
PORT21	EQU	4010H\r
PORT23	EQU	0029H\r
PORT24	EQU	0021H\r
PORT25	EQU	0010H\r
PORT27	EQU	0012H\r
PORT29	EQU	0018H\r
PORT31	EQU	001AH\r
PORT69	EQU	4011H\r
PORT70	EQU	4012H\r
PORT71	EQU	4014H\r
PORT72	EQU	4018H\r
PORT73	EQU	4019H\r
PORT74	EQU	401AH\r
PORT75	EQU	401CH\r
;\r
TSCAN	EQU	0001H		; SCAN-ROUTINE TIMER\r
TOUT	EQU	0002H		; TIMEOUT\r
TOCC	EQU	0003H		; OCCUPIED TIMER\r
TIMP	EQU	0004H		; IMPOSS. CONN. TIMER\r
;\r
KEYBOA	EQU	 6H		; KEYBOARD PROCESS\r
KPANEL	EQU	 7H		; PANEL PROCESS\r
STATNR	EQU	 8H		; STATUS TRANSMITTING PROCESS\r
EXECUT	EQU	 9H		; EXECUTE PROCESS\r
;\r
LINK	EQU	 0H\r
;\r
	DSEG\r
\r
STATUS	DS	 1H\r
OUTPUT	DS	 1H\r
CONDIT	DS	 1H\r
BUFF	DS	 3H\r
BUFFS	DS	 3H\r
COUNT2	DS	 1H\r
INPUT	DS	 3H\r
STROBE	DS	 1H\r
CHANGE	DS	 1H\r
IOVALU	DS	30H\r
STAC06	DS	20H\r
\r
;	ACTIVATE  MACRO\r
;	PASSIVATE MACRO\r
;\r
	NLIST	S\r
;\r
ACTIVATE	MACRO	#ID,#NO\r
					;DESRIP: THE MODULE ACTIVATES\r
					;	SPECIFIED PROCES.\r
					;	IF LINK IS SET AND PASSIV\r
					;	SPECIAL PROCESS IS ACTIVATED\r
					;	THE LINK-ELEMENT IS \r
					;	INCREMENTED\r
					;DESTR:	REG F,H,L\r
	IF	'#ID'.EQ.'S'\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	IF	LINK.EQ.1\r
	BIT	7,(HL)			;\r
	JR	NZ,O#$YM		;IF PROCESS WAS NOT ACTIVE THEN\r
	LD	HL,SYSRAM+0FBH		;BEGIN\r
	INC	(HL)			;INC LINK-ELEMENT\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;END\r
O#$YM:	ENDIF\r
	ENDIF\r
	IF	'#ID'.EQ.'N'\r
	LD	HL,SYSRAM+200H+S*10H+#NO*20H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	ENDIF\r
	SET	7,(HL)			;ACTIVATE\r
	ENDM\r
;\r
PASSIVATE	MACRO	#ID,#NO\r
					;DESRIP: THE MODULE PASSIVATES\r
					;	SPECIFIED PROCES.\r
					;	IF LINK IS SET AND ACTIV\r
					;	SPECIAL PROCESS IS PASSIVATED\r
					;	THE LINK-ELEMENT IS \r
					;	DECREMENTED\r
					;DESTR:	REG F,H,L\r
	IF	'#ID'.EQ.'S'\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	IF	LINK.EQ.1\r
	BIT	7,(HL)			;\r
	JR	Z,O#$YM			;IF PROCESS WAS NOT PASSIVE THEN\r
	LD	HL,SYSRAM+0FBH		;BEGIN\r
	DEC	(HL)			;DEC LINK-ELEMENT\r
	LD	HL,SYSRAM+200H+#NO*10H+5\r
					;END\r
O#$YM:	ENDIF\r
	ENDIF\r
	IF	'#ID'.EQ.'N'\r
	LD	HL,SYSRAM+200H+S*10H+#NO*20H+5\r
					;IMPLEMENT ADD OF STATUS-BIT\r
	ENDIF\r
	RES	7,(HL)			;PASSIVATE\r
	ENDM\r
;\r
	LIST	S\r
;\r
	CSEG\r
;\r
*******************************************************************************\r
*			KEYBOARD SCAN - ROUTINE				      *\r
*******************************************************************************\r
;\r
;	THE SCAN-ROUTINE IS CALLED BY THE TIMER-PROCESS AS A SUBROUTINE.\r
;	MESSAGES FROM THE SCAN-ROUTINE IS ENQUEUED IN THE QUEUE QSK.\r
;\r
;\r
;\r
; INPUT PORTS:	BC =	NAME =\r
; ============  ====    ======\r
; PORT1 	0	KRE1\r
; PORT3	 	1	SET1\r
; PORT5		2	SET2\r
; PORT7	 	3	SET3\r
; PORT9	 	4	SET4\r
; PORT11	5	TEXT3\r
; PORT13	6	TEXT4\r
; PORT15	7	KR1\r
; PORT16	8	KR2\r
; PORT17	9	KR1/2\r
; PORT18	A	KR38\r
; PORT19	B	KR39\r
; PORT21	C	TEST\r
; PORT23	D	V1\r
; PORT69	E	TALLY IN 1\r
; PORT70	F	    -\r
; PORT71       10	    -\r
; PORT72       11	    -\r
; PORT73       12	    -\r
; PORT74       13       TALLY IN 2\r
; PORT75       14 	    -\r
;\r
;\r
;	E N T R Y :\r
*******************************************************************************\r
;\r
;---------------------------------------------------------------------------\r
; ON AIR SCANNING ROUTINE :\r
\r
TIMSCA	LD	HL,TBONAIR-1\r
	LD	BC,0EH\r
\r
ONLOOP:	PUSH 	HL\r
	PUSH	BC\r
	CALL	IOREAD		;SCAN ON AIR-PORT\r
	LD	D,C		;SAVE PORT VALUE IN (D)\r
	LD	E,A		;SAVE ON AIR CHANGE-INDICATION\r
	POP	BC\r
	POP	HL\r
	JR	NZ,O0\r
	LD	DE,8\r
	ADD	HL,DE\r
	JR	O5\r
				;IF ON AIR CHANGE INDICATION THEN\r
				;BEGIN\r
O0:	LD	A,8		;\r
O0A:	PUSH	AF		;  SAVE BIT-COUNTER\r
	INC	HL		;  NEXT ON AIR CONVERSION TABLE-ADDRESS\r
	RR	D		;  NEXT ON AIR-BIT\r
	RR	E		;  NEXT ON AIR CHANGE-BIT\r
	JR	NC,O4		;\r
	LD	A,(HL)		;  GET CORRESPONDING DESTINATION NO.\r
	CP	00		;\r
	JR	Z,O4		;  IF CHANGE IN VALID ON AIR-BIT THEN\r
				;  BEGIN\r
	PUSH	HL		;\r
	PUSH	BC		;\r
	PUSH	DE		;\r
	LD	C,A		;\r
	LD	B,0		;\r
	LD	HL,CPSTAT-1	;    FIND CORRESPONDING DESTINATION CELL\r
	ADD	HL,BC		;    IN DYNAMIC	TABLE\r
	BIT	7,E		;\r
	JR	Z,O1		;    IF OFF AIR THEN\r
	RES	7,(HL)		;    RESET BIT 7\r
	JR	O2		;    ELSE\r
O1:	SET	7,(HL)		;    SET BIT 7\r
O2:	PUSH	BC		;\r
	LD	HL,QEMPTY	;\r
	CALL	SUBDEQ		;\r
	POP	BC		;\r
	JR	NC,O3		;    IF BUFFERS IN EMPTY BUFFER QUEUE THEN\r
				;    BEGIN\r
	PUSH	DE		;\r
	POP	IX		;\r
	LD	A,08H		;\r
	LD	(IX+2),A	;      INSERT ON AIR BUFFER CODE\r
	LD	A,0		;\r
	LD	(IX+3),A	;      INSERT DUMMY SOURCE NO.\r
	LD	(IX+4),C	;      INSERT DESTINATION NO.\r
	LD	HL,QKE		;\r
	CALL	SUBENQ		;      SEND BUFFER TO EXECUTE PROCESS AND\r
	ACTIVATE S,EXECUT	;      ACTIVATE EXECUTE PROCESS\r
				;    END\r
O3:	POP	DE		;\r
	POP	BC		;\r
	POP	HL		;  END\r
				;\r
O4:	POP	AF		;  GET BIT-COUNTER\r
	DEC	A		;\r
	JR	NZ,O0A		;  IF MORE BITS IN PORT, GOTO O0 ELSE\r
				;END OF PORT\r
O5:	INC	C\r
	LD	A,15H\r
	CP	C\r
	JR	NZ,ONLOOP	;IF MORE ON AIR-PORTS GOTO ONLOOP\r
\r
\r
;----------------------------------------------------------------------------\r
	LD	IX,INPUT\r
	LD	BC,000DH	;   SCAN PORT V1\r
	CALL	IOREAD		;   ============\r
	JR	Z,SCAN3\r
	AND	E		;   UPDATE STROBE BYTE\r
	LD	(STROBE),A\r
;\r
	BIT	0,C		;   CHECK KRE1 STROBE\r
				;   -----------------\r
	JR	NZ,SCAN1	;   IF STROBE ACTIV, THEN\r
				;   BEGIN:\r
	LD	BC,PORT1	;     SCAN KRE1\r
	IN	A,(C)\r
	LD	(IX),01H	;     ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),A\r
	CALL	QUEUE\r
				;   END\r
;\r
				;   IF PORT-V1 VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
SCAN1	LD	A,(STROBE)	;     CHECK TAKE BIT\r
	BIT	1,A		;     --------------\r
	JR	Z,SCAN2		;     IF TAKE BIT IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),0AH	;       ENQUEUE MESSAGE INTO QSK\r
	CALL	QUEUE\r
				;     END\r
;\r
SCAN2	LD	A,(STROBE)	;     CHECK COMPUTER ON/OFF BIT\r
	BIT	2,A		;     -------------------------\r
	JR	Z,SCAN3		;     IF COMPUTER ON/OFF BIT IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),0BH	;       ENQUEUE MESSAGE INTO QSK\r
	CALL	QUEUE\r
				;     END\r
;\r
SCAN3	LD	BC,0AH		;\r
	CALL	IOREAD		;     SCAN KR38\r
	JR	Z,SCAN4		;     IF INPUT-VALUE HAS CHANGED, THEN\r
				;     BEGIN:\r
	LD	(IX),07H	;\r
	LD	(IX+1),C	;       ENQUEUE MESSAGE INTO QSK\r
	CALL	QUEUE		;\r
				;     END\r
;\r
SCAN4	LD	BC,0BH		;\r
	CALL	IOREAD		;     SCAN KR39\r
	JR	Z,SCAN5		;     IF INPUT-VALUE HAS CHANGED, THEN\r
				;     BEGIN:\r
	LD	(IX),08H	;\r
	LD	(IX+1),C	;       ENQUEUE MESSAGE INTO QSK\r
	CALL	QUEUE		;\r
				;     END\r
				;   END\r
;\r
SCAN5	LD	BC,0001H	;   SCAN SET1 PORT\r
	CALL	IOREAD		;   ==============\r
	JR	Z,SCAN6		;   IF INPUT-VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
	BIT	7,C		;     CHECK SET1 STROBE\r
	JR	NZ,SCAN6	;     IF STROBE IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),02H	;       ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),C\r
	LD	(IX+2),00H\r
	CALL	QUEUE\r
	JR	SCAN9		;       GO TO SCAN9\r
				;     END\r
				;   END\r
;\r
SCAN6	LD	BC,0002H	;   SCAN SET2 PORT\r
	CALL 	IOREAD		;   ==============\r
	JR	Z,SCAN7		;   IF INPUT-VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
	BIT	7,C		;     CHECK SET2 STROBE\r
	JR	NZ,SCAN7	;     IF STROBE IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),02H	;       ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),C\r
	LD	(IX+2),14H\r
	CALL	QUEUE\r
	JR	SCAN9		;       GO TO SCAN9\r
				;     END\r
				;   END\r
;\r
SCAN7	LD	BC,0003H	;   SCAN SET3 PORT\r
	CALL	IOREAD		;   ==============\r
	JR	Z,SCAN8		;   IF INPUT-VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
	BIT	7,C		;     CHECK SET3 STROBE\r
	JR	NZ,SCAN8	;     IF STROBE IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),02H	;       ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),C\r
	LD	(IX+2),28H\r
	CALL	QUEUE\r
	JR	SCAN9		;       GO TO SCAN9\r
				;     END\r
				;   END\r
;\r
SCAN8	LD	BC,0004H	;   SCAN SET4 PORT\r
	CALL	IOREAD		;   ==============\r
	JR	Z,SCAN9		;   IF INPUT-VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
	BIT	7,C		;     CHECK SET4 STROBE\r
	JR	NZ,SCAN9	;     IF STROBE IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),02H	;       ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),C\r
	LD	(IX+2),3CH\r
	CALL	QUEUE\r
				;     END\r
				;   END\r
;\r
SCAN9	LD	BC,0005H	;   SCAN TEXT3 PORT\r
	CALL	IOREAD		;   ===============\r
	JR	Z,SCAN10	;   IF INPUT-VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
	BIT	7,C		;     CHECK TEXT3 STROBE\r
	JR	NZ,SCAN10	;     IF STROBE IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),03H	;       ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),C\r
	CALL	QUEUE\r
				;     END\r
				;   END\r
;\r;\r
SCAN10	LD	BC,0006H	;   SCAN TEXT4 PORT\r
	CALL	IOREAD		;   ===============\r
	JR	Z,SCAN11	;   IF INPUT-VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
	BIT	7,C		;     CHECK TEXT4 STROBE\r
	JR	NZ,SCAN11	;     IF STROBE IS ACTIV, THEN\r
				;     BEGIN:\r
	LD	(IX),04H	;       ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),C\r
	CALL	QUEUE\r
				;     END\r
				;   END\r
;\r
SCAN11	LD	BC,0009H	;   SCAN KR1\r
	CALL	IOREAD		;   ================\r
	PUSH	BC\r
	POP	IY\r
	LD	(CHANGE),A	;   SAVE PORT17 (KR1/2) CHANGES\r
	LD	BC,7\r
	CALL	IOREAD		;   SCAN PORT15 (KR1)\r
	AND	0FFH\r
	JP	NZ,KR1OUT	;   IF CHANGES IN PORT15 (KR1), GOTO KR1OUT\r
	LD	A,(CHANGE)	;   RESTORE PORT17 CHANGES\r
	AND	03H\r
	JP	Z,SCAN12	;   IF CHANGES IN PORT17 (KR1), THEN\r
				;   BEGIN\r
KR1OUT:	LD	A,C\r
	PUSH	IY\r
	POP	BC		;     (C) = KR1 Z6,Z5\r
	LD	B,A		;     (B) = KR1 Z4,Z3,Z2,Z1,D,C,B,A\r
	BIT	1,C		;     COMBINE (C) AND (B)\r
	JR	NZ,FOR11\r
	LD	A,60H		;     60H\r
	JR	FOR16\r
FOR11	BIT	0,C\r
	JR	NZ,FOR12\r
	LD	A,50H		;     50H\r
	JR	FOR16\r
FOR12	BIT	7,B\r
	JR	NZ,FOR13\r
	LD	A,40H		;     40H\r
	JR	FOR16\r
FOR13	BIT	6,B\r
	JR	NZ,FOR14\r
	LD	A,30H		;     30H\r
	JR	FOR16\r
FOR14	BIT	5,B\r
	JR	NZ,FOR15\r
	LD	A,20H		;     20H\r
	JR	FOR16\r
FOR15	BIT	4,B\r
	JR	NZ,SCAN12\r
	LD	A,10H		;     10H\r
FOR16	LD	D,A\r
	LD	A,0FH\r
	AND	B\r
	OR	D		;     (A) = KR1 ENCODED\r
;\r
	LD	(IX),05H	;     ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),A\r
	CALL	QUEUE\r
				;     END\r
;\r
SCAN12	LD	BC,8		;   SCAN KR2\r
	CALL	IOREAD		;   ==============\r
	AND	0FFH		;\r
	JP	NZ,KR2OUT	;   IF CHANGES IN PORT16 (KR2), GOTO KR2OUT\r
	LD	A,(CHANGE)	;   RESTORE PORT17 CHANGES\r
	AND	30H\r
	JP	Z,SCAN13	;   IF CHANGES IN PORT17 (KR2), THEN\r
				;   BEGIN\r
KR2OUT:	LD	A,C\r
	PUSH	IY\r
	POP	BC		;     (C) = KR2 Z6,Z5\r
	LD	B,A		;     (B) = KR2 Z4,Z3,Z2,Z1,D,C,B,A\r
	BIT	5,C		;     COMBINE (C) AND (B)\r
	JR	NZ,FOR21\r
	LD	A,60H		;     60H\r
	JR	FOR26\r
FOR21	BIT	4,C\r
	JR	NZ,FOR22\r
	LD	A,50H		;     50H\r
	JR	FOR26\r
FOR22	BIT	7,B\r
	JR	NZ,FOR23\r
	LD	A,40H		;     40H\r
	JR	FOR26\r
FOR23	BIT	6,B\r
	JR	NZ,FOR24\r
	LD	A,30H		;     30H\r
	JR	FOR26\r
FOR24	BIT	5,B\r
	JR	NZ,FOR25\r
	LD	A,20H		;     20H\r
	JR	FOR26\r
FOR25	BIT	4,B\r
	JR	NZ,SCAN13\r
	LD	A,10H		;     10H\r
FOR26	LD	D,A\r
	LD	A,0FH\r
	AND	B\r
	OR	D		;     (A) = KR2 ENCODED\r
;\r
	LD	(IX),06H	;     ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),A\r
	CALL	QUEUE\r
				;\r
				;   END\r
;\r
SCAN13	LD	BC,000CH	;   SCAN TEST PORT\r
	CALL	IOREAD		;   ==============\r
	JR	Z,SCAN14	;   IF INPUT-VALUE HAS CHANGED, THEN\r
				;   BEGIN:\r
	AND	E		;     MASK TEST BYTE\r
	AND	07H\r
	LD	(IX),09H	;     ENQUEUE MESSAGE INTO QSK\r
	LD	(IX+1),A\r
	CALL	QUEUE\r
				;   END\r
;\r
SCAN14	LD	BC,TSCAN	;   RE-ESTABLISH SCAN-TIMER\r
	CALL	ESTABR\r
;\r
	RET			;   RETURN TO TIMER PROCESS\r
				; END\r
;\r
\r
*******************************************************************************\r
;	END OF SCAN-ROUTINE\r
;\r
;\r
*******************************************************************************\r
*			TIMEOUT ROUTINE					      *\r
*******************************************************************************\r
;\r
TIMOUT	LD	HL,COUNT2	; DECREMENT COUNTER\r
	DEC	(HL)\r
	JR	Z,TIMRES	; IF COUNTER IS NOT = 0\r
				; THEN BEGIN:\r
	LD	BC,TOUT		;   RE-ESTABLISH TIMER\r
	CALL	ESTABR\r
	RET			; END\r
				; ELSE BEGIN:\r
TIMRES	LD	A,0FFH		;   SOURCE AND DESTINATION LAMP OFF\r
	LD	BC,PORT2\r
	OUT	(C),A\r
	LD	BC,PORT4\r
	OUT	(C),A\r
	LD	BC,PORT6\r
	OUT	(C),A\r
	LD	BC,PORT8\r
	OUT	(C),A\r
	LD	BC,PORT10\r
	OUT	(C),A\r
;\r
	LD	HL,STATUS	;   SET STATUS =\r
	RES	0,(HL)		;   NO TAKE\r
	RES	4,(HL)		;   POSSIBLE CONNECTION\r
	RES	5,(HL)		;   FREE\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	RES	2,(HL)		;   NOT BUSY\r
	RES	3,(HL)		;   NO SOURCE READY\r
	RES	4,(HL)		;   NO DESTINATION READY\r
	RES	7,(HL)		;   NO MANUEL OPERATION IN PROGRESS\r
;\r
	ACTIVATE S,KEYBOA	;   ACTIVATE KEYBOARD PROCESS\r
;\r
				;   END\r
	RET			; END\r
;\r
*******************************************************************************\r
;	END OF TIMEOUT ROUTINE\r
;\r
;\r
*******************************************************************************\r
*		OCCUPIED AND IMPOSSIBLE CONNECTION FLASH		      *\r
*******************************************************************************\r
;\r
TIMOCC	LD	BC,PORT24	; READ OCCUPIED LAMP\r
	IN	A,(C)\r
	BIT	5,A\r
	JR	Z,OCC1		; COMPLEMENT OCCUPIED BIT\r
	AND	0DFH\r
	JR	OCC2\r
OCC1	OR	20H\r
OCC2	OUT	(C),A		; INDICATE OCCUPIED BIT\r
;\r
	LD	BC,TOCC		; RE-ESTABLISH TIMER\r
	CALL	ESTABR\r
	RET			; RETURN\r
;\r
;------------------------------------------------------------------------------\r
;\r
TIMIMP	LD	BC,PORT24	; READ IMPOSS. CONN. LAMP\r
	IN	A,(C)\r
	BIT	4,A\r
	JR	Z,IMP1		; COMPLEMENT IMPOSS. CONN. BIT\r
	AND	0EFH\r
	JR	IMP2\r
IMP1	OR	10H\r
IMP2	OUT	(C),A		; INDICATE IMPOSS. CONN. BIT\r
;\r
	LD	BC,TIMP		; RE-ESTABLISH TIMER\r
	CALL	ESTABR\r
	RET			; RETURN\r
;\r
*******************************************************************************\r
;	END OF FLASH-ROUTINES\r
;\r
;\r
;\r
*******************************************************************************\r
*			   KEYBOARD PROCESS :				      *\r
*******************************************************************************\r
;\r
;	THE KEYBOARD PROCESS DEQUEUES MESSAGES FROM THE SCAN-ROUTINE\r
;	AND ENCODES THE SOURCE AND DESTINATION MESSAGE TO LOGICAL NUMBERS.\r
;\r
;\r
;	E N T R Y :\r
*******************************************************************************\r
;\r
KEYB	LD	SP,STAC06+20H	; INIT. STACKPOINTER\r
;\r
	LD	A,0FFH		; INIT. OUTPUT PORTS:\r
	LD	BC,PORT2\r
	OUT	(C),A		; KRE1\r
	LD	BC,PORT4\r
	OUT	(C),A		; SET1\r
	LD	BC,PORT6\r
	OUT	(C),A		; SET2\r
	LD	BC,PORT8\r
	OUT	(C),A		; SET3\r
	LD	BC,PORT10\r
	OUT	(C),A		; SET4\r
	LD	BC,PORT24\r
	OUT	(C),A		; V1\r
	LD	BC,PORT12\r
	OUT	(C),A		; TEXT3\r
	LD	BC,PORT14\r
	OUT	(C),A		; TEXT4\r
	LD	BC,PORT20\r
	OUT	(C),A		; TEST\r
;\r
	LD	BC,TSCAN	; INIT. SCAN-TIMER\r
	LD	E,2\r
	CALL	UPDATE\r
	LD	BC,TOUT		; INIT. TIMEOUT\r
	LD	E,0FFH\r
	CALL	UPDATE\r
	LD	BC,TOCC		; INIT. OCCUPIED TIMER\r
	LD	E,40H\r
	CALL	UPDATE\r
	LD	BC,TIMP		; INIT. IMPOSS. CONN. TIMER\r
	LD	E,20H\r
	CALL	UPDATE\r
;\r
	LD	A,0FFH		;\r
	LD	C,14		;\r
	LD	HL,IOVALU	;\r
	LD	DE,0EH		;\r
	ADD	HL,DE		;LOAD 0FFH IN ALL TALLY IN IOVALU-BYTES\r
	ADD	HL,DE		;\r
IONXT:	LD	(HL),A		;\r
	INC	HL		;\r
	DEC	C		;\r
	JR	NZ,IONXT	;\r
\r
	LD	HL,STATUS	; SET STATUS =\r
	LD	(HL),20H	; OCCUPIED\r
	LD	HL,OUTPUT	; INIT. OUTPUT\r
	LD	(HL),00H\r
;\r
INIKEY	CALL	SCOMMON		; SCHEDULE\r
	EI\r
;\r
	CALL	KEYSTA		; INDICATE STATUS\r
;\r
	LD	HL,CONDIT	; CHECK CONDITION MODE\r
	BIT	6,(HL)\r
	JR	NZ,INIKEY	; IF CONDITION = INIT. MODE, THEN: GO TO INIKEY\r
				; ELSE:\r
	LD	(HL),00H	; SET CONDITION = NOT BUSY\r
	LD	HL,STATUS	; SET STATUS 	= FREE\r
	LD	(HL),00H\r
;\r
	CALL	KEYSTA		; INDICATE STATUS\r
;\r
	LD	BC,TSCAN	; ESTABLISH SCAN - TIMER\r
	CALL	ESTABR\r
;\r
KEYB1	CALL	SCOMMON		; SCHEDULE\r
	EI\r
;\r
KEYB2	LD	HL,QSK		; DEQUEUE MESSAGE FROM QSK\r
	CALL	SUBDEQ\r
	JR	C,KEYB3		; IF QUEUE WAS EMPTY\r
				; THEN BEGIN:\r
	LD	HL,CONDIT	;   SET CONDITION = QSK EMPTY\r
	SET	0,(HL)\r
	JR	KEYB4		; END\r
				; ELSE BEGIN:\r
KEYB3	CALL	ENCODE		;   ENCODE ROUTINE\r
				; END\r
;\r
KEYB4	LD	HL,QIK		; DEQUEUE MESSAGE FROM QIK\r
	CALL	SUBDEQ\r
	JR	C,KEYB5		; IF QUEUE WAS EMPTY\r
				; THEN BEGIN:\r
	LD	HL,CONDIT	;   SET CONDITION = QIK EMPTY\r
	SET	1,(HL)\r
	JR	KEYB6		; END\r
				; ELSE BEGIN:\r
KEYB5	CALL	ACKNOW		;   ACKNOWLEDGE ROUTINE\r
				; END\r
;\r
KEYB6	CALL	KEYSTA		; STATUS ROUTINE\r
;\r
	LD	A,(CONDIT)	; CHECK CONDITION\r
	AND	03H\r
	CP	03H\r
	JR	NZ,KEYB1	; IF ALL QUEUES WAS EMPTY, THEN\r
				; BEGIN:\r
	PASSIVATE S,KEYBOA	;   PASSIVATE KEYBOARD PROCESS\r
	JR	KEYB1		; END\r
;\r
*******************************************************************************\r
;	END OF KEYBOARD PROCESS\r
;\r
;\r
*******************************************************************************\r
*			KEYBOARD ENCODE ROUTINE 			      *\r
*******************************************************************************\r
;\r
ENCODE	LD	HL,CONDIT	; SET CONDITION = QSK NOT EMPTY\r
	RES	0,(HL)\r
;\r
	PUSH	DE		; READ MESSAGE TYPE\r
	POP	IX		; (IX) = POINTER TO BUFFER\r
	LD	A,(IX+2)\r
;\r
	CP	0BH\r
	JR	Z,COMPUT	; COMPUTER ON/OFF MESSAGE\r
	CP	0AH\r
	JR	Z,TAKE		; TAKE MESSAGE\r
;\r
	CP	01H\r
	JP	Z,SOURCE	; SOURCE MESSAGE\r
	CP	02H\r
	JP	Z,DESTIN	; DESTINATION MESSAGE\r
	CP	03H\r
	JP	Z,TEXT3		; TEXT3 MESSAGE\r
	CP	04H\r
	JP	Z,TEXT4		; TEXT4 MESSAGE\r
	CP	05H\r
	JP	Z,KR1		; KR1 MESSAGE\r
	CP	06H\r
	JP	Z,KR2		; KR2 MESSAGE\r
	CP	07H\r
	JP	Z,KR38		; KR38 MESSAGE\r
	CP	08H\r
	JP	Z,KR39		; KR39 MESSAGE\r
	CP	09H\r
	JP	Z,TEST		; TEST MESSAGE\r
;\r
	LD	HL,QEMPTY	; RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			; RETURN\r
;\r
;\r
;	COMPUTER ON/OFF MESSAGE :\r
*******************************************************************************\r
;\r
COMPUT	LD	HL,STATUS	; READ STATUS\r
	BIT	1,(HL)\r
	JR	Z,COMP1		; IF COMPUTER = OFF\r
				; THEN BEGIN:\r
	RES	1,(HL)		;   SET COMPUTER = ON\r
	LD	A,0FFH\r
	JR	COMP2		; END\r
				; ELSE BEGIN:\r
COMP1	SET	1,(HL)		;   SET COMPUTER = OFF\r
	LD	A,00H\r
				; END\r
;\r
COMP2	LD	(IX+2),A\r
	LD	HL,QKT		; ENQUEUE MESSAGE INTO QKT\r
	CALL	SUBENQ\r
	ACTIVATE S,STATNR\r
	RET			; RETURN\r
;\r
;	TAKE MESSAGE :\r
*******************************************************************************\r
;\r
TAKE	LD	HL,STATUS	; READ STATUS\r
	BIT	0,(HL)\r
	JR	Z,TAKE1		; IF STATUS INDICATES TAKE\r
				; THEN BEGIN:\r
;\r
	LD	BC,TOUT		;     SUSPEND TIMEOUT\r
	CALL	SUSPND\r
;\r
	LD	HL,STATUS	;     SET STATUS =\r
	RES	0,(HL)		;     NO TAKE\r
	RES	4,(HL)		;     POSSIBLE CONN.\r
	RES	5,(HL)		;     NOT OCCUPIED\r
;\r
	LD	A,(BUFF)	;     TRANSMIT MESSAGE TO EXECUTE-MODULE\r
	AND	80H\r
	LD	(IX+2),A\r
	LD	A,(BUFF+1)\r
	LD	(IX+3),A\r
	LD	A,(BUFF+2)\r
	LD	(IX+4),A\r
;\r
	PUSH	IX\r
TAKE01:	LD	HL,CONDIT\r
	BIT	2,(HL)\r
	JR	Z,TAKE02	;     IF CONDITION = BUSY THEN\r
	CALL	SCOMMON		;     WAIT\r
	EI\r
	JR	TAKE01		;     ELSE\r
\r
TAKE02:	SET	2,(HL)		;     SET CONDITION = BUSY\r
	POP	DE\r
	LD	HL,QKE		;     ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUT\r
	RET			;     RETURN\r
				; END\r
				; ELSE BEGIN:\r
TAKE1	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	SOURCE MESSAGE :\r
*******************************************************************************\r
;\r
SOURCE	LD	A,(IX+3)	; UPDATE BUFF: ESTABLISH/DELETE\r
	CP	7FH\r
	JR	Z,SOUR1		; IF SOURCE MESSAGE = RELEASE\r
				; THEN BEGIN:\r
	LD	A,80H		;   BUFFER-HEAD = 80H\r
	JR	SOUR2		; END\r
				; ELSE BEGIN:\r
SOUR1	LD	A,00H		;   BUFFER-HEAD = 00H\r
				; END\r
SOUR2	LD	(BUFFS),A\r
	LD	A,(IX+3)\r
	LD	BC,38		; FIND SOURCE BUTTON-CODE\r
	LD	HL,KRNO\r
	CPIR\r
	JR	NZ,SOUR3	; IF BUTTON-CODE IS FOUND\r
				; THEN BEGIN:\r
	PUSH	AF\r
	AND	A		;   FIND LOGIC SOURCE NO.\r
	LD	HL,37\r
	SBC	HL,BC\r
	LD	BC,LOGSRC\r
	ADD	HL,BC\r
	LD	A,(HL)\r
	LD	(BUFFS+1),A	;   UPDATE LOGIC SOURCE NO. IN BUFF\r
;\r
	POP	AF		;   SOURCE LAMP ON\r
	LD	BC,PORT2\r
	OUT	(C),A\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	3,(HL)		;   SOURCE READY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	BC,TOUT		;   ESTABLISH TIMEOUT\r
	CALL	ESTABR\r
	LD	HL,COUNT2\r
	LD	(HL),06H\r
;\r
	PUSH	IX\r
	POP	DE\r
	CALL	INVMES		;   TRANSMIT MESSAGE TO INVESTIGATE-MODULE\r
				;   IF DESTINATION IS READY\r
;\r
	RET			; END\r
				; ELSE BEGIN:\r
SOUR3	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			; END\r
;\r
;	DESTINATION MESSAGE :\r
*******************************************************************************\r
;\r
DESTIN	LD	A,0FFH		; DESTINATION LAMPS OFF\r
	LD	BC,PORT4\r
	OUT	(C),A\r
	LD	BC,PORT6\r
	OUT	(C),A\r
	LD	BC,PORT8\r
	OUT	(C),A\r
	LD	BC,PORT10\r
	OUT	(C),A\r
;\r
	LD	A,(IX+3)	; FIND DESTINATION BUTTON-CODE\r
	LD	BC,20\r
	LD	HL,SET\r
	CPIR\r
	JR	NZ,DEST1	; IF BUTTON-CODE IS FOUND\r
				; THEN BEGIN:\r
	AND	A		;   FIND DESTINATION TABLE OFFSET\r
	LD	HL,19\r
	SBC	HL,BC		;   (HL) = RELATIV TABLE OFFSET\r
	LD	B,00H\r
	LD	C,(IX+4)\r
	ADD	HL,BC\r
	EX	DE,HL		;   (DE) = ABS. TABLE OFFSET\r
	LD	HL,ACTTYP\r
	ADD	HL,DE\r
	LD	B,00H\r
	LD	C,(HL)		;   (BC) = ACTION TYPE\r
	SLA	C\r
	LD	HL,DSTADR\r
	ADD	HL,BC\r
	LD	C,(HL)\r
	INC	HL\r
	LD	B,(HL)		;   (BC) = DEST. LAMP PORT ADRESS\r
;\r
	OUT	(C),A		;   DESTINATION LAMP ON\r
;\r
	LD	HL,LOGDST	;   FIND LOGIC DESTINATION-NO.\r
	ADD	HL,DE\r
	LD	A,(HL)\r
	LD	(BUFFS+2),A	;   UPDATE DESTINATION NO. IN BUFF\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	4,(HL)		;   DESTINATION READY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	BC,TOUT		;   ESTABLISH TIMEOUT\r
	CALL	ESTABR\r
	LD	HL,COUNT2\r
	LD	(HL),06H\r
;\r
	PUSH	IX\r
	POP	DE\r
	CALL	INVMES		;   TRANSMIT MESSAGE TO INVESTIGATE-MODULE\r
				;   IF SOURCE IS READY\r
;\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
DEST1	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	TEXT3 MESSAGE :\r
*******************************************************************************\r
;\r
TEXT3	LD	A,(IX+3)	; FIND TEXT BUTTON-CODE\r
	LD	BC,12\r
	LD	HL,TEXT		; TABLE = TEXT\r
	CPIR\r
	JR	NZ,TEXT3A	; IF BUTTON-CODE IS FOUND\r
				; THEN BEGIN:\r
	AND	A		;   FIND LOGIC SOURCE-NO.\r
	LD	HL,11\r
	SBC	HL,BC\r
	LD	BC,LOGSRC\r
	ADD	HL,BC\r
	LD	A,(HL)		;   (A) = LOGIC SOURCE-NO.\r
;\r
				;   TRANSMIT MESSAGE TO EXECUTE-MODUL\r
	LD	(IX+2),80H	;   ESTABLISH\r
	LD	(IX+3),A	;   LOGIC SOURCE-NO.\r
	LD	(IX+4),58	;   LOGIC DESTINATION-NO.\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	2,(HL)		;   BUSY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	HL,QKE		;   ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUT\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
TEXT3A	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	TEXT4 MESSAGE :\r
*******************************************************************************\r
;\r
TEXT4	LD	A,(IX+3)	; FIND TEXT BUTTON-CODE\r
	CP	5AH\r
	JR	NZ,TEXT40	; IF DISPLAY UPDATING THEN\r
				; BEGIN\r
	LD	(IX+2),10H	;   DISPLAY UPDATING COMMAND BYTE\r
	LD	(IX+3),0	;\r
	LD	(IX+4),0	;\r
	JR	TEXT41		; END ELSE\r
TEXT40:				; BEGIN\r
	LD	BC,12\r
	LD	HL,TEXT		;   TABLE = TEXT\r
	CPIR\r
	JR	NZ,TEXT4A	;   IF BUTTON-CODE IS FOUND\r
				;   THEN BEGIN:\r
	AND	A		;     FIND LOGIC SOURCE-NO.\r
	LD	HL,11\r
	SBC	HL,BC\r
	LD	BC,LOGSRC\r
	ADD	HL,BC\r
	LD	A,(HL)		;     (A) = LOGIC SOURCE-NO.\r
;\r
				;     TRANSMIT MESSAGE TO EXECUTE-MODUL\r
	LD	(IX+2),80H	;     ESTABLISH\r
	LD	(IX+3),A	;     LOGIC SOURCE-NO.\r
	LD	(IX+4),59	;     LOGIC DESTINATION-NO.\r
				;   END\r
				; END\r
;\r
TEXT41: LD	HL,CONDIT	; SET CONDITION =\r
	SET	2,(HL)		; BUSY\r
	SET	7,(HL)		; MANUEL OPERATION IN PROGRESS\r
;\r
	LD	HL,QKE		; ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUTE\r
	RET			; RETURN\r
				;\r
				; ELSE BEGIN:\r
TEXT4A	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	KR1 MESSAGE :\r
*******************************************************************************\r
;\r
KR1	LD	A,(IX+3)	; FIND KR1 BUTTON-CODE\r
	LD	BC,80\r
	LD	HL,KR12		; TABLE = KR12\r
	CPIR\r
	JR	NZ,KR1A		; IF BUTTON-CODE IS FOUND\r
				; THEN BEGIN:\r
	AND	A		;   FIND LOGIC DESTINATION-NO.\r
	LD	HL,79\r
	SBC	HL,BC\r
	LD	BC,LOGDST\r
	ADD	HL,BC\r
	LD	A,(HL)		;   (A) = LOGIC DESTINATION-NO.\r
;\r
				;   TRANSMIT MESSAGE TO EXECUTE-MODUL\r
	LD	(IX+2),20H	;   LISTEN\r
	LD	(IX+3),A	;   LOGIC SOURCE-NO.\r
	LD	(IX+4),01H	;   LOGIC DESTINATION-NO.\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	2,(HL)		;   BUSY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	HL,QKE		;   ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUT\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
KR1A	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	KR2 MESSAGE :\r
*******************************************************************************\r
;\r
KR2	LD	A,(IX+3)	; FIND KR2 BUTTON-CODE\r
	LD	BC,80\r
	LD	HL,KR12		; TABLE = KR12\r
	CPIR\r
	JR	NZ,KR2A		; IF BUTTON-CODE IS FOUND\r
				; THEN BEGIN:\r
	AND	A		;   FIND LOGIC DESTINATION-NO.\r
	LD	HL,79\r
	SBC	HL,BC\r
	LD	BC,LOGDST\r
	ADD	HL,BC\r
	LD	A,(HL)		;   (A) = LOGIC DESTINATION-NO.\r
;\r
				;   TRANSMIT MESSAGE TO EXECUTE-MODUL\r
	LD	(IX+2),20H	;   LISTEN\r
	LD	(IX+3),A	;   LOGIC SOURCE-NO.\r
	LD	(IX+4),02H	;   LOGIC DESTINATION-NO.\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	2,(HL)		;   BUSY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	HL,QKE		;   ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUTE\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
KR2A	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	KR38 MESSAGE :\r
*******************************************************************************\r
;\r
KR38	LD	A,(IX+3)	; FIND KR38 BUTTON-CODE\r
	LD	BC,38\r
	LD	HL,KRNO		; TABLE = KRNO\r
	CPIR\r
	JR	NZ,KR38A	; IF BUTTON-CODE IS FOUND\r
				; THEN BEGIN:\r
	AND	A		;   FIND LOGIC SOURCE-NO.\r
	LD	HL,37\r
	SBC	HL,BC\r
	LD	BC,LOGSRC\r
	ADD	HL,BC\r
	LD	A,(HL)		;   (A) = LOGIC SOURCE-NO.\r
;\r
				;   TRANSMIT MESSAGE TO EXECUTE-MODUL\r
	LD	(IX+2),80H	;   ESTABLISH\r
	LD	(IX+3),A	;   LOGIC SOURCE-NO.\r
	LD	(IX+4),38	;   LOGIC DESTINATION-NO.\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	2,(HL)		;   BUSY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	HL,QKE		;   ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUT\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
KR38A	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	KR39 MESSAGE :\r
*******************************************************************************\r
;\r
KR39	LD	A,(IX+3)	; FIND KR39 BUTTON-CODE\r
	LD	BC,38\r
	LD	HL,KRNO		; TABLE = KRNO\r
	CPIR\r
	JR	NZ,KR39A	; IF INPUT-CODE IS FOUND\r
				; THEN BEGIN:\r
	AND	A		;   FIND LOGIC SOURCE-NO.\r
	LD	HL,37\r
	SBC	HL,BC\r
	LD	BC,LOGSRC\r
	ADD	HL,BC\r
	LD	A,(HL)		;   (A) = LOGIC SOURCE-NO.\r
;\r
				;   TRANSMIT MESSAGE TO EXECUTE-MODUL\r
	LD	(IX+2),80H	;   ESTABLISH\r
	LD	(IX+3),A	;   LOGIC SOURCE-NO.\r
	LD	(IX+4),39	;   LOGIC DESTINATION-NO.\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	2,(HL)		;   BUSY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	HL,QKE		;   ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUTE\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
KR39A	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;	TEST MESSAGE :\r
*******************************************************************************\r
;\r
TEST	LD	A,(IX+3)	; FIND TEST BUTTON-CODE\r
	CP	01H		; STM\r
	JR	Z,TESTA\r
	CP	02H		; CNR\r
	JR	Z,TESTA\r
	CP	04H		; ST5\r
	JR	Z,TESTA\r
	JR	TESTB\r
				; IF CODE IS FOUND\r
				; THEN BEGIN:\r
				;   TRANSMIT MESSAGE TO EXECUTE-MODULE\r
TESTA	LD	(IX+2),A\r
	LD	(IX+3),00H\r
	LD	(IX+4),00H\r
;\r
	LD	HL,CONDIT	;   SET CONDITION =\r
	SET	2,(HL)		;   BUSY\r
	SET	7,(HL)		;   MANUEL OPERATION IN PROGRESS\r
;\r
	LD	HL,QKE		;   ENQUEUE MESSAGE INTO QKE\r
	CALL	SUBENQ\r
	ACTIVATE S,EXECUT\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
TESTB	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
*******************************************************************************\r
;	END OF KEYBOARD ENCODE ROUTINE\r
;\r
;\r
*******************************************************************************\r
*			KEYBOARD ACKNOWLEDGE ROUTINE			      *\r
*******************************************************************************\r
;\r
ACKNOW	LD	HL,CONDIT	; SET CONDITION =\r
	RES	1,(HL)		; QIK NOT EMPTY\r
;\r
	LD	A,(IX+2)	; READ MESSAGE\r
	LD	B,A\r
	LD	HL,STATUS\r
				; UPDATE TAKE-BIT\r
	AND	49H\r
	JR	NZ,ACK1\r
	SET	0,(HL)\r
	JR	ACK2\r
ACK1	RES	0,(HL)\r
				; UPDATE OCCUPIED-BIT\r
ACK2	LD	A,B\r
	AND	08H\r
	JR	NZ,ACK3\r
	RES	5,(HL)\r
	JR	ACK4\r
ACK3	SET	5,(HL)\r
				; UPDATE IMPOSSIBLE CONN.-BIT\r
ACK4	LD	A,B\r
	BIT	3,B\r
	JR	Z,ACK41\r
	AND	40H\r
	JR	NZ,ACK42\r
	JR	ACK5\r
ACK41	AND	60H\r
	JR	Z,ACK5\r
ACK42	SET	4,(HL)\r
	JR	ACK6\r
ACK5	RES	4,(HL)\r
				; UPDATE BUFF\r
ACK6	LD	A,B\r
	AND	80H\r
	LD	(BUFF),A	; ESTABLISH/DELETE\r
	LD	A,(IX+3)\r
	LD	(BUFF+1),A	; LOGIC SOURCE-NO.\r
	LD	A,(IX+4)\r
	LD	(BUFF+2),A	; LOGIC DESTINATION-NO.\r
;\r
	LD	HL,QEMPTY	; RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			; RETURN\r
;\r
*******************************************************************************\r
;	END OF KEYBOARD ACKNOWLEDGE ROUTINE\r
;\r
;\r
*******************************************************************************\r
*			KEYBOARD STATUS ROUTINE				      *\r
*******************************************************************************\r
;\r
KEYSTA	LD	HL,STATUS	; READ STATUS\r
	BIT	5,(HL)\r
	JR	Z,KEYST1	; IF STATUS = OCCUPIED\r
				; THEN BEGIN:\r
	LD	HL,OUTPUT	;   READ OUTPUT\r
	BIT	5,(HL)\r
	JR	NZ,KEYST2	;   IF OUTPUT IS NOT OCCUPIED, THEN\r
				;   BEGIN:\r
	SET	5,(HL)		;     SET OUTPUT = OCCUPIED\r
	LD	BC,TOCC		;     START OCCUPIED TIMER\r
	CALL	ESTABR\r
;\r
	LD	BC,PORT24	;     OCCUPIED LAMP ON\r
	IN	A,(C)\r
	AND	0DFH\r
	OUT	(C),A\r
	JR	KEYST2		;   END\r
				; END\r
				; ELSE BEGIN:\r
KEYST1	LD	HL,OUTPUT	;   READ OUTPUT\r
	BIT	5,(HL)\r
	JR	Z,KEYST2	;   IF OUTPUT IS OCCUPIED, THEN\r
				;   BEGIN:\r
	RES	5,(HL)		;     SET OUTPUT = FREE\r
	LD	BC,TOCC		;     SUSPEND OCCUPIED TIMER\r
	CALL	SUSPND\r
;\r
	LD	BC,PORT24	;     OCCUPIED LAMP OFF\r
	IN	A,(C)\r
	OR	20H\r
	OUT	(C),A\r
				;   END\r
				; END\r
;\r
KEYST2	LD	HL,STATUS	; READ STATUS\r
	BIT	4,(HL)\r
	JR	Z,KEYST3	; IF STATUS = IMPOSSIBLE CONN.\r
				; THEN BEGIN:\r
	LD	HL,OUTPUT	;   READ OUTPUT\r
	BIT	4,(HL)\r
	JR	NZ,KEYST4	;   IF OUTPUT IS POSSIBLE CONN., THEN\r
				;   BEGIN:\r
	SET	4,(HL)		;     SET OUTPUT = IMPOSSIBLE CONN.\r
	LD	BC,TIMP		;     START IMPOSS. CONN. TIMER\r
	CALL	ESTABR\r
;\r
	LD	BC,PORT24	;     IMPOSSIBLE CONN. LAMP ON\r
	IN	A,(C)\r
	AND	0EFH\r
	OUT	(C),A\r
	JR	KEYST4		;   END\r
				; END\r
				; ELSE BEGIN:\r
KEYST3	LD	HL,OUTPUT	;   READ OUTPUT\r
	BIT	4,(HL)\r
	JR	Z,KEYST4	;   IF OUTPUT IS IMPOSS. CONN., THEN\r
				;   BEGIN:\r
	RES	4,(HL)		;     SET OUTPUT = POSSIBLE CONN.\r
	LD	BC,TIMP		;     SUSPEND IMPOSS. CONN. TIMER\r
	CALL	SUSPND\r
;\r
	LD	BC,PORT24	;     IMPOSSIBLE CONN. LAMP OFF\r
	IN	A,(C)\r
	OR	10H\r
	OUT	(C),A\r
				;   END\r
				; END\r
;\r
KEYST4	LD	BC,PORT24	; INDICATE TAKE/COMPUTER STATUS\r
	IN	A,(C)\r
	AND	0FCH\r
	LD	D,A\r
	LD	A,(STATUS)\r
	CPL\r
	AND	03H\r
	OR	D\r
	OUT	(C),A\r
	RET			; RETURN\r
;\r
*******************************************************************************\r
;	END OF KEYBOARD STATUS ROUTINE\r
;\r
;\r
*******************************************************************************\r
*				INVESTIGATE MESSAGE			      *\r
*******************************************************************************\r
;\r
INVMES	LD	A,(CONDIT)	; CHECK CONDITION\r
	AND	18H\r
	CP	18H\r
	JR	NZ,INVM1	; IF BOTH DESTINATION AND SOURCE IS READY\r
				; THEN BEGIN:\r
	LD	A,(BUFFS)	;   TRANSMIT MESSAGE TO INVESTIGATE-MODUL\r
	LD	(IX+2),A\r
	LD	A,(BUFFS+1)\r
	LD	(IX+3),A\r
	LD	A,(BUFFS+2)\r
	LD	(IX+4),A\r
;\r
INVMX:	LD	HL,CONDIT\r
	BIT	2,(HL)\r
	JR	Z,INVM0		;   IF BUSY = 1 THEN WAIT\r
	PUSH	DE\r
	CALL	SCOMMON\r
	EI\r
	POP	DE\r
	JR	INVMX\r
\r
INVM0:	LD	HL,QKI		;   ENQUEUE MESSAGE INTO QKI\r
	CALL	SUBENQ\r
	CALL	INVEST		;   CALL INVESTIGATE SUBROUTINE\r
	RET			;   RETURN\r
				; END\r
				; ELSE BEGIN:\r
INVM1	LD	HL,QEMPTY	;   RETURN BUFFER INTO QEMPTY\r
	CALL	SUBENQ\r
	RET			;   RETURN\r
				; END\r
;\r
;\r
*******************************************************************************\r
*				IOREAD SUBROUTINE			      *\r
*******************************************************************************\r
;\r
IOREAD:	LD	HL,IOADDR\r
	ADD	HL,BC\r
	ADD	HL,BC\r
	LD	D,B\r
	LD	E,C\r
	LD	C,(HL)			; (BC):= PORTNUMBER\r
	INC	HL\r
	LD	B,(HL)\r
	IN	A,(C)\r
\r
	LD	HL,IOVALU\r
	ADD	HL,DE\r
	ADD	HL,DE\r
\r
	LD	D,(HL)\r
	LD	(HL),A			; X(N-1) := X(N)\r
	INC	HL\r
	LD	E,(HL)			; (D):= X(N-1)  , (E):= X(N-2)\r
\r
	LD	C,A\r
	XOR	E\r
\r
NOCHANGE:\r
	RET	Z\r
\r
POSSCH:	LD	B,A\r
	LD	A,E\r
	XOR	D\r
	AND	B			; (A):= X(N) XOR X(N-2) AND\r
					;		  X(N-1) XOR X(N-2)\r
					; :- CHANGE\r
	RET	Z			; EXIT IF NO STATIONARY CHANGE\r
\r
	LD	B,A			; (B):= CHANGE\r
	AND	D			; (A):= CHANGE AND X(N-1)\r
\r
	LD	C,A\r
	LD	A,B\r
	CPL\r
	AND	E\r
	OR	C			; (A):= (NOT CHANGE AND X(N-2)) OR\r
					;       (CHANGE AND X(N-1))\r
					; :- STATIONARY VALUE\r
	LD	(HL),A			; X(N-2):= STATIONARY VALUE\r
\r
	LD	C,A			; (C):= STATIONARY VALUE\r
	LD	A,B\r
	OR	A			; OPDATE Z-FLAG\r
\r
	RET\r
;\r
*******************************************************************************\r
*				ENQUEUE MESSAGE				      *\r
*******************************************************************************\r
;\r
QUEUE	LD	HL,QEMPTY	;   DEQUEUE BUFFER FROM QEMPTY\r
	CALL	SUBDEQ\r
	RET	NC		;   IF BUFFER EMPTY, THEN: RETURN\r
				;   ELSE BEGIN:\r
	PUSH	DE\r
	INC	DE\r
	INC	DE\r
	LD	BC,0003H	;     LOAD BUFFER WITH (INPUT)\r
	LD	HL,INPUT\r
	LDIR\r
	POP	DE\r
	LD	HL,QSK		;     (HL) = QUEUE HEAD ADRESS\r
	CALL	SUBENQ		;     ENQUEUE MESSAGE INTO QSK\r
;\r
	ACTIVATE S,KEYBOA	;     ACTIVATE KEYBOARD PROCESS\r
;\r
	RET			;     RETURN\r
				;   END\r
;\r
*******************************************************************************\r
;	END OF SUBROUTINES\r
;\r
	END\r