Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: msx dummie en 26 de Septiembre de 2007, 01:43:11 pm



Título: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Septiembre de 2007, 01:43:11 pm
Buenas tardes familia.
Como algunos ya sabeis sigo investigando en el mundo de los sprites, y en el mundo del basic, voy poco a poco avanzando y haciendo mis programitas, empollando de todo lo que pillo, en plan libros y revistas y tal...
bueno, el caso es que me gustaria comprender el vpeek y el vpoke. En la mayoria de los libros que tengo (por no decir todos) hablan sobre el tema pero basicamente para decir que solo los programadores "expertos" deben hacer uso de esto, y la información que consigo a traves de las revistas de la epoca, no me deja nada claro, quiero decir:
Se que al igual que se crea un sprite mediante algo parecido a esto:

10 screen 2,2
20 s$=""
30 for i=1 to 32
40 read a
50 s$=s$+chr$(a)
60 next i
1000 data 128,1,15.........

y despues...

80 put sprite0,(x,y),15,0 (por ejemplo)

también se puede hacer mediante vpeek y vpoke y de tal forma hacer que todo sea mas rapido.

lo que me gustaria saber es cual es la manera exacta de hacer lo mismo mediante la sentencia vpeek y vpoke, que pasos hay que seguir?? me refiero ha si hay un codigo digamos "patron"
para hacerlo.
estoy con el msx red book y estudiando las direcciones destinadas para cada cosa, pero digo yo que existirá una formula para darle los datos de la forma del sprite a la vram y poder hacer uso de él o de ellos en basic.

podeis ayudarme por favor?
gracias a todos!!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: SapphiRe_MSX en 26 de Septiembre de 2007, 02:01:57 pm
Se que al igual que se crea un sprite mediante algo parecido a esto:

10 screen 2,2
20 s$=""
30 for i=1 to 32
40 read a
50 s$=s$+chr$(a)
60 next i
1000 data 128,1,15.........

y despues...

80 put sprite0,(x,y),15,0 (por ejemplo)

Si mal no recuerdo del BASIC (esto del ensamblador me ha hecho olvidar el MSX-BASIC) te faltaría la instrucción

70 sprite$(0)=s$

Citar
también se puede hacer mediante vpeek y vpoke y de tal forma hacer que todo sea mas rapido.

En efecto, se puede hacer.

Citar
lo que me gustaria saber es cual es la manera exacta de hacer lo mismo mediante la sentencia vpeek y vpoke, que pasos hay que seguir?? me refiero ha si hay un codigo digamos "patron" para hacerlo.

Lo que tienes que hacer es localizar la dirección de la tabla de patrones de sprites en el screen que estés utilizando. Si mal no recuerdo, el número a usar en BASE sería

Código:
(SC+1)*5-1

siendo SC el modo de pantalla en el que estemos. Con lo que la dirección de la tabla de generadores de sprites sería:

Código:
BASE((SC+1)*5-1)

Ahora tendríamos que elegir el sprite adecuado (se pueden definir un total de 256 patrones de sprites en modo 8x8 ó 64 en modo 16x16). La dirección de la VRAM donde se empieza a guardar el patrón N-ésimo de un sprite sería:

Código:
BASE((SC+1)*5-1)+N*TS

siendo TS (como su propio nombre indica) el Tamaño del Sprite en bytes (8 ó 32 bytes).

A partir de ahí puedes empezar a VPOKEAR todos los datos que quieras, que serán metidos en el patrón del sprite N-ésimo. Si te pasas de los 8 bytes (para sprites de 8x8) o de 32 bytes (para sprites de 16x16), empezarás a definir el patrón del sprite (N+1)-ésimo y así sucesivamente. Si tienes, por ejemplo, 4 patrones de sprites para definir, simplemente localizas la dirección de VRAM del primero de todos y empiezas a vpokear los 32 ó 128 bytes (según sean sprites de 8x8 ó 16x16 respectivamente) de datos.

Obviamente todo este código es genérico. Si usas un Screen determinado (o un patrón inicial conocido) podrás substituir la fórmula por su valor concreto, lo que te dará una mayor velocidad al ahorrar cálculos.

Espero que esta explicación te sea de ayuda.

Saludos
--
SapphiRe


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: Shinzon en 26 de Septiembre de 2007, 02:43:46 pm
SapphiRe, estas en todo. :)

