Newsgroup: it.hobby.elettronica.digitale
Titolo: Domanda ST6

Devo trasferire il valore di un bit di un registro nel carry.
Qual'è il sistema più veloce?

Qual'è il sistema più veloce?
Supponiamo che sia il Bit 5 del registro W :
	...
	call label
	...
label	ldi a, 255	; A = 255
	jrs w, 5, label1	; Salta se Bit = 1
	addi a, 0	; Flag C = 0
	jp label2		; Salta senza modificare il Carry
label1	addi a, 1	; Flag C = 1
label2	ret		; Ritorna indietro (Non modifica il Carry)
Ciao, Massimo - IW1FDX
E-Mail    
max...@libero.it
Visita la pagina dedicata ai microcontrollori ST62
all'indirizzo 
http://digilander.iol.it/max4000

 > Devo trasferire il valore di un bit di un registro nel carry.


Stefano
Infatti un metodo alternativo e piu' generico di quello che ho
indicato precedentemente e' :
W -> Byte in cui si deve controllare il bit
V -> Bit da controllare (0 = LSB...7 = MSB)
	...
	ldi w, 01101001b
	ldi v, 5
	call label
	...
label	ldi a, 8
	sub a, v		; A = Numero di Rotate da fare
	ld v, a
	ld a, w
label1	rlc a		; L'Msb va nel Carry
	dec v		; V-- (Non modifica il Carry)
	jrnz label1	; Cicla se non ha finito (Non mod. il Carry)
	ret		; Ritorna (Non modifica il Carry)


 
E fare l'OR del byte in cui si vuole testare il bit con una maschera con
tutti 1 tranne il posto da testare e poi sommare uno?
Con la prima operazione si ottengono tutti uno, tranne il bit da testare
che mantiene il suo valore originale. SI somma 1, e se c'e' carry vuol dire
che in qualunque posizione fosse il bit testando, questo era a uno,
altrimenti se non c'e' carry, il bit era a zero. 
Due istruzioni, OR e ADD (ma con perdita del dato iniziale). E` abbastanza
veloce?
Franco


    JRR   bit,registro,qui
qui:
saluti
  giovanni

 altrimenti se non c'e' carry, il bit era a zero. 
Già. Però resta sempre il problema di scegliere la maschera di bit 
giusta per fare l'OR secondo il bit da analizzare. Non conosco bene 
l'ST6, ma se permette il set/reset di ogni singolo bit allora è senza
dubbio una operazione veloce e comoda la tua descritta.

 dubbio una operazione veloce e comoda la tua descritta.
Tu non lo ocnsci bene, invece io non lo conosco affatto :-), mai usato
l'ST6. La mia e` una soluzione general purpose, che va bene su quasi
tutti i micro.
Per quanto riguarda la maschera da scegliere e` vero quanto dici, ma
spesso quando si testa un bit (ad esempio uno stato) si sa quale
testare, ed e` sempre quello. Se invece si deve trovare anche la
maschera, la cosa si fa piu` complicata (si potrebbe usare anche una
look up table, specie se il micro ha l'indirizzamento indicizzato).
E poi ho visto che qualcun altro ha postato una soluzione con un branch
condizionato.
Ciao
Franco

tutti 1 tranne il posto da testare e poi sommare uno?
In generale funziona, ma l'ST62 non ha il comando OR.
Lo dovresti fare con AND e NOT, ma a quel punto non conviene piu'
in termini di velocita'.
La soluzione piu' veloce comunque l'ha postata Giovanni.


qui:
Direi che nel caso in cui il bit da testare e' fisso piu' veloce di
cosi' si muore :-)
Sapevo che le istruzioni JRR e JRS modificavano il Carry ma non
avevo mai fatto caso al fatto che nel Carry ci va a finire proprio il
bit testato. Dopo che ho letto il tuo msg ho guardato i DataSheet
e in effetti e' vero.
Non si finisce mai di imparare.


dubbio una operazione veloce e comoda la tua descritta.
Si', lo permette ma solo con indirizzamento immediato.
In pratica non puoi esprimere il bit da settare/resettare in modo
indiretto attraverso una variabile.


 La soluzione piu' veloce comunque l'ha postata Giovanni.
Si`, ho visto, indubbiamente la soluzione ottima.
Franco

 indiretto attraverso una variabile.
Immagino quindi che il test di un singolo bit non sia presente...

Immagino quindi che il test di un singolo bit non sia presente...
Si esiste. E' del tipo :
jrs 3, pippo, label
jrr 3, pippo, label
Salta a "label" se il bit 3 della variabile pippo e' a 1 / 0.
Anche in questo caso pero' e' permesso solo l'indirizzamento
immediato e non quello indiretto.


 immediato e non quello indiretto.
Ma non basta allora caricare in un registro il dato indiretto e poi 
testarlo? Non si risparmiano cicli?

testarlo? Non si risparmiano cicli?
Il problema e' che se io conosco il Bit che devo testare perche'
e' sempre lo stesso mi basta un'istruzione del tipo :
jrs 3, pippo, label
jrr 3, pippo, label
Ma se non conosco a priori quale bit devo testare non lo posso
utilizzare perche' il numero del bit da testare fa parte dell'Op.Code
dell'istruzione. Non posso specificarlo in una variabile.
E' per questo che in questi casi ci si deve affidare al solito ciclo
con Shift/Rotate ecc...
