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