Proposición de gráfica externa para ZX Spectrum

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: Fechas de Retromadrid 2014?

Mensajepor radastan » 30 Ene 2014, 22:18

mcleod_ideafix escribió:
radastan escribió:Y pienso hacer algún experimento con los ZX Spectrum, si Mc Leod no se anima me inventaré algo.

¿Qué te apetecería hacer? :) Estoy barajando quedarme los dos días, en lugar de ir para un solo día :)


Pues había pensado en un modo de vídeo para el ZX Spectrum con resolución 256x128 y 16 colores por pixels por dos razones:

- Es panorámico, y se podría hacer como gráfica externa y tener la señal en el pineado indicando dicho formato.
- Ocupa 16K, lo cual es manejable por el Z80 sin problemas.

La idea sería que el modo de vídeo se pudiera paginar con las existentes (que fuese compatible con 48K y 128K). Si la salida fuese VGA o HDMI ya sería la repera, pero creo que encarece y complica mucho el diseño.

Se puede implementar con una FPGA y una única RAM, vamos que podría ser medianamente económico, y ya tienes realizadas cosas parecidas (no te llevaría mucho tiempo).

Si lo haces puedo llevarme material echo desde casa y lo montamos allí a ver que pasa. Bastaría preparar una rutina simple de sprites sin máscara a 16x16, no me hace falta un fondo de pantalla para un juego de plataformas vistoso y simple. La rutina puedo hacerla sin problemas, sobre todo si los pixels van linealmente en memoria.

¿Te hace? si me dices que si me pongo con los gráficos en un plis plas, te hago un Misco Jones edición especial. ;)
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

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: Fechas de Retromadrid 2014?

Mensajepor mcleod_ideafix » 30 Ene 2014, 23:32

radastan escribió:Pues había pensado en un modo de vídeo para el ZX Spectrum con resolución 256x128 y 16 colores por pixels por dos razones:

- Es panorámico, y se podría hacer como gráfica externa y tener la señal en el pineado indicando dicho formato.
- Ocupa 16K, lo cual es manejable por el Z80 sin problemas.

¿Pero esto es para hacerlo en un Spectrum de verdad, con la FPGA de la ULAplus, o para hacerlo en un clon de Spectrum hecho en FPGA?

radastan escribió:La idea sería que el modo de vídeo se pudiera paginar con las existentes (que fuese compatible con 48K y 128K).

¿Te refieres a que en un 128K haya dos pantallas como ésta?

radastan escribió:Si la salida fuese VGA o HDMI ya sería la repera, pero creo que encarece y complica mucho el diseño.

HDMI va a ser que no. No tengo ninguna Spartan 6. VGA podría ser, a costa de perder todos los timmings originales de la ULA, o meterse a hacer un scandoubler en FPGA, que va a ser que tampoco.

radastan escribió:Se puede implementar con una FPGA y una única RAM, vamos que podría ser medianamente económico, y ya tienes realizadas cosas parecidas (no te llevaría mucho tiempo).

Eso es lo que todo el mundo dice ("no, si tú esto lo haces en una tarde..."). Tan solo es hacer el equivalente a una nueva ULA que poco tiene que ver con la original (modo irónico)

radastan escribió:¿Te hace? si me dices que si me pongo con los gráficos en un plis plas, te hago un Misco Jones edición especial. ;)

Si me pongo con ello te avisaré, pero no prometo nada. Antes de escribir si quiera una linea de Verilog habría que discutir cosas como la disposición de la pantalla. Lineal es lo lógico, pero puede hacer que las rutinas sean más lentas. ¿Cuál sería la disposición de la pantalla en la memoria para que esto funcionara bien?
- ¿Un modo "chunky"? (un byte contiene dos píxeles, uno en la parte alta y otro en la baja)
- ¿Un modo "planar"? (un byte contiene 8 píxeles. Hay cuatro planos, cada uno de ellos contiene un bit del color)

Y además, decidir si el bitmap es lineal, o por scanlines como el Amstrad, o por bloques y scanlines como el Spectrum, o....¿?

Y no olvides la contención: será mayor, ya que en cada scan de pantalla leemos cuatro veces el número de bytes (128) que en el Spectrum original (32). El diseño de esto no es trivial. (Y no, no tengo hecho nada parecido)

Eso sí: si esto se llegara a hacer, porfa porfa porfa, quiero poner un cartel diciendo algo así como "Puristas, por favor, pasen de largo. Herejía in progress..." :D
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

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: Fechas de Retromadrid 2014?

Mensajepor mcleod_ideafix » 31 Ene 2014, 12:12

radastan escribió:
mcleod_ideafix escribió:¿Pero esto es para hacerlo en un Spectrum de verdad, con la FPGA de la ULAplus, o para hacerlo en un clon de Spectrum hecho en FPGA?


