DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 33892 (0x8464) Types: TextFile Names: »KEYB.SRC«
└─⟦af81bc460⟧ Bits:30005550 8" CR80 Floppy CR80FD_0034 ( MATRIX Source and Abs-files ) └─⟦af81bc460⟧ Intel_ISIS_II └─ ⟦this⟧ »KEYB.SRC«
;******************************************************************************\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