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]