Tienes razon, falta la instruccion:

70 sprite$(0)=s$

Si no, no defines el sprite. El "0" del parentesis especifica el numero del sprite que defines. Lo que no me queda claro ahora, es si el segundo parametro de la instruccion SCREEN define el tamaño de los Sprites (creo que asi esta puesto en modo 16x16)... o puede que yo este metiendo la pezuña... pero como ahora estoy con el Ensamblador, como que me he olvidado. Pero miralo por si acaso.

Lo cierto es que a traves de los comandos BASE, VDP y VPOKE/VPEEK se accede bastante mas rapido a los procesos de video que a traves de comandos como SPRITE, o al menos, eso parece. Pero sin embargo, mi consejo es que primero te metas con los medios directos y hagas pruebas. Eso afianzara conocimientos que luego te serviran para lanzarte poco a poco a cosas mas complicadas. Por supuesto, el uso de estas instrucciones deberia ser el paso final, ya que esos conocimientos te serviran bastante cuando un dia te metas en el Ensamblador. Pero antes, el BASIC es un buen punto de partida, ya que te permitira ver que puede hacer el MSX para ti.

Bueno, la verdad es que todo esto es para robarle un poco de protagonismo a Sapphire... ¡dios, estas en todas partes! ¿Como lo haces? ;)

Por cierto, gracias por la ayuda de las interrupciones y lo de RRL y RRD. Eres un libro de conocimientos :)

Salu2.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Septiembre de 2007, 04:34:13 pm
es verdad Saphire, me estas siendo de gran ayuda, gracias otra vez.
si, es cierto olvide poner la linea 70 para decirle que numero de sprite es ese en cuestión... :'( ejeeemmmmmmmm....

