; 11 — Progetto di riferimento: "colonna luminosa"  (UDA 6, proposta 1)
; Keypad + LED + display 7 segmenti + timer in interrupt.
;
; Digitando una cifra (0-F) sul keypad, la "colonna" conta da 0 fino a quel
; valore sui LED e sul display, poi riparte. Il ritmo arriva dal timer CTC
; (0x70/0x71) in interrupt IM2, cosi' il programma principale resta libero
; di leggere il keypad.
;
; Porte: keypad 0x80/0x81, LED 0x20, display 7 seg 0xA0, timer 0x70/0x71.

KEYPAD = 0x80
KEYPAD_C = 0x81
LEDS   = 0x20
SEG    = 0xA0
TIM    = 0x70
TIM_C  = 0x71

        .seg CODE (abs)
        .org 0x0010
VTab:   .dw servizio          ; tabella dei vettori (indirizzo pari)

        .org 0x0020
target: .db 0                 ; valore digitato (0-15)
conta:  .db 0                 ; conteggio corrente

        .org 0x0100
inizio:
        ld  sp, 0xFFFF
        ld  a, 0x10
        out (TIM), a          ; costante del timer (prova a cambiarla!)
        ld  a, VTab
        out (TIM_C), a        ; vettore = byte basso (< 0x80)
        ld  a, 0x83
        out (TIM_C), a        ; run + interrupt
        ld  a, 0
        ld  i, a              ; byte alto della tabella dei vettori
        im  2
        ei

main:
        in  a, (KEYPAD)
        bit 7, a              ; c'e' un tasto nuovo?
        jr  z, main
        and 0x0F              ; numero del tasto (0-15)
        ld  (target), a       ; nuovo valore da raggiungere
        xor a
        ld  (conta), a        ; si riparte da zero
        jr  main

servizio:
        push af
        push hl
        ld  hl, target
        ld  a, (conta)
        inc a
        cp  (hl)              ; ha superato il valore?
        jr  c, mostra
        jr  z, mostra         ; lo raggiunge: si ferma qui
        xor a                 ; oltre: riparte da zero
mostra:
        ld  (conta), a
        out (LEDS), a         ; la "colonna" sui LED
        out (SEG), a          ; lo stesso valore sul display
        pop hl
        pop af
        ei
        reti
