HispaMSX

Re: [hispamsx] Alguien sabe de algún tutorial?

2004-04-13 16:34:26
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 ----------=~~   ~~=,
 ------------------------------------------=__   __='
                                              ~~~


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