a ver si me aclaro:
primero defino el sprite tal y como lo estaba haciendo y despues con la instrucción base lo cargo en la vram?? :-[
quiero decir que si la instrucción base es posterior a la rutina de creaccion del sprite?

y en este codigo que me das: (SC+1)*5-1 ¿sc hay que reemplazarlo por el numero de la dirección que esté utilizando el modo de pantalla seleccionado? (screen 2 en mi caso)
por que va acompañado de +1? y que es ese 5*1??

una ultima pregunta: ¿como vpokeo los datos del sprite? seria algo asi como vpoke(15,128....)???

siento ser tan lerdo, espero que mantengais la paciencia y consigais hacer que lo comprenda del todo.
mil gracias otra vez! :god:


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: SapphiRe_MSX en 26 de Septiembre de 2007, 05:01:33 pm
es verdad Saphire, me estas siendo de gran ayuda, gracias otra vez.

Si es que soy profesor... no puedo evitarlo...

Citar
a ver si me aclaro:
primero defino el sprite tal y como lo estaba haciendo y despues con la instrucción base lo cargo en la vram?? :-[
quiero decir que si la instrucción base es posterior a la rutina de creaccion del sprite?

Al revés...

Citar
y en este codigo que me das: (SC+1)*5-1 ¿sc hay que reemplazarlo por el numero de la dirección que esté utilizando el modo de pantalla seleccionado? (screen 2 en mi caso)
por que va acompañado de +1? y que es ese 5*1??

No, hay que reemplazarlo por el NÚMERO de pantalla. En este caso un 2. ¿Por qué esa fórmula? La respuesta es que el número que hay que usar en BASE para obtener la tabla de definiciones de patrones de sprites es:

SCREEN 0 -> 4
SCREEN 1 -> 9
SCREEN 2 -> 14
SCREEN 3 -> 19
...

Y así sucesivamente, por lo que (SC+1)*5-1 es la fórmula que calcula el número a consultar para el modo de pantalla SC (es que soy matemático, tampoco puedo evitarlo).

Citar
una ultima pregunta: ¿como vpokeo los datos del sprite? seria algo asi como vpoke(15,128....)???

Si PP es el primer patrón de Sprites que quieres modificar y NP el número de patrones de sprites que quieres modificar puedes usar el siguiente código:

Código:
10 IN=BASE(14)+32*PP
20 FOR DI=IN TO IN+32*NP-1
30 READ DA
40 VPOKE DI,DA
50 NEXT DI

¡OJO! Asumo que estás en Screen 2, por eso el 14... si cambias de pantalla tienes que cambiar ese número. También ambos 32, que son para sprites 16x16 (si fueran 8x8 serían 8 ). Si tienes el RESTORE apuntando a los datos de los sprites esta rutina rellenará NP patrones de sprites a partir del patrón PP.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 26 de Septiembre de 2007, 05:27:09 pm
No te agobies, aquí creo que ya se impone una relajada lectura del MSX technical handbook (¿que tal te desenvuelves con el inglés?): Chapter 4,  VDP and display screen (parts 1-5). (http://www.konamiman.com/msx/th-4a.txt). En el apartado 5 se explica el funcionamiento de los sprites en modo 1 (los del MSX1) y en modo 2 (los del MSX2).

Es fundamental que para controlar la pantalla tengas siempre muy clara cual es su estructura de la memoria de video. En este otro documento (http://www.work.de/nocash/portar.htm#videodisplayprocessor) tienes expuesta de forma muy básica como se distribuyen las áreas en la VRAM en cualquiera de los modos. Como verás, screen 2 está dividida en las siguientes zonas:

Código:
  0000-17FF   Definicion de patrones
  1800-1AFF   Mapa de patrones
  1B00-1B7F   Atributos de los sprites
  2000-37FF   Definicion de los colores
  3800-3FFF   Definicion de los sprites

Está claro que ahí tienes los 16K de VRAM (0000-3FFF),
Para modificar una dirección con el valor que quieras lo único que tienes que emplear es el vpoke, por ejemplo, VPOKE &H1B00,92 (haces que la coordenada Y del sprite 0 valga 92). Con el VPEEK lo que podrás hacer es leer su contenido, por ejemplo, Y=VPEEK(&H1B00).

Como ejemplo, pasa a SC1 tecleando
Código:
SCREEN 1,0
y luego teclea este churro de VPOKEs, a ver si pillas lo que se ha hecho:

Código:
VPOKE &H3800,&HFF
VPOKE &H3801,&H81
VPOKE &H3802,&H81
VPOKE &H3803,&H81
VPOKE &H3804,&H81
VPOKE &H3805,&H81
VPOKE &H3806,&H81
VPOKE &H3807,&HFF
VPOKE &H1B03,10
VPOKE &H1B01,112
VPOKE &H1B00,92

Ya sólo es cuestión de experimentar... :)


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Septiembre de 2007, 05:35:10 pm
ok, entonces:
(sc+2)*5-1 es la formula para saber el numero que conultar, esto creo que lo entiendo.

pero sigo sin comprender el listado, porque en basic existe una o varias lineas data donde poner los numeros (ya sea en binario o decimal...) de los valores digamos de los bytes que se van a encender.
pero en tu listado no comprendo por ejemplo que quiere decir ese "read da" ¿hace referencia a alguna linea data? es decir, ¿aunque defina asi los sprites tengo que seguir teniendo unas lineas data con los valores de la composición del sprite?

y ¿podrias explicarme un poco más en detalle lo que hace la linea 20?
sigue sin quedarme claro que es pp y que es np... tengo que sustituirlos por algun numero?

graaacias.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Septiembre de 2007, 05:35:46 pm
lo siento jj no habia visto tu respuesta, muchas gracias!
me pongo con ello, a ver que sale.
un saludo!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: SapphiRe_MSX en 26 de Septiembre de 2007, 06:09:19 pm
pero sigo sin comprender el listado, porque en basic existe una o varias lineas data donde poner los numeros (ya sea en binario o decimal...) de los valores digamos de los bytes que se van a encender.

Claro, las líneas data ya las tienes que poner tú con la definición del sprite.

Citar
pero en tu listado no comprendo por ejemplo que quiere decir ese "read da" ¿hace referencia a alguna linea data? es decir, ¿aunque defina asi los sprites tengo que seguir teniendo unas lineas data con los valores de la composición del sprite?

¡Eso es! Esa línea lee el DAto.

Citar
y ¿podrias explicarme un poco más en detalle lo que hace la linea 20?

Comienza un bucle FOR..NEXT para incrementar la DIrección tantas veces como sea necesario desde el INicio hasta el total de bytes a VPOKEar (32 veces el Número de Patrones que quieres modificar).

Citar
sigue sin quedarme claro que es pp y que es np... tengo que sustituirlos por algun numero?

Si quieres sí, si no, puedes usarlos como variables.

PP -> Primer Patrón a definir
NP -> Número de Patrones a definir

Es decir, si quieres modificar los patrones del 7 al 21 (ambos inclusive):

PP=7
NP=15

Puedes usar la rutina que te he pasado como una subrutina genérica y llamarla con un GOSUB, para lo cual deberías tener un RETURN al final de la misma. Lo único que tendrías que hacer sería algo como:

Código:
PP=7
NP=15
RESTORE 10000
GOSUB xxx

Donde xxx es la línea de inicio de la subrutina y en la línea 10000 comienzan los DATAs correspondientes a los 15 patrones de sprite que quieres modificar (desde el 7 al 21 ambos inclusive).

Saludancias
--
Sph.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Septiembre de 2007, 06:29:10 pm
bueno, creo que lo tengo. (igual es mucho decir)
voy a practicar un poco a ver que saco y a ponerme con esa "lectura relajada del msx red book" de la que Jl habla ;)
muchisimas gracias otra vez, de verdad, de la güena. ;D
salud!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 06 de Octubre de 2007, 01:49:30 pm
tengo una nueva duda sobre el tema, JL me decia esto:

Para modificar una dirección con el valor que quieras lo único que tienes que emplear es el vpoke, por ejemplo, VPOKE &H1B00,92 (haces que la coordenada Y del sprite 0 valga 92).

lo que no entiendo es ¿porque justo la coordenada y? ¿que habria que hacer si quisiese mover la coordenada x? pensaba que estaban en la misma dirección...

y otra cosa:
aunque me refiera a las direcciones del vdp a traves de hexadecimales... ¿los atributos se le dan en decimal?


graaaacias again!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: cybernoid en 06 de Octubre de 2007, 06:13:54 pm
Hola,

Si no me equivoco para mover la coordenada X es la siguiente dirección de memoria, osea vpoke &h1b01,X, y la siguiente es el nº de sprite que quieres mostrar, y la siguiente el color
, y en la siguiente empezarían las propiedades del siguiente sprite (joe, hay que ver lo que me repito xDD), da igual como le pases el valor al vpoke, lo puedes pasar, en decimal, en hexadecimal, en binario, total, el siempre lo entenderá en binario.

espero que te sirva de ayuda.

saludos,
gobblin

tengo una nueva duda sobre el tema, JL me decia esto:

Para modificar una dirección con el valor que quieras lo único que tienes que emplear es el vpoke, por ejemplo, VPOKE &H1B00,92 (haces que la coordenada Y del sprite 0 valga 92).

lo que no entiendo es ¿porque justo la coordenada y? ¿que habria que hacer si quisiese mover la coordenada x? pensaba que estaban en la misma dirección...

y otra cosa:
aunque me refiera a las direcciones del vdp a traves de hexadecimales... ¿los atributos se le dan en decimal?


graaaacias again!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 06 de Octubre de 2007, 06:42:42 pm
Exacto, como ya te han explicado:

Citar
¿porque justo la coordenada y?

Por que eso es lo que se guarda en esa dirección, las siguientes contienen lo que te ha explicado gobblin.

Citar
¿que habria que hacer si quisiese mover la coordenada x? pensaba que estaban en la misma dirección...

Explicado está. Y piensa en lo que comentas, ¿cual es el rango de valores de "x" y de "y"?, no te caben ambos en un solo byte (sólo 8 bits)

Citar
¿los atributos se le dan en decimal?

Eso es a gusto del consumidor, siempre, siempre, siempre puedes meter cualquier número en el formato que quieras (binario, octal, decimal o hexadecimal) y que normalmente te sea más sencillo de comprender.

Respecto a las direcciones usadas para los atributos de los sprites siguen esta secuencia:

Código:
1B00 - Coordenada Y del sprite 0
1B01 - Coordenada X del sprite 0
1B02 - Patrón del sprite 0
1B03 - Color del sprite 0
1B04 - Coordenada Y del sprite 1
1B05 - Coordenada X del sprite 1
1B06 - Patrón del sprite 1
1B07 - Color del sprite 1
1B08 - Coordenada Y del sprite 2
.
.
.
etc,etc

Con esto seguro que ya te haces una idea de lo que modificar para mover o modificar un sprite... :)


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 07 de Octubre de 2007, 01:02:47 pm
pero yo pensaba que según esto:

  0000-17FF   Definicion de patrones
  1800-1AFF   Mapa de patrones
  1B00-1B7F   Atributos de los sprites
  2000-37FF   Definicion de los colores
  3800-3FFF   Definicion de los sprites

los mapas de patrones se almacenarian desde 1800 hasta 1AFF, sus atributos desde 1B00 hasta 1B7F... y asi con todo... :-\

y según esto:

1B00 - Coordenada Y del sprite 0
1B01 - Coordenada X del sprite 0
1B02 - Patrón del sprite 0
1B03 - Color del sprite 0
1B04 - Coordenada Y del sprite 1
1B05 - Coordenada X del sprite 1
1B06 - Patrón del sprite 1
1B07 - Color del sprite 1
1B08 - Coordenada Y del sprite 2

el patron del sprite 0 por ejemplo no se almacena en 3800???  ??? ni el color en 2000???  :'( ??? ::)
me pierdo aqui...



Título: Re: USO DE VPEEK Y VPOKE
Publicado por: SapphiRe_MSX en 07 de Octubre de 2007, 01:38:56 pm
  0000-17FF   Definicion de patrones
  1800-1AFF   Mapa de patrones
  1B00-1B7F   Atributos de los sprites
  2000-37FF   Definicion de los colores
  3800-3FFF   Definicion de los sprites

Es correcto, pero creo que te has liado un montón ya que la tabla de colores se refiere a los patrones, no a los sprites.

Citar
y según esto:

1B00 - Coordenada Y del sprite 0
1B01 - Coordenada X del sprite 0
1B02 - Patrón del sprite 0
1B03 - Color del sprite 0
1B04 - Coordenada Y del sprite 1
1B05 - Coordenada X del sprite 1
1B06 - Patrón del sprite 1
1B07 - Color del sprite 1
1B08 - Coordenada Y del sprite 2

el patron del sprite 0 por ejemplo no se almacena en 3800???  ??? ni el color en 2000???  :'( ??? ::)
me pierdo aqui...

En 3800 se almacena la DEFINICIÓN del patrón 0, pero en el plano 0 de sprites no tiene por qué visualizarse el patrón 0. Tienes 64 patrones de sprites para definir, mientras que cada plano de sprites puede mostrar uno de esos patrones (32 al mismo tiempo). Ese es el valor que se almacena en el tercer byte de atributos para cada plano de sprites: un índice.

Saludos
--
Sph.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 07 de Octubre de 2007, 02:20:02 pm
Exacto, relacionadas con los sprites sólo tenemos dos tablas: la primera contiene lo que ya has visto, 4 datos X 32 sprites simultaneos que se permiten en el MSX (128 bytes totales de longitud) y la segunda es la de definicion de los sprites, que es donde defines el aspecto que tendrá cada sprite.
Esta última tabla tiene 2K de tamaño y eso determina lo siguiente:

Si se usan sprites de 8x8 (8 bytes de tamaño cada sprite): 2048/8 = 256 sprites diferentes que pueden ser definidos.
Si se usan sprites de 16x16 (32 bytes de tamaño cada sprite): 2048/32 = 64 sprites diferentes que pueden ser definidos.

Como ya te ha dicho Sapphire, el valor que metes en su area de atributos es el número de sprite definido que quieres mostrar. ¡Ojo!, en caso de usar sprites de 16x16, el número de sprites será siempre un múltiplo de cuatro (0,4,8,12,etc.).


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 07 de Octubre de 2007, 04:04:08 pm
estoy en ello, muchas gracias a todos por vuestra paciencia...


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Octubre de 2007, 01:47:17 pm
bueno masters...

Sigo estudiando la estructura del vdp y los distintos modos de pantalla, ayer estuve dandole unas vueltas y me surgen nuevas dudas, asi que aqui van, espero que podais ayudarme:

En Screen 1 es posible utilizar sprites ademas de texto, esto me hace pensar que podria vpokear los caracteres de texto para definir "bloques" para los escenarios, pero ¿para los sprites? existe un lugar en la vram para almacenarlos en screen 1? o es la misma dirección que para screen 2?
me refiero al margen de la asignada al texto.

espero ansioso la respuesta ;D muchisimas gracias a todos!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 26 de Octubre de 2007, 01:54:53 pm
Pues en principio es la misma; así que vas bien encaminado...  :)


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Octubre de 2007, 04:05:23 pm
que bien!
entonces si quisiera hacer un "escenario" podria diseñarlo con bloques imagino que ¿con print? ¿asi tal cual?
y despues almacenar mediante BASE los sprites y ¿colocarlos con PUT SPRITE?
¿QUEDAN ESTOS EN UN PLANO SUPERIOR A LOS CARACTERES?

