; FKEY for TurboDOS
; By ESKAY 4/85 No Lefts Reversed
;
z80
;
       dseg
;
leadin:: db     'A'-40h         ; lead-in character
lastc:  db      0               ; previous char
infk:   db      0               ; ff=in sequence
fkptr:  dw      0               ; points to current fkey
fkeys:: db      0
       ds      255
;
       cseg
;
fkey::  ld      hl,leadin
       cp      (hl)
       jr      z,isli          ; jump if it is leadin
       inc     hl
       ld      (hl),a
       ret
;
; come here if we just received a leadin character
;
isli:   push    af
       ld      a,(fkeys)
       or      a
       jr      nz,dofk         ; fkeys are enabled
       pop     af              ; no fkeys enabled - let's split
       ret
;
dofk:   inc     hl
       pop     af
       ld      (hl),a          ; set previous char
       push    de
       ld      e,1             ; get char
       call    serial##
;
; this char is the fkey
;
       push    bc
       ld      hl,fkeys        ; hl points to fkeys
       ld      b,255           ; 255 chars to check
       ld      c,a
begofk: cp      (hl)
       jr      z,fndfk
       dec     b
       inc     hl
nxtfk:  ld      a,(hl)
       or      a
       inc     hl
       ld      a,c
       jr      z,begofk
       djnz    nxtfk
pdex:   pop     bc
       pop     de
       ret                     ; fkey not in table
;
fndfk:  inc     hl
       ld      a,0ffh
       ld      (infk),a
       ld      a,(hl)
       inc     hl
       ld      (fkptr),hl
       jr      pdex
;
getfk:: ld      a,(infk)
       or      a
       ret     z               ; no fkey sequence
       ld      hl,(fkptr)
       ld      a,(hl)
       inc     hl
       ld      (fkptr),hl
       or      a
       jr      nz,retfk
       ld      (infk),a        ; reset in-fk flag
       ret                     ; return (continue normally)
;
retfk:  pop     hl              ; kill ret addr
       ret                     ; return to previous caller
       end