viernes, 23 de abril de 2010

Mostrar textos en Screen 2

Para facilitar la tarea de mostrar textos en el modo gráfico Screen 2, he programado una serie de funciones. Si quieres conocer como se programa el VDP de los MSX (TMS9918), podéis encontrar el datasheet en EmuDocs.

La primera función necesaria, es una que nos permita escribir en la VRAM (igual que la instrucción de basic VPOKE). Está programada en assembler y es muy sencilla, ya que utiliza la función WRTVRM de la BIOS. En el registro HL se le pasa la dirección, y en el registro A el valor a escribir.

// address = direccion de memoria VRAM
// value = valor a escribir
void vpoke(unsigned int address, unsigned char value)
{
  address;
  value;
__asm
  ld l,4(ix)
  ld h,5(ix)
  ld a,6(ix)
  call 0x004d
__endasm;
}

La siguiente función es la que nos mostrará el texto en la pantalla.

// posx = numero de columna (0 a 31)
// posy = numero de fila (0 a 23)
// text = cadena de caracteres
void vprint(unsigned char posx, unsigned char posy, char* text)
{
  int longi = strLength(text); // tamaño de la cadena
  unsigned int address = 6144 + (posy * 32) + posx; // calcula la posicion en la VRAM
  while (longi-->0)
  {
   vpoke(address++,*(text++)); // escribe en la VRAM
  }
}

Veréis que lo primero que se hace, es identificar el tamaño de la cadena. En vez de utilizar la función de la librería del SDCC, he creado una que la he llamado strLength:

int strLength(char *str)
{
    int i = 0;
    while(*(str++))  i++;
    return i;
}

Luego se calcula la posición en la memoria de vídeo donde se ha de escribir la cadena, en base a la posición dada. El valor 6144 se refiere a la posición de la tabla de nombre de patrones, en la VRAM. Por último se hace un bucle que escribe los caracteres utilizando la función vpoke.

Para finalizar un ejemplo de uso:
vprint(9, 14, "VERSION 0.21B");

No hay comentarios:

Publicar un comentario