Graaacias!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: cybernoid en 26 de Octubre de 2007, 04:17:57 pm
que bien!
entonces si quisiera hacer un "escenario" podria diseñarlo con bloques imagino que ¿con print? ¿asi tal cual?
y despues almacenar mediante BASE los sprites y ¿colocarlos con PUT SPRITE?
¿QUEDAN ESTOS EN UN PLANO SUPERIOR A LOS CARACTERES?

Graaacias!

Si, puedes hacerlo con PRINT y si, quedan los Sprites en un plano superior :)


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 26 de Octubre de 2007, 06:08:29 pm
Aja, tal que así. Por cierto, no acabo de pillarte eso del BASE, supongo que te referirás a que con el BASE obtendrás la dirección en la que comienza la definición de sprites y luego VPOKEarás los datos de cada uno. Si es así, también es correcto...


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Octubre de 2007, 07:15:12 pm
madre  mia! entonces Screen 1 es una maravilla no?

bueno...  con respecto al color, se supone que permite un color frontal y uno de fondo por cada 8 bites, me imagino que esto será horizontalmente, ya que en el polka por ejemplo te permite color frontal y de fondo por cada linea horizontal de 8 bites, por lo que en un mismo caracter existen mas de un color frontal y uno de fondo...

¿esto es muy complicado de hacer? que cada caracter tenga mas de dos colores, me refiero. ¿cual seria la manera?

