Seis colores por carácter. ¡ CONSEGUIDO !

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Avatar de Usuario
Rafa
Jack The Nipper
Mensajes: 181
Registrado: Lun May 07, 2007 11:59 am

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por Rafa » Dom Sep 19, 2010 1:03 pm

De verdad, es la última vez que escribo en este hilo. No sigáis contra mí. Seguid aportando información.

Y es que sé de varias personas que piensan que hay algunos "individuos" que se "apropian" de los hilos y no dejan meter baza a nadie. Yo no pienso esto, que quede claro. Estos que lo piensan sé que pasan de este foro. Si es cierto este "acaparamiento" no sería bueno para los novatos, porque nos perderíamos entre un mar de información muy técnica. Sólo hay que echar un vistazo a los hilos. Al fin y al cabo, somos jugones del Spectrum.

No tengo tiempo yo de estar inventándome historias, si digo que lo he conseguido, pues es eso, no me lo invento. Más humildad, señores, no está hecha la miel para ciertos hocicos de ciertos asnos.
RANDOMIZE USR 0

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por jzx » Mar Sep 21, 2010 6:36 pm

Hace unos días que no leía este hilo y por lo que veo la cosa se ha salido un poco de madre. La verdad es que no sé si es para tanto. Yo no creo que sea ninguna exageración o algo impensable lo de hacer una especie de sprite multicolor reducido, y que vaya en una posición variable de la pantalla, incluso podría llegar a pensar algún método para ello, pero ,rafa, no dejes a la gente esperando, si no quieres que te pisen la idea antes de terminarla, (cosa perfectamente comprensible y que yo también pensaría), pon un video en youtube o algo así.

Y bueno, el objetivo del post, antes de ver lo visto, era una tontería, simplemente un programilla que he probado en un rato y que deja tener 1 :!: caracter con dos atributos a la vez, en basic :). No sirve para nada, ya que por ejemplo he tenido que ajustar la posición de la "O" para que cayera en donde se hace el cambio de atributo, ya que el basic no deja ajustar con mucha finura los tiempos (hay que ver lo que dura cada instrucción :( ).

1 PAUSE 1: BORDER 3
20 BORDER 1: POKE a,d
40 POKE a,e: BORDER 6
999 GO TO 1
1000 REM empezar por aqui
1010 LET y=12
1020 PRINT AT Y,0;"O";
1030 LET a=22528+y*32: LET d=64+7*8+2: LET e=7*8+4
1040 GO TO 1

La sincronización con el barrido la hace PAUSE 1, que espera 1 interrupción (casi como un HALT).
Los BORDER eran para calcular la duración de las instrucciones, como una especie de osciloscopio. Al final los he dejado de colorines, efecto de borde por el mismo precio.
Si se pulsan las teclas, como la interrupción sigue "viva", se ve que el "corte" del atributo cambia de posición, pero también es estable.

Lo curioso es que lo he probado en eightyone y en un spectrum de 16 K issue 6A (un plus con amnesia grave que estoy reparando) y se nota que de uno a otro tengo que variar la línea 1010 (en el plus tengo que poner 13).

Ya digo que no vale para gran cosa, pero que conste que (con un mísero caracter) se puede en basic :)

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por mcleod_ideafix » Dom Sep 26, 2010 7:50 pm

jzx escribió:Lo curioso es que lo he probado en eightyone y en un spectrum de 16 K issue 6A (un plus con amnesia grave que estoy reparando) y se nota que de uno a otro tengo que variar la línea 1010 (en el plus tengo que poner 13).


Porque en el caso del Plus de 16K, el stack también se está usando en la memoria contenida, al igual que el programa en BASIC. Si el EightyOne está emulando un 48K, el stack está en memoria no contenida.

Si en el EightyOne haces un CLEAR 32767 antes de ejecutar el programa, también necesitarás poner un 13 seguramente.

¿Por cierto, no sería más rápido hacer un OUT 0,valorborde que un BORDER valorborde? Lo digo por aquello de minimizar la indeterminación de Heisemberg (tú sabes, lo de que el hecho de medir algo altera eso que se quiere medir)
Web: ZX Projects | Twitter: @zxprojects

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por jzx » Lun Sep 27, 2010 8:06 am

