Título: Puertos de acceso VDP Publicado por: assembler en 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) Título: Re: Puertos de acceso VDP Publicado por: samsaga2 en 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. Título: Re: Puertos de acceso VDP Publicado por: Iggy Rock en 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.
Título: Re: Puertos de acceso VDP Publicado por: assembler en 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. |