ZX-Uno - kit de programación modo Radastaniano

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
na_th_an
Amiga 1200
Amiga 1200
Mensajes: 1273
Registrado: 10 Oct 2012, 11:17
Sistema Favorito: (Otro)
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Sega Master System
Gracias dadas: 18 veces
Gracias recibidas: 15 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor na_th_an » 16 Jun 2015, 22:18

Ahora mismo no lo puedo probar, pero en QB y otros Basics viejos de Microsoft había un comando "Option Base 0" u "Option Base 1" que configuraba para que los arrays empezasen en 0 o en 1. Puedes probar a poner Option Base 0 antes del array. También puedes intentar Dim pal(0 to 15), a ver si se lo traga.

Avatar de Usuario
Haplo
MSX Turbo R
MSX Turbo R
Mensajes: 278
Registrado: 14 Abr 2014, 22:24
Sistema Favorito: PC
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Nintendo NES/Clónica
Ubicación: Ciudad Real
Gracias dadas: 33 veces
Gracias recibidas: 5 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor Haplo » 25 Jun 2015, 20:08

Sigo peleándome por mi cuenta con el modo radastaniano... :mrgreen:

Ahora me he atascado con el uso de máscaras o más exactamente hacer que uno de los colores que se use en un sprite sea transparente con el fondo:

La otra opción sería implementar una nueva instrucción en el Z80 algo así:
OR (HL),A ; 10 ciclos

Que toma el valor de la posición de memoria apuntada por HL, le hace un OR con lo que haya en A y el resultado lo vuelve a escribir en la posición de memoria apuntada por HL. Es decir, una instrucción que equivaldría a esta secuencia:
OR (HL) ; 7 ciclos
LD (HL),A ; 7 ciclos

De esa forma, defines el color transparente como el color de índice 0 y ya está.


¿sería algo asi como esto?:

Código: Seleccionar todo

;DE- direccion_sprite
;HL- direccion_pantalla

LD A, (DE)
OR (HL)
LD (HL),A



No puede ser tan simple creo yo, he probado combinaciones con más operaciones lógicas y no hay manera. Igual es que esté haciendo algo mal con la paleta :P

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor antoniovillena » 25 Jun 2015, 21:44

Te falta la máscara, es decir, indicar qué partes del sprite son transparentes. La máscara se hace con un AND justo antes del OR. Como los píxeles ocupan 4 bits, la cosa se simplifica mucho. Hay 4 posibilidades:

1. Máscara 1111.1111 Se usa sólo el fondo. En realidad equivale a no hacer nada. Si puedes detectarlo antes te puedes ahorrar unos ciclos.
2. Máscara 1111.0000 Se pinta sólo el pixel de la derecha, dejando como fondo (pixel transparente) el de la izquierda.
3. Máscara 0000.1111 Se pinta sólo el pixel de la izquierda, dejando como fondo (pixel transparente) el de la derecha.
4. Máscara 0000.0000 Se pintan los 2 píxeles. Aquí te puedes ahorra el AND y el OR, transfiriendo directamente el byte del sprite a la pantalla.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor mcleod_ideafix » 25 Jun 2015, 21:50

Haplo escribió:Sigo peleándome por mi cuenta con el modo radastaniano... :mrgreen:

Ahora me he atascado con el uso de máscaras o más exactamente hacer que uno de los colores que se use en un sprite sea transparente con el fondo:

La otra opción sería implementar una nueva instrucción en el Z80 algo así:
OR (HL),A ; 10 ciclos

Que toma el valor de la posición de memoria apuntada por HL, le hace un OR con lo que haya en A y el resultado lo vuelve a escribir en la posición de memoria apuntada por HL. Es decir, una instrucción que equivaldría a esta secuencia:
OR (HL) ; 7 ciclos
LD (HL),A ; 7 ciclos

De esa forma, defines el color transparente como el color de índice 0 y ya está.


¿sería algo asi como esto?:

Código: Seleccionar todo

;DE- direccion_sprite
;HL- direccion_pantalla

LD A, (DE)
OR (HL)
LD (HL),A



No puede ser tan simple creo yo, he probado combinaciones con más operaciones lógicas y no hay manera. Igual es que esté haciendo algo mal con la paleta :P


Lo más simple es que sea el color 0 el que se use como "transparente". De todas formas creo que es más rápido si usas una máscara "de verdad" en donde en cada byte de máscara tengas dos pixeles, como en el sprite, pero estos dos píxeles son o bien 0000 para indicar que el pixel en cuestión es transparente, o 1111 para indicar que es opaco.

Así, si HL apunta a un par de píxeles del sprite, DE a la pantalla y HL+1 a la máscara correspondiente a esos dos píxeles, puedes hacer esto (que seguro que ahora viene Antonio Villena y lo deja en dos instrucciones mal contadas :D )

Código: Seleccionar todo

ld a,(hl)   ;A = dos pixeles
inc hl      ;o INC L si el sprite está alineado a frontera de 256
ld b,(hl)   ;B = mascara de esos pixeles
and b       ;elimino los pixeles que se convertirán en transparentes
ld c,a      ;guardo en C
ld a,b      ;mascara en A
cpl         ;invierto para usar ahora en fondo
ld b,a
ld a,(de)   ;A = fondo de pantalla (dos pixeles)
and b    ;elimino pixeles que serán tapados por el sprite
or c       ;pongo el sprite
ld (de),a  ;pantalla actualizada


Si usas una máscara que sea 0000 para color opaco, y 1111 para color transparente, y además haces en el sprite que el color transparente sea siempre el 0, entonces puedes ahorrarte algunos pasos y te queda así:

Código: Seleccionar todo

ld c,(hl)   ;C = dos pixeles
inc hl      ;o INC L si el sprite está alineado a frontera de 256
ld a,(de)   ;A = fondo de pantalla (dos pixeles)
and (hl)       ;elimino pixeles que serán tapados por el sprite
or c       ;pongo el sprite
ld (de),a  ;pantalla actualizada
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
Haplo
MSX Turbo R
MSX Turbo R
Mensajes: 278
Registrado: 14 Abr 2014, 22:24
Sistema Favorito: PC
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Nintendo NES/Clónica
Ubicación: Ciudad Real
Gracias dadas: 33 veces
Gracias recibidas: 5 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor Haplo » 25 Jun 2015, 23:42

Gracias, ya decía yo...
también es cierto que estaba emperrado en no tener que utilizar el método de la máscara aparte, sino calcularla utilizando el propio valor del color definido en el sprite : P
Pero ya veo que se ralentizaría bastante la cosa, es mucho más eficiente tener la máscara generada de antemano.

Avatar de Usuario
Haplo
MSX Turbo R
MSX Turbo R
Mensajes: 278
Registrado: 14 Abr 2014, 22:24
Sistema Favorito: PC
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Nintendo NES/Clónica
Ubicación: Ciudad Real
Gracias dadas: 33 veces
Gracias recibidas: 5 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor Haplo » 27 Jun 2015, 17:06

na_th_an escribió:Dejo por aquí esto que hice y que sería fácil modificar para otros tamaños. En principio coge un PNG de cualquier tamaño con sprites de 8x8 y una cadena con la paleta(*) y genera código.

(*) Una cadena con la paleta es una ristra de 32 caracteres con los 16 colores de la paleta en formato hexadecimal, por ejemplo "93F103141C8401A0E08244B4FC8EFF00" (cada 2 digitos hex representan 1 color).

Hay dos aplicaciones de linea de comandos:

Código: Seleccionar todo

radsprad.exe in.png out.h palette


Donde in.png es un archivo gráfico con los sprites de 8x8 (por tanto, su altura y anchura deberían ser múltiplos de 8), out.h es el archivo de salida donde se escribirán los datos, y palette es la cadena de 32 caracteres con la paleta. Este programa convertirá los colores que encuentre en png a los colores más parecidos dentro de la paleta.

Para que sea más fácil trabajar con un editor gráfico, tenemos la segunda aplicación:

Código: Seleccionar todo

genpalad.exe palout.png palette


Donde palout.png es un archivo de salida y palette es una cadena de 32 caracteres con la paleta. Esto generará un sencillo archivo png con los colores que se indiquen en palette, para que nos sirva para dibujar en cualquier editor gráfico usando esos colores, con la certeza de que usando esos colores la conversión posterior con radsprad será perfecta.

Espero que os sirva para algo.


Hola na_th_an, hoy he tenido un rato y me he puesto a investigar tu código, como los gráficos que manejo son de 12x8, me he instalado el freebasic para modificarlo ... y me tira este error al compilar (sin haber tocado nada):

"C:\PROGRA~2\FREEBA~1\bin\win32\ld.exe: cannot find -lz"

He probado con varias versiones de FB por si faltara alguna libreria o así.

-- Actualizado 27 Jun 2015, 22:20 --

Vale, en principio ya no me hace falta, basándome en lo que he visto, me estoy haciendo un conversor parecido al tuyo pero que maneja .bmp, que es más sencillo de tratar sin tirar de librerías. Así de paso puedo colocar las máscaras y reorganizar todo independientemente de cómo estuvieran organizados los gráficos en el bmp.

También soy novato en Freebasic pero parece sencillito ...

No obstante, a ver si le puedes echar un ojo al error ése, para gente que quiera tirar de .png

Avatar de Usuario
na_th_an
Amiga 1200
Amiga 1200
Mensajes: 1273
Registrado: 10 Oct 2012, 11:17
Sistema Favorito: (Otro)
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Sega Master System
Gracias dadas: 18 veces
Gracias recibidas: 15 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor na_th_an » 29 Jun 2015, 10:02

Es raro, nunca he visto ese error y llevo trabajando con Freebasic desde la versión 0.1... Es posible que el soporte de png, que usa compresión LZ77, necesite una biblioteca extra que no tengas en tu entorno y yo sí (al trabajar con otros compiladores basados en mingw/gcc). Pensaba que con zlib.dll y el .a que meto siempre con los fuentes era suficiente - al menos cuando me muevo a otro de mis PCs sólo necesito una instalación fresca de freebasic y lo que hay en la carpeta de fuentes para compilar.

Tirando de google, errores parecidos en otros entornos se solucionan instalando zlib. Te adjunto la versión que uso yo en mingw porque a lo mejor es suficiente.

Lo raro es que si me meto en el /bin de mi carpeta de freebasic existe libz.dll.a, que es el que te dice que no encuentra. ¿Quizás no tengas bien instalado freebasic? ¿Usas el acceso directo a la consola de freebasic que se crea al instalar el paquete? Puedes probar a copiar libz.dll.a a la misma carpeta que los fuentes a ver si así lo pilla.
Adjuntos
zlib-1.2.3.exe.zip
(375.46 KiB) Descargado 447 veces

Avatar de Usuario
Haplo
MSX Turbo R
MSX Turbo R
Mensajes: 278
Registrado: 14 Abr 2014, 22:24
Sistema Favorito: PC
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Nintendo NES/Clónica
Ubicación: Ciudad Real
Gracias dadas: 33 veces
Gracias recibidas: 5 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor Haplo » 29 Jun 2015, 10:44

Ok, lo probaré cuando llegue a casa.
Ayer me lo pasé teta con FB para masticar el .bmp y sacarlo como .bas como lo haces tú (y eso que parece sencillo!). Ahora que he conseguido cuadrar la salida, ya puedo tunearla y que me ordene de otra manera más apropiada los datos, incluyendo la máscara. Dado que necesitaba trabajar con bloques gráficos de 12x8, mi rutina es algo menos genérica, pero intentaré hacer una adaptable y que funcione como la tuya para que la gente la pueda usar con otros parámetros.

No será una maravilla de la programación pero funciona para el caso y de paso he aprendido muchas cosas, que es de lo que se trata!

Avatar de Usuario
na_th_an
Amiga 1200
Amiga 1200
Mensajes: 1273
Registrado: 10 Oct 2012, 11:17
Sistema Favorito: (Otro)
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Sega Master System
Gracias dadas: 18 veces
Gracias recibidas: 15 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor na_th_an » 29 Jun 2015, 11:18

Freebasic es genial para hacer conversores y utilidades en un tris, en cuanto le coges el tranquillo. A mí me encanta, no uso otra cosa :D

Avatar de Usuario
Haplo
MSX Turbo R
MSX Turbo R
Mensajes: 278
Registrado: 14 Abr 2014, 22:24
Sistema Favorito: PC
primer_sistema: Spectrum +2
consola_favorita: Sony PlayStation 1
Primera consola: Nintendo NES/Clónica
Ubicación: Ciudad Real
Gracias dadas: 33 veces
Gracias recibidas: 5 veces

Re: ZX-Uno - kit de programación modo Radastaniano

Mensajepor Haplo » 20 Jul 2015, 12:05

Buenas, sólo comentar que he avanzado en este tema y ya dispongo de rutinas para imprimir en modo radastaniano con máscaras. Lo que pasa es que me he ido picando y me he metido de lleno en el desarrollo del proyecto que tenía en mente para este modo. (A alguno de vosotros se lo comenté en Retromadrid Days)
Esto implica que las rutinas dejaron hace tiempo de ser "genéricas" y están diseñadas para algo específico. Para colmo, como me gusta experimentar, me he metido con usar la pila para volcar más rápido, desenrrollar bucles y sacar fuera cálculos repetitivos, con lo que el código empieza a ser largo y enredado.

Intentaré publicar pronto una versión más sencilla y sin "optimizar" para que se vea cómo funciona.


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 16 invitados