y luego cuando tienes digamos el escenario montado...

¿mediante que comandos o rutinas se dice por donde y por donde no va a poder pasar nuestro personaje?

gracias, un saludo!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: SapphiRe_MSX en 26 de Octubre de 2007, 07:20:01 pm
bueno...  con respecto al color, se supone que permite un color frontal y uno de fondo por cada 8 bites, me imagino que esto será horizontalmente, ya que en el polka por ejemplo te permite color frontal y de fondo por cada linea horizontal de 8 bites, por lo que en un mismo caracter existen mas de un color frontal y uno de fondo...

¿esto es muy complicado de hacer? que cada caracter tenga mas de dos colores, me refiero. ¿cual seria la manera?

Usar Screen 2. En Screen 1 es imposible y el modo mixto no funciona en todos los MSX1 por lo que si no vas a hacer nada específico de MSX2 olvídalo.

Saludos
--
SapphiRe


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 26 de Octubre de 2007, 07:59:28 pm
que olvide lo de mas de un color o que me olvide de screen 1?

que es el modo mixto?


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: Dioniso en 26 de Octubre de 2007, 08:55:22 pm
que olvide lo de mas de un color o que me olvide de screen 1?

que es el modo mixto?

Primera pregunta:

A ver, SCREEN 1 sólo permite 2 colores por 8 bytes (y no bites, como decías antes), es decir, por cada bloque ("tile" en inglés) de 64 bites; aunque, realmente, los dos colores de cada carácter se agrupan en 8... Que si das color de carácter blanco y fondo azul al carácter "A", eso quiere decir que se lo darás a "A", "B", "C", D", etc... Los grupos van de 8 en 8; que si cambias el color del uno de los caracteres de 64 a 72 (64+8) todos cambiarán. Recuerda: de 8 en 8; 8, 16, 24, 32, 40, 48, 56, 64, ...

