Ruota a destra
© by Vittorio Crapella - i2viu
RUOTA A DESTRA DI UN BIT L'ACCUMULATORE
RUOTA A DESTRA DI UN BIT L'ACCUMULATORE
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.
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:
L’operazione di rotazione a destra equivale anche ad una divisione per due.
Esempio : 00000100b = 4 dopo RRC -> 00000010b = 2
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
DIVISIONE CON ST6
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 dividi.zip (3 Kb) contenete div2byte.asm
Preleva div2b99.zip (3 Kb) contenete div2b99.asm divisione migliorata - risultato a 2 byte
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