Durante lo svolgimenti di alcuni esercizi mi sono accorto che il testo combinava in successione alcuni comandi, senza passare prima per i registri, per ottenere in maniera molto più rapida il risultato richiesto rendendo così superflui altri tipi di ragionamenti; vi porgo un esempio:
Il testo mi chiede, in breve, di realizzare un programma che controlli la velocità di 8 ruote tachimetriche:
porti ingresso -> WHELLS (ID 00h) con otto linee W7...W0 una per ogni ruota;
-> VELREL (ID 01h) con otto bit (R7...R0) settabili dall'esterno
porti uscita: -> ERROR (ID 02h) con otto bit (E7...E0) ciascuno corrispondere ad ogni ruota
ogni ruota ha 32 buchi == 32 impulsi per completare un giro.
timer interrupt ogni 50ms richiesta hardware, risposa gestita in automatico.
Prog principale deve controllare i sensore degli otto tachimetri ed incrementare il corrispettivo conteggio della velocità.
Interrupt valuta il valore delle velocità confrontandole con quella di riferimento ad ogni secondo,e porre ERROR ad 1 o 0 a seconda che esse superino o meno la velocità di riferimento.
Io ho fatto tutto il programma ma sono bloccato nell'interrupt, una volta letti i valori devo velocità devo settare le uscite un maniera opportuna; il punto in questione è il seguente:
.
.
LD LH,SELECT_VELL
;assegno il primo indirizzo delle variabili (che ho creato per contenere le ;varie velocità relative ;all'ing WHELLS)
LOOP: LD A,(HL)
SUB B ; in B è contenuta la velocità di riferimento
RR E ; il CARRY è salvato nel reg E
LD (HL),00h
INC HL ; incremento l'indirizzo di mem
DEC C ; variabile contatore per indicare quante variabili mi rimangono da analizzare
JP NZ,LOOP
.
.
Il mio dubbio è: se il risultato della sottrazione è salvato nell'accumulatore A, come può essere che il risultato in A sia fatto ruotare verso destra (o meglio il CARRY)e che RR E agisca su A se fa riferimento la registro E?
p.s. se servono altri pezzi di codice per chiarire il tutto li inserisco