xxxxxxxx 8 bites = byte
xxxxxxxx 8 bites = byte
xxxxxxxx 8 bites = byte
xxxxxxxx 8 bites = byte
xxxxxxxx 8 bites = byte
xxxxxxxx 8 bites = byte
xxxxxxxx 8 bites = byte
xxxxxxxx 8 bites = byte

En SCREEN 1, todo ese grupo de "x"s (8 bytes = 1 tile) tendría dos colores únicamente.

En SCREEN 2 cada línea de "x" tendría dos colores; por lo que podrías tener "16" colores (y digo 16 entre comillas porque realmente son 15, ya que el cero hace de transparente) en ese grupo (o "tile") de 64 "x".

Segunda pregunta:

En SCREEN1 redefines todos los caracteres una sola vez, es decir, tienes 256 caracteres (tiles) y los redefines una vez para toda la pantalla. Si escribes "Megaron"  ;D en la primera línea de la pantalla o en la última, las letras tendrán siempre los mismos gráficos.

En SCREEN 2 la pantalla se "divide" en tres tercios. Tienes que redefinir los caracteres 3 veces y los colores tres veces, una por cada carácter; vamos, una putada de mal gaste de tiempo (ciclos?, hercios?, t-states?, etc...)

De hecho, si tienes en cuenta que hay 256 caracteres en una pantalla de 32 caracteres por línea en SCREEN 2 (en SCREEN 2 el máximo es un "WIDTH 32") verás que tienes 8 líneas de 32 caracteres (32 x 8 = 256). Vamos, que 32 caracteres horizontalmente serán 32 (caracteres) x 8 (bites/pixels) = 256, lo que sería el eje X). Y, como hemos dicho, 8 caracteres verticalmente; 8 (caracteres) x 8 (bites/pixels) = 64. Es decir, un tercio de la ordenada Y (3 x 64 = 192).