No había caido en lo del stack. Me parecía raro porque así en principio me parecía que iba todo en ram contenida (o rom) y el eightyone parece que está muy logrado en cuanto a tiempos, y no veía por dónde estaba la diferencia (lo que dices del stack, seguro, además en basic le meterá bastante tralla). Probaremos, además el eighty one también tiene la posibilidad de funcionar en modo 16K "reales".

Lo del border era por hacerlo en basic más "puro" (el out, poke y demás no son "basic" del todo :) , si no que se lo digan a los usuarios de commodores :twisted: ). Además era sólo por hacer la prueba, no tiene ninguna utilidad.

El border es mucho más lento, porque además cambia unas cuantas variables de sistems (para el color de la parte baja de la pantalla, para cuanto tiene que reponerlo después de usar el cassete y demás).

Z80user
Manic Miner
Mensajes: 215
Registrado: Vie Jun 08, 2007 9:42 am
Ubicación: En un lugar de la mancha
Contactar:

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por Z80user » Mié Sep 29, 2010 3:33 pm

jzx escribió: 1 PAUSE 1: BORDER 3
20 BORDER 1: POKE a,d
40 POKE a,e: BORDER 6
999 GO TO 1
1000 REM empezar por aqui
1010 LET y=12
1020 PRINT AT Y,0;"O";
1030 LET a=22528+y*32: LET d=64+7*8+2: LET e=7*8+4
1040 GO TO 1

Junta las lineas 1, 20 40 y 999 en la misma linea, deberia ser algo mas rapido
Los BORDER, tambien los podrias sustituir por OUT, no se que sera mas rapido, pero no deberia de actualizar ninguna variable.

Sobre el OUT poco pueden decir los de Comodores, ya que la CPU no tiene posibilidades de manejar puertos de entrada/salida.
Si vas a tirar Hardware, primero pregunta si alguien lo puede recuperar.
No abandones un ordenador en un vertedero, donalo a alguien.

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por jzx » Jue Sep 30, 2010 8:17 am

Ya estuve probando cosas, y es cierto que el out es más rápido, pero la idea era usar instrucciones de "alto nivel" (si no puedo poner un USR). Con algunas combinaciones de out, o agrupando instrucciones etc, era más rápido (se producía el cambio más arriba en la pantalla) pero se cortaba el caracter "mal" (por ejemplo 1 línea con un color y 7 con el otro). En todo caso, tampoco da para mucho y no merece la pena.

El comentario sobre los commodores no iba por ahí. El 6502 no distingue puertos y memoria (todo se conecta como memoria) y los puertos se controlan con POKE.
En el Z80 (o en el 8080) se supone que uno de los motivos principales para diferenciar ports y memoria es que out mete un ciclo de espera porque se supone que los ports son más lentos (lo que había entonces, año 78 ó así). Luego además se tiene la ventajas de ampliar el direccionamiento y facilitar la decodificación.

En commodores este tipo de trucos de cambiar cosas durante el barrido se ha usado mucho para hacer demos muy buenas, y en la atari 2600, que también es un 6502 recortado, no veas lo que se hacía.

El comentario iba porque el basic de estas máquinas era bastante cutre y en cualquier programa para cosas como BORDER, PAPER, INK, había que meter POKE, prácticamente todos los programas tenían algún poke

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por mcleod_ideafix » Dom Oct 03, 2010 4:47 pm

Z80user escribió:Sobre el OUT poco pueden decir los de Comodores, ya que la CPU no tiene posibilidades de manejar puertos de entrada/salida.

Ni falta que les hace. Usan E/S mapeada en memoria, como practicamente todos los demás micros no basados en Z80. Para ellos, hacer un POKE en ciertas direcciones de memoria es equivalente a hacer un OUT. Concretamente, un POKE 53280,nuevo_color cambia el color del borde del C64.
Web: ZX Projects | Twitter: @zxprojects

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por Gandulf » Lun Oct 04, 2010 9:19 am

[OFF-TOPIC]
Si no recuerdo mal la familia 68000 tiene el mismo trato con la E/S, y es mapeada en memoria. Desconozco el efecto que tiene esto ya que no he programado ningún procesador (en ensamblador se entiende) que no sea intel 80X86 o el Z80, pero me imagino que será más rápido y en la parte negativa, que ocupa espacios de memoria que podían estar asignados a RAM.
Un saludo,

