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 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 ripeti ret
Il risultato finale é il seguente:
Loperazione 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
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 retMETODI 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 saltaPer gentile concessione: Vittorio Crapella