HispaMSX

RE: [hispamsx] Assembler y vdp's

2004-08-12 11:58:12
Alguien me puede dar unos pequeños apuntes de como trabajar con el
VDP del MSX con assembler,
Me interesaría saber como leer y escribir en el vdp.

Queda todo muy bien explicado (pero en inglés) en el MSX RED BOOK, que puedes consultar aquí: http://www.robsy.net/tredbook.txt

Ayer estuve haciendo pruebas con el MSX desde el Basic

Y con

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

Pude escribir en screen 2

Te sobran OUTs y mejor si pasas los datos en hexadecimal, para aclararte.

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

Te sobre un byte en todo el proceso.

Primero mandas al puerto de direcciones el byte bajo de la dirección en memoria. A continuación mandas el byte alto de la dirección, poniendo en los campos más altos la máscara que indica escritura (o lectura, según prefieras). Después, mandas directamente el dato o los datos sucesivamente al otro puerto.

Ejemplo práctico: ESCRIBIR "A" en la POSICION 0,0 DE LA PANTALLA

En ensamblador, y a lo bestia:

; La tabla de nombres empieza en 1800h para SCREEN 1 y SCREEN 2

; Desactiva interrupciones por precaucion
di

; Escribe el byte bajo de dirección
ld a,00h
out (99h),a

; Escribe el byte alto con la máscara (1bh OR 40h)
ld a,5bh
out (99h),a

; Ahora el VDP apunta a donde debe, pero hay que darle un respiro - estos comandos solo sirven para perder tiempo
ex af,af'
ex af,af'

; Escribe la A (código ASCII 65 o 41h)
ld a,41h
out (98h),a

; Reactiva interrupciones
ei

Sé que parece muy lioso, pero no lo es tanto. Ten en cuenta, que el registro de dirección se autoincrementa, es decir, si mandaras otro byte al puerto 98h, lo escribiría en la posición 1,0 de pantalla, o lo que es lo mismo, en la dirección 1b01h.

Son correctas mis teorías???

Te has acercado bastante, como ves.

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

Se hace utilizando las rutinas de la BIOS, lo que te recomiendo para empezar, porque hacen que la programación sea mucho más sencilla. Tienes un montón de rutinas distintas, comentadas en el libro que te he señalado. Como muestra, un botón:

; La misma rutina, en versión sencilla usando la BIOS
ld hl,1800h
ld a,41h
call WRTVRM

Tienes otras muchas rutinas para trabajar con la VRAM y el VDP: ENASCR, DISSCR, WRTVRM, RDVRM, FILVRM, LDIRVM, LDIRMV, WRTVDP, etc. Documéntate, documéntate...

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

Poco hay en castellano. Pero no necesitas mucho inglés para ver las explicaciones de rutinas de la BIOS.

Si tienes más dudas, ya sabes: pregunta. Si hay algo en concreto que no entiendes, mándame un e-mail privado, aunque imagino que hay bastante gente por aquí que podría ayudarte.

Edu Robsy

_________________________________________________________________
Acepta el reto MSN Premium: Correos más divertidos con fotos y textos increíbles en MSN Premium. Descárgalo y pruébalo 2 meses gratis. http://join.msn.com?XAPID=1697&DI=1055&HL=Footer_mailsenviados_correosmasdivertidos


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