HispaMSX

Alguien sabe de algún tutorial?

2004-04-12 12:39:32
Hola a todos, vereis es que estoy un mucho perdido jejejejjeje.

Chafardeando el código del Nemesis 1 y del Super Cobra (con fines educativos 
claro), he visto un par de cosillas que no me cuadran. Sé que muchos de 
vosotros llevais ya tiempo programando para MSX y sabeis de que va el asunto. 
Pero para la gente que empieza como yo, es un poco difícil llegar a comprender 
ciertas cosas.

Sí es cierto que existen mucha documentación técnica al respecto como The MSX 
Red Book, etc, pero lo único que te hacen es darte la arina y el agua, sin 
llegar a decirte como se hace el pan.

Puesh bueno, paso a exponer mis dudas existenciales xDDDDD

En Super Cobra por ejemplo:

DI   
IM 1  
LD SP,0F800h    ;  Posiciona la pila
LD HL,0E000h    ;  Aquí lo que se hace es poner a 0 las direcciones de memoria 
de 0E000h a 0F800h
LD DE,0E001h    ; O sea, se prepara la pila y se reinicializa
LD BC,017FFh    ;
LD (HL),000h       ; No sé el sentido que tendrá hacer esto, quizás mas tarde 
utilicen todos estos 0's para algo? en fin
LDIR                   ;
LD A,0C3h        ;  
LD (TFD9AH),A ;  Esto lo entiendo, remplaza en InterruptHandler (RST#38) por el 
suyo propio.
LD HL,0402Bh   ;
LD (TFD9BH),HL;

En Nemesis 1:

DI   
IM 1  
DI   
PUSH HL  ; Y digo yo, al principio del código, el registro HL contiene basura, 
¿Porqué lo guardan en la pila?
LD HL,0F0F1h ; Tampoco me llego a imaginar, porqué ponen a 1 esta dirección de 
memoria
LD A,001h  
LD (T6000H),A ; Las direcciones de memoria 6000h, 8000h  y 0A000h (¿Qué función 
tienen?)
LD (HL),A         ;
INC A   ; 
LD (T8000H),A 
INC HL   ; 
LD (HL),A  
INC A   ; 
LD (TA000H),A 
INC HL   ; 
LD (HL),A  ; 0F0F2 - Tampoco sé que función tiene esta dirección, he estado 
mirando en las variables del sistema, pero no he encontrado referencias.
POP HL  
EI


Si os fijais, en los dos casos al principio del código hacen un DI y un IM 1 
(RST#38) antes de reemplazar el InterruptHandler de la BIOS por el del juego.
¿No se podría cambiar directamente sin hacer el IM 1? No sé que sentido tiene 
hacerlo. Y en el caso del Nemesis 1, como veis hacen : DI, IM 1 y DI otra vez.
¿Si ya han desactivado las interrupciones, para que las desactivan otra vez 
despues del IM 1? Es que se reactivan? Y si lo hacen en el Nemesis 1, porque no 
lo han hecho en el super cobra? En fin, misterios de la konami-ciencia que no 
llego a entender O_o

Y bueno, por último. Por lo vistos estos juegos, reemplazan el Interrupt 
Handler por el propio y lo utilizan como su engine.

Y yo en mi juego haría algo así:


MyInterruptHandler:    DI ; No estoy seguro si he de hacer un PUSH/POP de los 
registros que utilize aquí dentro, o se guardan automáticamente.
                                CALL MyVDPEngine
                                CALL MyPSGEngine
                                EI
                                RET    ; Tengo entendido que como el MSX no 
soporta Interrupciones Enmascarables no tiene sentido hacer un RETI, así que 
pongo el RET que
                                          ;  usa menos ciclos de reloj.


Main:                        DI
                                IM 1
                                LD A,0C3H    ; 0C3H equivale a JP
                                LD (0FD9AH),A
                                LD HL,MyInterruptHandler    ; Establece un 
control de interrupciones propio
                                LD (0FD9BH),HL
                                .
                                .
                                .
                                RET

Pues bien, tengo pensado utilizar el modo SCREEN 1 para el juego cambiando los 
patrones de carácteres, y en MyVDPEngine meter alguna rutina que haga X volcados
de bytes/segundo por ejemplo (explicado de forma muy general)

Pues bien, perdonad la paliza. No sé si esta lista es es lugar adecuado para 
preguntar estas cosas, pero no sé donde recurrir. La verdad es que este mundo 
me apasiona, lo que me iría muy bien algún código fuente de un juego, 
documentado en condiciones. Ya que la ingienería inversa para un novato como yo 
es muy dura.

Y bueno, si alguno sabe dónde puedo encontrar código fuente de juegos 
documentados y con explicaciones, o bien alguna página web, le estaría 
eternamente agradecido. Y creo que vosotros también porque dejaría de darlos la 
lata jajajajajajaj ;)

Me gustaría sobre todo aprender técnicas para implementar el loop del juego en 
RST#38, con sus ejemplos y eso. Y en fin, aprender de la gente que ya lleva 
mucho tiempo en esto. ¿Para qué reinventar la rueda verdad? :)

Venga, un saludo a todos y cuídaos.

- David Romero -

[Se han eliminado los trozos de este mensaje que no contenían texto]


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