;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Rotina de leitura de teclas e auto-repeticao - Versao 5.5 (66 bytes).
;
; Observacao: Registrador de retorno da tecla pressionada mudado de D para C.
; ==========
;
; Entrada:
;   Nada.
; Retorno:
;   C = Codigo CHR$ da tecla pressionada. $7F para nenhuma.
;   Destroi todos os demais registradores.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Get_Key: 
    ld   bc,(4025h)       ;obtem o status do teclado (LAST_K)
    ld   a,c
    add  a,1              ;alguma tecla pressionada? (INC A nao seta o Carry)
    jr   c,None_Key       ;nao


;Obtem o valor CHR$ da tecla atualmente pressionada e compara com a ultima

    call 07BDh            ;obtem o valor CHR$ da tecla
    ld   c,(HL)           ;copia para C
    ld   a,(4021h)        ;obtem a ultima tecla
    cp   c                ;compara com a tecla atual
    jr   nz,Different_Key
    ld   de,4034h         ;FRAMES (usado nas temporizacoes)
    ld   hl,403Bh
    bit  1,(hl)           ;repeticao da tecla esta' ativada?
    jr   z,Delay          ;nao


;Repeticao da tecla (10 caracteres/s)

    ld   a,(de)           ;FRAMES
    cp   0FAh             ;delay da taxa de repeticao (255 - 6 + 1)
    jr   nc,None_Key      ;retorna nada no intervalo entre duas repeticoes

Repeat_Key:
    ld   a,(4028h)        ;MARGIN
    add  a,0E0h           ;seta carry se sistema = 50Hz
    sbc  a,a
    dec  a                ;A=254 se 50Hz ou 255 se 60Hz
    ld   (de),a           ;reseta o delay da taxa de repeticao
    set  1,(hl)           ;habilita a repeticao da tecla
    ret                   ;retorna com o codigo da tecla pressionada, em C


;Delay aproximado de 1 segundo antes de comecar a repetir a tecla

Delay:
    ld   a,(de)           ;FRAMES
    cp   0C9h             ;delay (media entre 50/60 Hz)
    jr   c,Repeat_Key


;Nenhuma tecla pressionada

None_Key:
    ld   c,$7F            ;retornando nada
    ret  nc               ;retorno usado pelo trechos de repeticao 


;Tecla e' diferente da ultima ou nenhuma tecla pressionada

Different_Key:
    ld   hl,4034h
    ld   (hl),0FFh        ;reseta o delay de 1 segundo
    ld   l,3Bh
    res  1,(hl)           ;desabilita a repeticao de tecla
    ld   l,21h
    ld   (hl),c           ;salva a tecla pressionada
    ret                   ;retorna com o codigo da tecla pressionada, em C
