Buenas...
Me contaba David el Monday, April 12, 2004 :
Uff, hace tiempos que no me meto, pero creo que puedo ser de algo de ayuda
^_^U
DR> DI
DR> IM 1
DR> LD SP,0F800h ; Posiciona la pila
DR> LD HL,0E000h ; Aquà lo que se hace es poner a 0 las direcciones de
memoria de 0E000h a 0F800h
DR> LD DE,0E001h ; O sea, se prepara la pila y se reinicializa
DR> LD BC,017FFh ;
DR> LD (HL),000h ; No sé el sentido que tendrá hacer esto, quizás mas
tarde utilicen todos estos 0's para algo? en fin
DR> LDIR ;
Exacto. Con esto llenas de 00 de E000 a E001+17FF
DR> LD A,0C3h ;
DR> LD (TFD9AH),A ; Esto lo entiendo, remplaza en InterruptHandler (RST#38)
por el suyo propio.
DR> LD HL,0402Bh ;
DR> LD (TFD9BH),HL;
DR> En Nemesis 1:
DR> DI
DR> IM 1
DR> DI
DR> PUSH HL ; Y digo yo, al principio del código, el registro HL contiene
DR> basura, ¿Porqué lo guardan en la pila?
DR> LD HL,0F0F1h ; Tampoco me llego a imaginar, porqué ponen a 1 esta dirección
de memoria
DR> LD A,001h
DR> LD (T6000H),A ; Las direcciones de memoria 6000h, 8000h y 0A000h (¿Qué
función tienen?)
DR> LD (HL),A ;
DR> INC A ;
DR> LD (T8000H),A
DR> INC HL ;
DR> LD (HL),A
DR> INC A ;
DR> LD (TA000H),A
DR> INC HL ;
DR> LD (HL),A ; 0F0F2 - Tampoco sé que función tiene esta dirección, he
DR> estado mirando en las variables del sistema, pero no he encontrado
DR> referencias.
DR> POP HL
DR> EI
Aqui tienes 2 detalles a tener en cuenta.
a) el Push HL y el Pop HL del principio y final: simple, tiene pinta de ser una
subrutina de esas que tienes en una libreria. Como buen programador, cuando
haces una subrutina, guardas el valor de los registros que vas a modificar
dentro; y a la salida, los restauras.
Que está al principio del juego, pos fale, que va a saber el compilador :)
b) las direcciones 4000,6000,8000,A000 son los "puertos" de mapeo de las
paginas en los cartuchos MegaROM. Cuando escribes un valor en ellos,
seleccionas esa pagina (6000-> pagina 6000-7FFF, etc).
Aqui en concreto, selecciona las paginas 1,2 y 3 (las primeras, ya que parece
ser que la correspondiente a 4000-5FFF o no se mapea, o en ese momento es la
que contiene el codigo en ejecucion, y seria un poco peligroso cambiar a otra
^.^
Tambien guarda en F0F1-F0F3 el numero de pagina actual que hay seleccionada en
cada bloque de memoria. Bastante util, ya que en las direcciones "puerto" de
seleccion de pagina (6000,8000,A000) puede (bueno, casi seguro que lo hacen)
haber escrito cualquier valor.
DR> Si os fijais, en los dos casos al principio del código hacen un DI y un
DR> IM 1 (RST#38) antes de reemplazar el InterruptHandler de la BIOS por el del
DR> juego.
DR> ¿No se podrÃa cambiar directamente sin hacer el IM 1? No sé que sentido
DR> tiene hacerlo. Y en el caso del Nemesis 1, como veis hacen : DI, IM 1 y DI
DR> otra vez.
DR> ¿Si ya han desactivado las interrupciones, para que las desactivan otra
DR> vez despues del IM 1? Es que se reactivan?
Creo que si.
DR> Y si lo hacen en el Nemesis 1,
DR> porque no lo han hecho en el super cobra? En fin, misterios de la
DR> konami-ciencia que no llego a entender O_o
Unos cuantos años de diferencia entre ambos juegos, y hasta quizas otro
programador ^_^
DR> Y bueno, por último. Por lo vistos estos juegos, reemplazan el
DR> Interrupt Handler por el propio y lo utilizan como su engine.
DR> Y yo en mi juego harÃa algo asÃ:
DR> MyInterruptHandler: DI ; No estoy seguro si he de hacer un PUSH/POP
DR> de los registros que utilize aquà dentro, o se guardan automáticamente.
TIENES que guardarlos, si reemplazas la rutina de 0038h. Si usas los ganchos
de FD9A, no hace falta, ya que la rutina de la 0038h que hay en la BIOS ya
hace los Push'es y Pop's necesarios.
DR> CALL MyVDPEngine
DR> CALL MyPSGEngine
DR> EI
DR> RET ; Tengo entendido que como el
DR> MSX no soporta Interrupciones Enmascarables no tiene sentido hacer un RETI,
DR> asà que pongo el RET que
DR> ; usa menos ciclos de reloj.
Cierto.
DR> Main: DI
DR> IM 1
DR> LD A,0C3H ; 0C3H equivale a JP
DR> LD (0FD9AH),A
DR> LD HL,MyInterruptHandler ; Establece un
control de interrupciones propio
DR> LD (0FD9BH),HL
DR> .
DR> .
DR> .
DR> RET
Si es un juego en ROM... creo que al final te sobra ese RET X-DDD
DR> Pues bien, tengo pensado utilizar el modo SCREEN 1 para el juego
DR> cambiando los patrones de carácteres, y en MyVDPEngine meter alguna rutina
DR> que haga X volcados
DR> de bytes/segundo por ejemplo (explicado de forma muy general)
Chunguillo. Cuidadin, que no hay mucho tiempo para hacer nada entre
interrupciones. Ya lo iras viendo.
DR> Me gustarÃa sobre todo aprender técnicas para implementar el loop del
DR> juego en RST#38, con sus ejemplos y eso. Y en fin, aprender de la gente que
DR> ya lleva mucho tiempo en esto. ¿Para qué reinventar la rueda verdad? :)
Lo siento, pero yo de juegos... nada ^_^U
Ja matta!
___
----- trunks(_en_)another-world(_punto_)com ----------=~~ ~~=,
------------------------------------------=__ __='
~~~