Página 2 de 2

Re: [Modo Radastaniano] - Textos

Publicado: 09 Dic 2015, 09:52
por Hark0
En la página de dafont hay algunas typos pixel que pueden servir:

http://www.dafont.com/es/bitmap.php

;)

Re: [Modo Radastaniano] - Textos

Publicado: 14 Dic 2015, 19:36
por Radastan
Empezamos por lo fundamental, una rutina en ASM para dibujar una letra de 4x6 pixels. De momento no es translúcida, es decir, es como si imprimiéramos un sprite. Por defecto voy a poner que se use el color 0 de la paleta en la tabla ASCII como fondo.

Código: Seleccionar todo

// ___________________________________________
// Posiciona una letra a color
// ___________________________________________

void put_letra (unsigned char *posicion, unsigned int x, unsigned int y)
{
// ___________________________________________
// Posiciona una letra a color
// ___________________________________________

void put_letra (unsigned char *posicion, unsigned int x, unsigned int y)
{
	// -------------------------------------------
	// RUTINA DE IMPRESION DE UNA LETRA DE 4x6 PIXELS
	// EN CUALQUIER POSICION DE BYTES (cada byte dos pixels horizontales)
	// ENTRADAS:
	// D será la posición del cursor vertical en pixels
	// E será la posición del cursor horizontal en parejas de pixels
	// HL es la posición de memoria donde tenemos el sprite
	// SALIDAS: se escribe en el mapa de pantalla
	// ADVERTENCIAS: no comprueba límites de pantalla
	// -------------------------------------------
	#asm
		ld hl,2		; Pasamos la variable de entrada al acumulador
		add hl,sp
		ld d, (hl)	; D es el valor Y
		inc hl
		inc hl
		ld e, (hl)	; E es el valor X
		inc hl
		inc hl
		ld a, (hl)
	    	inc hl
	    	ld h, (hl)
	    	ld l, a		; HL es el puntero al sprite
	
		ld a, d		; recuperamos el valor vertical
		rrca
	        rrca		; rotamos para dejar su valor en múltiplos de 64 (linea, de dos en dos pixels)
		and 192		; borramos el resto de bits por si las moscas
		or e		; sumamos el valor horizontal
		ld e, a		; e preparado
		ld a, d		; cargamos el valor vertical
		rrca
		rrca		; rotamos para quedarnos con los bits altos
		and 63		; borramos el resto de bits
		or 64		; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
		ld d, a		; d preparado, ya tenemos la posición en pantalla
	
		ld b,6		; Indicamos que vamos a pintar 6 líneas
		.draw2		; dibujamos 4 pixels (2 bytes)
		ld c,2		; Indicamos que vamos a pintar 2 pares de pixels
		ldi
		ldi
		ld a,e
		add a,62	; incrementamos una línea y retornamos los pixels dibujados
		ld e,a
		jr nc, sigue2
		inc d		; incrementamos D si sale acarrero al incrementar E en 64 bytes
		.sigue2
		djnz, draw2
	
		ret
	
	#endasm
}
PD: Estoy haciendo todo el puñetero código ASCII a mano, sed pacientes. De momento el 0 y el 1 lo imprime bien. :plasplas:

Re: [Modo Radastaniano] - Textos

Publicado: 14 Dic 2015, 21:55
por Hark0
Truco, (o no)..... yo lo he usado en mis chorradas con SDL2...

Buscas una fuente de video BN para display... tipo NOKIA 3310... para Arduino o similares... en la librería de turno encontrarás los set de ASCII que se utilizan en estos displays...

;)


EDITO:
Aqui el enlace de la fuente que yo he usado en SDL2... OJO con la codificación, recomiendo pasar el código 66 (letra B) a binario... ;)

http://playground.arduino.cc/Code/PCD8544

Faltaría encontrar una a tamaño adecuado.

Re: [Modo Radastaniano] - Textos

Publicado: 14 Dic 2015, 22:42
por Radastan
Nada, nada, estoy haciéndome una con dos cojones, aunque me está saliendo muy parecida a las que hay (es que no hay mucho que hacer si quieres algo legible).
test.png
test.png (1.04 KiB) Visto 4607 veces
Esto va de vicio, sólo me queda terminar el font y os actualizo el kit de Z88DK con todo. Lo he metido como libreria aparte por si alguien quiere optimizarlo o personalizarlo sin tocar el resto. De paso añadiré en la actualización alguna rutina interesante más.

Por cierto, la rutina que va eligiendo los caracteres es la de McLeod casi del tirón, lo ha bordado salvo por algún pequeño detalle:

Código: Seleccionar todo

// ___________________________________________
// Escribe un texto
// ___________________________________________

void print (char *texto, char x, char y)
{
  char *InicioFuente = ascii - 32*12; /* de esta forma, InicioFuente apunta 32 caracteres antes del espacio */
  char *InicioSprite;

  while (*texto)
  {
    InicioSprite = (*texto)*12+InicioFuente;
    put_letra (InicioSprite,x, y);
    x+=2; /* siguiente posición de carácter */
    if (x>=63)
    {
      y+=6;
      x = 0;
    }
    texto++;
  }
}

Re: [Modo Radastaniano] - Textos

Publicado: 15 Dic 2015, 08:41
por Hark0
¿alguien puede modificar el mencionado "memcpy" para poder usar transparencias?

¿y añadir un parámetro "tinta" para el color de la fuente?

:silbando: :maestro:

Re: [Modo Radastaniano] - Textos

Publicado: 15 Dic 2015, 09:22
por Radastan
Hark0 escribió:¿alguien puede modificar el mencionado "memcpy" para poder usar transparencias?

¿y añadir un parámetro "tinta" para el color de la fuente?

:silbando: :maestro:
Estoy con una rutina de sprites en C que usa el color 0 de la paleta como transparencia, así podemos usarla en textos y sprites (estos últimos si son pocos en pantalla porque no será rápida la rutina).

EDITADO: Ya he actualizado el kit con letrastransparentes, voy a trabajar en optimizar el asunto.