Gandulf

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por na_th_an » Lun Oct 04, 2010 12:36 pm

Siempre depende del sistema, pero creo que la única ventaja "real" es que puedes ahorrarte patillas en el chip y que el conjunto de señales de procesador es más sencillo... Lo cual no me parece una ventaja real, la verdad. Considero más flexible el modelo de I/O y espacio de direccionamiento de memoria separados, ya que, a fin de cuentas, lo que dicta la velocidad son los dispositivos de I/O y no el método para mapearlos en el espacio de direcciones.

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por jzx » Lun Oct 04, 2010 1:21 pm

El tema de la velocidad es que intel decidió que como los periféricos son lentos, les daba un ciclo de espera extra, por lo que si conectas un dispositivo controlandolo con iorq, el acceso es más lento, para bien o para mal (en la época en que se hizo era bueno). Si quieres, con el z80 no hay problema en poner un periferico mapeado como memoria, tampoco es tan complicado, y te saltas el ciclo de espera.
En cuanto a lo del número de patas, si no tuviera la distinción entre io y memoria, nos sobraría una pata, quizá una dirección y tener doble mapa de memoría ??.

Hoy en día, en los PCs, que han heredado este sistema (el pentium también tiene IN y OUT, muchas tarjetas PCI (o todas no lo sé seguro) mapean los puertos como memoría.

En los micros que no tienen esta separación, pues no queda más que mapear todo como memoría, y así han funcionado muchos sistemas sin problemas (apple i y ii, commodores, ataris y más). Pero si un periférico era lento, tenía que tener "algo" que pidiera el ciclo de espera, como lo tiene que hacer una memoría lenta en el z80, y entonces era más complicado=caro.
Es algo parecido a lo del refresco integrado del z80, que facilitaba mucho el diseño, aunque no fuera algo indispensable.

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por mcleod_ideafix » Lun Oct 11, 2010 8:27 pm

na_th_an escribió:Siempre depende del sistema, pero creo que la única ventaja "real" es que puedes ahorrarte patillas en el chip y que el conjunto de señales de procesador es más sencillo... Lo cual no me parece una ventaja real, la verdad.


El hecho es que el Z80 y los derivados de Intel a partir del 8080, creo, son los únicos sistemas que tienen E/S separada. El resto tiene E/S mapeada en memoria.

Ventajas de la E/S separada: simplifica la circuitería de acceso a memoria al no tener que dedicar parte del mapa de memoria a E/S. En procesadores con MMU y/o caché, simplifica la lógica de gestión de estos componentes, al no necesitarse zonas "sombreadas" de E/S mapeada, donde no debe realizarse la traducción de la MMU, ni debe realizarse el cacheado de los datos.

Desventajas de la E/S separada: no puedes usar los modos de direccionamiento que habitualmente se tienen para manejar la memoria. En el caso del Z80, no tendrás disponibles para E/S separada las instrucciones de carga y almacenamiento de 16 bits, con las cuales se podrían acelerar algunos dispositivos, como el DivIDE. Tampoco podrás usar las instrucciones que operan a nivel de bits (SET, RES, BIT) y que serían particularmente útiles si pudieran usarse con puertos de E/S.

Supongo que recordarás estas cosas de la asignatura de AC de 2º, ¿no? ;)

Dicho esto, recordar que el Z80, al no tener ni MMU ni caché, no tiene problema ninguno para trabajar con E/S mapeada en memoria. Lo que pasa es que en el Spectrum la totalidad del espacio de memoria ya está ocupado con ROM y/o RAM.

Hay un tipo de periféricos, que no son muy comunes, pero que existen para el Spectrum y usan E/S mapeada en memoria: son los periféricos diseñados para enchufarse en el slot de cartuchos ROM del Interface II. En ese slot no hay señal de acceso a E/S, por lo que cualquier periférico que se añada ahí, sólo podrá "hacer caso" a lecturas de memoria en alguna dirección que pertenezca al rango de memoria visible para el cartucho (0000-3FFF). Ejemplo de estos periféricos están por ejemplo los "megacartuchos" que permiten tener varios juegos en el mismo cartucho, y se selecciona uno u otro mediante un menú (no con jumpers).
Web: ZX Projects | Twitter: @zxprojects

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por jzx » Mié Oct 13, 2010 8:45 am

