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 ]