home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / zcat / z3key14.lbr / Z3KEYRCP.ZZ0 / Z3KEYRCP.Z80
Text File  |  1991-01-31  |  18KB  |  790 lines

  1. ;  SYSTEM SEGMENT:  Z3KEY.RCP
  2. ;  WRITTEN BY:  ARNOLD BAILEY
  3.  
  4. ;
  5. ;  PROGRAM:  Z3KEYRCP.Z80
  6. ;  AUTHOR:  ARNOLD BAILEY
  7. ;  VERSION:  1.4
  8. ;  DATE:  25 JAN 86
  9. ;  PREVIOUS VERSIONS:  1.0, 1.1, 1.2, 1.3
  10.  
  11. ;  VERSION 1.4 IMPROVED INSTALLATION FOR USERS
  12.  
  13. ;  VERSION 1.3 ADDS FULL SUPERSHIFT KEY ABILITY. AND COMPILED KEY DEFINITION
  14. ;  INPUTS WITH Z3KEY.COM
  15. ;
  16. ;  VERSION 1.2 ADDS ABILITY TO DISPLAY THE KEY DEFINITIONS BY THE USE OF THE
  17. ;  KEYS COMMMAND.
  18.  
  19. ;
  20. ;  VERSION 1.1 ADDS CONTROLLED EXPANSION RATE OF MACROS TO PREVENT PROGRAMS
  21. ;  THAT CLEAR INCOMING CHARACTERS UPON ENTRY FROM THROWING AWAY THE REST OF
  22. ;  A MACRO EXPANSION.
  23. ;
  24.  
  25.  
  26. VERSION    EQU    14
  27.  
  28. ;
  29. ; ZKEYRCP IS A RESIDENT COMMAND PROCESSOR FOR ZCPR3.  IT PROVIDES THE 
  30. ; FOLLOWING FUNCTIONS:
  31. ;    1. ALLOWS ON THE FLY RE-DEFINITION OF THE KEYBOARD. EVEN WHILE IN
  32. ;      A PROGRAM.
  33. ;
  34. ;    2. ALLOWS DEFINING A KEY AS THE GENERATOR OF A MACRO STRING.
  35. ;
  36. ;    3. USER DEFINIED LEADIN KEY FOR USE OF MULTI CHARACTER FUNCTION KEYS.
  37. ;
  38. ;    4. VARIABLE DELAY ALLOWS THE LEADIN KEY TO BE USED AS A SUPER SHIFT KEY.
  39. ;
  40. ;    5. CASE FLAG CAN AUTOMATICALLY UPCASE ANY CHARACTER AFTER THE LEADIN
  41. ;     CHARACTER.
  42. ;    
  43. ;    6. Z3KEY.COM UTILITY ALLOWS RE-DEFINITION OF THE ATTENTION KEY, LEADIN
  44. ;       KEY, DELAY, CASE FLAG, AND SAVING A SET OF DEFINITIONS TO A DISK FILE.
  45. ;
  46. ;
  47. ;
  48. ;  GLOBAL LIBRARY WHICH DEFINES ADDRESSES FOR ZKEYRCP
  49. ;
  50. *INCLUDE    Z3BASE.LIB        ; USE BASE ADDRESSES
  51. *INCLUDE    Z3KEYRCP.LIB        ;INITIALIZATION DEFINITIONS
  52. ;
  53. CTRLC    EQU    'C'-'@'
  54. TAB    EQU    09H
  55. LF    EQU    0AH
  56. FF    EQU    0CH
  57. CR    EQU    0DH
  58. CTRLX    EQU    'X'-'@'
  59. ;
  60. WBOOT    EQU    BASE+0000H    ; CP/M WARM BOOT ADDRESS
  61. UDFLAG    EQU    BASE+0004H    ; USER NUM IN HIGH NYBBLE, DISK IN LOW
  62. BDOS    EQU    BASE+0005H    ; BDOS FUNCTION CALL ENTRY PT
  63. TFCB    EQU    BASE+005CH    ; DEFAULT FCB BUFFER
  64. FCB1    EQU    TFCB        ; 1ST AND 2ND FCBS
  65. FCB2    EQU    TFCB+16
  66. TBUFF    EQU    BASE+0080H    ; DEFAULT DISK I/O BUFFER
  67. TPA    EQU    BASE+0100H    ; BASE OF TPA
  68. ;
  69. ;  SYSTEM ENTRY POINT
  70. ;
  71.  
  72.     ORG    RCP
  73.  
  74.     DB    'Z3RCP'        ; FLAG FOR PACKAGE LOADER
  75. ;
  76. ;  **** COMMAND TABLE FOR RCP ****
  77. ;    THIS TABLE IS RCP-DEPENDENT!
  78. ;
  79. ;    THE COMMAND NAME TABLE IS STRUCTURED AS FOLLOWS:
  80. ;
  81. ;    CTABLE:
  82. ;        DB    'CMNDNAME'    ; TABLE RECORD STRUCTURE IS
  83. ;        DW    CMNDADDRESS    ; 8 CHARS FOR NAME AND 2 BYTES FOR ADR
  84. ;        ...
  85. ;        DB    0    ; END OF TABLE
  86. ;
  87. CNSIZE    EQU    5        ; NUMBER OF CHARS IN COMMAND NAME
  88.     DB    CNSIZE        ; SIZE OF TEXT ENTRIES
  89. CTAB:
  90.     DB    'H    '        ; HELP FOR RCP
  91.     DW    CLIST
  92. CTAB1:
  93.     DB    'KEY+ '        ;CLEAR SCREEN COMMMAND
  94.     DW    KEYON
  95.  
  96.     DB    'KEY- '
  97.     DW    KEYOFF
  98.  
  99.     DB    'CASE+'
  100.     DW    CASEON
  101.  
  102.     DB    'CASE-'
  103.     DW    CASEOFF
  104.  
  105.     DB    'KSTAT'
  106.     DW    STATUS
  107.  
  108.     IF    KEYDEF
  109.  
  110.     DB    'KEYS '
  111.     DW    KEYS
  112.  
  113.     ENDIF
  114.  
  115.     DB    0
  116. ;
  117. ; THE KEY DEFINITION BUFFER AND VARIABLES MUST FOLLOW HERE SO THAT THE
  118. ; Z3KEY.COM UTILITY CAN FIND THEM PROPERLY.
  119. ;
  120.  
  121. ID    DB    'Z3KEY'        ;IDENTIFIER TO Z3KEY UTILITY
  122.  
  123. NAME    DB    '        ',0    ;NAME OF RCP STORED HERE WHEN DEFINITION SAVED
  124.  
  125. CASEFLG:            ;IF NOT ZERO THEN ALL CHAR AFTER LEADIN WILL   
  126.     DB    UPCASE        ;BE UPPERCASE                                  
  127.  
  128. DELAY:    DW    DELAYCNT    ;DELAY FOR FUNCTION KEY SECOND CHAR
  129.  
  130. INSFLG:    DB    00H        ;FLAG TO INDICATE WHETHER INSTALLED OR NOT
  131.  
  132. EXRATE:    DB    EXPRATE        ;COUNT FOR CONST CALLS BEFORE CHARACTER SENT
  133.  
  134. KTSIZE    DW    KEYTBLS        ;LENGTH OF TABLE
  135.  
  136. ATTN:                ;ATTENTION CHAR TO SIGNAL DEFINITION INPUT
  137.     DB    ATTNCHAR
  138.  
  139. LEADIN:                ;LEAD IN CHARACTER FOR FUNCTION KEYS
  140. KEYTBL:
  141.     DB    LEADCHR,LEADCHR+128,0
  142.                 ;DOUBLE CHARACTER DEFINES SINGLE LEADIN AS
  143.                 ;LEADIN CHARACTER
  144.     DS    TABLESIZE
  145.                 ;RESERVE BLANK SPACE FOR TABLE
  146.  
  147. KEYEND:
  148.  
  149.     DB    0,0        ;GUARD BYTES JUST IN CASE
  150.  
  151. KEYTBLS:    EQU    KEYEND-KEYTBL    ;KEY TABLE SIZE
  152.  
  153. ;
  154. ;  BANNER NAME OF RCP
  155. ;
  156. RCP$NAME:
  157.     DB    'Z3KEY '
  158.     DB    [VERSION/10]+'0','.',[VERSION MOD 10]+'0'
  159.     DB    RCPID,0DH,0AH,0AH
  160.     DB    ' KEY+ activates key definitions',0DH,0AH
  161.     DB    ' KEY- deactivates key definitions',0DH,0AH,0AH
  162.     DB    ' KEY- must be run before loading a new RCP',0DH,0AH
  163.     DB    0
  164.  
  165. ;
  166. ;  COMMAND LIST ROUTINE
  167. ;
  168. CLIST:
  169.     LD    HL,NAME
  170.     CALL    PRINT1
  171.     CALL    CRLF
  172.     LD    HL,RCP$NAME    ; PRINT RCP NAME
  173.     CALL    PRINT1
  174.     LD    HL,CTAB1    ; PRINT TABLE ENTRIES
  175.     LD    C,1        ; SET COUNT FOR NEW LINE
  176. CLIST1:
  177.     LD    A,(HL)        ; DONE?
  178.     OR    A
  179.     RET    Z
  180.     DEC    C        ; COUNT DOWN
  181.     JR    NZ,CLIST1A
  182.     CALL    CRLF        ; NEW LINE
  183.     LD    C,4        ; SET COUNT
  184. CLIST1A:
  185.     LD    DE,ENTRYNAME    ; COPY COMMAND NAME INTO MESSAGE BUFFER
  186.     LD    B,CNSIZE    ; NUMBER OF CHARS
  187. CLIST2:
  188.     LD    A,(HL)        ; COPY
  189.     LD    (DE),A
  190.     INC    HL        ; PT TO NEXT
  191.     INC    DE
  192.     DJNZ    CLIST2
  193.     INC    HL        ; SKIP TO NEXT ENTRY
  194.     INC    HL
  195.     PUSH    HL        ; SAVE PTR
  196.     LD    HL,ENTRYMSG    ; PRINT MESSAGE
  197.     CALL    PRINT1
  198.     POP    HL        ; GET PTR
  199.     JR    CLIST1
  200.  
  201. CRLF:    LD    A,0DH
  202.     CALL    CONOUT
  203.     LD    A,0AH
  204. ;
  205. ;  CONSOLE OUTPUT ROUTINE
  206. ;
  207. CONOUT:
  208.     PUSH    HL        ; SAVE REGS
  209.     PUSH    DE
  210.     PUSH    BC
  211.     PUSH    AF
  212.     AND    7FH        ; MASK MSB
  213.     LD    E,A        ; CHAR IN E
  214.     LD    C,2        ; OUTPUT
  215.     CALL    BDOS
  216.     POP    AF        ; GET REGS
  217.     POP    BC
  218.     POP    DE
  219.     POP    HL
  220.     RET
  221. ;
  222. ;  PRINT STRING [TERMINATED IN 0 OR MSB SET] AT RETURN ADDRESS
  223. ;
  224. PRINT:
  225.     EX    (SP),HL        ; GET ADDRESS
  226.     CALL    PRINT1
  227.     EX    (SP),HL        ; PUT ADDRESS
  228.     RET
  229. ;
  230. ;  PRINT STRING [TERMINATED IN 0 OR MSB SET] PTED TO BY HL
  231. ;
  232. PRINT1:
  233.     LD    A,(HL)        ; DONE?
  234.     INC    HL        ; PT TO NEXT
  235.     OR    A        ; 0 TERMINATOR
  236.     RET    Z
  237.     CALL    CONOUT        ; PRINT CHAR
  238.     RET    M        ; MSB TERMINATOR
  239.     JR    PRINT1
  240. ;
  241. ;  CLIST MESSAGES
  242. ;
  243. ENTRYMSG:
  244.     DB    '  '        ; COMMAND NAME PREFIX
  245. ENTRYNAME:
  246.     DS    CNSIZE        ; COMMAND NAME
  247.     DB    0        ; TERMINATOR
  248.  
  249. ;
  250. ; UCASE UPCASES CHARACTER IN A
  251. ;
  252.  
  253. UCASE:
  254.     AND    7FH        ; MASK OUT MSB
  255.     CP    'a'        ; LOWER-CASE A
  256.     RET    C
  257.     CP    'z'+1        ; GREATER THAN LOWER-CASE Z?
  258.     RET    NC
  259.     AND    5FH        ; CAPITALIZE
  260.     RET
  261. ;
  262. ;  **** RCP ROUTINES ****
  263. ;  ALL CODE FROM HERE ON IS RCP-DEPENDENT!
  264. ;
  265. ;
  266. ; MESSAGE STRINGS
  267. ;
  268.  
  269. KEYMSG:
  270.     DB    'Key: ',0    ;KEY PROMPT
  271.  
  272. EQMSG:
  273.     DB    ' = ',0        ;EQUAL STRING
  274.  
  275. FULLMSG:
  276.     DB    ' Key Table Full, Press any Key ',0    
  277.  
  278. CMESGON:
  279.     DB    '  Upcase function is on.',0DH,0AH,0
  280.  
  281. KMESGON:
  282.     DB    '  Z3KEY is active.',0DH,0AH,0
  283.  
  284. KMESGOFF:
  285.     DB    '  Z3KEY is inactive.',0DH,0AH,0
  286.  
  287. CMESGOFF:
  288.     DB    '  Upcase function is off.',0DH,0AH,0
  289.     
  290.  
  291. OLDWBOOT:
  292.     JP    0000H        ;STORAGE FOR ORIGINAL BIOS JUMP TABLE
  293. OLDCONST:
  294.     JP    0000H        
  295. OLDCONIN:
  296.     JP    0000H
  297. OLDCONOUT:
  298.     JP    0000H    
  299.  
  300.  
  301. NEWTBL:    JP    NEWCONST    ;THIS JUMP TABLE WILL BE MOVED TO
  302.     JP    NEWCONIN    ;OVERLAY AT CONST TO REDIRECT CONSOLE IO
  303.                 ;TO THE RCP
  304.  
  305. SENDFLG:            ;FLAG TO SHOW THAT A DEFINITION IS BEING SENT
  306.     DB    00H        
  307.  
  308. ENTRYPTR:            ;POINTER TO A FOUND ENTRY IN THE TABLE
  309.     DW    KEYTBL        ;USED TO CLEAR ENTRIES
  310.  
  311. DEFPTR:                ;POINTER TO NEXT CHAR TO BE SENT
  312.     DW    KEYTBL        ;INITIALLY POINTS TO THE START OF THE KEYTABLE
  313.  
  314. LNLEN    DB    0        ;STORAGE FOR DEFINITION LINE LENGTH
  315.  
  316. EXCOUNT    DB    EXPRATE        ;COUNTER FOR EXPANSION RATE
  317.  
  318. INBUFS:    EQU    5        ;SIZE OF INPUT BUFFER FOR FUNCTION KEYS
  319.  
  320. INBUF:                ;INPUT BUFFER FOR FUNCTION KEYS
  321.     DS    INBUFS      ;INITIALIZED TO ZERO
  322.  
  323.     IF    KEYDEF
  324.  
  325. KEYS:
  326.     LD    DE,KEYTBL+3
  327. KS4:    LD    B,14H
  328. KS0:    CALL    CRLF
  329. KS1:
  330.     LD    A,(DE)
  331.     OR    A
  332.     JP    M,KS2
  333.     RET    Z
  334.     CP    ' '
  335.     JR    NC,KS6
  336.     LD    A,'^'
  337.     CALL    CONOUT
  338.     LD    A,(DE)
  339.     ADD    A,40H
  340. KS6:
  341.     CALL    CONOUT
  342.     INC    DE
  343.     JR    KS1
  344. KS2:    
  345.     LD    HL,EQMSG
  346.     CALL    PRINT1
  347. KS3:    
  348.     PUSH    BC
  349.     CALL    SNDMSG
  350.     POP    BC
  351.     DJNZ    KS0    
  352. KS5:
  353.     LD    C,06H
  354.     PUSH    DE
  355.     LD    E,0FFH
  356.     CALL    BDOS
  357.     POP    DE
  358.     OR    A
  359.     JR    Z,KS5
  360.     JR    KS4
  361.  
  362.     
  363.  
  364.     ENDIF
  365.     
  366.  
  367.  
  368. KEYOFF    LD    A,(INSFLG)    ;TURNS OFF THE KEY TRANSLATION AND 
  369.     OR    A        ;UNPATCHES THE BIOS TABLE
  370.     JR    Z,KO1        ;MUST BE RUN BEFORE A NEW RCP IS LOADED
  371.     LD    DE,(WBOOT+1)    ;TO AVOID TRASHING THE BIOS POINTERS
  372.     LD    HL,OLDWBOOT
  373.     LD    BC,12
  374.     LDIR
  375.     XOR    A
  376.     LD    (INSFLG),A
  377. KO1:    LD    HL,KMESGOFF
  378.     JR    S2    
  379.  
  380. KEYON:                ;REDIRECTS CONSOLE IO TO THE RCP
  381.     LD    A,(INSFLG)    ;SEE IF ALREADY ACTIVE
  382.     OR    A
  383.     JR    NZ,KN1        ;RETURN IMMEDIATELY IF NOT 0    
  384.     LD    HL,(WBOOT+1)    ;POINT TO PRESENT BIOS TABLE
  385.     LD    DE,OLDWBOOT    ;POINT TO STORAGE AREA
  386.     LD    BC,12        ;LENGTH OF TABLE
  387.     LDIR            ;MOVE TO STORAGE
  388.     LD    HL,(WBOOT+1)    ;POINT TO PRESENT BIOS TABLE
  389.     LD    BC,3        ;ADD 3 TO POINT TO CONST
  390.     ADD    HL,BC
  391.     EX    DE,HL        ;PUT IN DE
  392.     LD    HL,NEWTBL    ;POINT TO NEW JUMP TABLE
  393.     LD    BC,6        ;LOAD LENGTH
  394.     LDIR            ;MOVE NEW TABLE TO BIOS
  395.     LD    A,0FFH        ;TURN ON INSTALLED FLAG
  396.     LD    (INSFLG),A
  397. KN1:
  398.     LD    HL,NAME        ;DISPLAY NAME OF THIS VERSION OF Z3KEY
  399.     CALL    PRINT1
  400.     CALL     CRLF
  401.     LD    HL,RCP$NAME    ;DISPLAY HELP MENU
  402.     JR    S2
  403.  
  404. CASEON:                ;TURNS ON THE CASE TRANSLATION FLAG
  405.     LD    A,0FFH
  406.     LD    (CASEFLG),A
  407.     LD    HL,CMESGON
  408.     JR    S2
  409.  
  410. CASEOFF:            ;TURNS OFF TTHE CASE TRANSLATION FLAG
  411.     XOR    A
  412.     LD    (CASEFLG),A
  413.     LD    HL,CMESGOFF
  414.     JR    S2
  415.  
  416. STATUS:                ;DISPLAYS PRESENT STATUS OF INSTALLED RCP
  417.     LD    A,(INSFLG)
  418.     OR    A
  419.     LD    HL,KMESGON
  420.     JR    NZ,S1
  421.     LD    HL,KMESGOFF
  422. S1:    CALL     PRINT1
  423.     LD    HL,CMESGON
  424.     LD    A,(CASEFLG)
  425.     OR    A
  426.     JR    NZ,S2
  427.     LD    HL,CMESGOFF
  428. S2:    JP    PRINT1
  429.  
  430. NEWCONST:            ;NEW CONSOLE STATUS ROUTINE
  431.     LD    A,(SENDFLG)    ;SEE IF FLAG SET
  432.     OR    A
  433.     JP    Z,OLDCONST    ;IF ZERO THEN CHECK THE CONSOLE
  434.     LD    A,(EXCOUNT)    ;GET EXPANSION COUNT
  435.     OR    A        ;SET FLAGS
  436.     JR    Z,NS1        ;SKIP IF ZERO
  437.     DEC    A
  438.     LD    (EXCOUNT),A     ;STORE THE NEW COUNT
  439.     XOR    A        ;ZERO A
  440.     RET            ;RET NO CHARACTER AVAILABLE YET
  441. NS1:    LD    A,0FFH        ;CHARACTER AVAILABLE HERE FIRST
  442.     RET            ;SO FLAG IT AND RETURN
  443.  
  444. NEWCONIN:            ;NEW CONSOLE INPUT ROUTINE
  445.     PUSH    HL        ;SAVE THE REGISTERS
  446.     PUSH    DE
  447.     PUSH    BC
  448.     LD    A,(SENDFLG)    ;SEE IF FLAG SET
  449.     OR    A
  450.     JR    NZ,SENDNXT    ;IF NOT ZERO THEN SEND NEXT CHAR OF DEFINITION
  451.     LD    HL,INBUF    ;POINT TO INBUF FOR GETKEY
  452.     CALL    GETKEY        ;GET THE CHARCTER OR FUNCTION KEY
  453.     LD    A,(INBUF)    ;GET FIRST CHAR
  454.     LD    BC,(ATTN)    ;GET ATTENTION CHAR    
  455.     CP     C
  456.     JP    Z,GETDEF    ;IF ATTENTION CHAR THEN GET A KEY DEFINITION
  457.     CALL    FINDKEY        ;ELSE SEARCH THE KEY TABLE RETURNS CHAR IN A
  458. NC1:
  459.     IF    KEYDEF
  460.     AND    7FH
  461.     ENDIF
  462.     POP    BC
  463.     POP    DE
  464.     POP    HL
  465.     RET
  466.  
  467. SENDNXT:            ;SENDS NEXT CHARACTER OF A MACRO KEY
  468.     LD    A,(EXRATE)    ;GET EXPANSION RATE COUNT
  469.     LD    (EXCOUNT),A    ;RESET COUNT
  470.     LD    HL,(DEFPTR)    ;GET POINTER TO NEXT CHARACTER
  471.     LD    B,(HL)        ;MOVE CHARACTER TO A
  472.     INC    HL        ;INCREMENT THE POINTER
  473.     LD    (DEFPTR),HL
  474.     LD    A,(HL)        ;GET NEXT CHAR
  475.     LD    (SENDFLG),A    ;STORE IN FLAG
  476.     LD    A,B        ;MOVE THE CHAR TO A
  477.     JR    NC1        ;AND EXIT
  478.  
  479. GETKEY:                ;GETS A KEY FROM CONSOLE AND STORES IT AT HL
  480.                 ;HL RETURNS POINTING TO 0 AT END OF STRING
  481.     PUSH    HL
  482.     CALL    OLDCONIN    ;ELSE GET CHARACTER FROM CONSOLE
  483.     POP    HL
  484.     LD    (HL),A
  485.     INC    HL
  486.     LD    BC,(LEADIN)    ;LOAD LEADIN CHARACTER TO C
  487.     CP    C        ;SEE IF CHARACTER IS LEADIN CHARACTER
  488.     CALL    Z,CHKLEADIN    ;IF SO THEN CHECK FOR REST OF CHARACTERS
  489.     LD    (HL),0        ;OTHERWISE NO NEED FOR INBUF SO 0
  490.     RET
  491.  
  492. CHKLEADIN:            ;CHECKS FOR MORE CHARACTERS AFTER A LEADIN 
  493.                 ;CHARACTER IF NONE ARRIVE WHITHIN THE PERIOD
  494.                 ;DEFINED BY DELAY IT TERMINATES THE INPUT
  495.  
  496.     LD    BC,(DELAY)    ;LOAD DELAY COUNT
  497.     XOR    A        ;ZERO A REGISTER
  498.     CP    B        ;IS B ZERO
  499.     JR    NZ,CL1        ;IF NOT THEN CONTINUE
  500.     CP    C        ;SEE IF C IS ALSO 0
  501.     JR    NZ,CL1        ;IF 0 THEN TREAT AS SUPERSHIFT KEY
  502.     PUSH    HL        ;SAVE POINTER
  503.     CALL     GETCHAR        ;GET NEXT CHARACTER
  504.     POP    HL        ;RETRIEVE POINTER
  505.     LD    (HL),A
  506.     LD    BC,(LEADIN)
  507.     CP    C
  508.     RET    Z
  509.     INC    HL
  510.     RET
  511.  
  512. CL1:
  513.     PUSH    BC        ;SAVE REGISTERS
  514.     PUSH    HL
  515.     CALL    OLDCONST    ;SEE IF NEXT CHARACTER AVAILABLE YET
  516.     OR    A        ;SET FLAGS
  517.     JR    Z,WAIT        ;IF NOT THEN WAIT A TICK
  518.     CALL    GETCHAR
  519.     POP    HL        ;RETRIEVE POINTER 
  520.     LD    (HL),A        ;STORE NEXT CHARACTER IN INBUF
  521.     INC    HL
  522.     POP    BC        ;CLEANUP STACK
  523.     JR    CHKLEADIN    ;SEE IF MORE CHARACTERS
  524.  
  525. WAIT:
  526.     POP    HL        ;RETRIEVE REGISTERS
  527.     POP    BC
  528.     DEC    BC         ;DECREMENT THE DELAY COUNT
  529.     CP    B        ;A IS ZERO SO SEE IF B IS
  530.     JR    NZ,CL1        ;IF NOT 0 THEN LOOP
  531.     CP    C        ;IF B WAS 0 SEE IF C IS
  532.     JR    NZ,CL1        ;LOOP IF NOT 0
  533.     RET
  534. ;
  535. ; GETCHAR GET A CHARACTER FROM THE OLD CONIN ROUTINE AND APPLIES THE UP CASE IF 
  536. ; THE CASE FLAG IS SET
  537. ;
  538. GETCHAR:
  539.     CALL    OLDCONIN    ;ELSE GET THE CHARACTER
  540.     LD    B,A
  541.     LD    A,(CASEFLG)
  542.     OR    A
  543.     LD    A,B
  544.     CALL    NZ,UCASE
  545.     RET
  546.  
  547.  
  548. ;
  549. ; FINDKEY LOCATES A KEY DEFINITION IN THE TABLE FROM THE STRING POINTED TO
  550. ; BY DE. RETURNS WITH THE ENTRY'S ADDRESS IN ENTRYPTR, A CONTAINS THE FIRST
  551. ; CHARACTER OF THE DEFINITION,DEFPTR POINTS TO SECOND CHARACTER OF DEFINITION
  552. ; SENDFLG IS SET IF MORE CHARACTERS TO SEND FROM THE DEFINITION
  553. ;
  554.  
  555. FINDKEY:            ;INBUF CONTAINS THE KEY CHAR TO BE MATCHED
  556.     LD    DE,INBUF
  557. SCAN:                ;ENTER HERE WITH DE PRESET
  558.     LD    BC,KEYTBLS    ;LOAD SIZE OF KEY TABLE
  559.     LD    HL,KEYTBL    ;POINT TO BEGINNING OF KEY TABLE
  560.     PUSH    DE        ;SAVE POINTER TO THE INPUT STRING
  561. KEYCOMP:
  562.     LD    A,(DE)        ;GET CHAR FROM INBUF
  563.     INC    DE        ;POINT TO NEXT INBUF CHAR
  564.     OR    A        ;END OF INBUF CHARACTERS?
  565.     JR    Z,FOUND        ;IF SO THEN FOUND
  566.     CPI            ;COMPARE INBUF CHAR WITH TABLE
  567.     JR    Z,KEYCOMP    ;IF MATCH THEN CHECK NEXT CHARACTER
  568.     POP    DE        ;IF NOT THEN GET START OF KEY
  569.     PUSH    DE        ;AND SAVE IT AGAIN
  570.     XOR    A        ;FIND A=0 WHICH BEGINS A DEFINITION
  571.     CPIR            ;SEARCH UNTIL 0 FOUND OR END OF TABLE
  572.     JP    PO,NOFIND    ;IF BC=0 THEN END OF TABLE REACHED
  573.     CP    (HL)        ;SEE IF CHARACTER AFTER THE ZERO IS ALSO A ZERO
  574.     JR    Z,NOFIND    ;DOUBLE ZERO MARKS END OF DEFINED TABLE
  575.     LD    (ENTRYPTR),HL    ;SAVE POINTER TO BEGINNING OF ENTRY
  576.     JR    KEYCOMP
  577. FOUND:    
  578.     POP    DE
  579.     LD    B,(HL)        ;GET FIRST CHARACTER
  580.     INC    HL        ;POINT TO NEXT CHAR
  581. FND1:    
  582.     LD    (DEFPTR),HL    ;STORE POINTER TO NEXT CHAR OF TRANSLATION
  583.     LD    A,(HL)        ;LOAD SECOND CHAR
  584.     LD    (SENDFLG),A    ;STORE IN FLAG IF NON ZERO THEN MORE TO SEND
  585.     LD    A,B        ;MOVE FIRST CHAR TO A
  586.     RET
  587. NOFIND:
  588.     POP    HL        ;NOT FOUND SO GET CHARACTERS FROM INPUT BUFFER
  589.     LD    B,(HL)
  590.     INC    HL
  591.     JR    FND1
  592.  
  593. PRTCHR:                ;SEND CHARACTER IN A TO CONSOLE
  594.     PUSH    HL
  595.     PUSH    DE
  596.     PUSH    BC
  597.     PUSH    AF
  598.     LD    C,A
  599.     CALL    OLDCONOUT
  600.     POP    AF
  601.     POP    BC
  602.     POP    DE
  603.     POP    HL
  604.     RET
  605.     
  606. SNDMSG:                ;SEND MESSAGE POINTED TO BY DE TO CONSOLE
  607.                 ;INCREMENTS LNLEN SO MESSAGE CAN BE ERASED
  608.  
  609.     LD    A,(DE)        ;GET CHAR
  610.  
  611.     IF    KEYDEF
  612.     AND    7FH
  613.     ENDIF
  614.  
  615.     INC    DE
  616.     OR    A        ;SET FLAGS
  617.     RET    Z        ;RETURN IF END OF STRING
  618.     CP    ' '        ;CHECK IF LESS THAN SPACE CHARACTER
  619.     JR    NC,SM1        ;JUMP IF >= TO SPACE
  620.     ADD    A,40H        ;ADD OFFSET TO PROPER CHARACTER
  621.     LD    B,A        ;SAVE CHARACTER
  622.     LD    A,'^'        ;LOAD '^' SYMBOL FOR CONTROL CHARACTERS
  623.     CALL    PRTCHR
  624.     LD    A,(LNLEN)    ;INCREMENT THE LINE LENGTH
  625.     INC    A
  626.     LD    (LNLEN),A    ;SAVE NEW VALUE BACK
  627.     LD    A,B    
  628. SM1:    
  629.     CALL    PRTCHR        ;SEND CHARACTER
  630.     LD    A,(LNLEN)    ;INCREMENT THE LINE LENGTH
  631.     INC    A
  632.     LD    (LNLEN),A
  633.     JR    SNDMSG        ;LOOP TIL DONE        
  634.  
  635.  
  636. ;
  637. ; FINDS END OF KEY TABLE. RETURNS END OF TABLE IN HL OR SENDS TABLE FULL
  638. ; MESSAGE. BC CONTAINS SPACE REMAINING IN TABLE
  639. ;
  640.  
  641. FINDEND:
  642.     LD    HL,KEYTBL    ;POINT TO BEGINNING OF TABLE
  643.     LD    BC,KEYTBLS    ;LOAD SIZE OF TABLE
  644. FE1:    XOR    A        ;SEARCH FOR 0 IN TABLE
  645.     CPIR            ;SEARCH UNTIL 0 FOUND OR END OF TABLE
  646.     JP    PO,TBLFULL    ;IF BC=0 THEN END OF TABLE REACHED
  647.     CP    (HL)        ;SEE IF CHAR AFTER THE ZERO IS ALSO A ZERO
  648.     RET    Z        ;DOUBLE ZERO MARKS END OF DEFINED TABLE
  649.     JR    FE1        ;OTHERWISE KEEP LOOKING
  650.         
  651.  
  652. ;
  653. ;GETDEF PROMPTS FOR KEY DEFINITION AND PLACES IT AT THE END OF THE TABLE
  654. ;DELETES PREVIOUS MATCHING DEFINITION IF FOUND
  655. ;
  656.  
  657. GETDEF:
  658.     XOR    A
  659.     LD    (LNLEN),A    ;ZERO LENGTH OF LINE COUNTER
  660.     LD    DE,KEYMSG    ;POINT TO KEY PROMPT
  661.     CALL    SNDMSG        ;SEND THE MESSAGE    
  662.     CALL    FINDEND        ;RETURNS WITH HL POINTING TO END OF KEY TABLE
  663.     OR    A        ;IF A ZERO THEN ROOM REMAINS IN TABLE
  664.     LD    A,0AH        ;LINEFEED
  665.     JP    NZ,NC1        ;IF NOT ZERO THEN EXIT
  666.     PUSH    HL        ;SAVE STARTING ADDRESS
  667.     CALL    GETKEY        ;GET KEY TO BE DEFINED
  668.     POP    DE        ;RETRIEVE STARTING ADDRESS
  669.     PUSH    HL        ;SAVE POINTER TO NEXT CHAR OF DEFINITION
  670.     PUSH     DE        ;SAVE STARTING ADDRESS AGAIN
  671.     LD    BC,(ATTN)    ;MOVE ATTN CHARACTER TO C REGISTER
  672.     LD    A,(DE)        ;GET FIRST CHARACTER OF KEY BEING DEFINED
  673.     CP    C        ;SEE IF IT'S THE ATTENTION CHARACTER
  674.     JR    NZ,GD3        ;IF NOT THEN SKIP NEXT
  675.     POP    DE
  676.     POP    DE        ;CLEAN UP STACK
  677.     JR    ERASE        ;ERASE AND SEND THE ATTENTION CHARACTER
  678. GD3:
  679.     CALL    SNDMSG        ;DISPLAY KEY TO BE DEFINED
  680.     LD    DE,EQMSG    ;POINT TO EQUAL MESSAGE
  681.     CALL    SNDMSG        ;SEND MESSAGE
  682.     POP    DE        ;RETRIEVE STARTING ADDRESS
  683.     PUSH    DE        ;SAVE IT AGAIN
  684.     CALL    SCAN        ;SEARCH TABLE FOR KEY POINTED TO BY DE
  685.     POP    BC        ;RETRIEVE STARTING ADDRESS OF KEY
  686.     LD    A,(ENTRYPTR)    ;GET LOW BYTE OF POINTER TO FOUND KEY DEF
  687.     CP    C        ;SEE IF ENTRY POINTER AND BC MATCH
  688.     JR    NZ,GD0        ;IF NO MATCH THEN ENTRYPTR POINTS TO PREV DEF
  689.     LD    A,(ENTRYPTR+1)    ;GET HIGH BYTE
  690.     CP    B        ;CHECK HIGH BYTE
  691. GD0:    CALL    NZ,DELDEF    ;IF NO MATCH THEN DELETE OLD DEFINITION 
  692.     POP    HL        ;IF THEY MATCH THEN THIS IS A NEW DEF 
  693. GD1:
  694.     PUSH    HL        ;SAVE POINTER TO NEXT CHAR OF DEF
  695.     CALL    GETKEY        ;GET CHAR OF DEFINITION
  696.     POP     DE        ;POP STARTING POSITION TO DE
  697.     LD    B,A
  698.  
  699.     IF    KEYDEF
  700.     OR    80H
  701.     LD    (DE),A        ;STORE CHARACTER WITH HIGH BIT SET
  702.     ENDIF
  703.  
  704.     LD    A,(ATTN)    ;GET ATTENTION CHAR
  705.     CP    B        ;SEE IF ATTENTION CHAR
  706.     LD    A,08H        ;LOAD BS TO BE RETURNED BY ERASE IF CALLED
  707.     JR    Z,ERASE        ;IF SO THEN QUIT
  708.     CALL    SNDMSG        ;DISPLAY CHAR
  709.     PUSH    HL        ;SAVE POINTER
  710.     EX    DE,HL        ;MOVE TO DE
  711.     LD    HL,KEYEND    ;LOAD END OF TABLE
  712.     CCF            ;CLEAR CARRY FLAG
  713.     SBC    HL,DE        ;CALCULATE REMAINING SPACE
  714.     POP    HL        ;RETRIEVE NEXT POSITION
  715.     JR    NC,GD1        ;SPACE REMAINS SO GET ANOTHER CHAR
  716. ;
  717. ;TBLFULL SENDS THE TABLE FULL MESSAGE WHEN CALLED
  718. ;
  719.  
  720. TBLFULL:
  721.     LD    DE,FULLMSG
  722.     CALL    SNDMSG
  723.     LD    C,07
  724.     CALL    OLDCONOUT
  725. TF2:    CALL    OLDCONST
  726.     OR    A
  727.     JR    Z,TF2
  728.     CALL     OLDCONIN
  729. ERASE:                ;ERASE A MESSAGE SENT BY SNDMSG
  730.     PUSH    AF        ;SAVE CHARACTER TO BE OUTPUT ON RETURN
  731.     LD    A,(LNLEN)
  732.     LD    B,A
  733.     PUSH    BC
  734.     LD    A,08H
  735.     CALL    SNDX
  736.     POP    BC
  737.     PUSH    BC
  738.     LD    A,' '
  739.     CALL    SNDX
  740.     POP     BC
  741.     DEC    BC
  742.     LD    A,08H
  743.     CALL    SNDX    
  744.     XOR    A
  745.     LD    (DE),A
  746.     LD    (SENDFLG),A
  747.     POP    AF        ;RETRIEVE FINAL CHARACTER 
  748.     JP    NC1        ;EXIT THROUGH END OF NEWCONIN
  749.  
  750. SNDX:
  751.     CALL    PRTCHR
  752.     DJNZ    SNDX
  753.     RET
  754.  
  755. DELDEF:                ;DELETE DEFINITION POINTED TO BY ENTRYPTR
  756.     POP    HL        ;CLEAN UP STACK
  757.     POP    DE
  758.     PUSH    HL        ;SAVE RETURN ADDRESS
  759.     LD    HL,(ENTRYPTR)    ;LOAD POSITION OF ENTRY TO DELETE
  760.     EX    DE,HL
  761.     LD    HL,KEYEND    ;LOAD ADDRESS OF TABLE END
  762.     CCF            ;CLEAR CARRY FLAG
  763.     SBC    HL,DE        ;GET LENGTH OF REMAINING TABLE
  764.     PUSH    HL        ;MOVE RESULT TO BC
  765.     POP    BC        ;SIZE OF BLOCK TO SEARCH
  766.     LD    HL,(ENTRYPTR)    ;POINT TO START OF DEFINITION TO DELETE
  767.     XOR    A        ;LOOK FOR ZERO AT END OF DEFINITION
  768.     CPIR
  769.     LD    DE,(ENTRYPTR)    ;DESTINATION OF BLOCK MOVE
  770.     LDIR            ;MOVE TABLE UP
  771.     CALL    FINDEND        ;FIND NEW END OF TABLE
  772.     DEC    HL        ;MOVE BACK ONE SPACE
  773.     INC    BC
  774.     POP    DE
  775.     PUSH    HL
  776.     PUSH    DE
  777.     RET
  778.  
  779. ;
  780. ; SIZE ERROR TEST
  781. ;
  782.     IF    [$ GT [RCP+RCPS*128]]
  783. SIZERR    EQU    NOVALUE
  784.     ENDIF
  785. ;
  786. ; END Z3KEY.RCP
  787. ;
  788.     END
  789.