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).
Consegna
Sezione intitolata “Consegna”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,
eiereti; - ha un programma principale attivo (un ciclo che continua a lavorare);
- è commentato.
Consegna il sorgente (scarica il .asm dal simulatore) e mostra la demo.
Traccia A — “Contatore a interrupt”
Sezione intitolata “Traccia A — “Contatore a interrupt””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.
Traccia B — “Tasto sul display”
Sezione intitolata “Traccia B — “Tasto sul display””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 e colloquio
Sezione intitolata “Bonus e colloquio”- 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
EInel servizio?», «dove deve stare lo stato condiviso tra main e servizio?».
Griglia di correzione
Sezione intitolata “Griglia di correzione”| Indicatore | 0 | 1–2 | 3–4 |
|---|---|---|---|
| Funzionamento | non funziona | funziona in parte / con aiuto | servo come richiesto, main attivo |
| Setup interrupt | mancante | incompleto (manca la tabella o I o im 2) | tabella pari + I + im 2 + ei + vettore/0x83 |
| Servizio | non c’è | presente ma non bilanciato | push/pop bilanciati, ei, reti |
| Bonus | — | — | +1 (beeper o contratto) |
| Colloquio | non risponde | parziale | +1 completo |
(Totale: 4 + 2 + 2 + 1 + 1 = 10)
Soluzioni (per il docente)
Traccia A
Sezione intitolata “Traccia A”TIM = 0x70TIM_C = 0x71SWS = 0x90SEG = 0xA0
.seg CODE (abs) .org 0x0010VTab: .dw servizio
.org 0x0020conta: .db 0
.org 0x0100inizio: 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 eiciclo: 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 retiTraccia B
Sezione intitolata “Traccia B”KEYPAD = 0x80KEYPAD_C = 0x81LCD = 0xD0SWS = 0x90LEDS = 0x20
.seg CODE (abs) .org 0x0010VTab: .dw servizio
.org 0x0100inizio: 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 eiciclo: 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 retiVarianti per la classe
Sezione intitolata “Varianti per la classe”- 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.
Verifiche automatiche
Sezione intitolata “Verifiche automatiche”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.