domingo, 23 de mayo de 2010

Utilizar datos en assembler

Este caso específico, lo comento, ya que me encontré con un problema con la forma de trabajar con las etiquetas en el "assembler in line", que no estaba descrito (o no lo localicé) , en la documentación del SDCC (manual + ASxxxx Cross Assembler Documentation).

En mi caso, para mostrar el texto de ayuda, necesito que se aloje en un área de la memoria, que luego voy copiando a la VRAM, creando un efecto de scroll. Lo que estaba haciendo, hasta el momento, era utilizar un array de char, que luego volcaba en la RAM. Mi intención es situarlo en la ROM y acceder directamente a la dirección donde se aloje. Para ello he utilizado el "assembler in line", añadiendo los datos con la instrucción "db".

Nota: Esta técnica nos sirve para añadir cualquier tipo de dato, como por ejemplo gráficos, con lo que conseguiríamos mucha más velocidad al volcarlos a la VRAM, utilizando directamente una rutina en ensamblador.

Para conseguir esto, necesitaríamos averiguar en que dirección apuntan nuestros datos. En assembler utilizaremos una etiqueta, pero nos encontramos con el problema de que en C no podemos acceder a esta. Para solucionarlo, tendremos que usar un puente: escribiremos la dirección en la RAM. Para ello, ejecutaremos un programita en ensamblador. Fijaos que al hacer el "load" de la etiqueta al registro HL, hay que añadirle el caracter de la almohadilla "#" (este es el problema que comentaba al inicio).

void setData()
{
__asm

ld hl,#ALABEL
ld (#0xE007),hl
ret

ALABEL:
.db 0x50,0x53,0x47,0x65,0x64,0x20,0x56,0x30
.db 0x2E,0x34,0x42,0x20,0x20,0x20,0x20,0x20
.db 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
.db 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
__endasm;
}

Nota: En el ejemplo se puede observar que los datos utilizan el formato típico de SDCC ("0xFF"), ya que no acepta el común en algunos compiladores de asm ("0FFh").

No hay comentarios:

Publicar un comentario