Otros aparatos que usaban el mapeado de memoria para periféricos con el z80 eran los periféricos del zx81, ya que tal como estaba diseñado, cualquier IN afectaba al pulso de sincronismo de video (sí, un IN no sólo leía el dato, además "hacía" algo). Además, el basic no tenía IN ni OUT, entre otras cosas (supongo) porque era muy facil colgar el sistema con una de estas instrucciones mal dada. Si el periférico sólo necesitaba puertos de salida, a veces se usaban las direcciones de la rom para facilitar la decodificación.

Por cierto, para que funcionen las instrucciones de bit hace falta que los datos que se han enviado al puerto se puedan leer de nuevo. Esto no funcionaría con los puertos solapados con la rom como se hacía a veces con el zx81 o lo comentado del if2, pero tampoco se podría hacer con el puerto 254 del spectrum, ya que lo que hace en lectura no tiene nada que ver con lo que hace en escritura.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por na_th_an » Mié Oct 13, 2010 12:37 pm

mcleod_ideafix escribió:Supongo que recordarás estas cosas de la asignatura de AC de 2º, ¿no? ;)


Mira que las asignaturas de ATC eran mis preferidas y mi nota más baja en cualquiera de todas las que cursé (obligatorias, optativas y de libre) fue un 7.5... Pero si te soy sincero, recuerdo más bien poco. Diseño y desarrollo software profesionalmente, y en mis hobbies no seguí cultivando el tema, así que, lamentablemente, he perdido todo es conocimiento. Aunque nunca es tarde para refrescarlo.

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por Gandulf » Mié Oct 13, 2010 1:58 pm

Es normal na_th_an, a mi me pasa lo mismo, hay que hacer sitio en el disco duro y cuando llevas 20 años pegado al desarrollo y al cambio de arquitecturas y frameworks de software, vas olvidando lo que no utilizas. Lo importante es recordar los conceptos básicos, que esos no se olvidan
Un saludo,

Gandulf

Z80user
Manic Miner
Mensajes: 215
Registrado: Vie Jun 08, 2007 9:42 am
Ubicación: En un lugar de la mancha
Contactar:

Re: Seis colores por carácter. ¡ CONSEGUIDO !

Mensaje por Z80user » Mar Oct 26, 2010 12:20 pm

Al usar un puerto I/O en lugar de uno mapeadop en memoria, la CPU añade automaticamente un estado de espera en el caso del Z80, con lo cual el periferico puede que sea algo mas lento que la memoria, y en la epoca en la que se diseño, no era descabellado pensar que el dispositivo estaria en un bus algo mas alejado y lento que la memoria. (esto ultimo una suposicion)

Luego tenemos que en el Spectrum con la puñetera ULA haciendo de las suyas y estando conectada y direccionada con A0, perdemos muchas direcciones de memoria (en los modelos de amstrad unicamente, ya que en los de sinclair se puede inhabilitar la ULA)

En un Spectrum podriamos hablar de 65536 direcciones de memora y otras tantas de I/O, en los Intel por compatibilidad se mantiene, y originalmente se uso a diestro y siniestro, con todo tipo de chips.
Cada una como comentais tiene sus ventajas e inconvenientes, lo unico que se distinge es perfectamente cuando estamos intentando acceder a un periferico porque hay pocas instrucciones y son rapidas de ver, que cuando estamos direccionando memoria y I/O por igual un LD [HL],A no sabriamos si escribe en memoria o en un dispositivo, tanto en el caso de un dispositivo como la memoria, tienen lineas de retardo extra, con lo cual, aumentariamos mas los 64KB de que dispone el Spectrum a mas de 128KB, pero habria sido algo mas costoso de fabricar, y mas complicado de direccionar una direccion de memoria, como ocurre con los i8086, que necesitan 2 registros para direccionar una posicion de memoria absoluta CS:IP DS:BX, etc, los puertos de I/O en ese caso si estan en un rango de 1 registro.

Si el border se pudiese acceder como una posicion de memoria, podria dibujarse algo mas rapido, pero unicamente tendriamos esa ventaja.
Si vas a tirar Hardware, primero pregunta si alguien lo puede recuperar.
No abandones un ordenador en un vertedero, donalo a alguien.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Ahrefs [Bot] y 10 invitados