Logo del sito i2viu

RUOTA A DESTRA DI UN BIT L'ACCUMULATORE
© by Vittorio Crapella - i2viu

Preleva il contenuto di questa pagina in formato .ZIP (5 Kb)

Medainte l'istruzione RLC (Rotate Left Through Carry), come raffigurato qui sotto, é possibile ottenere una routine che implementa l'istruzione (RRC) che ruota l'accumulatore a destra di un bit. Infatti dopo otto RLC, i bit si trovano come se fossero spostati di un posto a destra.

 

sra.gif

RRC (Rotate Right Through Carry)

  
rrc	cp	a,a	;azzera carry
	ldi	x,8 	;conta nr volte rotazione a destra
rlca	rlc	a	;ruota a sinistra di un posto attraverso il carry
	dec	x
	jrnz	rlca	;se non ha ruotato 8 volte ripete
	ret 
Il risultato finale é il seguente:

sra2.gif

L’operazione di rotazione a destra equivale anche ad una divisione per due.

Esempio : 00000100b = 4 dopo RRC -> 00000010b = 2

sra.gif

RUOTA LED DA SINISTRA A DESTRA E VICEVERSA

Listato per ST6210:

;port_a:
	ldi	port_a,00000000b		;tutti input
	ldi	pdir_a,00000000b
	ldi	popt_a,00000000b
;port_b:
	ldi	port_b,00000000b		;tutti output
	ldi	pdir_b,11111111b
	ldi	popt_b,11111111b

;******************************************
;PROGRAMMA PRINCIPALE
;******************************************

main	ldi	wdog,255
	ldi	a,10000000b
sinistr	rlc	a		;cy=1 la prima volta
	jrnc	led		;se cy=0 salta
	jp	destra		;altrimenti deve girare a destra
led	call	ritardo		;accende led per un certo tempo
	jp	sinistr		;ruota ancora a sinistra
destra	ldi	x,8		;ruota per 8 volte
rlca	rlc	a
	dec	x
	jrnz	rlca
	cpi	a,0		;se ruotando a destra a=0
	jrz	sin		;allora é ora di ritornare a sinistra
	call	ritardo
	jp	destra
sin	ldi	a,1		;rimette 1 in a
	jp	sinistr		;ruoterá a sinistra

ritardo	ld	port_b,a
	ldi	w,150		;circa 0,5 secondi
ldiy	ldi	y,255
decy	ldi     wdog,255
	dec	y
	jrnz	decy
	dec	w
	jrnz	ldiy
	ret

          ruota.gif [Stessa soluzione con C-MOS]

DIVISIONE CON ST6
DIVIDENDO A 2 BYTE - DIVISORE E RISULTATO A 1 BYTE

	.title  "DIVISIONE"
                 Dividendo a 16 Bit (n1-n2) 
                 Divisore 8 bit (n3) 
                 Risultato a 8 bit (risult)"

;LIMITI:
;per il minimo divisore = 01h  il max dividendo = 00FFh
;per il max    divisore = FFh  il max dividendo = FE01h


VARIABILI USATE :
; n1          .def       084h   ;byte piú  significativo MSB 
; n2          .def       085h   ;byte meno significativo LSB
; n3	      .def	 086h   ;divisore
; resto	      .def	 087h   ;viene ricordato il resto
; risult      .def	 088h   ;viene ricordato il risultato 


divid	ldi     wdog,0fe	;carico wdog
	clr	risult		;azzeramento risultato
	ld	a,n1		;carico nel reg a il byte + significativo
	jrnz	div		;se non e` zero salto
	ld	a,n2		;altrimenti prendo byte - significativo
	jp	ancora		;e vado a dividere 
div	ld	a,n2		;prendo il byte - signif.
suba	ldi     wdog,0fe
	inc	risult		;suppongo gia` che n3 ci stia una volta in n2
	sub	a,n3		;sottraggo una volta n2-n3 
	jrnc	suba		;se a>= n2 continuo a sottrarre e inc risultato
	dec	n1		;chiedo riporto al byte + significativo
	jrnz	suba		;e se n1 non e` zero continuo a sottrarre
ancora	ldi     wdog,0fe
	inc	risult		;incremento ancora il risultato
	sub	a,n3		;sottraggo ancora
	jrnc	ancora		;e continuo fino a che n2>n3
	dec	risult		;ho finito ma devo sottrarre 1 al risultato
	add	a,n3		;rimetto a come prima dell'ultima sub non valida
	ld	resto,a		;cosi da avere in a il resto 
	ret	

Preleva dividi.zip (3 Kb) contenete div2byte.asm

Preleva div2b99.zip (3 Kb) contenete div2b99.asm divisione migliorata - risultato a 2 byte

METODI DI PROGRAMMAZIONE
Come verificare se il registro X contiene 0 o altro:

METODO LOGICO:
ld	a,x	;istruzione a 1 byte eseguita in 4 cicli macchina
cpi	a,0 	;compara a con 0 istruzione a 2 byte e 4 cicli macch.
jrz	label	;se è 0 salta 

METODO ASTUTO:
inc	x	;x=x+1 istruzione a 1 byte esegutia in 4 cicli macch.
dec	x	;x=x-1 (cioè x=invariato) ist. 1byte 4 cicli 
jrz	label 	;se è 0 salta 

METODO OTTIMALE:
ld	a,x	;istruzione a 1 byte eseguita in 4 cicli macchina
jrz	label	;se è 0 salta 

[ Elettronica ]       [ ST62 Link ]