# Esercizi — G80

Sei esercizi progressivi, con **consegna**, **file di partenza** (da completare) e **soluzione**.
I file di partenza si aprono nella UI (`Apri .asm…`) e **assemblano già**: eseguendoli si vede il comportamento incompleto da correggere.

## Come si usano
1. Apri `web/g80-lab.html` (o `distro/G80Lab.html`).
2. `Apri .asm…` → scegli il file dell'esercizio (es. `esercizi/01-somma.asm`).
3. Completa i punti `TODO`, premi **Assembla & Carica**, poi **Esegui** o **Passo**.
4. Confronta con `esercizi/soluzioni/…` (in fondo a ogni esercizio c'è il criterio di verifica).

## Indice
| # | Esercizio | Argomento | Verifica |
|---|---|---|---|
| 1 | Somma | istruzioni aritmetiche | `A = 0x20` |
| 2 | Massimo di tre | confronti, `DJNZ`, `(HL)` | `A` = maggiore |
| 3 | Contatore con ritardo | cicli, subroutine | LED che contano lentamente |
| 4 | Copia di un blocco | `LDIR` | 16 byte copiati |
| 5 | Eco su LCD | I/O (`IN`/`OUT`) | i tasti compaiono sul LCD |
| 6 | Interrupt del timer | IM2, vettori | messaggio periodico sul LCD |

## Criteri di valutazione (suggeriti)
- Il programma **assembla senza errori**.
- Il risultato è quello richiesto (vedi "Verifica").
- Commenti chiari e uso corretto delle etichette.
- (Extra) Il programma funziona anche modificando i dati iniziali.

---

## 1 — Somma
**Obiettivo:** `A` deve contenere la somma di `VAL1` e `VAL2`.
**Verifica:** con `VAL1 = 0x15` e `VAL2 = 0x0B` → `A = 0x20`.
**Suggerimento:** `ADD A, <registro o valore>`.

## 2 — Massimo di tre
**Obiettivo:** tre valori nelle celle `0x0010`, `0x0011`, `0x0012`; mettere il **maggiore** in `A`.
**Verifica:** prova con `3, 9, 5` → `A = 9`; con `9, 2, 7` → `A = 9`; con `1, 2, 3` → `A = 3`.
**Suggerimento:** parti dal primo come massimo provvisorio e confronta gli altri con `CP`; `JR NC` salta se il provvisorio è ancora ≥.

## 3 — Contatore con ritardo
**Obiettivo:** contare in binario sugli 8 LED (porta `0x20`) con una pausa visibile fra i valori.
**Verifica:** i LED cambiano circa 2 volte al secondo.
**Suggerimento:** una subroutine di ritardo che **preserva A** (usa `PUSH AF` / `POP AF`).

## 4 — Copia di un blocco
**Obiettivo:** copiare 16 byte da `0x0200` a `0x0300` usando `LDIR`.
**Verifica:** `0x0300..0x030F` uguali a `0x0200..0x020F`.
**Suggerimento:** `LD HL,origine`, `LD DE,destinazione`, `LD BC,16`, `LDIR`.

## 5 — Eco su LCD
**Obiettivo:** ogni carattere digitato compare sul LCD (porta `0xD0`).
**Verifica:** digitando "ciao" compare "ciao".
**Suggerimento:** leggi la porta `0xC0`; `OR A` + `JR Z` per attendere un tasto; poi `OUT`.

## 6 — Interrupt del timer
**Obiettivo:** il timer (`0x70` costante, `0x71` vettore/controllo) genera un interrupt (IM2) che scrive un messaggio sul LCD; nel frattempo il programma principale conta sui LED.
**Verifica:** il messaggio compare ripetutamente, il conteggio LED prosegue.
**Suggerimento:** vettore = byte basso (`< 0x80`) poi `0x83` per abilitare; tabella vettori in `.org 0x0010`; `I` = byte alto; `EI`; nel servizio `EI` e `RETI`.
