Karoshi MSX Community
06 de Julio de 2021, 12:04:45 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2 3
  Imprimir  
Autor Tema: USO DE VPEEK Y VPOKE  (Leído 16993 veces)
0 Usuarios y 1 Visitante están viendo este tema.
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« : 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!!
En línea
SapphiRe_MSX
Visitante
« Respuesta #1 : 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
En línea
Shinzon
Karoshi Lover
***
Mensajes: 116


Email
« Respuesta #2 : 26 de Septiembre de 2007, 02:43:46 pm »

SapphiRe, estas en todo. Smiley

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? Wink

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

Salu2.
En línea
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #3 : 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... Cry 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?? Embarrassed
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....)Huh

siento ser tan lerdo, espero que mantengais la paciencia y consigais hacer que lo comprenda del todo.
mil gracias otra vez! :god:
En línea
SapphiRe_MSX
Visitante
« Respuesta #4 : 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?? Embarrassed
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....)Huh

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.
« Última modificación: 26 de Septiembre de 2007, 05:06:29 pm por SapphiRe » En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #5 : 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).. 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 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... Smiley
« Última modificación: 26 de Septiembre de 2007, 05:29:13 pm por jltursan » En línea

Doom dee doom dee doom
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #6 : 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.
En línea
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #7 : 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!
En línea
SapphiRe_MSX
Visitante
« Respuesta #8 : 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.
En línea
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #9 : 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 Wink
muchisimas gracias otra vez, de verdad, de la güena. Grin
salud!
En línea
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #10 : 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!
En línea
cybernoid
Karoshi Maniac
****
Mensajes: 368



WWW
« Respuesta #11 : 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!
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #12 : 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... Smiley
« Última modificación: 06 de Octubre de 2007, 09:51:00 pm por jltursan » En línea

Doom dee doom dee doom
msx dummie
Karoshi Lover
***
Mensajes: 162



Email
« Respuesta #13 : 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... Undecided

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???  Huh ni el color en 2000???  Cry Huh Roll Eyes
me pierdo aqui...

En línea
SapphiRe_MSX
Visitante
« Respuesta #14 : 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???  Huh ni el color en 2000???  Cry Huh Roll Eyes
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.
En línea
Páginas: [1] 2 3
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!