Ruota a destra
© by Vittorio Crapella - i2viu
© by Vittorio Crapella - i2viu
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 destrarlca  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,10000000bsinistr  rlc  a    ;cy=1 la prima volta  jrnc  led       ;se cy=0 salta  jp  destra     ;altrimenti deve girare a destraled  call  ritardo    ;accende led per un certo tempo  jp  sinistr       ;ruota ancora a sinistradestra  ldi  x,8    ;ruota per 8 volterlca  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  destrasin  ldi  a,1    ;rimette 1 in a  jp  sinistr    ;ruoterá a sinistraritardo  ld  port_b,a  ldi  w,150        ;circa 0,5 secondildiy  ldi  y,255decy  ldi  wdog,255  dec  y  jrnz  decy  dec  w  jrnz  ldiy  retDIVIDENDO 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 = FE01hVARIABILI 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 sottrarreancora  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  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 macchinacpi  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 macchinajrz  label  ;se è 0 salta