[Modo Radastaniano] - Textos

Software para o relacionado con el core ZX Spectrum / Software for or related to the ZX Spectrum core
Avatar de Usuario
Radastan
Mensajes: 389
Registrado: 05 Oct 2015, 14:39

[Modo Radastaniano] - Textos

Mensaje por Radastan » 19 Nov 2015, 15:44

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).

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: [Modo Radastaniano] - Textos

Mensaje por Haplo » 19 Nov 2015, 21:23

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.

Avatar de Usuario
Radastan
Mensajes: 389
Registrado: 05 Oct 2015, 14:39

Re: [Modo Radastaniano] - Textos

Mensaje por Radastan » 19 Nov 2015, 23:21

Coméntala por aquí, ya la iremos desgranando.

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: [Modo Radastaniano] - Textos

Mensaje por mcleod_ideafix » 20 Nov 2015, 00:05

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
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: [Modo Radastaniano] - Textos

Mensaje por Haplo » 20 Nov 2015, 01:41

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.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: [Modo Radastaniano] - Textos

Mensaje por Hark0 » 20 Nov 2015, 10:44

Textos textos.... :plasplas:

Sino... ¿como hacemos un "helou wol"? :mrgreen:
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: [Modo Radastaniano] - Textos

Mensaje por Haplo » 21 Nov 2015, 20:16

Éste es el charset que utilizo (está ampliada un 500%):
chr tolo.png
chr tolo.png (962 Bytes) Visto 7552 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)

Avatar de Usuario
Mejias3D
Mensajes: 429
Registrado: 06 Oct 2015, 23:01

Re: [Modo Radastaniano] - Textos

Mensaje por Mejias3D » 21 Nov 2015, 22:24

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

Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Re: [Modo Radastaniano] - Textos

Mensaje por antoniovillena » 21 Nov 2015, 22:34

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

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: [Modo Radastaniano] - Textos

Mensaje por mcleod_ideafix » 08 Dic 2015, 16:15

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
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder