ZX-Uno - kit de programación modo Radastaniano
- na_th_an
- 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
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.
- Haplo
- 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
Sigo peleándome por mi cuenta con el modo radastaniano... 
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:
¿sería algo asi como esto?:
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

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

- antoniovillena
- Amiga 1200
- Mensajes: 2013
- Registrado: 16 Abr 2012, 21:22
- Gracias recibidas: 8 veces
Re: ZX-Uno - kit de programación modo Radastaniano
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.
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.
- mcleod_ideafix
- 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
Haplo escribió:Sigo peleándome por mi cuenta con el modo radastaniano...
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
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

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
- Haplo
- 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
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.
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.
- Haplo
- 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
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
- na_th_an
- 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
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.
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
- Haplo
- 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
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!
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!
- na_th_an
- 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
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 

- Haplo
- 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
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.
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.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 16 invitados