Ruota a destra

© by Vittorio Crapella - i2viu

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

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