Para un Spectrum de verdad, pero tendría que ser externo, es decir para conectar al bus de expansión.


Entonces no hay más remedio que hacerlo a través de la placa interfaz CPLD de Winston, ya que no voy a ponerme a diseñar una placa para el bus de expansión con una FPGA, sólo para un prototipo: es un pitch muy fino y la fresadora que uso no tiene "solder mask". Soldar una FPGA de 0,1mm de pitch sin solder mask es muy doloroso :O

radastan escribió:
mcleod_ideafix escribió:HDMI va a ser que no. No tengo ninguna Spartan 6. VGA podría ser, a costa de perder todos los timmings originales de la ULA, o meterse a hacer un scandoubler en FPGA, que va a ser que tampoco.


Pues olvida ambas cosas, tu a lo sencillo, por euroconector se puede transmitir en panorámico si no mal recuerdo.


Si se hace usando la técnica de mirror de memoria, en la que tengo una copia en memoria local de lo mismo que el procesador escribe en su propia memoria, no habría problema con los timmings.... OJO, no habría problema en el sentido de que no habría colisiones, pero al ir cada chip por su lado, no podrías hacer efectos que requirieran un control preciso de dónde está el rayo catódico en cada momento. Todo lo más, te podría asegurar que desde que ocurre la interrupción del retrazo vertical hasta que se empieza a pintar el primer scan de "paper", pasan X estados.

radastan escribió:
mcleod_ideafix escribió:Eso es lo que todo el mundo dice ("no, si tú esto lo haces en una tarde..."). Tan solo es hacer el equivalente a una nueva ULA que poco tiene que ver con la original (modo irónico)


No exactamente, sólo vas a paginar un bloque de la RAM y ya vas por tu cuenta.

Sí... es que pensé que querías hacer este nuevo modo de video encima de los modos normales, en una ULAplus o similar.

radastan escribió:
mcleod_ideafix escribió:Si me pongo con ello te avisaré, pero no prometo nada. Antes de escribir si quiera una linea de Verilog habría que discutir cosas como la disposición de la pantalla. Lineal es lo lógico, pero puede hacer que las rutinas sean más lentas. ¿Cuál sería la disposición de la pantalla en la memoria para que esto funcionara bien?


Seamos lógicos, es por divertirnos. Si algo sencillo es lento importa un rábano, hago un juego que requiera poco movimiento en pantalla (o nulo).


radastan escribió:1 línea tendrá 256 pixels, y por lo tanto 512 bytes

Noooooo. Son 128 bytes. 512 bytes para 256 píxeles te daría ¡16 bits de color por pixel! ¡65536 colores diferentes!

Desde el punto de vista hardware, una disposición de memoria lineal es tan sencilla de implementar como la que tiene el Spectrum original. De hecho, la disposición que mejor veo es en forma "entrelazada". Algo tal que así:

Código: Seleccionar todo

Dirección    Scanline
---------------------
$4000-$407F     0
$4100-$417F     1
$4200-$427F     2
...             .
...             .
$7F00-$7F7F    63
$4080-$40FF    64
$4180-$41FF    65
$4280-$42FF    66
...             .
...             .
$7F80-$7FFF   127

Pixeles dentro de un byte:
Pixel A en posición X par. Pixel B en posición X impar.

A3 A2 A1 A0 B3 B2 B1 B0

A3-A0, B3-B0, son índices a una paleta de 16 colores. Cada entrada de esa paleta es de 8 bits, en el mismo formato que la ULAplus (G2 G1 G0 R2 R1 R0 B1 B0 si mal no recuerdo)


radastan escribió:Lo suyo es que la memoria sea lineal, las rutinas son mucho más rápidas y sencillas, e incluso se puede hacer scroll.

Scroll (lateral) se puede hacer incluso con la disposición del Spectrum. Es el scroll vertical el único que se beneficia de la disposición lineal de la pantalla. En cuanto a las rutinas de dibujo, una disposición lineal con 4 bits por pixel, 2 pixeles por byte, 128 bytes por scan, supone hacer cosas como ésta para dibujar un sprite de 8x8 píxeles en una posición de carácter:

Código: Seleccionar todo

         ld hl,inicio_definicion_sprite
         ld de,posicion_inicial_pantalla_de_sprite
         ld b,8
pinta:   push bc
         push hl
         ldi  ;2 pixeles/cada ldi
         ldi  ;
         ldi  ;
         ldi  ;
         pop hl
         pop bc
         inc d
         djnz pinta


Sólo habría que hacer un ajuste extra en el caso de que un sprite se pintara en la frontera entre la línea 63 y la 64, y es sumar 128 a la dirección, lo que se traduce en hacer

Código: Seleccionar todo

set 7,e


