L’analisi per l’esercizio, fatta precedentemente non è perfetta. Si noti, infatti, che, almeno a quanto traspare dalla traccia, i frame possono avere lunghezza variabile ancorché minore o uguale a 200. Ora, l’effettuazione di un controllo sullo stato di riempimento del buffer, fatto al termine di ogni singolo frame funziona solo se i frame sono tutti di ampiezza pari esattamente a 200 byte. Se così non fosse si potrebbe avere il caso, ad esempio, che il penultimo frame immesso abbia portato l’area occupata del buffer a 9920 locazioni, per cui restano soltanto 80 locazioni libere e arriva un nuovo frame di, ad esempi, 110 byte. Con il programma visto prima, il microprocessore riterrebbe che il buffer è ancora vuoto, ma la scrittura del frame nuovo deborderebbe dal buffer. Risolviamo il problema effettuando all’inizio il controllo confrontando l’area libera del buffer con la lunghezza del frame.


Il blocco preleva dati può essere realizzato con un altro sottoprogramma PREL che può essere rappresentato dal seguente diagramma
Il blocco calcola checksum può essere realizzato con un altro sottoprogramma CHECK

LD A,FEh; altrimenti invia il messaggio di buffer pieno
OUT(30h),A
RET; ed esci dal sottoprogramma
PREL: LD B,A;salva nel contatore B la lunghezza del frame
; HL contiene già l’indirizzo della prima locazione del buffer
: da riempire
INIR
RET
CHECK: LD C,A
LD B,00h;abbiamo inserito nel registro BC la lunghezza del frame
AND A;azzera il carry
SBC HL,BC;il sottoprogramma PREL ha portato HL più avanti di una
; posizione per cui se sottraggo la lunghezza del frame
;mi porto al primo byte del frame
INC HL;mi devo portare al secondo byte che è il primo dei dati
LD B,C;uso B come contatore
DEC B;deve essere pari alla lunghezza del frame meno uno
;poiché non dovremo fare la XOR anche con il byte di checksum ;inviato dal trasmettitore
LD E,A;salvo in E la lunghezza del frame
LD A,00h;A conterrà il checksum
ET4: XOR (HL)
INC HL
DJNZ ET4
LD D,A ;salva il checksum calcolato
LD A,E;salva di nuovo in A la lunghezza del frame
RET
AZZERA: LD C,A
;il sottoprogramma CHECK ha fatto in modo che HL punti
;all’ultimo byte del frame, ad esempio se si trattava del primo pacchetto e questo era ;composto di 100 dati il buffer era stato riempito da 1A00H a 1A63H, per cui dopo
;CHECK il registro HL contiene 1A63H
;per tornare indietro basta sottrarre ad HL la lunghezza del frame (64 in esadecimale) ;meno 1
DEC C; lunghezza del frame meno uno
LD B,00h ; facciamo in modo che BC contenga la lunghezza del frame
;con la parte alta a zero
AND A ; azzeriamo il flag di carry poiché dobbiamo usare SBC
SBC HL,BC
RET