Página 1 de 2

[Modo Radastaniano] - Textos

Publicado: 19 Nov 2015, 15:44
por Radastan
A ver, a petición popular voy a pensar también en una rutina para tener textos en pantalla. Evidentemente se me plantea una duda existencial, ¿cómo puedo pasar una cadena de texto en C a un puntero dentro de una tabla de forma sencilla? Porque claro, la idea es que si hagu uan rutina del tipo:

PRINT (X,Y,"TEXTO");

Donde "TEXTO" es una cadena de caracteres... ¿cómo puedo pasar esa cadena a dígitos numéricos?

Según he visto podría hacer esto:

Código: Seleccionar todo

    int tam  = strlen(cad);  // Longitud de la cadena recibida
    int digito;
    int i;

    for (i = tam ; i > 0; --i) {
        digito = (int) (cad[i - 1] - 32); // El primer caracter será espacio en ASCII (32)
	// AQUÍ METERÍAMOS LA IMPRESIÓN COMO SPRITE DEL CARACTER
    }
cad sería la cadena, que estaría definida para recoger en la función como "const char *cad".

¿Es correcto? hasta que no ande por casa no tengo tiempo de probarlo.

Supuestamente se usaría la tabla ASCII: http://ascii.cl/es/, aunque empezando con el 32 en este caso como valor cero (no tiene sentido desperdiciar memoria).

Re: [Modo Radastaniano] - Textos

Publicado: 19 Nov 2015, 21:23
por Haplo
Yo tuve que desarrollar una para el "Tolo". Usa un set propio de caracteres de 6x4 píxeles que ocupan 350 bytes y es posible elegir el color del " paper" y el "ink". La pega es que está ultra optimizada para velocidad y memoria, con lo que de legible tiene poco. No sé si pasártelo o explicar aqui el funcionamiento.

Re: [Modo Radastaniano] - Textos

Publicado: 19 Nov 2015, 23:21
por Radastan
Coméntala por aquí, ya la iremos desgranando.

Re: [Modo Radastaniano] - Textos

Publicado: 20 Nov 2015, 00:05
por mcleod_ideafix
Radastan escribió:Donde "TEXTO" es una cadena de caracteres... ¿cómo puedo pasar esa cadena a dígitos numéricos?
No entiendo la pregunta.... ¿pasar la cadena a dígitos numéricos? Una cadena es un vector de caracteres, o sea, una ristra de dígitos numéricos (los cósigos ASCII de los caracteres de esa cadena), así que, ¿en qué se supone que consiste "pasar una cadena a dígitos numéricos"?

Entiendo que lo que necesitarías sería en realidad traducir cada carácter de una cadena a una dirección de inicio de la definición del carácter. Supongamos que, como dice Haplo, defines un juego de caracteres de 4x6. En el modo Radastaniano, eso ocupa (4*6)/2 = 12 bytes. Supongamos también que ese juego de caracteres comienza en la posición de memoria CharFont, y que comienza con la definición de un espacio (ASCII 32). Harías algo así:

Código: Seleccionar todo

/* Asumo que X es par */
void print (char x, char y, char *texto)
{
  char *InicioFuente = CharFont - 32*12; /* de esta forma, InicioFuente apunta 32 caracteres antes del espacio */
  char *InicioSprite;

  while (*texto)
  {
    InicioSprite = (*texto)*12+InicioFuente; /* Espero que el compilador optimice esto con desplazamientos */
    PrintSprite (x, y, InicioSprite);
    x+=4; /* siguiente posición de carácter */
    if (x>=128)
    {
      y+=6;
      x = 128-x;
    }
    texto++;
  }
}

Por otra parte, PrintSprite sería algo así (versión que asume que X es par y sin usar el color 0 como transparente):

Código: Seleccionar todo

void PrintSprite (char x, char y, char *Sprite)
{
  char *DirScreen = y*64+x/2;
  char i;

  for (i=0;i<6;i++)
  {
    memcpy (DirScreen, Sprite, 2); /* 2 bytes, 4 píxeles que pinto */
    Sprite+=2;
    DirScreen+=64;
  }
}
Si se quiere transparencia habría que cambiar memcpy() por una rutina adhoc que combinara el contenido actual del destino con los valores de fuente, respetando en destino los 4 bits que en una copia normal se convertirían en cuatro ceros