Ya que si te fijas, la disposición de pantalla de la primera y segunda mitad son iguales, excepto que en la segunda mitad, el bit 7 de la dirección de pantalla está alto, y en la primera mitad, bajo.

radastan escribió:Finalmente: si te decides a hacer esto crea un nuevo hilo, tipo "Gráfica externa para ZX Spectrum by McLeod". Así puedo meter los progresos del juego en ese hilo, porque evidentemente tiene que servir para algo más que para poner chicas guapas y gatos.

Ok. Lo dejo aquí, y si tú o yo queremos seguir hablando del tema, abrimos otro hilo, para no offtopiquear este más.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Proposición de gráfica externa para ZX Spectrum

Mensajepor radastan » 31 Ene 2014, 12:58

Esto viene de aquí:

http://www.zonadepruebas.com/viewtopic.php?f=4&t=4709&start=30

La idea es hacer un "experimento" divertido, una gráfica que se pueda conectar de forma externa al ZX Spectrum y de una imagen panorámica con un color por pixel. Vamos, saltarnos la ULA del ZX Spectrum.

Mi proposición es una pantalla de resolución 128x128 pixels, donde cada pixel realmente es de 2x1 respecto al ZX Spectrum (vamos, que son píxeles alargados). Es algo muy similar al modo 0 de los amstrad CPC. Si se añade posibilidad de poder elegir los 16 colores por una paleta, mucho mejor.

Creo que lo conveniente es hacer lineal la pantalla, y dejarse de entrelazados, al igual que hacer que cada pixel ocupe 4 bits correlativos y haya dos por byte.

Con estas condiciones podrían salir cosas como esta:

Imagen

Más que sobrado para poder tener juegos decentes a todo color.

A nivel de implementación, como esto es un experimento, bastaría con que la gráfica tuviera doble RAM y los datos se escribieran en ambas de forma transparente. Eso permite que el ZX Spectrum vaya por un lado y la gráfica por otro. Evidentemente no vamos a tener "efectos al pixel" y sufriremos algún efecto en movimiento, pero es que el objetivo de esto no es hacer algo perfecto sino divertido. Es el precio del color... :D

Ahora la pelota está en manos de McLeod y cualquiera que quiera colaborar, yo me comprometo a sacarle partido a esta tarjeta en Retromadrid con algún juego.

PD: Si lo de tener un formato panorámico es un latazo podemos podemos hacer una resolución 128x96 (cada pixel son 4 de ZX Spectrum). Ocupa menos que la pantalla actual del ZX Spectrum y se puede usar la misma dirección de memoria (bastaría hacer un OUT a algún puerto para activar el modo de vídeo externo).

En este caso se podría hacer algo así:

misco_mcleod_2.png
misco_mcleod_2.png (1.76 KiB) Visto 11892 veces
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

Avatar de Usuario
wilco2009
MSX Turbo R
MSX Turbo R
Mensajes: 401
Registrado: 29 Ago 2013, 15:48
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: Sega Master System
Primera consola: Atari 2600
Gracias dadas: 1 vez
Gracias recibidas: 7 veces

Re: Proposición de gráfica externa para ZX Spectrum

Mensajepor wilco2009 » 31 Ene 2014, 13:10

No lo acabo de entender. ¿Dónde se mapearia la memoria de video de esa tarjeta?. En el bus no disponemos de señales para deshabilitar la RAM interna.

¿quizás en la zona de la ROM?

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: Proposición de gráfica externa para ZX Spectrum

Mensajepor na_th_an » 31 Ene 2014, 13:32

128x96 / 2 = 6144. Cabría en la RAM que el Spectrum ya tiene destinada a video. Según entiendo, el dispositivo se conectaría al bus de expansión y desde ahí podría leer esta memoria y generar la imagen.

El único problema que veo es de sincronismo ¿hay señal de interrupción en el bus de expansión? ¿Puede "ganarle" esta señal a al ULA? ¿En caso contrario, puede usarse la int de la ULA para gobernar esta "tarjeta externa"?

Me gusta la idea :D

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: Proposición de gráfica externa para ZX Spectrum

Mensajepor radastan » 31 Ene 2014, 13:47

wilco2009 escribió:No lo acabo de entender. ¿Dónde se mapearia la memoria de video de esa tarjeta?. En el bus no disponemos de señales para deshabilitar la RAM interna.

¿quizás en la zona de la ROM?


En la zona de ROM no podemos mapear porque se va a freír gárgaras el Zx Spectrum si escribes (lo descubrimos por desgracia en uno de mis concursos).

Por eso estaba proponiendo el área de pantalla normal, saldrían cosas muy feas por la salida de vídeo del ZX Spectrum pero en la gráfica externa cosas muy majas.

