HispaMSX

Re: [hispamsx] Assembler y vdp's

2004-08-12 14:15:51
t> Hola

t> Alguien me puede dar unos pequeños apuntes de como trabajar con el 
t> VDP del MSX con assembler, 
t> Me interesaría saber como leer y escribir en el vdp.

t> Ayer estuve haciendo pruebas con el MSX desde el Basic

t> Y con 

t> out &h99,0
t> out &h99,33
t> out &h99,100
t> out &h98,255

t> Pude escribir en screen 2

t> Por lo que he leído el primer out sirve para preparar el VDP para 
t> escribir
t> el segundo y el tercer out para posicionarlo en la zona de memoria 
t> donde se desea escribir
t> y el cuarto el byte que se desea escribir

t> Son correctas mis teorías???

Casi, el puerto 99h, al escribir en el sirve para acceder a los
registros del vdp o para posicionar al vdp en una direccion de la vram
como tu dices, pero siempre se escriben 2 bytes seguidos en 99h para
cualquiera de esas 2 operaciones, de la siguiente forma:

-Si quieres escribir en un registro del VDP:
    escribes primero el dato que quieres guardar en el registro (99h)
    y despues 10000RRRb (tambien en 99h). Donde RRR es el registro
    donde quieres guardar el dato anterior.
    (Mediante estos registros se cambia de screen, tamaño de los
    sprites...)

-Si quieres posicionar al VDP en una zona de la vram, escribes primero
el byte menos significativo de la direccion y luego en las
significativo, (tambien ambos en 99h) (y ten cuidado con los bits de
los que hablo mas abajo) y luego los datos que vayas a
escribrir o leer lo haces en 98h, que a cada operacion de L/E que
hagas se incrementara automaticamente la direccion de la vram.

*existe un detalle que aun no entiendo el porque, pero me ciño al
redbook, los 2 bits mas altos de la direccion que se le pasa a la vdp
deben ser:

      00xxxxxxb => si las siguientes operaciones seran de lectura.
      01xxxxxxb => si las siguientes operaciones seran de escritura.

t> Desde assembler creo que con los registro HL se puede especificar la
t> zona ¿es correcto esto? ¿me podéis pasar un ejemplo?

Se puede hacer de varias maneras, pero juzga tu mismo a partir de
lo siguiente:

OUT tiene 2 formas de uso:
    OUT (N),A : (N) expresion 8 bits, A acumulador
    OUT (C),r : (C) puerto direccionado por registro C, r cualquier registro

*** Primera forma ***

Si quieres guardar la direccion en HL, luego para pasarla al VDP
mediante OUT, tendrás que usar la 2ª y por lo tanto, guardar en C la
direccion del puerto (99h)

seria algo asi:

' guarda una direccion en HL, (por ejemplo 0000h)
ld HL,0100000000000000b

' guardar antes la direccion del puerto (99h) en C
ld C,99h

' la siguiente linea no se si es necesaria, pero por si acaso,
' porque el registro B guarda el byte mas alto de la
' direccion del puerto a transferir.
ld B,00h
         
' como esta direccion hay que pasarla al vdp en 2 bytes seguidos
' primero escribimos L (el byte bajo) y luego H (el byte alto)
out (C),L
out (C),H

Ya tienes al VDP apuntando a la direccion 0000h y puedes empezar a
escribir en la vram.

------------------------------------

** Segunda forma **

' Guardas el primer byte de la direccion en A
ld A,00h

' Lo transfieres al VDP
out (99h),A

' Guardas el segundo byte de la direccion en A
ld A,01000000b

Lo transfieres al VDP
out (99h),A

Ya tienes al VDP apuntando a la direccion 0000h y puedes empezar a
escribir en la vram.

-------------------------------------

t> Aparte de easyasemble que otras lecturas en castellano sobre 
t> assembler y msx me podéis recomendar... lo q se hasta ahora es poco 
t> y todo lo he sacado del easyasembler y de un libro de código maquina 
t> para ZX81 y Speccy :P

Yo tambien empecé con el easymbler, esta muy bien porque lo puedes
usar incluso como referencia de programacion, porque ahi Nestor
explica incluso las formas de uso de cada instruccion todo bien
clasificado.

Te recomendaria el libro "programación del Z80" de Rodnay Zaks, del
cual me gustaron 2 cosas, la explicacion de alunas tecnicas de
programacion y sobre todo, lo mejor, la tabla resumen de todas las
instrucciones del Z80, con sus ciclos de reloj, memoria que ocupan,
etc... muy bueno para consultar mientras estas programando.

Si quieres darte un empujoncito en el ensamblador, prueba el paquete
IDE simulador de Z80 en la pagina http://www.oshonsoft.com/

Trae un compilador Basic con las instrucciones basicas para controlar
el Z80 y realizar bucles, condicionales...

Haz algun ejemplo sencillo en basic, compilalo y mira el codigo ASM
que genera, veras como te ayuda.
Luego compila el ASM y pasaselo al simulador y veras que hace el Z80,
como vas tocando los registro y obedece todo lo que le dices, es
genial.

Espero haberte ayudado y no haberte liado mas.

Un saludo.

                  -Daniel Berdugo-


<Anterior en la conversación] Conversación actual [Siguiente en la conversación>