Como puedes ver, SCREEN 2 tiene "3 veces" más trabajo que SCREEN 1,pero el modo mixto (por fin!!!!!!!! la respuesta a la pregunta!!!!!!!) permite redefinir los caracteres una sola vez, como SCREEN 1 y utilizarlos en toda la pantalla. Para ello ... Pero en fin, que de la MSXdev hay algunos, como el Gniffel, T-Virus, etc ...

Espero que programes cosas y que todo vaya "pa'lante".


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 27 de Octubre de 2007, 01:48:48 pm
oye muchisimas grácias por la información y felicidades por el T-VIRUS, está muy chulo  :).
lo que pasa que Sapphire comentaba que el modo mixto no funciona bien ¿no es asi?
un saludo!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: Dioniso en 27 de Octubre de 2007, 03:43:33 pm
oye muchisimas grácias por la información y felicidades por el T-VIRUS, está muy chulo  :).
lo que pasa que Sapphire comentaba que el modo mixto no funciona bien ¿no es asi?
un saludo!

Bueno, pues gracias... El T-Virus fue mi segundo juego en ensamblador, por lo que es un poco caca.

Sobre el modo mixto... pues sí, no es compatible en todos los MSX, tan sólo en un 99% (o un 99,9%  ;D ).

Ahora, que si lo puedes utilizar o no: Claro que sí. Hay quien dice que no se debería porque no guardaría una total compatibilidad con todos los modelos MSX y hay otros, como yo, que lo usarían sin dudarlo. El que tiene uno de esos modelos incompatibles seguramente tenga más modelos MSX que sí son compatibles con el modo mixto. Por cierto, cualquier MSX2 o superior sí es compatible con dicho modo.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 27 de Octubre de 2007, 05:14:21 pm
y es posible utilizar ese modo mixto en basic?
porque la verdad, si es compatible al 99,9% ;) yo también soy de la opinión de utilizarlo...

podrias decirme como funciona por favor? creo que ademas tú que ya has hecho un juego así, me podrias ser de mucha ayuda para comprenderlo...

ya me dices, te lo agradeceria mucho, un saludo!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: Dioniso en 27 de Octubre de 2007, 08:09:36 pm
y es posible utilizar ese modo mixto en basic?
porque la verdad, si es compatible al 99,9% ;) yo también soy de la opinión de utilizarlo...

Pues, en ese caso te remito al tema en cuestión: Aquí (http://karoshi.msxgamesbox.com/index.php?topic=566.0)

Lee todos los mensajes para comprender mejor de qué va el tema y descárgate el archivo del primer mensaje.

Ya nos contarás...


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: e_sedes en 28 de Octubre de 2007, 02:32:03 am
En el caso de un programa en BASIC creo que en vez de meterse en líos de modos mixtos y demás es más útil lo siguiente:

10 screen 1:width32
20 SCREEN 2
30 poke &hfcaf,1

De esta manera estarás en screen 2 pero el basic "piensa" que estás en screen 1, por lo que podrás usar PRINTs (que son bastante rápidos). Deberás definir cada tile con vpokes en los tres bancos, eso si. En el concurso de juegos en BASIC que se hizo por aquí hace ya algún tiempo podras encontrar varios programas que usan esto.

un saludo.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 28 de Octubre de 2007, 02:01:01 pm
ya, me encantaria poder ver los juegos que hicisteis, pero los enlaces no van...
viejo? ::)


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 29 de Octubre de 2007, 10:27:36 am
Oye Dioniso, ¿y que hace exactamente esta linea?
 30 poke &hfcaf,1

