home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol123 / inkey.z80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  2.3 KB  |  129 lines

  1. ;Revised INKEY and LINA module for BASCOM
  2. ; (C) Copyright Trevor Marshall 1981
  3.     EXT    $TTYST,$TTYIN,$STP,$$TOUT,$$TCR,$TYPTX,$$PLNM,$$TRFL
  4.     ENTRY    $TRF,$TRN,$LINA
  5.     ENTRY    $INK,INK2
  6. ;
  7.     NAME    LINA
  8. $LINA:    
  9. ;
  10.     LD    A,1    ;Non- zero
  11.     LD    (RAM0),A ;Indicate that this routine has been entered
  12. ;
  13. ;    CALL    $TTYST    ;Do a control-c abort
  14. ;    JP    Z,NXT1
  15. ;If the keyboard is ready get and store the char for inkey
  16. ;    CALL    $TTYIN    ;This uses a BIOS vector
  17.     CALL    BDOS.CHAR ;But we will use the BDOS call
  18.     LD    (CHAR),A ;A null if no char ready
  19.     PUSH    AF
  20.     LD    A,30    ;After 30 lines of code discard char
  21.     LD    (COUNT),A
  22.     POP    AF
  23. NXT1:    CP    3
  24.     JP    Z,$STP
  25. ;Now check the line count to see if char is fresh
  26.     LD    A,(COUNT)
  27.     OR    A    ;Is it already zero?
  28.     JP    Z,NXT2    ;Yes, dont decr
  29.     DEC    A
  30.     LD    (COUNT),A
  31. NXT2:
  32.     LD    A,($$TRFL)
  33.     AND    A
  34.     RET    Z
  35.     EX    (SP),HL
  36.     PUSH    BC
  37.     PUSH    DE
  38.     PUSH    HL
  39.     LD    A,($$TOUT)
  40.     DEC    A
  41.     CALL    NZ,$$TCR
  42.     CALL    $TYPTX
  43.     LD    D,H
  44.     LD    D,D
  45.     LD    B,C
  46.     LD    B,E
  47.     PUSH    BC
  48.     CALL    $$PLNM
  49.     POP    HL
  50.     POP    DE
  51.     POP    BC
  52.     EX    (SP),HL
  53.     RET    
  54. ;
  55. $TRN:    LD    A,1
  56.     LD    ($$TRFL),A
  57.     RET    
  58. $TRF:    XOR    A
  59.     LD    ($$TRFL),A
  60.     RET    
  61. ;
  62. COUNT:    DB    0    ;Storage for count
  63. CHAR:    DB    0    ;and char
  64. ;
  65. ; Trevor Marshall's attempt at in INKEY fn for BASCOM
  66. ;We see if /D routine has ever been entered and branch accordingly
  67. $INK:
  68.     LD    HL,RAM0
  69.     LD    A,(HL)
  70.     OR    A    ;Is it still zero
  71.     JR    Z,INK2    ;Yes, execute INK2
  72. ;
  73.     INC    HL
  74.     XOR    A
  75.     LD    (HL),A    ;put null length
  76.     LD    (RAM3),A ;Clear char
  77.     LD    A,(COUNT)
  78.     OR    A
  79.     PUSH    AF    ;Even if count was not 0
  80.     LD    A,0    ;it is now (lockout further calls)
  81.     LD    (COUNT),A ;while repriming COUNT
  82.     POP    AF
  83.     RET    Z    ;count is zero
  84.     LD    A,(CHAR) ;Get char
  85.     OR    A
  86.     RET    Z    ;Null  character
  87.     LD    (HL),1    ;Otherwise set length=1
  88.     LD    (RAM3),A ;store char
  89.     RET
  90.  
  91. INK2:    INC    HL
  92. ;    XOR    A
  93.     LD    (HL),A    ;zero length
  94. ;    CALL    $TTYST    
  95. ;    JP    Z,NXT11
  96. ;If the keyboard is ready get and store the char for inkey
  97. ;    CALL    $TTYIN
  98.     CALL    BDOS.CHAR
  99. NXT11:    LD    (CHAR),A
  100.     OR    A
  101.     RET    Z    ;Null  character
  102.     LD    (HL),1    ;Otherwise set length=1
  103.     LD    (RAM3),A ;store char
  104.     RET
  105. ;
  106. BDOS.CHAR:
  107.     PUSH    HL    ;Do a BDOS call in case char is caughtin O/P
  108.     PUSH    BC
  109.     PUSH    DE
  110.     LD    C,0BH
  111.     CALL    5
  112.     OR    A
  113.     JR    Z,NXT9    ;No char ready yet
  114.     LD    E,0FFH    ;else read it
  115.     LD    C,6
  116.     CALL    5    ;Read no echo CP/M 2
  117. NXT9:
  118.     POP    DE    ;returns a null for no char
  119.     POP    BC
  120.     POP    HL
  121.     RET    
  122. ;
  123. RAM0:    DB    0    ;Changed to 1 by DEBUG code
  124. RAM1:    DB    0    ;length of string
  125. RAM2:    DW    RAM3    ;Pointer at input char
  126. RAM3:    DB    0    ;Where the char is kept
  127.  
  128.     END
  129.