Salta ai contenuti

UDA 5 — Esempio di prova pratica n. 3

Durata: 1 ora · Al simulatore · Punteggio: 10 punti · Argomenti: UDA 5 (interrupt IM2, device vettorati, servizio, main attivo)

Nota per il docente: prova di esempio con due tracce. Si consiglia di assegnare una traccia per classe e di preparare varianti (costanti del timer, porte diverse).

Scrivi un programma in assembly che:

  • usa un interrupt IM2 di un device vettorato (timer, keypad o counter);
  • ha una tabella dei vettori su indirizzo pari, con I, im 2, ei;
  • ha un servizio con registri salvati, ei e reti;
  • ha un programma principale attivo (un ciclo che continua a lavorare);
  • è commentato.

Consegna il sorgente (scarica il .asm dal simulatore) e mostra la demo.


Il timer (0x70 costante, 0x71 vettore/controllo) genera un interrupt che:

  • incrementa un contatore in memoria;
  • lo mostra sui LED (0x20).

Il programma principale, intanto, copia gli interruttori (0x90) sul primo display 7 segmenti (0xA0).

Verifica osservabile: i LED avanzano da soli, a intervalli regolari; muovendo gli interruttori il display cambia; dimezzando la costante del timer il conteggio va più veloce.

Il keypad (controllo 0x81) genera un interrupt quando si preme un tasto. Il servizio:

  • legge il tasto con l’handshake (in a,(0x80), bit 7);
  • lo converte in ASCII e lo mostra sull’LCD (0xD0).

Il programma principale, intanto, copia gli interruttori (0x90) sui LED (0x20).

Verifica osservabile: premendo un tasto la cifra compare sull’LCD; gli interruttori continuano a comandare i LED (il main non si è fermato).


  • Bonus (+1): a ogni tasto, fai anche suonare il beeper (0x60); oppure documenta nel commento il contratto del servizio (registri usati e salvati).
  • Colloquio (1 punto): due domande, ad esempio: «perché il vettore deve essere < 0x80?», «cosa succede se dimentichi EI nel servizio?», «dove deve stare lo stato condiviso tra main e servizio?».
Indicatore01–23–4
Funzionamentonon funzionafunziona in parte / con aiutoservo come richiesto, main attivo
Setup interruptmancanteincompleto (manca la tabella o I o im 2)tabella pari + I + im 2 + ei + vettore/0x83
Servizionon c’èpresente ma non bilanciatopush/pop bilanciati, ei, reti
Bonus——+1 (beeper o contratto)
Colloquionon rispondeparziale+1 completo

(Totale: 4 + 2 + 2 + 1 + 1 = 10)


Soluzioni (per il docente)
TIM = 0x70
TIM_C = 0x71
SWS = 0x90
SEG = 0xA0
.seg CODE (abs)
.org 0x0010
VTab: .dw servizio
.org 0x0020
conta: .db 0
.org 0x0100
inizio:
ld sp, 0xFFFF
ld a, 0x10 ; costante del timer
out (TIM), a
ld a, VTab
out (TIM_C), a
ld a, 0x83 ; run + IRQ
out (TIM_C), a
ld a, 0
ld i, a
im 2
ei
ciclo:
in a, (SWS)
out (SEG), a ; il main copia gli interruttori sul display
jp ciclo
servizio:
push af
push hl
ld hl, conta
inc (hl) ; un "tick" in piu'
ld a, (hl)
out (0x20), a ; contatore sui LED
pop hl
pop af
ei
reti
KEYPAD = 0x80
KEYPAD_C = 0x81
LCD = 0xD0
SWS = 0x90
LEDS = 0x20
.seg CODE (abs)
.org 0x0010
VTab: .dw servizio
.org 0x0100
inizio:
ld sp, 0xFFFF
ld a, VTab
out (KEYPAD_C), a
ld a, 0x83
out (KEYPAD_C), a
ld a, 0
ld i, a
im 2
ei
ciclo:
in a, (SWS)
out (LEDS), a ; il main copia gli interruttori sui LED
jp ciclo
servizio:
push af
push bc
in a, (KEYPAD) ; lettura = handshake
and 0x0F
add a, 0x30 ; 0-9 -> '0'-'9'
ld c, LCD
out (c), a ; il tasto sul display
pop bc
pop af
ei
reti
  • traccia A con il counter al posto del timer (un “contapezzi”: costante 4 → interrupt ogni 2 s);
  • traccia B con il beeper obbligatorio (il bonus diventa requisito);
  • servizio che usa una subroutine (rispettando i salvataggi) per la conversione in ASCII.

I due schemi (timer→LED con main attivo; keypad→LCD con main attivo) sono coperti dai test end-to-end tests/interrupt-e2e.test.ts nel progetto: se la classe usa il simulatore, il comportamento atteso è già garantito.