gracias!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 29 de Octubre de 2007, 10:39:24 am
Justo lo que te comentaba Dioniso a continuación del ejemplo, hace que el ordenador aun estando en screen 2 se piense que está trabajando en screen 1; así se pueden utilizar los PRINT con carácteres multicolores.


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 29 de Octubre de 2007, 01:11:01 pm
ok. entonces,  esos caracteres multicolor que voy a poder usar con print, ¿cuantos colores podrán tener? ¿solo uno frontal y uno de fondo por cada caracter o mas de uno?

Gracias gente, un saludo!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: cybernoid en 29 de Octubre de 2007, 01:14:44 pm
ok. entonces,  esos caracteres multicolor que voy a poder usar con print, ¿cuantos colores podrán tener? ¿solo uno frontal y uno de fondo por cada caracter o mas de uno?

Gracias gente, un saludo!

2 colores por Byte, fondo y tinta. en un mismo caracter podras tener 16 colores


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 29 de Octubre de 2007, 06:06:34 pm
MAAMAA MMIAA!!!

Que bién! joder, muchisimas gracias!
ahora solo me falta un poco más de estudio del vdp y sus direcciones, estoy dandole, pero casi todo lo que tengo está en ingles y me cuesta un poco más (que ya es decir)
bueno, os seguire informando y pidiendo ayuda, GRACIAS!


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 29 de Octubre de 2007, 07:27:41 pm
De todas formas un consejillo, el problema que vas a tener con juegos que usen los carácteres multicolores es que vas a tener que cargar los patrones y los colores en la VRAM y eso respecto a si usas screen 1 puede significar hasta 6 veces más de tiempo. Te puedes imaginar que o defines pocos carácteres o el tiempo de espera usando BASIC va a ser un poco largo (y aburrido).
Usando código máquina no habría problema; pero si empiezas con BASIC, yo probaría primero con SC1; eso sí, experimenta con todos los modos, claro :)


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: SapphiRe_MSX en 29 de Octubre de 2007, 07:51:00 pm
eso sí, experimenta con todos los modos, claro :)

¡¡ESO ESO!! ¡¡QUEREMOS MÁS JUEGOS EN SCREEN 0!! ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: Sd-Snatcher en 29 de Octubre de 2007, 08:38:31 pm
y yo toda la vida con el open "grp:"


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 29 de Octubre de 2007, 10:39:43 pm
También con el open"grp:" se pueden redefinir los caracteres ;), sin colores, claro...


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: msx dummie en 30 de Octubre de 2007, 12:38:58 am
y como es esa forma? podriais explicarla también por favore?
y cuales son las diferencias?


Título: Re: USO DE VPEEK Y VPOKE
Publicado por: jltursan en 30 de Octubre de 2007, 11:46:25 am
Si tecleas este programa:

Código:
10 DEFINT A-Z
20 F=PEEK(&HF921)*256+PEEK(&HF920)
30 SCREEN 2:COLOR 15,1,15:CLS
40 FOR I=0 TO 2047:VPOKE I,PEEK(F+I):NEXT
50 GOTO 50

Aparecerá en pantalla algo curioso... :). ¿Como podemos cambiar el juego de carácteres en SC2?, pues basta con cambiar antes de entrar al modo la dirección en la que se encuentra el juego de carácteres que va a usar, pokeando la nueva dirección en las variables de sistema $F920 y $F921.
Esto también es válido para los demás modos de pantalla, por lo que si modificamos con pokes esta dirección, al retornar al basic tendremos todo el juego de caracteres trastocado, para evitarlo no tendremos que olvidarnos de restaurar su valor original antes de salir.

Para demostrar esto podeis probar con:

Código:
POKE &HF920,&HC7:SCREEN 0

¡...y la pantalla se os encriptara!

a ciegas, si volveis a teclear:

Código:
POKE &HF920,&HBF:SCREEN 0

Volvereis al juego de caracteres normal.