KEYUTIL 
          IDENT  KEYUTIL
          MACHINE  Z80
          TITLE  KEYUTIL - KEY UTILITY HOST LOADED CONTROLWARE. 
*COMMENT  KEYUTIL - KEY UTILITY HOST LOADED CONTROLWARE.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 KYU      SPACE  4,10 
***       KEYUTIL - KEY UTILITY HOST LOADED CONTROLWARE.
* 
*         W. F. ANSLEY.      83/06/01.
*         M. L. SWANSON.     85/01/03.
 KYU      SPACE  4,10 
***       *KEYUTIL* IS THE SOURCE CODE FOR THE Z80 PROGRAM THAT 
*         IS LOADED INTO THE 721 TERMINAL BY THE *KEY* UTILITY. 
*         THE PROGRAM *KEYEX* ACTUALLY HAS THE BINARY FOR THIS
*         PROGRAM HARDCODED WITHIN ITSELF; THIS PROGRAM IS INCLUDED 
*         ON THE OPL FOR DOCUMENTATION PURPOSES ONLY.  IF ANY 
*         CHANGES ARE MADE TO THIS PROGRAM, CORRESPONDING CHANGES 
*         MUST BE MADE TO THE HARDCODED VALUES WITHIN *KEYEX*.
 KYU      SPACE  4,10 
***       ASSEMBLY CONSTANTS. 
  
SENDB     EQU    #0087       SEND CHARACTER IN B
OBYTE2    EQU    #E047
DLMENA    EQU    #E0B9
KYT       EQU    #D7E0       KEY TABLE ADDRESS
KTL       EQU    #F0         KEY TABLE LENGTH 
DEFB      EQU    #C000       DEFINITION BUFFER
DFBE      EQU    #CAFF       DEFINITION BUFFER END
  
          ORG    #D100
  
 KYU      SPACE  4,25 
***       PUSH - PUSH FUNCTION KEY DEFINITIONS. 
* 
*         *PUSH* COPIES THE IMAGE OF THE CURRENT KEY DEFINITIONS
*         AND COPIES IT TO A BUFFER WITHIN THE TERMINAL.
* 
*         CALLS  RESET. 
  
PUSH      BSS    0           PUSH ROUTINE 
          LD     DE,SKTB     GET KEY TABLE ADDRESS
          LD     BC,KTL      GET BYTE COUNTER 
          LD     HL,KYT      GET KEY TABLE SAVE AREA
          LDIR               PUSH KEY TABLE 
          LD     A,(OBYTE2) 
          LD     (OBS2),A    SAVE SETUP CHARACTERISTICS 
          LD     A,(DLMENA) 
          LD     (DLMS),A    SAVE DELIMITER FLAG
          SCF                CARRIAGE RETURN AFTER FUNCTION KEY 
          CCF                CLEAR CARRY FLAG 
          LD     A,(DEFB)    GET LENGTH OF KEY DEFINITIONS
          LD     D,A
          LD     A,(DEFB+1) 
          LD     E,A
          INC    DE 
          INC    DE          SET DE TO LENGTH+2 
          LD     (DFLS),DE   SAVE TOTAL LENGTH
          LD     HL,DFBE     MOVE HL TO END OF DEF BUFF 
          SBC    HL,DE       SET HL TO START OF PUSH AREA 
          LD     (DFSA),HL   SAVE WHERE MOVED 
          EX     DE,HL       MOVE DE TO LOCATION MOVED
          LD     HL,DEFB     SET HL TO KEY DEFINITION BUFFER
          LD     BC,(DFLS)   SET NUMBER OF BYTES TO MOVE
          LDIR               PUSH DEFINITIONS 
          CALL   RESET       RESET DEFINITION TABLE 
          RET                RETURN 
  
 KYU      SPACE  4,25 
***       POP - POP FUNCTION KEY DEFINITIONS. 
* 
*         *POP* COPIES THE STORED FUNCTION KEY DEFINITIONS
*         FROM THE BUFFER WITHIN THE TERMINAL TO THE
*         RESIDENT FUNCTION KEY DEFINITION AREA.
  
POP       BSS    0           ENTRY
          LD     HL,SKTB     RESTORE KEY TABLE BUFFER ADDRESS 
          LD     BC,KTL      RESTORE KEY TABLE LENGTH 
          LD     DE,KYT      RESTORE KEY TABLE AREA 
          LDIR               RETURN USERS DEFINITIONS 
          LD     A,(OBS2) 
          LD     (OBYTE2),A  RESTORE OBYTE2 
          LD     A,(DLMS) 
          LD     (DLMENA),A  RESTORE DELIMITER FLAG 
          LD     HL,(DFSA)   DEF SAVED ADDRESS
          LD     A,H
          OR     L
          RET    Z           IF NONE
  
          LD     DE,DEFB     RESTORE DEFINITION BUFFER
          LD     BC,(DFLS)   NUMBER OF BYTES TO MOVE
          LDIR               RESTORE DEFINITIONS
          RET                RETURN 
  
 KYU      SPACE  4,25 
***       RESET - RESET DEFINITION TABLE. 
* 
*         *RESET* INITIALIZES THE RESIDENT KEY DEFINITION TABLE 
*         WITHIN THE TERMINAL.
  
RESET     BSS    0           ENTRY
          LD     A,(OBYTE2)  GET OBYTE2 
          OR     2           SET NUMERIC PAD SHIFTED
          LD     (OBYTE2),A  REPLACE OBYTE2 
          LD     A,0
          LD     (DLMENA),A  SET DELIMITER FLAG FALSE 
          LD     BC,KTL+3 
RESET1    BSS    0
          DEC    BC 
          DEC    BC 
          DEC    BC 
          LD     A,B
          OR     C
          RET    Z           UNTIL DONE WITH TABLE
  
          LD     HL,KYT-3    SET HL TO KEY TABLE-3
          ADD    HL,BC       SET HL TO DEFINITION BYTE
          LD     (HL),#30    UNDEFINE KEY 
          JR     RESET1 
  
 KYU      SPACE  4,25 
***       LABEL - GET LABELS FROM MEMORY. 
* 
*         *LABEL* RETRIEVES THE STORED FUNCTION KEY LABELS
*         FROM WITHIN THE TERMINAL MEMORY.
* 
*         CALLS  POP, PUSH, SENDB.
  
LABEL     BSS    0           ENTRY
          LD     A,(#D8DD)
          LD     H,A
          LD     A,(#D8DE)
          LD     L,A
LABEL1    BSS    0
          LD     B,(HL) 
          LD     A,B
          CP     #FF
          JP     Z,LABEL2    UNTIL REACH LAST BYTE
  
          PUSH   HL 
          CALL   SENDB       SEND CHARACTER TO HOST 
          POP    HL 
          INC    HL          TO NEXT CHARACTER
          JR     LABEL1 
LABEL2    BSS    0
          LD     B,#0D
          CALL   SENDB       SEND CARRIAGE RETURN 
          RET                RETURN 
  
DFSA      BSS    2           DEFINITIONS SAVED ADDRESS
SKTB      BSS    KTL         SAVE KEY TABLE BUFFER
OBS2      CON    0           OBYTE2 SAVE AREA 
DLMS      CON    0           DELMENA SAVE AREA
DFLS      CON    0           DEF LENGTH SAVE AREA 
  
          END 