Re: [Modo Radastaniano] - Textos

Publicado: 20 Nov 2015, 01:41
por Haplo
Corrijo, el set ocupa 288 bytes, uso 3 bytes por cada carácter ya que están codificados más o menos como un bitmap monocromo. A grosso modo lo que hace la rutina es leer de 2 en 2 bits (con RLCAs) y usarlos como índice en una tabla de 4 bytes donde están puestas las 4 combinaciones posibles de color:
00 - papel,papel
01 - papel,tinta
10 - tinta, papel
11 -tinta,tinta
Esta tabla es la que otra rutina se encarga de modificar para ajustar los colores.

Es la forma más rapida que he encontrado de hacerlo hasta el momento. Con esto me evito también el chequear si el caracter era par o impar como me pasaba en un principio.

Mañana trataré de explicar mejor el método.

Re: [Modo Radastaniano] - Textos

Publicado: 20 Nov 2015, 10:44
por Hark0
Textos textos.... :plasplas:

Sino... ¿como hacemos un "helou wol"? :mrgreen:

Re: [Modo Radastaniano] - Textos

Publicado: 21 Nov 2015, 20:16
por Haplo
Éste es el charset que utilizo (está ampliada un 500%):
chr tolo.png
chr tolo.png (962 Bytes) Visto 7551 veces
Como veis se trata de una tabla de 96 caracteres de 4x6 píxels en formato monocromo. (por cierto cuál es la notación correcta, 4x6 ó 6x4? :roll: )
El tamaño de letra creo que es el mínimo legible para el modo radastaniano, más grande implica menos caracteres por línea así que todo depende de lo que necesitéis mostrar.

No quiero liaros con mi rutina porque como digo, yo me empeñé en ahorrar memoria ya que ví que en realidad sólo usaría 2 colores con lo que codificando de 2 en 2 bits sería suficiente. Pero esto implica usar un conversor para generar el formato de datos concreto y una rutina muy especializada. También necesita tener el charset y los 4 bytes con las combinaciones de color en una posición de memoria múltiplo exacto de 256, porque sino la cosa se desmadraba con los registros. Así que no es muy flexible por ahí. Con todo, el ahorro de memoria no es tanto porque la rutina de textos también ocupa más, asi que al final me lo he tomado como un ejercicio para practicar ensamblador.

Es por ello que recomiendo tirar de impresión "normal" y hacerle un pequeño cambio a la rutina que ya tenéis de 8x8 y que se adapte a ese tamaño. En este caso la tabla ocuparía 1152 bytes (si queréis usar todos los caracteres, claro)

Re: [Modo Radastaniano] - Textos

Publicado: 21 Nov 2015, 22:24
por Mejias3D
Haplo escribió:[...] Como veis se trata de una tabla de 96 caracteres de 4x6 píxels en formato monocromo. (por cierto cuál es la notación correcta, 4x6 ó 6x4? :roll: [...]
En mi modesta opinión la notación correcta es 4x6, por la misma razón que primero citamos la coordenada "X" y después la "Y" a la hora de hablar de resoluciones de pantalla. Ejemplo: 640x480

Re: [Modo Radastaniano] - Textos

Publicado: 21 Nov 2015, 22:34
por antoniovillena
Mejias3D escribió: En mi modesta opinión la notación correcta es 4x6, por la misma razón que primero citamos la coordenada "X" y después la "Y" a la hora de hablar de resoluciones de pantalla. Ejemplo: 640x480
Totalmente de acuerdo

Re: [Modo Radastaniano] - Textos

Publicado: 08 Dic 2015, 16:15
por mcleod_ideafix
Aquí hay otra mención a una fuente de letras muy pequeñita, que podría usarse con monitores LCD y es compatible con el modo radastaniano ya que en él se permite color independiente por pixel...
http://www.fastcodesign.com/1662778/the ... lcd-screen