Y 128x96 da para mucho juego al ser cada pixel de un color, incluso podemos aprovechar la parte de atributos (que nos sobra) para poder elegir la paleta de colores.
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

Avatar de Usuario
gamer80
Atari 1040 STf
Atari 1040 STf
Mensajes: 781
Registrado: 31 Oct 2011, 19:34
Ubicación: ESPARTA
Gracias dadas: 20 veces
Gracias recibidas: 34 veces
Contactar:

Re: Proposición de gráfica externa para ZX Spectrum

Mensajepor gamer80 » 31 Ene 2014, 13:51

ULAplus¿?.. Todo esto está en el Sam Coupe, sólo hay que echar mano, hoy día con los chips que hay, esto es coser y cantar :mrgreen: ánimo =D>
"Hazlo o no lo hagas, pero no lo intentes" -Maestro Yoda-

Avatar de Usuario
radastan
Amiga 2500
Amiga 2500
Mensajes: 4542
Registrado: 11 Jun 2007, 19:29
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Sega Genesis/Megadrive
Primera consola: TV Games/Pong Clone
Ubicación: Córdoba
Gracias dadas: 9 veces
Gracias recibidas: 40 veces
Contactar:

Re: Proposición de gráfica externa para ZX Spectrum

Mensajepor radastan » 31 Ene 2014, 13:54

na_th_an escribió:El único problema que veo es de sincronismo ¿hay señal de interrupción en el bus de expansión? ¿Puede "ganarle" esta señal a al ULA? ¿En caso contrario, puede usarse la int de la ULA para gobernar esta "tarjeta externa"?

Hombre, bien mirado podemos usar la misma señal de sincronismo para aprovecharla en la gráfica, no tenemos que generarla si ya la genera el ZX Spectrum. Al fin y al cabo el modo de 128x96 es 4:3 y ocupa el mismo espacio de pantalla.

Lo que se me ocurre también, pero esto ya sería la repanocha, es que la señal de vídeo compuesto del ZX Spectrum se pudiera puentear de forma externa hacia la gráfica y así sacar una señal de vídeo única, con lo que no tendrías que tener dos televisores o cambiar de cable para disfrutar esto. La solución perfecta es que la FPGA sustituya la parte de vídeo de la ULA y genere la imagen también en el "modo ZX Spectrum", con lo que encima tendríamos una solución para sacar imagen con alta calidad en cualquier ZX Spectrum. Pero es pedir demasiado para un experimento y no quiero abusar de McLeod.

na_th_an escribió:Me gusta la idea :D


A que si. \:D/

Si McLeod nos hace el favor esto da para disfrutar una barbaridad.
Yo tengo una máquina del tiempo, se llama ZX Spectrum, siempre me devuelve a los buenos momentos.
(\.../) (\.../) (\.../) (\.../)
( *.*) ('.'= ) ('.'= ) ('.'= )
(")_(") (")_(") (")_(") (")_(")
╔═══╦═══╦═══╦══╦══╗
║╔═╗║╔═╗║╔═╗╠╣╠╩╣╠╝
║║─║║╚══╣║─╚╝║║─║║
║╚═╝╠══╗║║─╔╗║║─║║
║╔═╗║╚═╝║╚═╝╠╣╠╦╣╠╗
╚╝─╚╩═══╩═══╩══╩══╝

Avatar de Usuario
wilco2009
MSX Turbo R
MSX Turbo R
Mensajes: 401
Registrado: 29 Ago 2013, 15:48
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: ZX81
consola_favorita: Sega Master System
Primera consola: Atari 2600
Gracias dadas: 1 vez
Gracias recibidas: 7 veces

Re: Proposición de gráfica externa para ZX Spectrum

Mensajepor wilco2009 » 31 Ene 2014, 15:58

na_th_an escribió:128x96 / 2 = 6144. Cabría en la RAM que el Spectrum ya tiene destinada a video. Según entiendo, el dispositivo se conectaría al bus de expansión y desde ahí podría leer esta memoria y generar la imagen.

El único problema que veo es de sincronismo ¿hay señal de interrupción en el bus de expansión? ¿Puede "ganarle" esta señal a al ULA? ¿En caso contrario, puede usarse la int de la ULA para gobernar esta "tarjeta externa"?

Me gusta la idea :D


Mmmmm, interesante idea la de usar la propia memoria de vídeo del Spectrum.

Por otro lado, si pudiera añadirse más RAM yo pondría una segunda página para usarla como shadow RAM, como en los 128Kb. De esa manera es mas sencillo todo.
Quizás se podría añadir un puerto io para decirle a la tarjeta que puede cambiar de pantalla y de esa manera cuando llegue al final del retrazo vertical, si tiene esa señal activa cambia el buffer de pantalla.
El problema en este caso sigue siendo en qué espacio de direcciones meto la memoria de vídeo.


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

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