sirozz
Messages postés28Date d'inscriptionmardi 27 avril 2004StatutMembreDernière intervention13 avril 2008
-
17 août 2004 à 13:31
CodeFighter
Messages postés8Date d'inscriptionjeudi 7 octobre 2004StatutMembreDernière intervention 8 novembre 2004
-
26 oct. 2004 à 13:39
Bonjour à tous,
Je me lance dans la programmation d'un émulateur de console NES en ASM avec NASM. J'avais déja fait un émulateur NES en VB il y a quelques années mais je n'avais pas eu le temps de le finir.
Après avoir fait des .COM en 16 bits, je me lance maintenant dans les .EXE avec les fichiers .OBJ. Je rencontre malheureusement pas mal de problemes et je me pose aussi pas mal de questions :
1 - Je n'arrive plus à accéder au segment BSS, à part si je fais pointer DS sur ce segment ! faut-il toujours faire pointer DS vers un segment pour accéder aux données qu'il contient ?
2 - J'ouvre la ROM (le fichier NES) et je parcours les opcodes comme le ferait le proc 6502. Le problème c'est que pour executer une instruction du 6502, je stocke d'abord l'opcode dans AL et j'effectue 256 fois CMP pour tester la valeur de AL. J'ai alors pensé à une sorte de table de vecteurs, par ex: opcode 56 56 * 100 5600 = adresse de la fonction qui émule l'instruction numéro 56. Mais je ne sais pas du tout si c'est possible ?
3 - J'ai crée une sorte de mémoire de 64k qui est une réplique de la mémoire de la NES, le problème c'est que je conserve les même adresse que sur la machine originale, j'ai entendu parler d'une instruction sur NASM pour redéfinir l'adresse d'un segment ?
4 - Et pour finir, j'ai trouvé les sources ASM d'un émulateur de MAC qui tourne avec un 65c02 sur le web et ca ma déja bien aidé mais connaissez vous des sources d'émulateurs NES programmé en ASM ?
CodeFighter
Messages postés8Date d'inscriptionjeudi 7 octobre 2004StatutMembreDernière intervention 8 novembre 2004 26 oct. 2004 à 13:39
1-Un .com n'occupe qu'un segment.
Un .exe occupe plusieur segment, generalement :
-un segment de code (pointé par CS)
-un segment de pile (pointé par SS)
-un segment de donné (pointé par DS)
On a en plus un segment "extra" qui est utilisé par les instruction de chaîne (ES)
Si j'ai bien compris tu as plusieurs segments de donné.
Quand tu fais un :
mov al, [si]
En fait, le processeur fait :
mov al, ds:[si]
Tu peux donc acceder à deux segments de donné en même temps si un est pointé par DS et l'autre par ES. Pour y accéder, il suffit de l'écrire explicitement:
ex:
si DS pointe sur DATA1 et ES sur DATA2
mov al, [Var_DATA1] ; accéder à une variable dans le segment DS
mov al, es:[Var_DATA2] ; accéder à une variable dans le segment ES
2- A partir du 386 (il me semble) il existe une instruction "Jump Table" : tu fais une table qui contient les adresses de tes routines et qui est indexé par les opcodes. Sinon, tu peux le faire avec un "Jump Register".