Karoshi MSX Community
05 de Julio de 2021, 03:38:01 pm *
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]
  Imprimir  
Autor Tema: Puertos de acceso VDP  (Leído 2764 veces)
0 Usuarios y 1 Visitante están viendo este tema.
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« : 28 de Septiembre de 2011, 04:12:32 pm »

Quiero llegar a ese 0.01% de los equipos que no usan los puertos standar del VDP (0x98 y 0x99).

Aunque el acceso a la VRAM no es un tema crítico en el juego que estoy haciendo, he pensado en dejarlo listo para desarrollos posteriores.

Funcionar, funciona (al menos en blueMSX, me falta probarlo en un par de máquinas reales), pero me gustaría que me dierais vuestra opinión, no vaya a ser que por intentar acceder a ese 0.01% (por cierto, ¿alguien sabe que máquinas son?), tenga problemas con un porcentaje más alto dentro del 99,9% restante.

¿Aparte de eso, los tiempos de acceso al VDP se respetan con este código? De momento en las máquinas donde lo he probado, ha funcionado correctamente.

El código es el siguiente:
Código:
inicio_rutinas_video_ROM:
vpoke_ROM:
        di
        ld a,l
        vpoke_rom_99_1:        
        out (0x99),a
        ld a,h
        or  0x40
        vpoke_rom_99_2:        
        out (0x99),a
        ld a,b
        vpoke_rom_98_3:        
        out (0x98),a
        ei
        ret
vpoke_int_ROM:
        ld a,l
        vpoke_int_rom_99_1:        
        out (0x99),a
        ld a,h
        or  0x40
        vpoke_int_rom_99_2:        
        out (0x99),a
        ld a,b
        vpoke_int_rom_98_3:        
        out (0x98),a
        ret
direccionvram_ROM:
        ld a,l
        direccionvram_rom_99_1:
        out (0x99),a
        ld a,h
        and 0x3f
        or 0x40
        direccionvram_rom_99_2:
        out (0x99),a
        ret
fin_rutinas_video_ROM:

rutinas_vram:

        ld hl,inicio_rutinas_video_ROM
        ld de,inicio_rutinas_video_RAM
        ld bc,fin_rutinas_video_ROM-inicio_rutinas_video_ROM
        ldir

ld a,[7]
ld [inicio_rutinas_video_RAM+(vpoke_rom_99_1-vpoke_ROM)+1],a
ld [inicio_rutinas_video_RAM+(vpoke_rom_99_2-vpoke_ROM)+1],a
ld [inicio_rutinas_video_RAM+(vpoke_int_rom_99_1-vpoke_ROM)+1],a
ld [inicio_rutinas_video_RAM+(vpoke_int_rom_99_2-vpoke_ROM)+1],a
ld [inicio_rutinas_video_RAM+(direccionvram_rom_99_1-vpoke_ROM)+1],a
ld [inicio_rutinas_video_RAM+(direccionvram_rom_99_2-vpoke_ROM)+1],a
ld a,[7]
ld [inicio_rutinas_video_RAM+(vpoke_rom_98_3-vpoke_ROM)+1],a
ld [inicio_rutinas_video_RAM+(vpoke_int_rom_98_3-vpoke_ROM)+1],a

    /*Estas llamadas son para probar el funcionamiento de las
        ld hl,6144
        ld b,100
        call vpoke
        
        ld hl,6144
        ld b,100
        call vpoke_int
        
        call direccionvram*/
        
        ret



//Este código está en RAM

.org 0xdf00
inicio_rutinas_video_RAM:
vpoke equ inicio_rutinas_video_RAM+(vpoke_ROM-inicio_rutinas_video_ROM)
vpoke_int equ inicio_rutinas_video_RAM+(vpoke_int_ROM-inicio_rutinas_video_ROM)
direccionvram equ inicio_rutinas_video_RAM+(direccionvram_ROM-inicio_rutinas_video_ROM)
En línea
samsaga2
Karoshi Fan
**
Mensajes: 76


Email
« Respuesta #1 : 28 de Septiembre de 2011, 05:15:09 pm »

Los puertos correctos los tienes en la BIOS. El vdp data read en la dirección 6 y el vdp data write en la dirección 7 (http://map.grauw.nl/resources/msxsystemvars.php).

En cuanto al timing... en algunos de tus out añadiría un nop. En concreto en aquellos en que sólo están separados por un instrucción ld. Por ejemplo:

Código:
       out (0x99),a
        ld a,b
        vpoke_int_rom_98_3:        
        nop
        out (0x98),a
        ret

lo cambiaría a

Código:
       out (0x99),a
        ld a,b
        nop
        vpoke_int_rom_98_3:        
        out (0x98),a
        ret

Aprovecho para expresar una duda. Esos ordenadores que no usan el puerto #98 y #99 para vdp, ¿son únicamente msx1 o también ocurre con algúnos msx2?

EDITO: sólo has de añadir el nop si estás volviendo a escribir en el mismo puerto. Mi ejemplo anterior es erróneo.
En línea
Iggy Rock
Visitante
« Respuesta #2 : 28 de Septiembre de 2011, 07:17:34 pm »

Podrías aprovechar que se puede hacer OUT [C],registro. Y en el registro C cargar el puerto que indica el BIOS en las direcciones 6 y 7.
En línea
assembler
Karoshi Fan
**
Mensajes: 62

assembler@ya.com
Email
« Respuesta #3 : 28 de Septiembre de 2011, 08:41:25 pm »

Podrías aprovechar que se puede hacer OUT [C],registro. Y en el registro C cargar el puerto que indica el BIOS en las direcciones 6 y 7.

Sería lo más fácil, pero modificando el código, se ahorran unos cuantos bytes y ciclos de reloj.

No pretendo hacer un código ultraoptimizado. Seguro que hay muchas más funciones dentro del programa que mejorarían el rendimiento, y lo más seguro es que llegue un momento en el que tenga que empezar a optimizar para rescatar algunos cientos de bytes. Lo de hacer el código automodificable es más bien como curiosidad.

En línea
Páginas: [1]
  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!