Directivas estrañas en assembler

Hola
De los ejemplos que vienen con PROTEUS cogi el archivo Doorbell.asm de un circuito que genera 2 melodias con el pic 16f84, pero la parte señalada en rojo no la entiendo.
No pongo el codigo completo, ya que lo teneis disponible en los ejemplos que incorpora proteus.

LIST p=16F84 ; PIC16F844 is the target processor
#include "P16F84.INC" ; Include header file
CBLOCK 0x10 ; Temporary storage
tempo
tptrl
tptrh
note
length
pitch
temp
dl1
dl2
ENDC

ORG 0
entrypoint goto initialise
ORG 4
intvector goto toggle
initialise ; Register set up:
clrw ; Zero.
movwf PORTA ; Ensure PORTB is zero before we enable it.
movwf PORTB ; Ensure PORTB is zero before we enable it.
bsf STATUS,RP0 ; Select Bank 1
clrf TRISB ; Port B is outputs
; Set up timer 0 for tone generation
movlw 0x02 ; Prescaler on, internal clocking, divide by 4
movwf OPTION_REG
bcf STATUS,RP0 ; Back to bank 0


; Poll for a button
wait clrf PORTB
wloop btfss PORTA,0
goto playtune0
btfss PORTA,1
goto playtune1
goto wloop
;Routines to play the tunes
playtune0 movlw 0x13
movwf PORTB
movlw 0x50
movwf tempo
movlw tune0 / 0x100
movwf tptrh
movlw tune0 % 0x100
movwf tptrl
goto playtune
playtune1 movlw 0x23
movwf PORTB
movlw 0xA0
movwf tempo
movlw tune1 / 0x100
movwf tptrh
movlw tune1 % 0x100
movwf tptrl
goto playtune
 
Lo de rojo son registro; los cuales el que lo diseño el programa les coloco ese nombre; asi como tempo.

me corrigen si estoy mal

saludos
 
Última edición:
movlw tune0 / 0x100
movwf tptrh
movlw tune0 % 0x100
movwf tptrl


La constante tune0 debe estar definida por algun lado y debe ser un numero de 16bit.
Lo que hace el bloque es guardar los 8bits superiores en tptrh y los inferiores en tptrl.

Si por ejemplo la constante tune0 se hubiera definido como 0x1B8 , entonces

tune0 / 0x100 = 0x1 ; Division entera
tune0 % 0x100 = 0xB8 ; Modulo == Resto de la division entera

Pero esas operaciones se hacen durante la compilacion, el codigo que se escribe en realidad es:

movlw 0x1
movwf tptrh
movlw 0xB8
movwf tptrl
 
El registro tune0 no lo tienen definido por ninguna parte, y la / y % es la primera vez que lo veo en assembler.

Ojo, esas son operaciones aritmeticas del compilador y son con constantes, si no no podria hacerla.

Me fije en el Doorbell.asm y las dos son el inicio de una tabla con los tonos.

Código:
; Tune 0 Data 
; Bach 'Badinerie' from Suite No 2
tune0    retlw 0x17    ;B
         retlw 0x78    ;240
.............................................
; Tune 1 
; Mozart Eine Klein Nachtmusik
tune1        retlw 0x13    ;G
 
Hola compañeros.

Pues no se si sea una forma de enmascarar lo que se esta haciendo, o es una forma elegante de hacer direccionamiento.

No he revisado el codigo pero por el anterior comentario me di cuenta que tune0 y tune1 son etiquetas o marcas, como le quieran llamar, por lo tanto el dato que almacenan es la direccion donde inicia la tabla de datos.

Como bien comentan son predirectivas del compilador, entonces hace un calculo de constantes, el cual seria la direccion de inicio de tabla tune0 / 256 con lo cual si manejaras un microcontrolador con registros de 8 bits "extraño" el PC manejara espacios de memoria de 256 localidades. Por lo tanto esta tratando de determinar la parte alta del PC de donde empieza dicha tabla.

La segunda directiva tune0 % 256 determinaria ya la localidad exacta pues seria la parte baja del contador de programa PC.

Recuerdo en algun momento tener problemas con el manejo de tablas expecificamente cuando estas estaban en una localidad entre un multiplo de 256; ya que si haces una suma al contador de programa sin considerar la parte alta del registro PC luego sucedia que brincabas a una localidad que no contenia un dato de la tabla sino talvez un nop o algun otro dato, y se colgaba el pic pues al entrar varias veces a direccionar la tabla sin tener una instruccion de retorno se desbordaba la pila. Yo personalmente opte por colocar las tablas siempre al inicio de programa de esta forma garantizaba no tener este problema, claro si hubiese tenido que usar una tabla muy grande de mas de 256 datos yo creo tal vez hubiese hecho este mismo proceso.
 
En el MPLAB he encontrado los /, % y más, hasta en el libro www.pic16f84a.org de la página 588 aparece.

uno.gif
dos.gif




Tablas de datos por encima de la primera página de 256 bytes

Al adaptar algunos proyectos a mis necesidades, necesito situar algunas tablas de datos por encima de la primera página de 256 bytes con lo cual no funcionan correctamente, ¿qué puedo hacer?
Mira el siguiente documento donde se explica como hacerlo: Tablas a partir de 256 bytes (11.72 kB).


Saludo.
 
Última edición:
Es cierto, no me habia dado cuenta que que las tablas superan la posicion 256.
Ya en otra ocasion utilice el ejemplo del libro www.pic16f84a.org , que explica como utilizar tablas por encia de la posicion 256.

Un saludo muchachos.
 
Que tal compañeros.

De antemano gracias compañero meta por el aporte, aunque en mi caso como lo comente omitia ese proceso colocando las tablas en localidades que no tuvieran problema limitrofe de 256.

Otra de las formas para omitir este proceso; era al comenzar a escribir las tablas redefinir la localidad donde se esta trabajando con ellas, ejemplo:

org 0x500
tabla1 addwf PCL,F
retlw 0x00
retlw 0x01
...
...

de esta forma me omitia el proceso de manejar 2 registros para direccionar tablas.
Como comentan lo importante es que cargues el programa en el MPLAB y analices que esta pasando, de esta forma puedes sacar tus concluciones y tus soluciones a los diferentes retos que se te presentan, siempre existe una gran cantidad de formas de resolver un mismo problema. Saludos
 
Atrás
Arriba