Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc65a7a4f0 | ||
|
|
211b1f86c8 | ||
|
|
8e99ac85ff | ||
|
|
c2ae371bed | ||
|
|
79ac4c42f1 | ||
|
|
02a8b24523 | ||
|
|
735217df00 |
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#Temp files
|
||||||
|
/build*
|
||||||
|
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
16
CMakeLists.txt
Normal file
16
CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
|
||||||
|
cmake_minimum_required (VERSION 2.6)
|
||||||
|
project (TINES)
|
||||||
|
|
||||||
|
add_subdirectory (src)
|
||||||
@@ -1,3 +1,15 @@
|
|||||||
|
25/02/2008: V0.30 part 2
|
||||||
|
- Correct a bug in CPU emulation related with cycle count and the stupid R_FLAG
|
||||||
|
- Correct bugs in PAL emulation where VBlank line count was incorrect.
|
||||||
|
- Correct a bug with VBlank (it occured one line too late)
|
||||||
|
- Correct a bug with cart loading, if the file name was incorrect it crashed instead
|
||||||
|
exiting gently.
|
||||||
|
- All mappers are remerged.
|
||||||
|
- Unix & Windows build are totaly broken...
|
||||||
|
- Sprite are back! There are some bad behaviour, but they will be corrected with next versions.
|
||||||
|
- New SVN repository (the disk where the old one was had crashed...)
|
||||||
|
- Iremh3100 is now active! (finaly)
|
||||||
|
|
||||||
05/10/2007 V0.30 part 2 ... In progress ...
|
05/10/2007 V0.30 part 2 ... In progress ...
|
||||||
- Start rewrite of mapper manager. The goal, like for plugin manager, is
|
- Start rewrite of mapper manager. The goal, like for plugin manager, is
|
||||||
to allow in the future to have plugins or mapper in external libraries.
|
to allow in the future to have plugins or mapper in external libraries.
|
||||||
@@ -101,5 +113,5 @@
|
|||||||
- Premiere version public, ne sert que de d<>monstration.
|
- Premiere version public, ne sert que de d<>monstration.
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
$Id: Changements.txt 29 2007-04-03 14:34:02Z mtrapier $
|
$Id$
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,21 +1,33 @@
|
|||||||
05/10/2007 V0.30 part 2 ... In progress ...
|
25/02/2008: V0.30 part 2
|
||||||
- Start rewrite of mapper manager. The goal, like for plugin manager, is
|
- Correct a bug in CPU emulation related with cycle count and the stupid R_FLAG
|
||||||
to allow in the future to have plugins or mapper in external libraries.
|
- Correct bugs in PAL emulation where VBlank line count was incorrect.
|
||||||
- New sound layer using Allegro. Not really accurate, but more portable.
|
- Correct a bug with VBlank (it occured one line too late)
|
||||||
A lot of work has to be done on this (especialy because the actual sound
|
- Correct a bug with cart loading, if the file name was incorrect it crashed instead
|
||||||
is really bad.)
|
exiting gently.
|
||||||
- Started a new source organisation. Should be the good one this time !
|
- All mappers are remerged.
|
||||||
|
- Unix & Windows build are totaly broken...
|
||||||
|
- Sprite are back! There are some bad behaviour, but they will be corrected with next versions.
|
||||||
|
- New SVN repository (the disk where the old one was had crashed...)
|
||||||
|
- Iremh3100 is now active! (finaly)
|
||||||
|
|
||||||
25/10/2007:
|
25/10/2007:
|
||||||
- Savestate now work correctly (It was not loaded at the right time...)
|
- Savestate now work correctly (It was not loaded at the right time...)
|
||||||
- Mapper manager seems to work correctly ok
|
- Mapper manager seems to work correctly ok
|
||||||
- [MACOSX] Buils options are better now
|
- [MACOSX] Builds options are better now
|
||||||
|
|
||||||
|
|
||||||
- [TODO] Remerge old PPU debug utilities in real plugin form
|
- [TODO] Remerge old PPU debug utilities in real plugin form
|
||||||
- [TODO] Change the make util. Maybe cmake ?
|
- [TODO] Change the make util. Maybe cmake ?
|
||||||
- [TODO] Remerge all mappers with the new manager
|
- [TODO] Remerge all mappers with the new manager
|
||||||
- [TODO] Rewrite UNIX Makefile for support new src organization.
|
- [TODO] Rewrite UNIX Makefile for support new src organization.
|
||||||
|
|
||||||
|
05/10/2007:
|
||||||
|
- Start rewrite of mapper manager. The goal, like for plugin manager, is
|
||||||
|
to allow in the future to have plugins or mapper in external libraries.
|
||||||
|
- New sound layer using Allegro. Not really accurate, but more portable.
|
||||||
|
A lot of work has to be done on this (especialy because the actual sound
|
||||||
|
is really bad.)
|
||||||
|
- Started a new source organisation. Should be the good one this time!
|
||||||
|
|
||||||
03/05/2007 V0.30 part 1
|
03/05/2007 V0.30 part 1
|
||||||
- Started the process of PPU total rewrite.
|
- Started the process of PPU total rewrite.
|
||||||
- Bg seem to draw fine, sprite is under the way
|
- Bg seem to draw fine, sprite is under the way
|
||||||
@@ -123,5 +135,5 @@
|
|||||||
- Premiere version public, ne sert que de d<>monstration.
|
- Premiere version public, ne sert que de d<>monstration.
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
$Id: Changes.txt 51 2007-05-22 16:33:04Z mtrapier $
|
$Id$
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|||||||
224
doc/LisezMoi.txt
224
doc/LisezMoi.txt
@@ -1,65 +1,64 @@
|
|||||||
<---------------------------------------------------------------------------------->
|
<------------------------------------------------------------------------------>
|
||||||
TI-NESulator
|
TI-NESulator
|
||||||
Version 0.26 beta
|
Version 0.30.2 beta
|
||||||
|
|
||||||
Par Manoël TRAPIER aka Godzil
|
Par Manoel TRAPIER aka Godzil
|
||||||
godzil at godzil point net
|
godzil at godzil point net
|
||||||
|
|
||||||
1 -> #include <disclamer.h>
|
1 -> #include <disclamer.h>
|
||||||
|
|
||||||
L'utilisation de se logiciel se fait a vos risque et périls. Il s'agit d'une pars
|
L'utilisation de se logiciel se fait a vos risque et p<EFBFBD>rils. Il s'agit d'une
|
||||||
d'une version non terminée, et en cours de dévellopement, et la diffusion n'a été
|
pars d'une version non termin<EFBFBD>e, et en cours de d<EFBFBD>vellopement, et la diffusion
|
||||||
faite que pour permettre le teste, et la démonstration de se que sera le logiciel
|
n'a <20>t<EFBFBD> faite que pour permettre le teste, et la d<EFBFBD>monstration de se que sera le
|
||||||
final.
|
logiciel final.
|
||||||
|
|
||||||
Je ne peut donc être tenu pour responsable en cas de problème lié a l'utilisation
|
Je ne peut donc <EFBFBD>tre tenu pour responsable en cas de probl<EFBFBD>me li<EFBFBD> <20>
|
||||||
ou posession de se logiciel.
|
l'utilisation ou posession de se logiciel.
|
||||||
|
|
||||||
Vous êtes libre de l'utiliser à partir du moment au se logiciel n'a pas été modifié
|
Vous <EFBFBD>tes libre de l'utiliser <EFBFBD> partir du moment au se logiciel n'a pas <EFBFBD>t<EFBFBD>
|
||||||
que sa soit de manière binaire, ou par désassemblage. Si vous trouver une version
|
modifi<EFBFBD> que sa soit de mani<EFBFBD>re binaire, ou par d<EFBFBD>sassemblage. Si vous trouver
|
||||||
modifié ou fourni avec des fichiers illégaux, veuillez me le faire savoir. Vous
|
une version modifi<EFBFBD> ou fourni avec des fichiers ill<EFBFBD>gaux, veuillez me le faire
|
||||||
trouverez comment me contacter dans la suite de se fichier.
|
savoir. Vous trouverez comment me contacter dans la suite de se fichier.
|
||||||
|
|
||||||
Vous êtes libre aussi de le distribuer tant que les fichiers contenus dans le
|
Vous <EFBFBD>tes libre aussi de le distribuer tant que les fichiers contenus dans le
|
||||||
paquetage original sont laissé intouché (les fichiers Changements.txt LisezMoi.txt
|
paquetage original sont laiss<EFBFBD> intouch<EFBFBD>.
|
||||||
et TINes.exe)
|
|
||||||
|
|
||||||
Information légales :
|
Information l<EFBFBD>gales :
|
||||||
NES, Famicon, Nintendo Entertainment System, Nintendo sont des marques déposé de
|
NES, Famicon, Nintendo Entertainment System, Nintendo sont des marques d<EFBFBD>pos<EFBFBD> de
|
||||||
Nintendo France, Nintendo of america et Nintendo Company, Ltd.
|
Nintendo France, Nintendo of america et Nintendo Company, Ltd.
|
||||||
Tout les titres et marques apparaisant dans se fichier texte sont la propriété de
|
Tout les titres et marques apparaisant dans se fichier texte sont la propri<EFBFBD>t<EFBFBD>
|
||||||
leurs auteurs respectifs.
|
de leurs auteurs respectifs.
|
||||||
|
|
||||||
N'oubliez pas aussi que la posession de ROM (Fichier binaire représentant le
|
N'oubliez pas aussi que la posession de ROM (Fichier binaire repr<EFBFBD>sentant le
|
||||||
contenue d'une cartouche) sans en posseder l'originale (la cartouche) est absolument
|
contenue d'une cartouche) sans en posseder l'originale (la cartouche) est
|
||||||
illégale, que vous la gardiez 24 heures ou seulement 30 secondes
|
absolument ill<EFBFBD>gale, que vous la gardiez 24 heures ou seulement 30 secondes
|
||||||
|
|
||||||
|
|
||||||
2 -> Qu'est-ce que TI-NESulator ?
|
2 -> Qu'est-ce que TI-NESulator ?
|
||||||
|
|
||||||
TI-NESulator est un émulateur de la console Nintendo Entertainment System
|
TI-NESulator est un <EFBFBD>mulateur de la console Nintendo Entertainment System
|
||||||
(connunément appelé NES) fabriqué par Nintendo au milieu des année 80. L'originalité
|
(connun<EFBFBD>ment appel<EFBFBD> NES) fabriqu<EFBFBD> par Nintendo au milieu des ann<EFBFBD>e 80.
|
||||||
de cet emulateur est que sa plateforme de fonctionnement principal est les
|
L'originalit<69> de cet emulateur est que sa plateforme de fonctionnement principal
|
||||||
calculatrices TI-89 et TI-92+ de chez Texas Instrument. Ses calculatrices on la
|
est les calculatrices TI-89 et TI-92+ de chez Texas Instrument. Ses
|
||||||
particularité de posseder un microprocesseur 68000 de chez motorola, qui est pour
|
calculatrices on la particularit<EFBFBD> de posseder un microprocesseur 68000 de chez
|
||||||
se genre de plateforme relativement puissant et programmer un emulateur, meme de
|
motorola, qui est pour se genre de plateforme relativement puissant et
|
||||||
NES, sur ses machine est un véritable défit.
|
programmer un emulateur, meme de NES, sur ses machine est un v<EFBFBD>ritable d<EFBFBD>fit
|
||||||
Tant au niveau matériel que mémoire, la NES et les TI-68k sont completements
|
tant au niveau mat<EFBFBD>riel que m<EFBFBD>moire, la NES et les TI-68k sont completements
|
||||||
différents.
|
diff<EFBFBD>rents.
|
||||||
La NES utilise une version légérement personalisé du microprocesseur 6502
|
La NES utilise une version l<EFBFBD>g<EFBFBD>rement personalis<EFBFBD> du microprocesseur 6502
|
||||||
fonctionnant a environ 1.7Mhz.
|
fonctionnant <EFBFBD> environ 1.7Mhz.
|
||||||
|
|
||||||
Vous avez actuellement une version spéciale (comprendre pas faite pour
|
Vous avez actuellement une version sp<EFBFBD>ciale (comprendre pas faite pour
|
||||||
calculatrices TI.) Cette version ne me sert qu'a mettre en oeuvre de nouvelles
|
calculatrices TI.) Cette version ne me sert qu'a mettre en oeuvre de nouvelles
|
||||||
choses dans la version TI de l'émulateur (notemment a cause d'un gros manque
|
choses dans la version TI de l'<EFBFBD>mulateur (notemment a cause d'un gros manque
|
||||||
de debuggueur C dans le monde TI.)
|
de debuggueur C dans le monde TI.)
|
||||||
|
|
||||||
Cette version est et sera toujours plus avancé que la version TI dans le sens ou
|
Cette version est et sera toujours plus avanc<EFBFBD> que la version TI dans le sens ou
|
||||||
elle me sert a expérimenter les nouveaux hardware émulé et a finaliser le hardware
|
elle me sert a exp<EFBFBD>rimenter les nouveaux hardware <EFBFBD>mul<EFBFBD> et a finaliser le
|
||||||
deja emuler. Une fois fonctionnant d'un maniere convenable sur le portage Windows,
|
hardware deja emuler. Une fois fonctionnant d'un maniere convenable sur le
|
||||||
les mises a jours sont faites dans la version TI. Mais la version Windows au final
|
portage Windows, les mises a jours sont faites dans la version TI. Mais la
|
||||||
contiendra plus de fonctionnalité que la version TI (support des palletes, de la
|
version Windows au final contiendra plus de fonctionnalit<EFBFBD> que la version TI
|
||||||
couleur, voir meme le son etc...)
|
(support des palletes, de la couleur, voir meme le son etc...)
|
||||||
|
|
||||||
|
|
||||||
3 -> Utilisation de TI-NESulator
|
3 -> Utilisation de TI-NESulator
|
||||||
@@ -86,7 +85,7 @@ SELECT P
|
|||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Autres touches :
|
Autres touches :
|
||||||
R identique a l'apuis du bouton Reset de la console
|
R identique <EFBFBD> l'apuis du bouton Reset de la console
|
||||||
|
|
||||||
|
|
||||||
1-2 A un effet, mais vous risque de pas le voir ;)
|
1-2 A un effet, mais vous risque de pas le voir ;)
|
||||||
@@ -97,137 +96,110 @@ R identique a l'apuis du bouton Reset de la console
|
|||||||
|
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Il faut noter aussi qu'afficher ces tables ralenti considérablement la vitesse de
|
Il faut noter aussi qu'afficher ces tables ralentisent consid<EFBFBD>rablement la
|
||||||
l'émulateur
|
vitesse de l'<EFBFBD>mulateur
|
||||||
|
|
||||||
4 -> Compatibilité
|
4 -> Compatibilit<EFBFBD>
|
||||||
|
|
||||||
TI-NESulator version Win32 est normalement compatible avec tous les Windows (95, 98,
|
TI-NESulator version Win32 est normalement compatible avec tous les Windows
|
||||||
Me, NT 4, 2000, XP)
|
(95, 98,Me, NT 4, 2000, XP)
|
||||||
TI-NESulator version .X (MacOS X) est normalement compatible toutes version de OS X
|
TI-NESulator version .X (MacOS X) est normalement compatible toutes version
|
||||||
(.1.x .2.x .3.x)
|
de OS X (.1.x .2.x .3.x)
|
||||||
L'émulateur émule actuellement avec les mappers :
|
|
||||||
|
L'<27>mulateur <20>mule actuellement avec les mappers :
|
||||||
|
|
||||||
- 0 aucun mapper (Super Mario Bros 1, Donkey Kong, ...)
|
- 0 aucun mapper (Super Mario Bros 1, Donkey Kong, ...)
|
||||||
|
|
||||||
- 1 MMC1 (a 99%, Megaman 2, Zelda1 & 2, Final Fantasy 1, ...)
|
- 1 MMC1 (a 99%, Megaman 2, Zelda1 & 2, Final Fantasy 1, ...)
|
||||||
|
|
||||||
- 2 UNROM (MegaMan, Final fantasy 2, ...)
|
- 2 UNROM (MegaMan, Final fantasy 2, ...)
|
||||||
|
|
||||||
- 3 CNROM
|
- 3 CNROM
|
||||||
|
- 4 MMC3 (Super mario Bross 2 & 3, MegaMan 3 <20> 6, ...)
|
||||||
|
- 7 AOROM (Battletoad, ...)
|
||||||
|
|
||||||
- 4 *NOUVEAU* MMC3 (Super mario Bross 2 & 3, MegaMan 3 à 6, ...)
|
Les mappers marqu<71> comme *NOUVEAU* sont ceux qui on <20>t<EFBFBD> ajout<75> dans la derniere
|
||||||
|
version disponible. Merci de faire un rapport d<>taill<6C> si vous rencontrer des
|
||||||
|
probl<EFBFBD>mes avec.
|
||||||
|
|
||||||
- 7 *NOUVEAU* AOROM (Battletoad, ...)
|
5 -> Question R<>ponses
|
||||||
|
|
||||||
Les mappers marqué comme *NOUVEAU* sont ceux qui on été ajouté dans la derniere
|
|
||||||
version disponible. Merci de faire un rapport détaillé si vous rencontrer des
|
|
||||||
problèmes avec.
|
|
||||||
|
|
||||||
|
|
||||||
5 -> A faire
|
|
||||||
|
|
||||||
* Optimisation du coeur de l'émulation du CPU de la NES.
|
|
||||||
|
|
||||||
* Son ?
|
|
||||||
|
|
||||||
* Supprimer les printf et les remplacer par l'affichage dans une console (prochaine
|
|
||||||
maj) pour eviter les soucis sur
|
|
||||||
|
|
||||||
- PC: car la console n'est pas forcement ouverte tout le temps
|
|
||||||
- Unix: pour la meme raison
|
|
||||||
- MacOS: aussi (%))
|
|
||||||
- TI: pasqu'on peut pas avoir les deux en meme temps.
|
|
||||||
|
|
||||||
* Recoder le ppu (gestion de l'affichage)
|
|
||||||
|
|
||||||
6 -> Question Réponses
|
|
||||||
|
|
||||||
Q: Pourquoi le jeu xxx ne fonctionne pas ?
|
Q: Pourquoi le jeu xxx ne fonctionne pas ?
|
||||||
R: TI-NESulator est actuellement en cours de dévellopement. Beaucoup de jeux ne
|
R: TI-NESulator est actuellement en cours de d<EFBFBD>vellopement. Beaucoup de jeux ne
|
||||||
sont pas supporté.
|
sont pas support<EFBFBD>.
|
||||||
|
|
||||||
Q: Vous dites que certain de jeux ne sont pas supporté, mais si j'essaye xxx, il
|
Q: Vous dites que certain de jeux ne sont pas support<EFBFBD>, mais si j'essaye xxx, il
|
||||||
marche ! Pourquoi ?
|
marche ! Pourquoi ?
|
||||||
R: Ceci est du a une des particularité du Hardware de la NES/Famicon. Le hardware
|
R: Ceci est du a une des particularit<EFBFBD> du Hardware de la NES/Famicon. Le
|
||||||
de base de la console est assé limité, et la mémoire est aussi tres limité. pour
|
hardware de base de la console est ass<EFBFBD> limit<EFBFBD>, et la m<EFBFBD>moire est aussi tres
|
||||||
palier à ses limitations, certains jeux utilise ce qu'on appele des Mappers, qui
|
limit<EFBFBD>. pour palier <EFBFBD> ses limitations, certains jeux utilise ce qu'on appele des
|
||||||
permettent notemment d'avoir des jeux plus gros, et qui sont implémenté dans la
|
Mappers, qui permettent notemment d'avoir des jeux plus gros, et qui sont
|
||||||
cartouche du jeu. Malheureusement supporter tout ses mappers font grossir
|
impl<EFBFBD>ment<EFBFBD> dans la cartouche du jeu. Malheureusement supporter tout ses mappers
|
||||||
l'emulateur, et certain on un fonctionnement qui est malheureusement encore
|
font grossir l'emulateur, et certain on un fonctionnement qui est
|
||||||
inconnu. N'oubliez pas non plus que TI-NESulator est encore en dévellopement.
|
malheureusement encore inconnu. N'oubliez pas non plus que TI-NESulator est
|
||||||
Certain mapper connu ne sont pas encore implémenté.
|
encore en d<>vellopement. Certain mapper connu ne sont pas encore impl<EFBFBD>ment<EFBFBD>.
|
||||||
|
|
||||||
Q: Oui puis-je trouver le jeux xxxx ?
|
Q: Oui puis-je trouver le jeux xxxx ?
|
||||||
R: Désolé, je ne donne aucun lien menant, ni aucune ROM de jeux commerciaux.
|
R: D<EFBFBD>sol<EFBFBD>, je ne donne aucun lien menant, ni aucune ROM de jeux commerciaux.
|
||||||
N'oubliez pas que les personnes vous disant que vous avez le droit de ne garder que
|
N'oubliez pas que les personnes vous disant que vous avez le droit de ne garder
|
||||||
24h une ROM, vous raconte absolument n'importe quoi. Il est absolument *ILLEGAL* de
|
que 24h une ROM, vous raconte absolument n'importe quoi. Il est absolument
|
||||||
posseder la ROM d'un jeu que vous ne possedez pas officiellement.
|
*ILLEGAL* de posseder la ROM d'un jeu que vous ne possedez pas officiellement.
|
||||||
|
|
||||||
Q: XXX donne l'air de fonctionner, pourtant il ne reagis pas au touches
|
Q: XXX donne l'air de fonctionner, pourtant il ne reagis pas au touches
|
||||||
R: Cet emulateur n'est pas parfait. Certain jeux/demo demandent un fonctionnement
|
R: Cet emulateur n'est pas parfait. Certain jeux/demo demandent un
|
||||||
tres proche de celui de la console originale, ce que TI-NESulator est encore loin
|
fonctionnement tres proche de celui de la console originale, ce que TI-NESulator
|
||||||
d'arriver a faire
|
est encore loin d'arriver a faire.
|
||||||
|
|
||||||
Q:J'ai des problèmes graphiques avec XXXX
|
Q: J'ai des probl<EFBFBD>mes graphiques avec XXXX
|
||||||
R:Cf réponse-ci dessus
|
R: Cf r<EFBFBD>ponse-ci dessus
|
||||||
|
|
||||||
Q: C'est lent :(
|
Q: C'est lent :(
|
||||||
R: Désolé. Le code est toujours en cours de devellopement. Si vous trouvez trop lent,
|
R: D<EFBFBD>sol<EFBFBD>. Le code est toujours en cours de devellopement. Si vous trouvez trop
|
||||||
attendez la prochaine version une surprise vous y attendra peut-etre !
|
lent, attendez la prochaine version une surprise vous y attendra peut-etre !
|
||||||
|
|
||||||
7 -> En cas de problème
|
7 -> En cas de probl<EFBFBD>me
|
||||||
|
|
||||||
a) Un jeu indiqué compatible ne fonctionne pas (ie "Mapper non supporté")
|
a) Un jeu indiqu<EFBFBD> compatible ne fonctionne pas (ie "Mapper non support<EFBFBD>")
|
||||||
|
|
||||||
Alors plusieurs possibilité, soit vous avez une autre version du jeu officielle
|
Alors plusieurs possibilit<EFBFBD>, soit vous avez une autre version du jeu officielle
|
||||||
ou non, cela peut changer par exemple le mapper utilisé par le jeux, soit vous
|
ou non, cela peut changer par exemple le mapper utilis<EFBFBD> par le jeux, soit vous
|
||||||
avez recuperer un "bad dump", c'est a dire plus simplement une rom foireuse.
|
avez recuperer un "bad dump", c'est a dire plus simplement une rom foireuse.
|
||||||
|
|
||||||
Dans ces deux cas essayez d'en recuperer une autre version.
|
Dans ces deux cas essayez d'en recuperer une autre version.
|
||||||
|
|
||||||
b) TI-NESulator à planté !!
|
b) TI-NESulator <EFBFBD> plant<EFBFBD> !!
|
||||||
Si cela arrive regulierement pour le meme jeu et au meme endroit faites moi un
|
Si cela arrive regulierement pour le meme jeu et au meme endroit faites moi un
|
||||||
crash report avec les information que TI-NESulator vous met dans la console
|
crash report avec les information que TI-NESulator vous met dans la console
|
||||||
(pour pouvoir la copier tranquillement il faut lancer a partir d'une console
|
(pour pouvoir la copier tranquillement il faut lancer a partir d'une console
|
||||||
et pas faire glisser la rom sur l'executable)
|
et pas faire glisser la rom sur l'executable)
|
||||||
|
|
||||||
N'oubliez pas de préciser le nom complet du jeu, la taille du fichier et toutes
|
N'oubliez pas de pr<EFBFBD>ciser le nom complet du jeu, la taille du fichier et toutes
|
||||||
les infos que vous trouverez pertinante (manipulation a faire etc...)
|
les infos que vous trouverez pertinante (manipulation a faire etc...)
|
||||||
|
|
||||||
|
|
||||||
8 -> Remerciement
|
8 -> Remerciement
|
||||||
|
|
||||||
PpHd pour PreOS, et SMA :)
|
Loopy, Y0Shi, Marrat Fayzullin, et bcp d'autre pour la documentation technique
|
||||||
TiMad Membre de la XTeam sans lequel XLib existerait pas.
|
sur la NES
|
||||||
nEUrOO Membre de la XTeam sans lequel XLib existerait pas.
|
|
||||||
|
|
||||||
Loopy, Y0Shi,
|
|
||||||
Marrat Fayzullin,
|
|
||||||
et bcp d'autre pour la documentation technique sur la NES
|
|
||||||
|
|
||||||
Ainsi que tout ceux que j'ai pu oublier
|
Ainsi que tout ceux que j'ai pu oublier
|
||||||
|
|
||||||
9 -> Litérature
|
9 -> Lit<EFBFBD>rature
|
||||||
|
|
||||||
[A faire.]
|
[A faire.]
|
||||||
|
|
||||||
mais lien rapide :
|
mais lien rapide :
|
||||||
|
|
||||||
http://www.nesdev.org
|
http://nesdev.parodius.com/
|
||||||
|
http://nesdevwiki.org/
|
||||||
|
|
||||||
|
|
||||||
10 -> Comment me contacter ?
|
10 -> Comment me contacter ?
|
||||||
s
|
|
||||||
Vous pouvez me contacter grace au forum yAronet
|
|
||||||
http://www.yaronet.com
|
|
||||||
|
|
||||||
Et surtout grace au lien suivant :
|
Vous pouvez me contacter grace au forum yAronet: http://www.yaronet.com
|
||||||
http://www.yaronet.com/posts.php?sl=&s=2339
|
|
||||||
|
|
||||||
Vous pouvez aussi me joindre par mail en m'écrivant à "godzil chez godzil point net"
|
Et surtout grace au lien suivant : http://www.yaronet.com/posts.php?sl=&s=2339
|
||||||
Vous pouvez aussi essayer de visiter un de mes sites :
|
|
||||||
http://www.godzil.net
|
Vous pouvez aussi me joindre par mail en m'<27>crivant <20>
|
||||||
|
"godzil chez godzil point net"
|
||||||
|
Vous pouvez aussi essayer de visiter mon site : http://www.godzil.net
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
$Id: LisezMoi.txt 17 2007-03-27 09:25:23Z mtrapier $
|
$Id$
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
12
doc/TODO.txt
12
doc/TODO.txt
@@ -1,7 +1,15 @@
|
|||||||
07/10/2007 V0.30 part 2
|
25/02/2008
|
||||||
|
- Finish th Quick6502 C project to merge it into TI-NESulator [ ]
|
||||||
|
- Extract graphic primitive to be less dependent of Allegro [ ]
|
||||||
|
- Rewrite sound engine [ ]
|
||||||
|
|
||||||
|
07/10/2007
|
||||||
- Remerge old PPU debug utilities in real plugin form [ ]
|
- Remerge old PPU debug utilities in real plugin form [ ]
|
||||||
- Change the make util for UNIX. Maybe cmake ? [ ]
|
- Change the make util for UNIX. Maybe cmake ? [ ]
|
||||||
- Cleanup os/win32 folder [ ]
|
- Cleanup os/win32 folder [ ]
|
||||||
- Thinks about a better svn repository (Maybe a dedibox is a good choice?)
|
- Thinks about a better svn repository (Maybe a dedibox is a good choice?)
|
||||||
[ ]
|
[X]
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
$Id$
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
140
src/CMakeLists.txt
Normal file
140
src/CMakeLists.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
include_directories($(TINES_SOURCE_DIR)/include)
|
||||||
|
|
||||||
|
##########################
|
||||||
|
# Configurations variables
|
||||||
|
##########################
|
||||||
|
set(PPU_ISPAL OFF CACHE BOOL "When switch to ON the PPU is in PAL mode, else it will act as a NTSC one.")
|
||||||
|
set(Q6502_DEBUGGER OFF CACHE BOOL "Activate the Quick6502 debugger?")
|
||||||
|
set(USE_SOUND OFF CACHE BOOL "Activate the sound?")
|
||||||
|
set(DETECT_BUS_CONFLICT OFF CACHE BOOL "Activate the bus conflit detector? (Could slow down the emulator a lot.)")
|
||||||
|
|
||||||
|
set(USE_EFENCE OFF CACHE BOOL "Use electricfence memory debugger?")
|
||||||
|
set(USE_PROFILING OFF CACHE BOOL "Use profiling tools? (Will slow down a lot.)")
|
||||||
|
|
||||||
|
set(USE_ALLEGRO ON CACHE BOOL "Use Allegro backend" FORCE)
|
||||||
|
|
||||||
|
IF(NOT CMAKE_BUILD_TYPE)
|
||||||
|
SET(CMAKE_BUILD_TYPE Debug CACHE STRING
|
||||||
|
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
|
||||||
|
FORCE)
|
||||||
|
ENDIF(NOT CMAKE_BUILD_TYPE)
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
SET (CMAKE_FIND_FRAMEWORK LAST)
|
||||||
|
endif (APPLE)
|
||||||
|
|
||||||
|
##########################
|
||||||
|
# Link & Compile flags
|
||||||
|
##########################
|
||||||
|
|
||||||
|
set (CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused-parameter -Werror ${PLATFORM_FLAGS}")
|
||||||
|
set (CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused-parameter -Werror ${PLATFORM_FLAGS}")
|
||||||
|
|
||||||
|
add_definitions (-DNO_DECIMAL -DFAST_RDOP)
|
||||||
|
|
||||||
|
SET ( CMAKE_EXE_LINKER_FLAGS "-mmacosx-version-min=10.4")
|
||||||
|
|
||||||
|
if (PPU_ISPAL)
|
||||||
|
add_definitions (-DISPAL)
|
||||||
|
else (PPU_ISPAL)
|
||||||
|
add_definitions (-DISNTSC)
|
||||||
|
endif (PPU_ISPAL)
|
||||||
|
|
||||||
|
if (Q6502_DEBUGGER)
|
||||||
|
add_definitions (-DDEBUG)
|
||||||
|
endif (Q6502_DEBUGGER)
|
||||||
|
|
||||||
|
if (USE_SOUND)
|
||||||
|
add_definitions (-DUSE_SOUND)
|
||||||
|
endif (USE_SOUND)
|
||||||
|
|
||||||
|
if (DETECT_BUS_CONFLICT)
|
||||||
|
add_definitions (-DDETECT_BUS_CONFLICT)
|
||||||
|
endif (DETECT_BUS_CONFLICT)
|
||||||
|
|
||||||
|
if (USE_EFENCE)
|
||||||
|
if (CMAKE_BUILD_TYPE MATCHES Release)
|
||||||
|
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Debug info is forced" FORCE)
|
||||||
|
else(CMAKE_BUILD_TYPE)
|
||||||
|
SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Debug info is forced" FORCE)
|
||||||
|
endif(CMAKE_BUILD_TYPE)
|
||||||
|
|
||||||
|
endif (USE_EFENCE)
|
||||||
|
|
||||||
|
if (USE_PROFILING)
|
||||||
|
if (CMAKE_BUILD_TYPE MATCHES Rel)
|
||||||
|
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Debug info is forced" FORCE)
|
||||||
|
else(CMAKE_BUILD_TYPE MATCHES Rel)
|
||||||
|
SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Debug info is forced" FORCE)
|
||||||
|
endif(CMAKE_BUILD_TYPE MATCHES Rel)
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS -pg)
|
||||||
|
endif (USE_PROFILING)
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
include_directories(BEFORE /usr/include)
|
||||||
|
endif (APPLE)
|
||||||
|
|
||||||
|
#if the CPU is LSB set the define
|
||||||
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES i386 OR CMAKE_SYSTEM_PROCESSOR MATCHES [aA][rR][mM])
|
||||||
|
add_definitions (-DLSB_FIRST)
|
||||||
|
endif (CMAKE_SYSTEM_PROCESSOR MATCHES i386 OR CMAKE_SYSTEM_PROCESSOR MATCHES [aA][rR][mM])
|
||||||
|
|
||||||
|
#Add release mode extra C Flags
|
||||||
|
set (CMAKE_C_FLAGS_RELEASE "-fomit-frame-pointer -funroll-loops -Wall ${CMAKE_C_FLAGS_RELEASE}")
|
||||||
|
set (CMAKE_C_FLAGS_RELWITHDEBINFO "-fomit-frame-pointer -funroll-loops -Wall ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||||
|
|
||||||
|
add_subdirectory(apu)
|
||||||
|
add_subdirectory(corecpu)
|
||||||
|
add_subdirectory(mappersmanager)
|
||||||
|
add_subdirectory(memorymanager)
|
||||||
|
add_subdirectory(pluginsmanager)
|
||||||
|
add_subdirectory(ppu)
|
||||||
|
|
||||||
|
|
||||||
|
if (TARGET_TI68k)
|
||||||
|
add_subdirectory(os/ti68k)
|
||||||
|
elseif (APPLE AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
add_subdirectory(os/macos)
|
||||||
|
elseif (UNIX)
|
||||||
|
add_subdirectory(os/unix)
|
||||||
|
else (TARGET_TI68k)
|
||||||
|
#So we target UNIX like OS
|
||||||
|
add_subdirectory(os/win32)
|
||||||
|
endif (TARGET_TI68k)
|
||||||
|
|
||||||
|
|
||||||
|
add_library (main main.c paddle.c NESCarts.c)
|
||||||
|
|
||||||
|
add_executable(tines main.c)
|
||||||
|
set(CMAKE_FIND_FRAMEWORK LAST)
|
||||||
|
find_library(ALLEGROLIB allegro)
|
||||||
|
find_library(PTHREADLIB pthread)
|
||||||
|
|
||||||
|
if (USE_EFENCE)
|
||||||
|
find_library(EFENCELIB efence)
|
||||||
|
target_link_libraries(tines ${EFENCELIB})
|
||||||
|
endif (USE_EFENCE)
|
||||||
|
|
||||||
|
if (USE_ALLEGRO)
|
||||||
|
target_link_libraries(tines debug alld-main)
|
||||||
|
# target_link_libraries(tines)
|
||||||
|
if (APPLE)
|
||||||
|
find_library(COCOALIB Cocoa)
|
||||||
|
target_link_libraries(tines ${COCOALIB})
|
||||||
|
endif (APPLE)
|
||||||
|
|
||||||
|
endif (USE_ALLEGRO)
|
||||||
|
|
||||||
|
target_link_libraries(tines main apu corecpu mappermanager memorymanager pluginsmanager ppu oslib ${ALLEGROLIB} ${PTHREADLIB})
|
||||||
@@ -3,29 +3,38 @@
|
|||||||
* NESCart.c
|
* NESCart.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/NESCarts.c $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "include/NESCarts.h"
|
/* System Headers */
|
||||||
#include "include/mappers/manager.h"
|
#if !defined(__TIGCC__) && !defined(__GCC4TI__) && !defined(__GTC__)
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <memory.h>
|
||||||
|
|
||||||
/* Plateform dependent function */
|
#else /* Support for TI-68k compilation */
|
||||||
void *LoadFilePtr(char * filename);
|
|
||||||
|
#define TIGCC_COMPAT
|
||||||
|
#include <tigcclib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* TI-NES headers */
|
||||||
|
#include <os_dependent.h>
|
||||||
|
#include <NESCarts.h>
|
||||||
|
#include <os_dependent.h>
|
||||||
|
#include <mappers/manager.h>
|
||||||
|
|
||||||
void DumpCartProperties(FILE *out, NesCart * cart)
|
void DumpCartProperties(FILE *out, NesCart * cart)
|
||||||
{
|
{
|
||||||
fprintf(out,
|
console_printf(Console_Verbose,
|
||||||
"'%s' informations:\n"
|
"'%s' informations:\n"
|
||||||
" Total ROM Size : 0x%06X | Total VROM Size : 0x%06X\n"
|
" Total ROM Size : 0x%06lX | Total VROM Size : 0x%06lX\n"
|
||||||
" Mapper ID : 0x%06X | Mirroring ? : %s\n"
|
" Mapper ID : 0x%06X | Mirroring ? : %s\n"
|
||||||
" Battery ? : %s | 4 Screen ? : %s \n"
|
" Battery ? : %s | 4 Screen ? : %s \n"
|
||||||
" PROMBanks start at : %p |\n"
|
" PROMBanks start at : %p |\n"
|
||||||
@@ -43,12 +52,12 @@ void DumpCartProperties(FILE *out, NesCart * cart)
|
|||||||
|
|
||||||
int LoadCart(const char *filename, NesCart * cart)
|
int LoadCart(const char *filename, NesCart * cart)
|
||||||
{
|
{
|
||||||
byte buffer[6];
|
char buffer[6];
|
||||||
/* Load the cart into memory */
|
/* Load the cart into memory */
|
||||||
cart->File = (byte *)LoadFilePtr(filename);
|
cart->File = (byte *)LoadFilePtr((char *)filename);
|
||||||
|
|
||||||
|
|
||||||
if (cart->File == -1)
|
if ((cart->File == NULL) || ((int)cart->File == -1))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
sprintf(buffer, "%c%c%c%c", 0x4E, 0x45, 0x53, 0x1A);
|
sprintf(buffer, "%c%c%c%c", 0x4E, 0x45, 0x53, 0x1A);
|
||||||
@@ -57,14 +66,11 @@ int LoadCart(const char *filename, NesCart * cart)
|
|||||||
if (memcmp(cart->File, buffer, 4))
|
if (memcmp(cart->File, buffer, 4))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ((cart->File == NULL) || (cart->File == -1))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Before go elsewhere, verify that the header is clean !
|
/* Before go elsewhere, verify that the header is clean !
|
||||||
(aka no DiskDude! in it) */
|
(aka no DiskDude! in it) */
|
||||||
if (memcmp(cart->File+7, "DiskDude!", 9) == 0)
|
if (memcmp(cart->File+7, "DiskDude!", 9) == 0)
|
||||||
{
|
{
|
||||||
printf("\n"
|
console_printf(Console_Warning, "\n"
|
||||||
"*******************WARNING****************\n"
|
"*******************WARNING****************\n"
|
||||||
"* The header of this game is not clean *\n"
|
"* The header of this game is not clean *\n"
|
||||||
"* (DiskDude! pollution) I will only use *\n"
|
"* (DiskDude! pollution) I will only use *\n"
|
||||||
@@ -83,7 +89,7 @@ int LoadCart(const char *filename, NesCart * cart)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now fill the structure */
|
/* Now fill the structure */
|
||||||
cart->FileName = filename;
|
cart->FileName = (char *)filename;
|
||||||
|
|
||||||
cart->PROMSize = cart->File[4] * 16 * 1024; /* Size of PROM */
|
cart->PROMSize = cart->File[4] * 16 * 1024; /* Size of PROM */
|
||||||
cart->VROMSize = cart->File[5] * 8 * 1024; /* Size of VROM */
|
cart->VROMSize = cart->File[5] * 8 * 1024; /* Size of VROM */
|
||||||
@@ -92,7 +98,7 @@ int LoadCart(const char *filename, NesCart * cart)
|
|||||||
/* We don't and we will never support trainer-ed ROM */
|
/* We don't and we will never support trainer-ed ROM */
|
||||||
if (cart->Flags & iNES_TRAINER)
|
if (cart->Flags & iNES_TRAINER)
|
||||||
{
|
{
|
||||||
printf("\n"
|
console_printf(Console_Error, "\n"
|
||||||
"********************ERROR*****************\n"
|
"********************ERROR*****************\n"
|
||||||
"* This cart have an embedded trainer. *\n"
|
"* This cart have an embedded trainer. *\n"
|
||||||
"* There is NO support for them. *\n"
|
"* There is NO support for them. *\n"
|
||||||
|
|||||||
13
src/apu/CMakeLists.txt
Normal file
13
src/apu/CMakeLists.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
add_library(apu SndUnixT.c Sound.c)
|
||||||
|
#add_library(apu SndAlleg.c Sound.c)
|
||||||
@@ -2,18 +2,27 @@
|
|||||||
* Allegro Sound Driver for EMULib Sound system - The TI-NESulator Project
|
* Allegro Sound Driver for EMULib Sound system - The TI-NESulator Project
|
||||||
* SndAlleg.C
|
* SndAlleg.C
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier
|
* Created by Manoel Trapier
|
||||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-03-28 15:50:50 +0200 (mer, 28 mar 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/types.h $
|
* $HeadURL$
|
||||||
* $Revision: 25 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include <Sound.h>
|
#include <Sound.h>
|
||||||
|
|
||||||
|
/* Allegro includes */
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define USE_CONSOLE
|
||||||
|
#include <Allegro/allegro.h>
|
||||||
|
#else
|
||||||
|
#define USE_CONSOLE
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -34,7 +43,7 @@ static int MasterSwitch = (1<<SND_CHANNELS)-1;
|
|||||||
static int LoopFreq = 25;
|
static int LoopFreq = 25;
|
||||||
static int NoiseGen = 1;
|
static int NoiseGen = 1;
|
||||||
static int Suspended = 0;
|
static int Suspended = 0;
|
||||||
|
static int SoundRun = 0;
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
int Type; /* Channel type (SND_*) */
|
int Type; /* Channel type (SND_*) */
|
||||||
@@ -265,6 +274,8 @@ static void *DSPLoop(void *Arg)
|
|||||||
L2=L1+K;
|
L2=L1+K;
|
||||||
Wave[I]+= L1&0x8000?V:-V /*(L2&0x8000? V:0):(L2&0x8000? 0:-V)*/;
|
Wave[I]+= L1&0x8000?V:-V /*(L2&0x8000? V:0):(L2&0x8000? 0:-V)*/;
|
||||||
L1=L2;
|
L1=L2;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
CH[J].Count=L1;
|
CH[J].Count=L1;
|
||||||
break;
|
break;
|
||||||
@@ -314,14 +325,14 @@ int InitSound(int Rate,int Verbose)
|
|||||||
|
|
||||||
if (install_sound(DIGI_AUTODETECT, MIDI_NONE, "") != 0)
|
if (install_sound(DIGI_AUTODETECT, MIDI_NONE, "") != 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s!\n", allegro_error);
|
console_printf(Console_Error, "%s!\n", allegro_error);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
stream = play_audio_stream(SND_BUFSIZE, 8, FALSE, Rate, 255, 128);
|
stream = play_audio_stream(SND_BUFSIZE, 8, FALSE, Rate, 255, 128);
|
||||||
if (!stream) {
|
if (!stream) {
|
||||||
fprintf(stderr, "Error creating audio stream!\n");
|
console_printf(Console_Error, "Error creating audio stream!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,7 +343,7 @@ int InitSound(int Rate,int Verbose)
|
|||||||
if(!(Rate=OpenSoundDevice(Rate,Verbose))) return(0);
|
if(!(Rate=OpenSoundDevice(Rate,Verbose))) return(0);
|
||||||
|
|
||||||
/* Create DSPLoop() thread */
|
/* Create DSPLoop() thread */
|
||||||
if(Verbose) printf(" Creating thread...");
|
if(Verbose) console_printf(Console_Default, " Creating thread...");
|
||||||
if(pthread_create(&ThreadID,0,DSPLoop,0))
|
if(pthread_create(&ThreadID,0,DSPLoop,0))
|
||||||
{ if(Verbose) puts("FAILED");return(0); }
|
{ if(Verbose) puts("FAILED");return(0); }
|
||||||
|
|
||||||
@@ -340,6 +351,7 @@ int InitSound(int Rate,int Verbose)
|
|||||||
pthread_detach(ThreadID);
|
pthread_detach(ThreadID);
|
||||||
|
|
||||||
/* Done */
|
/* Done */
|
||||||
|
SoundRun = 1;
|
||||||
if(Verbose) puts("OK");
|
if(Verbose) puts("OK");
|
||||||
return(SoundRate=Rate);
|
return(SoundRate=Rate);
|
||||||
}
|
}
|
||||||
@@ -349,10 +361,13 @@ int InitSound(int Rate,int Verbose)
|
|||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
void TrashSound(void)
|
void TrashSound(void)
|
||||||
{
|
{
|
||||||
StopSound();
|
if (SoundRun == 1)
|
||||||
printf("%s: Kill thread...\n", __func__);
|
{
|
||||||
if(ThreadID) pthread_cancel(ThreadID);
|
StopSound();
|
||||||
|
console_printf(Console_Default, "%s: Kill thread...\n", __func__);
|
||||||
|
if(ThreadID) pthread_cancel(ThreadID);
|
||||||
|
}
|
||||||
|
SoundRun = 0;
|
||||||
SoundRate = 0;
|
SoundRate = 0;
|
||||||
ThreadID = 0;
|
ThreadID = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,8 +10,6 @@
|
|||||||
/** commercially. Please, notify me, if you make any **/
|
/** commercially. Please, notify me, if you make any **/
|
||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
#ifdef UNIX
|
|
||||||
|
|
||||||
#include "Sound.h"
|
#include "Sound.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -21,6 +19,8 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
#ifdef SUN_AUDIO
|
#ifdef SUN_AUDIO
|
||||||
|
|
||||||
#include <sys/audioio.h>
|
#include <sys/audioio.h>
|
||||||
@@ -106,7 +106,7 @@ static struct
|
|||||||
int Count; /* Phase counter */
|
int Count; /* Phase counter */
|
||||||
} CH[SND_CHANNELS];
|
} CH[SND_CHANNELS];
|
||||||
|
|
||||||
static void UnixSetWave(int Channel,signed char *Data,int Length,int Rate);
|
static void UnixSetWave(int Channel, signed char *Data,int Length,int Freq);
|
||||||
static void UnixSetSound(int Channel,int NewType);
|
static void UnixSetSound(int Channel,int NewType);
|
||||||
static void UnixDrum(int Type,int Force);
|
static void UnixDrum(int Type,int Force);
|
||||||
static void UnixSetChannels(int Volume,int Switch);
|
static void UnixSetChannels(int Volume,int Switch);
|
||||||
@@ -135,7 +135,7 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
|||||||
|
|
||||||
#ifdef SUN_AUDIO
|
#ifdef SUN_AUDIO
|
||||||
|
|
||||||
if(Verbose) printf(" Opening /dev/audio...");
|
if(Verbose) console_printf(Console_Default, " Opening /dev/audio...");
|
||||||
if((SoundFD=open("/dev/audio",O_WRONLY | O_NONBLOCK))==-1)
|
if((SoundFD=open("/dev/audio",O_WRONLY | O_NONBLOCK))==-1)
|
||||||
{
|
{
|
||||||
if(Verbose) puts("FAILED");
|
if(Verbose) puts("FAILED");
|
||||||
@@ -150,13 +150,13 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
|||||||
#else /* SUN_AUDIO */
|
#else /* SUN_AUDIO */
|
||||||
|
|
||||||
/* At first, we need to open /dev/dsp: */
|
/* At first, we need to open /dev/dsp: */
|
||||||
if(Verbose) printf(" Opening /dev/dsp...");
|
if(Verbose) console_printf(Console_Default, " Opening /dev/dsp...");
|
||||||
I=((SoundFD=open("/dev/dsp",O_WRONLY))<0);
|
I=((SoundFD=open("/dev/dsp",O_WRONLY))<0);
|
||||||
|
|
||||||
/* Set 8-bit sound */
|
/* Set 8-bit sound */
|
||||||
if(!I)
|
if(!I)
|
||||||
{
|
{
|
||||||
if(Verbose) printf("OK\n Setting mode: 8bit...");
|
if(Verbose) console_printf(Console_Default, "OK\n Setting mode: 8bit...");
|
||||||
J=AFMT_U8;
|
J=AFMT_U8;
|
||||||
I=(ioctl(SoundFD,SNDCTL_DSP_SETFMT,&J)<0);
|
I=(ioctl(SoundFD,SNDCTL_DSP_SETFMT,&J)<0);
|
||||||
}
|
}
|
||||||
@@ -164,7 +164,7 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
|||||||
/* Set mono sound */
|
/* Set mono sound */
|
||||||
if(!I)
|
if(!I)
|
||||||
{
|
{
|
||||||
if(Verbose) printf("mono...");
|
if(Verbose) console_printf(Console_Default, "mono...");
|
||||||
J=0;
|
J=0;
|
||||||
I=(ioctl(SoundFD,SNDCTL_DSP_STEREO,&J)<0);
|
I=(ioctl(SoundFD,SNDCTL_DSP_STEREO,&J)<0);
|
||||||
}
|
}
|
||||||
@@ -172,9 +172,9 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
|||||||
/* Set sampling rate */
|
/* Set sampling rate */
|
||||||
if(!I)
|
if(!I)
|
||||||
{
|
{
|
||||||
if(Verbose) printf("OK\n Setting sampling rate: %dHz...",Rate);
|
if(Verbose) console_printf(Console_Default, "OK\n Setting sampling rate: %dHz...",Rate);
|
||||||
I=(ioctl(SoundFD,SNDCTL_DSP_SPEED,&Rate)<0);
|
I=(ioctl(SoundFD,SNDCTL_DSP_SPEED,&Rate)<0);
|
||||||
if(Verbose) printf("(got %dHz)...",Rate);
|
if(Verbose) console_printf(Console_Default, "(got %dHz)...",Rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Here we set the number of buffers to use */
|
/* Here we set the number of buffers to use */
|
||||||
@@ -221,6 +221,9 @@ static void *DSPLoop(void *Arg)
|
|||||||
unsigned char Buf[SND_BUFSIZE];
|
unsigned char Buf[SND_BUFSIZE];
|
||||||
register int J,I,K,L,M,N,L1,L2,A1,A2,V;
|
register int J,I,K,L,M,N,L1,L2,A1,A2,V;
|
||||||
int FreqCount;
|
int FreqCount;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
L = N = A2 = 0;
|
||||||
|
|
||||||
for(J=0;J<SND_CHANNELS;J++)
|
for(J=0;J<SND_CHANNELS;J++)
|
||||||
{
|
{
|
||||||
@@ -421,7 +424,7 @@ static void *DSPLoop(void *Arg)
|
|||||||
/* We'll block here until next DMA buffer becomes free. It happens
|
/* We'll block here until next DMA buffer becomes free. It happens
|
||||||
** once per (1<<SND_BITS)/SoundRate seconds.
|
** once per (1<<SND_BITS)/SoundRate seconds.
|
||||||
*/
|
*/
|
||||||
write(SoundFD,Buf,SND_BUFSIZE);
|
ret = write(SoundFD,Buf,SND_BUFSIZE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -462,7 +465,7 @@ int InitSound(int Rate,int Verbose)
|
|||||||
if(!(Rate=OpenSoundDevice(Rate,Verbose))) return(0);
|
if(!(Rate=OpenSoundDevice(Rate,Verbose))) return(0);
|
||||||
|
|
||||||
/* Create DSPLoop() thread */
|
/* Create DSPLoop() thread */
|
||||||
if(Verbose) printf(" Creating thread...");
|
if(Verbose) console_printf(Console_Default, " Creating thread...");
|
||||||
if(pthread_create(&ThreadID,0,DSPLoop,0))
|
if(pthread_create(&ThreadID,0,DSPLoop,0))
|
||||||
{ if(Verbose) puts("FAILED");return(0); }
|
{ if(Verbose) puts("FAILED");return(0); }
|
||||||
|
|
||||||
@@ -480,9 +483,9 @@ int InitSound(int Rate,int Verbose)
|
|||||||
void TrashSound(void)
|
void TrashSound(void)
|
||||||
{
|
{
|
||||||
StopSound();
|
StopSound();
|
||||||
printf("%s: Kill thread...\n", __func__);
|
console_printf(Console_Default, "%s: Kill thread...\n", __func__);
|
||||||
if(ThreadID) pthread_cancel(ThreadID);
|
if(ThreadID) pthread_cancel(ThreadID);
|
||||||
printf("%s: close /dev/xxx ...\n", __func__);
|
console_printf(Console_Default, "%s: close /dev/xxx ...\n", __func__);
|
||||||
if(SoundFD!=-1) close(SoundFD);
|
if(SoundFD!=-1) close(SoundFD);
|
||||||
|
|
||||||
SoundRate = 0;
|
SoundRate = 0;
|
||||||
@@ -531,13 +534,13 @@ void UnixSetSound(int Channel,int NewType)
|
|||||||
/** waveform to be an instrument or set it to the waveform **/
|
/** waveform to be an instrument or set it to the waveform **/
|
||||||
/** own playback rate. **/
|
/** own playback rate. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
void UnixSetWave(int Channel,signed char *Data,int Length,int Rate)
|
void UnixSetWave(int Channel, signed char *Data, int Length, int Freq)
|
||||||
{
|
{
|
||||||
if((Channel<0)||(Channel>=SND_CHANNELS)||(Length<=0)) return;
|
if((Channel<0)||(Channel>=SND_CHANNELS)||(Length<=0)) return;
|
||||||
|
|
||||||
CH[Channel].Type = SND_WAVE;
|
CH[Channel].Type = SND_WAVE;
|
||||||
CH[Channel].Length = Length;
|
CH[Channel].Length = Length;
|
||||||
CH[Channel].Rate = Rate;
|
CH[Channel].Rate = Freq;
|
||||||
CH[Channel].Pos = 0;
|
CH[Channel].Pos = 0;
|
||||||
CH[Channel].Count = 0;
|
CH[Channel].Count = 0;
|
||||||
CH[Channel].Data = Data;
|
CH[Channel].Data = Data;
|
||||||
@@ -550,5 +553,3 @@ void UnixDrum(int Type,int Force)
|
|||||||
{
|
{
|
||||||
/* This function is currently empty */
|
/* This function is currently empty */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* UNIX */
|
|
||||||
|
|||||||
@@ -11,6 +11,13 @@
|
|||||||
/** commercially. Please, notify me, if you make any **/
|
/** commercially. Please, notify me, if you make any **/
|
||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
|
/*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*/
|
||||||
|
|
||||||
#include "Sound.h"
|
#include "Sound.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -29,7 +36,7 @@ struct SndDriverStruct SndDriver =
|
|||||||
(void (*)(int,int))0,
|
(void (*)(int,int))0,
|
||||||
(void (*)(int,int))0,
|
(void (*)(int,int))0,
|
||||||
(void (*)(int,int,int))0,
|
(void (*)(int,int,int))0,
|
||||||
(void (*)(int,const signed char *,int,int))0,
|
(void (*)(int,signed char *,int,int))0,
|
||||||
(const signed char *(*)(int))0
|
(const signed char *(*)(int))0
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -160,7 +167,7 @@ void SetChannels(int Volume,int Switch)
|
|||||||
/** waveform to be an instrument or set it to the waveform **/
|
/** waveform to be an instrument or set it to the waveform **/
|
||||||
/** own playback rate. **/
|
/** own playback rate. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
void SetWave(int Channel,const signed char *Data,int Length,int Rate)
|
void SetWave(int Channel,signed char *Data,int Length,int Rate)
|
||||||
{
|
{
|
||||||
if((Channel<0)||(Length<=0)) return;
|
if((Channel<0)||(Length<=0)) return;
|
||||||
|
|
||||||
|
|||||||
12
src/corecpu/CMakeLists.txt
Normal file
12
src/corecpu/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
add_library(corecpu corecpu.c)
|
||||||
@@ -12,10 +12,10 @@
|
|||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
/*
|
/*
|
||||||
* $LastChangedDate: 2007-05-31 18:01:41 +0200 (jeu, 31 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/Codes.h $
|
* $HeadURL$
|
||||||
* $Revision: 57 $
|
* $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
case 0x10:
|
case 0x10:
|
||||||
@@ -91,7 +91,7 @@ break; /* BVS * REL */
|
|||||||
case 0x40:
|
case 0x40:
|
||||||
|
|
||||||
M_POP(R->P);
|
M_POP(R->P);
|
||||||
R->P |= R_FLAG;
|
//R->P |= R_FLAG;
|
||||||
M_POP(R->PC.B.l);
|
M_POP(R->PC.B.l);
|
||||||
M_POP(R->PC.B.h);
|
M_POP(R->PC.B.h);
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ if ((R->IRequest != INT_NONE) && ((I ^ R->P) & ~I & I_FLAG))
|
|||||||
R->ICount = 1;
|
R->ICount = 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
R->P = I | R_FLAG | B_FLAG;
|
R->P = I /*| R_FLAG*/ | B_FLAG;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -13,10 +13,10 @@
|
|||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
/*
|
/*
|
||||||
* $LastChangedDate: 2007-04-19 18:18:57 +0200 (jeu, 19 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/Debug.c $
|
* $HeadURL$
|
||||||
* $Revision: 43 $
|
* $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "M6502.h"
|
#include "M6502.h"
|
||||||
|
|||||||
@@ -14,10 +14,10 @@
|
|||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
/*
|
/*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/M6502.c $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "M6502.h"
|
#include "M6502.h"
|
||||||
@@ -201,7 +201,7 @@ INLINE byte Op6502(register word A) { return(Page[A>>13][A&0x1FFF]); }
|
|||||||
void Reset6502(M6502 *R)
|
void Reset6502(M6502 *R)
|
||||||
{
|
{
|
||||||
R->A=R->X=R->Y=0x00;
|
R->A=R->X=R->Y=0x00;
|
||||||
R->P=Z_FLAG|R_FLAG;
|
R->P=Z_FLAG;
|
||||||
R->S=0xFF;
|
R->S=0xFF;
|
||||||
R->PC.B.l=Rd6502(0xFFFC);
|
R->PC.B.l=Rd6502(0xFFFC);
|
||||||
R->PC.B.h=Rd6502(0xFFFD);
|
R->PC.B.h=Rd6502(0xFFFD);
|
||||||
@@ -245,7 +245,7 @@ void Int6502(M6502 *R,byte Type)
|
|||||||
R->ICount-=7;
|
R->ICount-=7;
|
||||||
M_PUSH(R->PC.B.h);
|
M_PUSH(R->PC.B.h);
|
||||||
M_PUSH(R->PC.B.l);
|
M_PUSH(R->PC.B.l);
|
||||||
M_PUSH(R->P&~B_FLAG);
|
M_PUSH(R->P & ~(B_FLAG|R_FLAG));
|
||||||
R->P&=~D_FLAG;
|
R->P&=~D_FLAG;
|
||||||
if(R->IAutoReset&&(Type==R->IRequest)) R->IRequest=INT_NONE;
|
if(R->IAutoReset&&(Type==R->IRequest)) R->IRequest=INT_NONE;
|
||||||
if(Type==INT_NMI) J.W=0xFFFA; else { R->P|=I_FLAG;J.W=0xFFFE; }
|
if(Type==INT_NMI) J.W=0xFFFA; else { R->P|=I_FLAG;J.W=0xFFFE; }
|
||||||
@@ -402,6 +402,9 @@ int DAsmCAP(char *S, word A)
|
|||||||
return (B - A);
|
return (B - A);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern unsigned short ScanLine;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Run6502() ************************************************/
|
/** Run6502() ************************************************/
|
||||||
@@ -413,7 +416,7 @@ word Run6502(M6502 *R)
|
|||||||
{
|
{
|
||||||
register pair J,K;
|
register pair J,K;
|
||||||
register byte I;
|
register byte I;
|
||||||
|
byte nb_of_cycle;
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@@ -444,21 +447,16 @@ word Run6502(M6502 *R)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
I=Op6502(R->PC.W++);
|
I=Op6502(R->PC.W++);
|
||||||
R->ICount-=Cycles[I];
|
nb_of_cycle = Cycles[I];
|
||||||
|
|
||||||
//#ifdef DEBUG
|
//#ifdef DEBUG
|
||||||
// pushop(I);
|
// pushop(I);
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
icount++;
|
icount++;
|
||||||
|
|
||||||
switch(I)
|
switch(I)
|
||||||
{
|
{
|
||||||
#include "Codes.h"
|
#include "Codes.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TRACE_EXECUTION
|
#ifdef TRACE_EXECUTION
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
@@ -478,15 +476,18 @@ word Run6502(M6502 *R)
|
|||||||
|
|
||||||
printf("%c", F & 0x80 ? FA[J] : '.');
|
printf("%c", F & 0x80 ? FA[J] : '.');
|
||||||
|
|
||||||
printf("], Stack[%02x, %02x, %02x]\n",
|
printf("], Stack[%02x, %02x, %02x], %03d, %03d\n",
|
||||||
Rd6502(0x0100 + (byte) (R->S + 1)),
|
Rd6502(0x0100 + (byte) (R->S + 1)),
|
||||||
Rd6502(0x0100 + (byte) (R->S + 2)),
|
Rd6502(0x0100 + (byte) (R->S + 2)),
|
||||||
Rd6502(0x0100 + (byte) (R->S + 3)));
|
Rd6502(0x0100 + (byte) (R->S + 3)),
|
||||||
|
R->ICount,
|
||||||
|
ScanLine
|
||||||
|
);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
R->ICount-= nb_of_cycle;
|
||||||
/* If cycle counter expired... */
|
/* If cycle counter expired... */
|
||||||
if(R->ICount<=0)
|
if(R->ICount<=0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,10 +12,10 @@
|
|||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
/*
|
/*
|
||||||
* $LastChangedDate: 2007-04-23 18:55:35 +0200 (lun, 23 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/M6502.h $
|
* $HeadURL$
|
||||||
* $Revision: 45 $
|
* $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef M6502_H
|
#ifndef M6502_H
|
||||||
|
|||||||
@@ -13,10 +13,10 @@
|
|||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
/*
|
/*
|
||||||
* $LastChangedDate: 2007-05-24 15:07:13 +0200 (jeu, 24 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/Tables.h $
|
* $HeadURL$
|
||||||
* $Revision: 52 $
|
* $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static byte Cycles[256] =
|
static byte Cycles[256] =
|
||||||
|
|||||||
2255
src/corecpu/corecpu.c
Normal file
2255
src/corecpu/corecpu.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -11,6 +11,12 @@
|
|||||||
/** commercially. Please, notify me, if you make any **/
|
/** commercially. Please, notify me, if you make any **/
|
||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
|
/*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*/
|
||||||
|
|
||||||
{ -36, 8063 },{ -12, 8063 },{ -3, 8298 },{ 3, 8358 },
|
{ -36, 8063 },{ -12, 8063 },{ -3, 8298 },{ 3, 8358 },
|
||||||
{ 8, 8201 },{ 12, 8063 },{ 15, 8054 },{ 17, 8238 },
|
{ 8, 8201 },{ 12, 8063 },{ 15, 8054 },{ 17, 8238 },
|
||||||
|
|||||||
@@ -3,18 +3,19 @@
|
|||||||
* NESCart.h
|
* NESCart.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/NESCarts.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NESCARTS_H
|
#ifndef NESCARTS_H
|
||||||
#define NESCARTS_H
|
#define NESCARTS_H
|
||||||
|
|
||||||
#include "types.h"
|
#include <stdint.h>
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
#define iNES_MIRROR 0x01
|
#define iNES_MIRROR 0x01
|
||||||
#define iNES_BATTERY 0x02
|
#define iNES_BATTERY 0x02
|
||||||
@@ -23,14 +24,14 @@
|
|||||||
|
|
||||||
typedef struct NesCart_
|
typedef struct NesCart_
|
||||||
{
|
{
|
||||||
unsigned long PROMSize, /* Size of PROM */
|
uint32_t PROMSize, /* Size of PROM */
|
||||||
VROMSize; /* Size of VROM */
|
VROMSize; /* Size of VROM */
|
||||||
char MapperID; /* Mapper Type */
|
char MapperID; /* Mapper Type */
|
||||||
byte Flags;
|
uint8_t Flags;
|
||||||
char *FileName;
|
char *FileName;
|
||||||
byte *File; /* Pointer on the file in memory */
|
uint8_t *File; /* Pointer on the file in memory */
|
||||||
byte *PROMBanks; /* Pointer on the first PROM */
|
uint8_t *PROMBanks; /* Pointer on the first PROM */
|
||||||
byte *VROMBanks; /* Pointer on the first VROM */
|
uint8_t *VROMBanks; /* Pointer on the first VROM */
|
||||||
} NesCart;
|
} NesCart;
|
||||||
|
|
||||||
void DumpCartProperties();
|
void DumpCartProperties();
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
/** commercially. Please, notify me, if you make any **/
|
/** commercially. Please, notify me, if you make any **/
|
||||||
/** changes to this file. **/
|
/** changes to this file. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
|
/*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SOUND_H
|
#ifndef SOUND_H
|
||||||
#define SOUND_H
|
#define SOUND_H
|
||||||
@@ -87,7 +93,7 @@ void SetChannels(int Volume,int Switch);
|
|||||||
/** waveform to be an instrument or set it to the waveform **/
|
/** waveform to be an instrument or set it to the waveform **/
|
||||||
/** own playback rate. **/
|
/** own playback rate. **/
|
||||||
/*************************************************************/
|
/*************************************************************/
|
||||||
void SetWave(int Channel,const signed char *Data,int Length,int Rate);
|
void SetWave(int Channel,signed char *Data,int Length,int Rate);
|
||||||
|
|
||||||
/** GetWave() ************************************************/
|
/** GetWave() ************************************************/
|
||||||
/** Get current read position for the buffer set with the **/
|
/** Get current read position for the buffer set with the **/
|
||||||
@@ -123,7 +129,7 @@ int MIDILogging(int Switch);
|
|||||||
void MIDITicks(int N);
|
void MIDITicks(int N);
|
||||||
|
|
||||||
//#ifdef UNIX
|
//#ifdef UNIX
|
||||||
#define SND_CHANNELS 16 /* Number of channels */
|
#define SND_CHANNELS 4 /* Number of channels */
|
||||||
#define SND_SAMPLESIZE 256 /* Max. SetWave() sample size */
|
#define SND_SAMPLESIZE 256 /* Max. SetWave() sample size */
|
||||||
#define SND_BUFSIZE 256 /* Buffer size, <= 2^SND_BITS */
|
#define SND_BUFSIZE 256 /* Buffer size, <= 2^SND_BITS */
|
||||||
#define SND_BITS 8 /* Number of bits in a fragment */
|
#define SND_BITS 8 /* Number of bits in a fragment */
|
||||||
@@ -219,7 +225,7 @@ struct SndDriverStruct
|
|||||||
void (*Drum)(int Type,int Force);
|
void (*Drum)(int Type,int Force);
|
||||||
void (*SetChannels)(int Volume,int Switch);
|
void (*SetChannels)(int Volume,int Switch);
|
||||||
void (*Sound)(int Channel,int NewFreq,int NewVolume);
|
void (*Sound)(int Channel,int NewFreq,int NewVolume);
|
||||||
void (*SetWave)(int Channel,const signed char *Data,int Length,int Freq);
|
void (*SetWave)(int Channel,signed char *Data,int Length,int Freq);
|
||||||
const signed char *(*GetWave)(int Channel);
|
const signed char *(*GetWave)(int Channel);
|
||||||
};
|
};
|
||||||
extern struct SndDriverStruct SndDriver;
|
extern struct SndDriverStruct SndDriver;
|
||||||
|
|||||||
48
src/include/color.h
Normal file
48
src/include/color.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
* ANSI Color definitiont - The Quick6502 Project
|
||||||
|
* include/color.h
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier on 25/06/10
|
||||||
|
* Copyright 2010 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate:$
|
||||||
|
* $Author:$
|
||||||
|
* $HeadURL:$
|
||||||
|
* $Revision:$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COLOR_H
|
||||||
|
#define COLOR_H
|
||||||
|
|
||||||
|
#define ALLOW_COLORS
|
||||||
|
|
||||||
|
#ifdef ALLOW_COLORS
|
||||||
|
#define __C(c) "\x1B[" c "m"
|
||||||
|
#else
|
||||||
|
#define __C(c) ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ANSI_COLOR __C
|
||||||
|
#define FBLACK ANSI_COLOR("30")
|
||||||
|
#define FRED ANSI_COLOR("31")
|
||||||
|
#define FGREEN ANSI_COLOR("32")
|
||||||
|
#define FYELLOW ANSI_COLOR("33")
|
||||||
|
#define FBLUE ANSI_COLOR("34")
|
||||||
|
#define FMAGENTA ANSI_COLOR("35")
|
||||||
|
#define FCYAN ANSI_COLOR("36")
|
||||||
|
#define FWHITE ANSI_COLOR("37")
|
||||||
|
|
||||||
|
#define BBLACK ANSI_COLOR("40")
|
||||||
|
#define BRED ANSI_COLOR("41")
|
||||||
|
#define BGREEN ANSI_COLOR("42")
|
||||||
|
#define BYELLOW ANSI_COLOR("43")
|
||||||
|
#define BBLUE ANSI_COLOR("44")
|
||||||
|
#define BMAGENTA ANSI_COLOR("45")
|
||||||
|
#define BCYAN ANSI_COLOR("46")
|
||||||
|
#define BWHITE ANSI_COLOR("47")
|
||||||
|
|
||||||
|
#define CNORMAL ANSI_COLOR("0")
|
||||||
|
|
||||||
|
#endif /* COLOR_H */
|
||||||
|
|
||||||
170
src/include/corecpu.h
Normal file
170
src/include/corecpu.h
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/**
|
||||||
|
* CoreCPU - The Quick6502 Project
|
||||||
|
* corecpu.h
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier on 24/02/08
|
||||||
|
* Copyright 2008 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _QUICK6502_CORECPU_H_
|
||||||
|
#define _QUICK6502_CORECPU_H_
|
||||||
|
|
||||||
|
/* M6502 configuration
|
||||||
|
*
|
||||||
|
* Supported DEFINEs :
|
||||||
|
* Q6502_NO_DECIMAL Quick6502 will not support BDC arithemtic (used for NES)
|
||||||
|
* Q6502_CMOS Quick6502 will act as a CMOS 6502 (Not actually used)
|
||||||
|
* Q6502_DEBUGGER Quick6502 will be build with debugguer support. Add some KB to the binary
|
||||||
|
* and may slowdown a bit the emulation.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef Q6502_CMOS
|
||||||
|
//#warning Quick6502 CMOS support is actually desactivated, desactivate it
|
||||||
|
#undef Q6502_CMOS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Q6502_NO_DECIMAL
|
||||||
|
//#warning Quick6502 have actually no BCD support, fallback to no NO_DECIMAL
|
||||||
|
#define Q6502_NO_DECIMAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
typedef byte (*quick6502_MemoryReadFunction)(unsigned short addr);
|
||||||
|
typedef void (*quick6502_MemoryWriteFunction)(unsigned short addr, byte value);
|
||||||
|
|
||||||
|
typedef struct quick6502_cpu_
|
||||||
|
{
|
||||||
|
/* 6502 registers */
|
||||||
|
byte reg_A, reg_X, reg_Y;
|
||||||
|
byte reg_P, reg_S;
|
||||||
|
unsigned short reg_PC;
|
||||||
|
|
||||||
|
/* Read/Write memory functions */
|
||||||
|
quick6502_MemoryReadFunction memory_read;
|
||||||
|
quick6502_MemoryWriteFunction memory_write;
|
||||||
|
quick6502_MemoryReadFunction memory_page0_read;
|
||||||
|
quick6502_MemoryWriteFunction memory_page0_write;
|
||||||
|
quick6502_MemoryReadFunction memory_stack_read;
|
||||||
|
quick6502_MemoryWriteFunction memory_stack_write;
|
||||||
|
quick6502_MemoryReadFunction memory_opcode_read;
|
||||||
|
|
||||||
|
/* Timing related */
|
||||||
|
long cycle_done;
|
||||||
|
byte exit_loop;
|
||||||
|
byte int_pending;
|
||||||
|
|
||||||
|
/* Other config options */
|
||||||
|
byte running; /* This field is used to prevent cpu free if this cpu is running */
|
||||||
|
byte page_crossed;
|
||||||
|
|
||||||
|
/* TODO add support for Inst/MemAccess breakpoints */
|
||||||
|
|
||||||
|
} quick6502_cpu;
|
||||||
|
|
||||||
|
typedef struct quick6502_cpuconfig_
|
||||||
|
{
|
||||||
|
/* Read/Write memory functions */
|
||||||
|
quick6502_MemoryReadFunction memory_read;
|
||||||
|
quick6502_MemoryWriteFunction memory_write;
|
||||||
|
quick6502_MemoryReadFunction memory_page0_read;
|
||||||
|
quick6502_MemoryWriteFunction memory_page0_write;
|
||||||
|
quick6502_MemoryReadFunction memory_stack_read;
|
||||||
|
quick6502_MemoryWriteFunction memory_stack_write;
|
||||||
|
quick6502_MemoryReadFunction memory_opcode_read;
|
||||||
|
} quick6502_cpuconfig;
|
||||||
|
|
||||||
|
/*** Signal that we can send to the CPU ***/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Q6502_NO_SIGNAL = 0,
|
||||||
|
Q6502_IRQ_SIGNAL,
|
||||||
|
Q6502_NMI_SIGNAL,
|
||||||
|
Q6502_STOPLOOP_SIGNAL
|
||||||
|
} quick6502_signal;
|
||||||
|
|
||||||
|
/*** Some 6502 related definitions ***/
|
||||||
|
|
||||||
|
/*** P register flags ***/
|
||||||
|
#define Q6502_N_FLAG 0x80 /* Negavite flag */
|
||||||
|
#define Q6502_V_FLAG 0x40 /* oVerflow flag */
|
||||||
|
#define Q6502_R_FLAG 0x20 /* Not a real flag, but need to be to 1 on PHP */
|
||||||
|
#define Q6502_B_FLAG 0x10 /* Break flag */
|
||||||
|
#define Q6502_D_FLAG 0x08 /* BCD flag */
|
||||||
|
#define Q6502_I_FLAG 0x04 /* IRQ/BRK flag */
|
||||||
|
#define Q6502_Z_FLAG 0x02 /* Zero flag */
|
||||||
|
#define Q6502_C_FLAG 0x01 /* Carry flag */
|
||||||
|
|
||||||
|
/*** Interuption Vectors ***/
|
||||||
|
#define Q6502_NMI_LOW 0xFFFA
|
||||||
|
#define Q6502_NMI_HIGH 0xFFFB
|
||||||
|
#define Q6502_RESET_LOW 0xFFFC
|
||||||
|
#define Q6502_RESET_HIGH 0xFFFD
|
||||||
|
#define Q6502_IRQ_LOW 0xFFFE
|
||||||
|
#define Q6502_IRQ_HIGH 0xFFFF
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise the CPU
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
*
|
||||||
|
* - CPU Init structure:
|
||||||
|
* +- Memory Read function pointer
|
||||||
|
* +- Memory Write function pointer
|
||||||
|
* +- Fast memory read function pointer (for opcodes read)
|
||||||
|
* +- Fast page 0 function / Read/Write
|
||||||
|
* +- Fast page 1 function / Read/Write
|
||||||
|
*
|
||||||
|
* Output:
|
||||||
|
*
|
||||||
|
* (void *): An opaque pointer to the internal structure of the CPU
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
quick6502_cpu *quick6502_init(quick6502_cpuconfig *config);
|
||||||
|
|
||||||
|
/* Reset the CPU (must be done after init) */
|
||||||
|
void quick6502_reset(quick6502_cpu *cpu);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run cpu for at least X cycles
|
||||||
|
*
|
||||||
|
* Output:
|
||||||
|
*
|
||||||
|
* int: (Number of cycle really done) - (Number of cycle asked)
|
||||||
|
*/
|
||||||
|
int quick6502_run(quick6502_cpu *cpu, int cycles);
|
||||||
|
|
||||||
|
/** Loop CPU until explicit quit */
|
||||||
|
void quick6502_loop(quick6502_cpu *cpu);
|
||||||
|
|
||||||
|
/** Run CPU for one instruction */
|
||||||
|
void quick6502_exec(quick6502_cpu *cpu);
|
||||||
|
|
||||||
|
/** Send IRQ/NMI/EXITLOOP signal to CPU */
|
||||||
|
void quick6502_int(quick6502_cpu *cpu, quick6502_signal signal);
|
||||||
|
|
||||||
|
/** Dump CPU State to the given file */
|
||||||
|
void quick6502_dump(quick6502_cpu *cpu, FILE * fp);
|
||||||
|
|
||||||
|
/** Get current instruction name at specified address and put it into buffer */
|
||||||
|
#define MINE
|
||||||
|
|
||||||
|
int quick6502_getinstruction(quick6502_cpu *cpu, char interpret,
|
||||||
|
unsigned short addr, char *buffer, int *strlength);
|
||||||
|
/**
|
||||||
|
* Free the CPU
|
||||||
|
*
|
||||||
|
* This function will free the CPU only if it's not currently used, it will
|
||||||
|
* return !0 if everything goes well and 0 if the free is impossible
|
||||||
|
*/
|
||||||
|
int quick6502_free(quick6502_cpu *cpu);
|
||||||
|
|
||||||
|
#endif /* _QUICK6502_CORECPU_H_ */
|
||||||
|
|
||||||
42
src/include/log.h
Normal file
42
src/include/log.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* Log Facility - The Quick6502 Project
|
||||||
|
* include/log.h
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier on 19/05/10
|
||||||
|
* Copyright 2010 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate:$
|
||||||
|
* $Author:$
|
||||||
|
* $HeadURL:$
|
||||||
|
* $Revision:$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LOG_H
|
||||||
|
#define _LOG_H
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
LOG_ALWAYS = -1,
|
||||||
|
LOG_PANIC = 0,
|
||||||
|
LOG_ERROR,
|
||||||
|
LOG_WARNING,
|
||||||
|
LOG_NORMAL,
|
||||||
|
LOG_VERBOSE,
|
||||||
|
LOG_DEBUG,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TIME_STAMP_LOG
|
||||||
|
|
||||||
|
#define MAX_DEBUG_LEVEL LOG_PANIC
|
||||||
|
#define log(_level, _user, _fmt, ...) if ((_level <= MAX_DEBUG_LEVEL) || (_level <= LOG_PANIC)) do { log_real(_level, _user, _fmt, ##__VA_ARGS__); } while(0)
|
||||||
|
|
||||||
|
void log_real(int level, char *user, char *fmt, ...);
|
||||||
|
|
||||||
|
#define LOG(_level, _str, ...) if ((_level <= MAX_DEBUG_LEVEL) || (_level <= LOG_PANIC)) do { puts(_str); } while(0)
|
||||||
|
#define LOGCODE(_level, _user, _code) log(_level, _user, ""); \
|
||||||
|
if ((_level <= MAX_DEBUG_LEVEL) || (_level <= LOG_PANIC)) \
|
||||||
|
do { _code; printf("\n"); } while(0)
|
||||||
|
|
||||||
|
#endif /* _LOG_H */
|
||||||
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* mappers.h
|
* mappers.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate$
|
* $LastChangedDate$
|
||||||
* $Author$
|
* $Author$
|
||||||
@@ -29,6 +29,7 @@ typedef void (*MapperDump) ();
|
|||||||
|
|
||||||
#include <ppu/ppu.h>
|
#include <ppu/ppu.h>
|
||||||
#include <memory/manager.h>
|
#include <memory/manager.h>
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
extern NesCart *Cart;
|
extern NesCart *Cart;
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* 6502 Memory manager - The TI-NESulator Project
|
* 6502 Memory manager - The TI-NESulator Project
|
||||||
* memory.h - Taken from the Quick6502 project
|
* memory.h - Taken from the Quick6502 project
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 18/09/06.
|
* Created by Manoel Trapier on 18/09/06.
|
||||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-05 16:30:20 +0200 (jeu, 05 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/memory.h $
|
* $HeadURL$
|
||||||
* $Revision: 31 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifndef MEMORY_H
|
#ifndef MEMORY_H
|
||||||
@@ -63,6 +63,6 @@ void InitMemory();
|
|||||||
byte ReadMemory(byte page, byte addr);
|
byte ReadMemory(byte page, byte addr);
|
||||||
void WriteMemory(byte page, byte addr, byte value);
|
void WriteMemory(byte page, byte addr, byte value);
|
||||||
|
|
||||||
void DumpMemoryState();
|
void DumpMemoryState(FILE *fp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
45
src/include/os_dependent.h
Normal file
45
src/include/os_dependent.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* OS Dependent functions - The TI-NESulator Project
|
||||||
|
* os_dependent.h
|
||||||
|
*
|
||||||
|
* Created by Manoel TRAPIER on 08/05/08.
|
||||||
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_DEPENDENT_H
|
||||||
|
#define OS_DEPENDENT_H
|
||||||
|
|
||||||
|
/* File related functions */
|
||||||
|
/* Graphics related functions */
|
||||||
|
int graphics_init();
|
||||||
|
int graphics_drawpixel(long x, long y, long color);
|
||||||
|
int graphics_blit(long x, long y, long w, long h);
|
||||||
|
|
||||||
|
/* Sound related functions */
|
||||||
|
|
||||||
|
/* IO functions */
|
||||||
|
void *LoadFilePtr(char * filename);
|
||||||
|
|
||||||
|
/* Console functions */
|
||||||
|
typedef enum ConsoleLevel_t
|
||||||
|
{
|
||||||
|
Console_Error = 0,
|
||||||
|
Console_Warning,
|
||||||
|
Console_Alert,
|
||||||
|
Console_Default,
|
||||||
|
Console_Verbose,
|
||||||
|
Console_Debug,
|
||||||
|
} ConsoleLevel;
|
||||||
|
|
||||||
|
|
||||||
|
int console_init(ConsoleLevel DefaultLevel);
|
||||||
|
int console_printf(const ConsoleLevel level, const char *format, ...);
|
||||||
|
int console_printf_d(const char *format, ...);
|
||||||
|
|
||||||
|
#endif /* OS_DEPENDENT_H */
|
||||||
@@ -3,12 +3,12 @@
|
|||||||
* paddle.h
|
* paddle.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/paddle.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
/* Generated data file from file 'stdin' */
|
/* Generated data file from file 'stdin' */
|
||||||
|
/*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*/
|
||||||
|
|
||||||
PALETTE basicPalette = {
|
PALETTE basicPalette = {
|
||||||
{ 0x1E, 0x1E, 0x1E, 0x07 },
|
{ 0x1E, 0x1E, 0x1E, 0x07 },
|
||||||
@@ -257,5 +262,5 @@ PALETTE basicPalette = {
|
|||||||
{ 0x29, 0x3C, 0x3C, 0x08 },
|
{ 0x29, 0x3C, 0x3C, 0x08 },
|
||||||
{ 0x32, 0x31, 0x32, 0xB7 },
|
{ 0x32, 0x31, 0x32, 0xB7 },
|
||||||
{ 0x01, 0x01, 0x01, 0x08 },
|
{ 0x01, 0x01, 0x01, 0x08 },
|
||||||
{ 0x01, 0x01, 0x01, 0xBF }
|
{ 0x01, 0x01, 0x01, 0xBF },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* plugins.h
|
* plugins.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER on 02/04/07.
|
* Created by Manoel TRAPIER on 02/04/07.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate$
|
* $LastChangedDate$
|
||||||
* $Author$
|
* $Author$
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* PPU debug utilities - The TI-NESulator Project
|
* PPU debug utilities - The TI-NESulator Project
|
||||||
* ppu.debug.h
|
* ppu.debug.h
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 12/04/07.
|
* Created by Manoel Trapier on 12/04/07.
|
||||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu/ppu.debug.h $
|
* $HeadURL$
|
||||||
* $Revision: 53 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-26 18:47:34 +0200 (jeu, 26 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.h $
|
* $HeadURL$
|
||||||
* $Revision: 46 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* PPU Memory manager - The TI-NESulator Project
|
* PPU Memory manager - The TI-NESulator Project
|
||||||
* ppu.memory.h - Inspired from the memory manager of the Quick6502 Project.
|
* ppu.memory.h - Inspired from the memory manager of the Quick6502 Project.
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 12/04/07.
|
* Created by Manoel Trapier on 12/04/07.
|
||||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu/ppu.memory.h $
|
* $HeadURL$
|
||||||
* $Revision: 53 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -27,6 +27,8 @@ void ppu_memoryDumpState(FILE *fp);
|
|||||||
byte ppu_readMemory(byte page, byte addr);
|
byte ppu_readMemory(byte page, byte addr);
|
||||||
void ppu_writeMemory(byte page, byte addr, byte value);
|
void ppu_writeMemory(byte page, byte addr, byte value);
|
||||||
|
|
||||||
|
void ppu_setPageGhost(byte page, bool value, byte ghost);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error Must only be included inside the PPU code
|
#error Must only be included inside the PPU code
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* Base type definitions - The TI-NESulator Project
|
* Base type definitions - The TI-NESulator Project
|
||||||
* types.h - Taken from the Quick6502 project
|
* types.h - Taken from the Quick6502 project
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 18/09/06.
|
* Created by Manoel Trapier on 18/09/06.
|
||||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-03-28 15:50:50 +0200 (mer, 28 mar 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/types.h $
|
* $HeadURL$
|
||||||
* $Revision: 25 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
125
src/log.c
Normal file
125
src/log.c
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
/**
|
||||||
|
* Log Facility - The Quick6502 Project
|
||||||
|
* log.c
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier on 19/05/10
|
||||||
|
* Copyright 2010 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate:$
|
||||||
|
* $Author:$
|
||||||
|
* $HeadURL:$
|
||||||
|
* $Revision:$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <color.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <log.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#ifdef TIME_STAMP_LOG
|
||||||
|
void time_stamp_line(void)
|
||||||
|
{
|
||||||
|
/* Time "0" will be thefirst log line */
|
||||||
|
static char firstRun = 1;
|
||||||
|
static struct timeval firstTime;
|
||||||
|
struct timeval curTime;
|
||||||
|
|
||||||
|
int cMin, cSec;
|
||||||
|
long long cMSec;
|
||||||
|
|
||||||
|
/* Get datetime */
|
||||||
|
gettimeofday(&curTime, NULL);
|
||||||
|
|
||||||
|
if (firstRun == 1)
|
||||||
|
{
|
||||||
|
firstRun = 0;
|
||||||
|
firstTime.tv_sec = curTime.tv_sec;
|
||||||
|
firstTime.tv_usec = curTime.tv_usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
cMSec = ((curTime.tv_sec - firstTime.tv_sec)* 1000) + (curTime.tv_usec - firstTime.tv_usec)/1000;
|
||||||
|
cSec = (cMSec/1000);
|
||||||
|
cMSec %= 1000;
|
||||||
|
|
||||||
|
cMin = cSec / 60;
|
||||||
|
|
||||||
|
cSec %= 60;
|
||||||
|
|
||||||
|
/* Put cursor at start of line */
|
||||||
|
printf("%c[s", 0x1B);
|
||||||
|
printf("%c[7000D", 0x1B);
|
||||||
|
printf("%c[1C", 0x1B);
|
||||||
|
printf(FWHITE"[" FYELLOW "%03d" FRED "." FBLUE "%02d" FRED "." FGREEN "%03lld" FWHITE "]" CNORMAL, cMin, cSec, cMSec);
|
||||||
|
printf("%c[u", 0x1B);
|
||||||
|
}
|
||||||
|
#endif /* TIME_STAMP_LOG */
|
||||||
|
|
||||||
|
void log_real(int level, char *user, char *fmt, ...)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
va_list va;
|
||||||
|
|
||||||
|
/* The LOG_PANIC must always be displayed */
|
||||||
|
if ((level <= MAX_DEBUG_LEVEL) || (level <= LOG_PANIC))
|
||||||
|
{
|
||||||
|
switch(level)
|
||||||
|
{
|
||||||
|
case LOG_PANIC: printf(BRED FWHITE); break;
|
||||||
|
case LOG_ERROR: printf(FRED); break;
|
||||||
|
case LOG_WARNING: printf(FYELLOW); break;
|
||||||
|
default:
|
||||||
|
case LOG_NORMAL: printf(FGREEN); break;
|
||||||
|
case LOG_VERBOSE: printf(FCYAN); break;
|
||||||
|
case LOG_DEBUG: printf(BBLUE FWHITE); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TIME_STAMP_LOG
|
||||||
|
printf(" ");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (user != NULL)
|
||||||
|
{
|
||||||
|
i = strlen(user);
|
||||||
|
if (i < 12)
|
||||||
|
{
|
||||||
|
i = 12 - i;
|
||||||
|
for (; i >= 0; i--)
|
||||||
|
putchar(' ');
|
||||||
|
}
|
||||||
|
printf("%s", user);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch(level)
|
||||||
|
{
|
||||||
|
case LOG_PANIC: printf(" PANIC"); break;
|
||||||
|
case LOG_ERROR: printf(" Error"); break;
|
||||||
|
case LOG_WARNING: printf(" Warning"); break;
|
||||||
|
default:
|
||||||
|
case LOG_NORMAL: printf(" Info"); break;
|
||||||
|
case LOG_VERBOSE: printf(" Verbose"); break;
|
||||||
|
case LOG_DEBUG: printf(" Debug"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(CNORMAL ": ");
|
||||||
|
|
||||||
|
#ifdef TIME_STAMP_LOG
|
||||||
|
time_stamp_line();
|
||||||
|
#endif /* TIME_STAMP_LOG */
|
||||||
|
|
||||||
|
va_start(va, fmt);
|
||||||
|
vprintf(fmt, va);
|
||||||
|
va_end(va);
|
||||||
|
|
||||||
|
if (fmt[0] != 0)
|
||||||
|
{
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1333
src/main.c
1333
src/main.c
File diff suppressed because it is too large
Load Diff
13
src/mappersmanager/CMakeLists.txt
Normal file
13
src/mappersmanager/CMakeLists.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
file(GLOB mappers_list mappers/*.c)
|
||||||
|
add_library(mappermanager utils.c manager.c ${mappers_list} )
|
||||||
@@ -1,9 +1,14 @@
|
|||||||
/*
|
/*
|
||||||
|
* Mapper manager - The TI-NESulator Project
|
||||||
* manager.c
|
* manager.c
|
||||||
* TI-NESulator.X
|
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 07/10/07.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright 2007 986 Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -12,6 +17,8 @@
|
|||||||
|
|
||||||
#include <mappers/manager.h>
|
#include <mappers/manager.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
MapperIRQ mapper_irqloop;
|
MapperIRQ mapper_irqloop;
|
||||||
MapperDump mapper_dump;
|
MapperDump mapper_dump;
|
||||||
MapperWriteHook mapper_hook;
|
MapperWriteHook mapper_hook;
|
||||||
@@ -32,10 +39,10 @@ typedef struct Mapper_
|
|||||||
void mapper_list ()
|
void mapper_list ()
|
||||||
{
|
{
|
||||||
Mapper *ptr = &(Mappers[0]);
|
Mapper *ptr = &(Mappers[0]);
|
||||||
printf("Available mapers:\n");
|
console_printf(Console_Default, "Available mapers:\n");
|
||||||
while(ptr->name != NULL)
|
while(ptr->name != NULL)
|
||||||
{
|
{
|
||||||
printf("%d - %s\n", ptr->id, ptr->name);
|
console_printf(Console_Default, "%d - %s\n", ptr->id, ptr->name);
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -43,13 +50,14 @@ void mapper_list ()
|
|||||||
int mapper_init (NesCart *cart)
|
int mapper_init (NesCart *cart)
|
||||||
{
|
{
|
||||||
Mapper *ptr = &(Mappers[0]);
|
Mapper *ptr = &(Mappers[0]);
|
||||||
printf ("Search for a compatible mapper ID #%X:\n", cart->MapperID);
|
console_printf (Console_Default, "Search for a compatible mapper ID #%d:\n", cart->MapperID);
|
||||||
while (ptr->name != NULL)
|
while (ptr->name != NULL)
|
||||||
{
|
{
|
||||||
if (ptr->id == cart->MapperID)
|
if (ptr->id == cart->MapperID)
|
||||||
{
|
{
|
||||||
printf ("Found mapper ID #%X - '%s'\n", ptr->id, ptr->name);
|
console_printf (Console_Default, "Found mapper ID #%d - '%s'\n", ptr->id, ptr->name);
|
||||||
ptr->init (cart);
|
if (ptr->init)
|
||||||
|
ptr->init (cart);
|
||||||
|
|
||||||
mapper_irqloop = ptr->irq;
|
mapper_irqloop = ptr->irq;
|
||||||
mapper_dump = ptr->dump;
|
mapper_dump = ptr->dump;
|
||||||
@@ -58,5 +66,6 @@ int mapper_init (NesCart *cart)
|
|||||||
}
|
}
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
|
console_printf (Console_Default, "No compatible mapper found!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -3,12 +3,12 @@
|
|||||||
* aorom.c
|
* aorom.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-26 18:47:34 +0200 (jeu, 26 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/aorom.h $
|
* $HeadURL$
|
||||||
* $Revision: 46 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ void aorom_MapperWriteHook(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
aorom_load_bank = BankNb;
|
aorom_load_bank = BankNb;
|
||||||
|
|
||||||
//printf("aorom: Asking bank %d (giving %d & %d) - mirror is %d\n",BankNb,BankNb,(Value<<1)+1,Value&0x0F);
|
console_printf(Console_Default, "aorom: Asking bank %d - NT is 0x%04X\n",BankNb,(Value&0x10)?0x2400:0x2000);
|
||||||
set_prom_bank_32k(0x8000,BankNb);
|
set_prom_bank_32k(0x8000,BankNb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* aorom.h
|
* aorom.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-26 18:47:34 +0200 (jeu, 26 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/aorom.h $
|
* $HeadURL$
|
||||||
* $Revision: 46 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* cnrom.c
|
* cnrom.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/cnrom.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* cnrom.h
|
* cnrom.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/cnrom.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* genericmapper.h
|
* genericmapper.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/genericmapper.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -3,12 +3,12 @@
|
|||||||
* iremh3001.c
|
* iremh3001.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/iremh3001.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -45,29 +45,29 @@ int iremh3001_InitMapper(NesCart * cart)
|
|||||||
|
|
||||||
int iremh3001_MapperWriteHook(register byte Addr, register byte Value)
|
int iremh3001_MapperWriteHook(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
switch(Addr)
|
switch(Addr)
|
||||||
{
|
{
|
||||||
case 0x8000: /* Set 8k PROM @ 8000 */
|
case 0x8000: /* Set 8k PROM @ 8000 */
|
||||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||||
set_prom_bank_8k(0x8000, Value);
|
set_prom_bank_8k(0x8000, Value);
|
||||||
iremh3001_prom_slot[0] = Value;
|
iremh3001_prom_slot[0] = Value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x9003: /* Mirroring ??? */
|
case 0x9003: /* Mirroring ??? */
|
||||||
printf("iremh3001: Mirroring[0x%X:%d] ?\n", Value, Value);
|
console_printf(Console_Default, "iremh3001: Mirroring[0x%X:%d] ?\n", Value, Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x9005: /* IRQ ??? */
|
case 0x9005: /* IRQ ??? */
|
||||||
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
console_printf(Console_Default, "iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x9006: /* IRQ ??? */
|
case 0x9006: /* IRQ ??? */
|
||||||
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
console_printf(Console_Default, "iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xA000: /* Set 8k PROM @ A000 */
|
case 0xA000: /* Set 8k PROM @ A000 */
|
||||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||||
set_prom_bank_8k(0xA000, Value);
|
set_prom_bank_8k(0xA000, Value);
|
||||||
iremh3001_prom_slot[1] = Value;
|
iremh3001_prom_slot[1] = Value;
|
||||||
break;
|
break;
|
||||||
@@ -80,23 +80,23 @@ int iremh3001_MapperWriteHook(register byte Addr, register byte Value)
|
|||||||
case 0xB005: /* Set 1k VROM @ 1400 */
|
case 0xB005: /* Set 1k VROM @ 1400 */
|
||||||
case 0xB006: /* Set 1k VROM @ 1800 */
|
case 0xB006: /* Set 1k VROM @ 1800 */
|
||||||
case 0xB007: /* Set 1k VROM @ 1C00 */
|
case 0xB007: /* Set 1k VROM @ 1C00 */
|
||||||
printf("iremh3001: %X: change VROM to %d[%X]\n", (Addr&0x0F)<<10, Value, Value);
|
console_printf(Console_Default, "iremh3001: %X: change VROM to %d[%X]\n", (Addr&0x0F)<<10, Value, Value);
|
||||||
set_vrom_bank_1k((Addr&0xF)<<10, Value);
|
set_vrom_bank_1k((Addr&0xF)<<10, Value);
|
||||||
iremh3001_vrom_slot[Addr&0x0F] = Value;
|
iremh3001_vrom_slot[Addr&0x0F] = Value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xC000: /* Set 8k PROM @ C000 */
|
case 0xC000: /* Set 8k PROM @ C000 */
|
||||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||||
set_prom_bank_8k(0xC000, Value);
|
set_prom_bank_8k(0xC000, Value);
|
||||||
iremh3001_prom_slot[2] = Value;
|
iremh3001_prom_slot[2] = Value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("@:%X -- V:%X", Addr, Value);
|
console_printf(Console_Default, "@:%X -- V:%X", Addr, Value);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ void iremh3001_MapperDump(FILE *fp)
|
|||||||
iremh3001_vrom_slot[4],
|
iremh3001_vrom_slot[4],
|
||||||
iremh3001_vrom_slot[5],
|
iremh3001_vrom_slot[5],
|
||||||
iremh3001_vrom_slot[6],
|
iremh3001_vrom_slot[6],
|
||||||
iremh3001_prom_slot[7]);
|
iremh3001_vrom_slot[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* iremh3001.h
|
* iremh3001.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/iremh3001.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,26 +3,26 @@
|
|||||||
* mmc1.h
|
* mmc1.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc1.h $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "norom.h"
|
#include "mmc1.h"
|
||||||
|
|
||||||
unsigned char MMC1_reg0;
|
uint8_t MMC1_reg0;
|
||||||
|
|
||||||
unsigned char MMC1_reg1;
|
uint8_t MMC1_reg1;
|
||||||
|
|
||||||
unsigned char MMC1_reg2;
|
uint8_t MMC1_reg2;
|
||||||
|
|
||||||
unsigned char MMC1_reg3;
|
uint8_t MMC1_reg3;
|
||||||
|
|
||||||
unsigned char mmc1_CurrentBank;
|
uint8_t mmc1_CurrentBank;
|
||||||
|
|
||||||
#define MMC1_R0_MIRROR 0x01
|
#define MMC1_R0_MIRROR 0x01
|
||||||
#define MMC1_R0_ONESCREEN 0x02
|
#define MMC1_R0_ONESCREEN 0x02
|
||||||
@@ -135,11 +135,11 @@ Reg 0
|
|||||||
void mmc1_ApplyReg0Mod()
|
void mmc1_ApplyReg0Mod()
|
||||||
{
|
{
|
||||||
|
|
||||||
static unsigned char OldSwitchArea = MMC1_R0_PRGAREA;
|
static uint8_t OldSwitchArea = MMC1_R0_PRGAREA;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//printf("Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
|
//console_printf(Console_Default, "Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
|
||||||
|
|
||||||
switch (MMC1_reg0 & 0x03)
|
switch (MMC1_reg0 & 0x03)
|
||||||
{
|
{
|
||||||
@@ -182,16 +182,16 @@ void mmc1_ApplyReg0Mod()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int VROMBankNb;
|
uint32_t VROMBankNb;
|
||||||
unsigned char Bit = 0;
|
uint8_t Bit = 0;
|
||||||
unsigned char BitBuf = 0;
|
uint8_t BitBuf = 0;
|
||||||
|
|
||||||
void mmc1_MapperWriteReg0(register byte Addr, register byte Value)
|
void mmc1_MapperWriteReg0(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg0 = MMC1_REG0_DEFAULT;
|
MMC1_reg0 = MMC1_REG0_DEFAULT;
|
||||||
printf("MMC1: Reg0 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg0 Reset occured !\n");
|
||||||
mmc1_ApplyReg0Mod();
|
mmc1_ApplyReg0Mod();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -218,7 +218,7 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
|||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg1 = MMC1_REG1_DEFAULT;
|
MMC1_reg1 = MMC1_REG1_DEFAULT;
|
||||||
printf("MMC1: Reg1 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg1 Reset occured !\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -238,18 +238,18 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
if (Cart->VROMSize == 0)
|
if (Cart->VROMSize == 0)
|
||||||
{
|
{
|
||||||
printf("Try to change VROM but with didn't have any VROM ! [%04X]\n", VROMBankNb);
|
console_printf(Console_Default, "Try to change VROM but with didn't have any VROM ! [%04X]\n", VROMBankNb);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||||
{ /* 4K vram */
|
{ /* 4K vram */
|
||||||
//printf("Switching VROM at 0x0000 to 4k bank %d\n", VROMBankNb);
|
//console_printf(Console_Default, "Switching VROM at 0x0000 to 4k bank %d\n", VROMBankNb);
|
||||||
set_vrom_bank_4k(0x0000,VROMBankNb);
|
set_vrom_bank_4k(0x0000,VROMBankNb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* 8K vram */
|
{ /* 8K vram */
|
||||||
//printf("Switching VROM at 0x0000 to 8k bank %d\n", VROMBankNb>>1);
|
//console_printf(Console_Default, "Switching VROM at 0x0000 to 8k bank %d\n", VROMBankNb>>1);
|
||||||
set_vrom_bank_8k(0x0000,VROMBankNb>>1);
|
set_vrom_bank_8k(0x0000,VROMBankNb>>1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,7 +261,7 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
|||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg2 = MMC1_REG2_DEFAULT;
|
MMC1_reg2 = MMC1_REG2_DEFAULT;
|
||||||
printf("MMC1: Reg2 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg2 Reset occured !\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -279,21 +279,21 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
VROMBankNb = (MMC1_reg2 /* & MMC1_R2_VROMB2 */ );
|
VROMBankNb = (MMC1_reg2 /* & MMC1_R2_VROMB2 */ );
|
||||||
|
|
||||||
//printf("Want to switch VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
//console_printf(Console_Default, "Want to switch VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
||||||
if (Cart->VROMSize == 0)
|
if (Cart->VROMSize == 0)
|
||||||
{
|
{
|
||||||
//printf(": No\n");
|
//console_printf(Console_Default, ": No\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||||
{ /* 4K vram */
|
{ /* 4K vram */
|
||||||
//printf("Switching VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
//console_printf(Console_Default, "Switching VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
||||||
set_vrom_bank_4k(0x1000,VROMBankNb);
|
set_vrom_bank_4k(0x1000,VROMBankNb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* 8K vram */
|
{ /* 8K vram */
|
||||||
// printf("Switching VROM at 0x1000 to 8k bank %d\n", VROMBankNb>>1);
|
// console_printf(Console_Default, "Switching VROM at 0x1000 to 8k bank %d\n", VROMBankNb>>1);
|
||||||
// set_vrom_bank_8k(0x1000,VROMBankNb>>1);
|
// set_vrom_bank_8k(0x1000,VROMBankNb>>1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,7 +305,7 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
|||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg3 = MMC1_REG3_DEFAULT;
|
MMC1_reg3 = MMC1_REG3_DEFAULT;
|
||||||
printf("MMC1: Reg3 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg3 Reset occured !\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -321,7 +321,7 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
MMC1_reg3 = BitBuf;
|
MMC1_reg3 = BitBuf;
|
||||||
|
|
||||||
if (MMC1_reg3<<14 > Cart->PROMSize)
|
if ( ((uint32_t)MMC1_reg3 << 14) > Cart->PROMSize)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( (MMC1_reg0 & MMC1_R0_PRGSIZE) != 0 )
|
if ( (MMC1_reg0 & MMC1_R0_PRGSIZE) != 0 )
|
||||||
@@ -329,12 +329,12 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
|||||||
if ( (MMC1_reg0 & MMC1_R0_PRGAREA) != 0 )
|
if ( (MMC1_reg0 & MMC1_R0_PRGAREA) != 0 )
|
||||||
{ /* 0x8000 switch */
|
{ /* 0x8000 switch */
|
||||||
set_prom_bank_16k(0x8000,MMC1_reg3);
|
set_prom_bank_16k(0x8000,MMC1_reg3);
|
||||||
//printf("LowBank is now %d ( 0x%p )\n", MMC1_reg3, mLBank);
|
//console_printf(Console_Default, "LowBank is now %d ( 0x%p )\n", MMC1_reg3, mLBank);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* 0xC000 switch */
|
{ /* 0xC000 switch */
|
||||||
set_prom_bank_16k(0xC000,MMC1_reg3);
|
set_prom_bank_16k(0xC000,MMC1_reg3);
|
||||||
//printf("HighBank is now %d ( 0x%p )\n", MMC1_reg3, mUBank);
|
//console_printf(Console_Default, "HighBank is now %d ( 0x%p )\n", MMC1_reg3, mUBank);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -354,4 +354,4 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("MMC1: Debug (Reg:%d,Val:0x%02X,reg0:0x%02X,reg1:0x%02X,reg2:0x%02X,reg3:0x%02X)\n", MMC1_GetReg(Addr), Value, MMC1_reg0, MMC1_reg1, MMC1_reg2, MMC1_reg3);
|
//console_printf(Console_Default, "MMC1: Debug (Reg:%d,Val:0x%02X,reg0:0x%02X,reg1:0x%02X,reg2:0x%02X,reg3:0x%02X)\n", MMC1_GetReg(Addr), Value, MMC1_reg0, MMC1_reg1, MMC1_reg2, MMC1_reg3);
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* mmc1.h
|
* mmc1.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc1.h $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,15 +3,14 @@
|
|||||||
* mmc3.h
|
* mmc3.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc3.h $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mmc3.h"
|
#include "mmc3.h"
|
||||||
|
|
||||||
extern unsigned short ScanLine;
|
extern unsigned short ScanLine;
|
||||||
@@ -58,7 +57,7 @@ int mmc3_InitMapper(NesCart * cart)
|
|||||||
mmc3_command = -1;
|
mmc3_command = -1;
|
||||||
|
|
||||||
mmc3_irq_counter = -1;
|
mmc3_irq_counter = -1;
|
||||||
mmc3_irq_enable = 1;
|
mmc3_irq_enable = 0;
|
||||||
mmc3_irq_counter_reload = 0;
|
mmc3_irq_counter_reload = 0;
|
||||||
|
|
||||||
mmc3_use_xor = 0x42;
|
mmc3_use_xor = 0x42;
|
||||||
@@ -96,7 +95,7 @@ int mmc3_InitMapper(NesCart * cart)
|
|||||||
|
|
||||||
void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
||||||
{
|
{
|
||||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
//console_printf(Console_Default, "%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||||
if (addr > 0x01)
|
if (addr > 0x01)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -133,7 +132,7 @@ void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
|||||||
{
|
{
|
||||||
if (!(Value & 0x40))
|
if (!(Value & 0x40))
|
||||||
{
|
{
|
||||||
printf("MMC3: Switch -> 8/A\n");
|
console_printf(Console_Default, "MMC3: Switch -> 8/A\n");
|
||||||
mmc3_first_prom_page = 0x8000;
|
mmc3_first_prom_page = 0x8000;
|
||||||
mmc3_second_prom_page = 0xA000;
|
mmc3_second_prom_page = 0xA000;
|
||||||
|
|
||||||
@@ -146,7 +145,7 @@ void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("MMC3: Switch -> C/A\n");
|
console_printf(Console_Default, "MMC3: Switch -> C/A\n");
|
||||||
mmc3_first_prom_page = 0xC000;
|
mmc3_first_prom_page = 0xC000;
|
||||||
mmc3_second_prom_page = 0xA000;
|
mmc3_second_prom_page = 0xA000;
|
||||||
|
|
||||||
@@ -158,9 +157,9 @@ void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
|||||||
|
|
||||||
//prg_bank(max_prg-1,prg1,prg0,max_prg);
|
//prg_bank(max_prg-1,prg1,prg0,max_prg);
|
||||||
}
|
}
|
||||||
mmc3_last_prom_switch = (Value & 0x40);
|
mmc3_last_prom_switch = (Value & 0x40);
|
||||||
}
|
}
|
||||||
mmc3_command = Value & 0x07;
|
mmc3_command = Value & 0x07;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -224,13 +223,13 @@ void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
|||||||
|
|
||||||
void mmc3_MapperWriteA0Hook(byte addr, byte Value)
|
void mmc3_MapperWriteA0Hook(byte addr, byte Value)
|
||||||
{
|
{
|
||||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
//console_printf(Console_Default, "%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||||
if (addr > 0x01)
|
if (addr > 0x01)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!addr)
|
if (!addr)
|
||||||
{
|
{
|
||||||
//printf("MMC3: Select mirroring (0xA000) : 0x%X\n",Value);
|
//console_printf(Console_Default, "MMC3: Select mirroring (0xA000) : 0x%X\n",Value);
|
||||||
|
|
||||||
if (Value & 0x1)
|
if (Value & 0x1)
|
||||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||||
@@ -240,7 +239,7 @@ void mmc3_MapperWriteA0Hook(byte addr, byte Value)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//printf("MMC3: SaveRAM Toggle (0xA001) : 0x%X\n",Value);
|
//console_printf(Console_Default, "MMC3: SaveRAM Toggle (0xA001) : 0x%X\n",Value);
|
||||||
if (Value)
|
if (Value)
|
||||||
map_sram();
|
map_sram();
|
||||||
else
|
else
|
||||||
@@ -251,7 +250,7 @@ void mmc3_MapperWriteA0Hook(byte addr, byte Value)
|
|||||||
|
|
||||||
void mmc3_MapperWriteC0Hook(byte addr, byte Value)
|
void mmc3_MapperWriteC0Hook(byte addr, byte Value)
|
||||||
{
|
{
|
||||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
//console_printf(Console_Default, "%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||||
if (addr > 0x01)
|
if (addr > 0x01)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -259,33 +258,33 @@ void mmc3_MapperWriteC0Hook(byte addr, byte Value)
|
|||||||
{
|
{
|
||||||
mmc3_irq_counter_reload = Value;
|
mmc3_irq_counter_reload = Value;
|
||||||
mmc3_irq_counter = Value;
|
mmc3_irq_counter = Value;
|
||||||
//printf("MMC3 IRQ[%d]: SetIRQ reload to %d\n", ScanLine, Value);
|
//console_printf(Console_Default, "MMC3 IRQ[%d]: SetIRQ reload to %d\n", ScanLine, Value);
|
||||||
|
|
||||||
}else{ /* C001 */
|
}else{ /* C001 */
|
||||||
//printf("MMC3: New tmp IRQ value (0xC001) : 0x%X\n",Value);
|
//console_printf(Console_Default, "MMC3: New tmp IRQ value (0xC001) : 0x%X\n",Value);
|
||||||
//printf("MMC3 IRQ[%d]: Reset IRQ counter to val %d [Value = %d]\n", ScanLine, mmc3_irq_counter_reload, Value);
|
//console_printf(Console_Default, "MMC3 IRQ[%d]: Reset IRQ counter to val %d [Value = %d]\n", ScanLine, mmc3_irq_counter_reload, Value);
|
||||||
mmc3_irq_counter = Value;
|
mmc3_irq_counter = Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mmc3_MapperWriteE0Hook(byte addr, byte Value)
|
void mmc3_MapperWriteE0Hook(byte addr, byte Value)
|
||||||
{
|
{
|
||||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
//console_printf(Console_Default, "%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||||
if (addr > 0x01)
|
if (addr > 0x01)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!addr)
|
if (!addr)
|
||||||
{
|
{
|
||||||
//printf("MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
//console_printf(Console_Default, "MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||||
//printf("MMC3 IRQ[%d]: IRQ disabled\n", ScanLine);
|
//console_printf(Console_Default, "MMC3 IRQ[%d]: IRQ disabled\n", ScanLine);
|
||||||
mmc3_irq_enable = 0;
|
mmc3_irq_enable = 0;
|
||||||
//MapperWantIRQ = 1;
|
//MapperWantIRQ = 1;
|
||||||
// Add a way to raise an IRQ
|
// Add a way to raise an IRQ
|
||||||
|
|
||||||
}else{ /* E001 */
|
}else{ /* E001 */
|
||||||
//printf("MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
//console_printf(Console_Default, "MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||||
//printf("MMC3: IRQ Enabled (value : %d)\n",mmc3_irq_counter);
|
//console_printf(Console_Default, "MMC3: IRQ Enabled (value : %d)\n",mmc3_irq_counter);
|
||||||
//printf("MMC3 IRQ[%d]: Enable IRQ\nr", ScanLine);
|
//console_printf(Console_Default, "MMC3 IRQ[%d]: Enable IRQ\nr", ScanLine);
|
||||||
mmc3_irq_enable = 1;
|
mmc3_irq_enable = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -306,7 +305,7 @@ int mmc3_MapperIRQ(int cycledone)
|
|||||||
|
|
||||||
mmc3_irq_enable = 0;
|
mmc3_irq_enable = 0;
|
||||||
|
|
||||||
//printf("MMC3 IRQ[%d]: Tick next at %d\n", ScanLine, mmc3_irq_counter_reload);
|
//console_printf(Console_Default, "MMC3 IRQ[%d]: Tick next at %d\n", ScanLine, mmc3_irq_counter_reload);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* mmc3.h
|
* mmc3.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc3.h $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* mmc4.h
|
* mmc4.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2007 986Corp. All rights reserved.
|
* Copyright (c) 2007-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-31 18:00:41 +0200 (jeu, 31 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc4.h $
|
* $HeadURL$
|
||||||
* $Revision: 56 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -22,16 +22,16 @@ byte mmc4_RegE;
|
|||||||
byte mmc4_RegF;
|
byte mmc4_RegF;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define LOG
|
#define LOG(s) printf s
|
||||||
//printf
|
|
||||||
#else
|
#else
|
||||||
#define LOG
|
#define LOG(s) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* MAPPER WARNING: This mapper need to attach to the PPU memory... Need more work on this parts.. */
|
||||||
|
|
||||||
void mmc4_MapperWriteRegA(register byte Addr, register byte Value)
|
void mmc4_MapperWriteRegA(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
|
||||||
mmc4_RegA = Value;
|
mmc4_RegA = Value;
|
||||||
|
|
||||||
set_prom_bank_16k(0x8000, Value & 0x0F);
|
set_prom_bank_16k(0x8000, Value & 0x0F);
|
||||||
@@ -40,7 +40,7 @@ void mmc4_MapperWriteRegA(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
void mmc4_MapperWriteRegB(register byte Addr, register byte Value)
|
void mmc4_MapperWriteRegB(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
|
||||||
mmc4_RegB = Value;
|
mmc4_RegB = Value;
|
||||||
|
|
||||||
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
||||||
@@ -48,28 +48,28 @@ void mmc4_MapperWriteRegB(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
void mmc4_MapperWriteRegC(register byte Addr, register byte Value)
|
void mmc4_MapperWriteRegC(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
|
||||||
mmc4_RegC = Value;
|
mmc4_RegC = Value;
|
||||||
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mmc4_MapperWriteRegD(register byte Addr, register byte Value)
|
void mmc4_MapperWriteRegD(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
|
||||||
mmc4_RegD = Value;
|
mmc4_RegD = Value;
|
||||||
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mmc4_MapperWriteRegE(register byte Addr, register byte Value)
|
void mmc4_MapperWriteRegE(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
|
||||||
mmc4_RegE = Value;
|
mmc4_RegE = Value;
|
||||||
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mmc4_MapperWriteRegF(register byte Addr, register byte Value)
|
void mmc4_MapperWriteRegF(register byte Addr, register byte Value)
|
||||||
{
|
{
|
||||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
|
||||||
mmc4_RegF = Value;
|
mmc4_RegF = Value;
|
||||||
if (Value & 0x01)
|
if (Value & 0x01)
|
||||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||||
@@ -87,7 +87,7 @@ int mmc4_InitMapper(NesCart * cart)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
set_prom_bank_16k(0x8000,0);
|
set_prom_bank_16k(0x8000, 0);
|
||||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||||
|
|
||||||
if (cart->VROMSize > 0)
|
if (cart->VROMSize > 0)
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* mmc4.h
|
* mmc4.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2007 986Corp. All rights reserved.
|
* Copyright (c) 2007-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-31 18:00:41 +0200 (jeu, 31 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc4.h $
|
* $HeadURL$
|
||||||
* $Revision: 56 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* norom.c
|
* norom.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/unrom.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* norom.c
|
* norom.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/unrom.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* unrom.h
|
* unrom.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/unrom.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* unrom.h
|
* unrom.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/unrom.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
/*
|
/*
|
||||||
|
* Mapper list - The TI-NESulator Project
|
||||||
* mappers_list.h
|
* mappers_list.h
|
||||||
* TI-NESulator.X
|
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 25/10/07.
|
* Created by Manoel TRAPIER on 25/10/07.
|
||||||
* Copyright 2007 986 Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -27,10 +32,12 @@ Mapper Mappers[] = {
|
|||||||
|
|
||||||
{ 1 , "MMC1", mmc1_InitMapper, norom_MapperIRQ, mmc1_MapperDump },
|
{ 1 , "MMC1", mmc1_InitMapper, norom_MapperIRQ, mmc1_MapperDump },
|
||||||
{ 4 , "MMC3", mmc3_InitMapper, mmc3_MapperIRQ, mmc3_MapperDump },
|
{ 4 , "MMC3", mmc3_InitMapper, mmc3_MapperIRQ, mmc3_MapperDump },
|
||||||
{ 10, "MMC4", mmc3_InitMapper, norom_MapperIRQ, mmc4_MapperDump },
|
{ 10, "MMC4", mmc4_InitMapper, norom_MapperIRQ, mmc4_MapperDump },
|
||||||
|
|
||||||
{ 65, "Irem H3001", iremh3001_InitMapper, iremh3001_MapperIRQ, iremh3001_MapperDump },
|
{ 65, "Irem H3001", iremh3001_InitMapper, iremh3001_MapperIRQ, iremh3001_MapperDump },
|
||||||
|
|
||||||
|
|
||||||
|
{ 100, "Floppy Disk System", NULL, norom_MapperIRQ, norom_MapperDump },
|
||||||
/* EOL tag */
|
/* EOL tag */
|
||||||
{ 0, NULL, NULL, NULL, NULL }
|
{ 0, NULL, NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* genericmapper.h
|
* genericmapper.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: godzil $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/genericmapper.h $
|
* $HeadURL$
|
||||||
* $Revision: 39 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* mmc1.h
|
* mmc1.h
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc1.h $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
unsigned char MMC1_reg0;
|
unsigned char MMC1_reg0;
|
||||||
@@ -137,7 +137,7 @@ void mmc1_ApplyReg0Mod()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//printf("Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
|
//console_printf(Console_Default, "Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
|
||||||
|
|
||||||
switch (MMC1_reg0 & 0x03)
|
switch (MMC1_reg0 & 0x03)
|
||||||
{
|
{
|
||||||
@@ -189,7 +189,7 @@ void mmc1_MapperWriteReg0(register byte Addr, register byte Value)
|
|||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg0 = MMC1_REG0_DEFAULT;
|
MMC1_reg0 = MMC1_REG0_DEFAULT;
|
||||||
printf("MMC1: Reg0 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg0 Reset occured !\n");
|
||||||
mmc1_ApplyReg0Mod();
|
mmc1_ApplyReg0Mod();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -216,7 +216,7 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
|||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg1 = MMC1_REG1_DEFAULT;
|
MMC1_reg1 = MMC1_REG1_DEFAULT;
|
||||||
printf("MMC1: Reg1 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg1 Reset occured !\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -236,18 +236,18 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
if (Cart->VROMSize == 0)
|
if (Cart->VROMSize == 0)
|
||||||
{
|
{
|
||||||
printf("Try to change VROM but with didn't have any VROM ! [%04X]\n", VROMBankNb);
|
console_printf(Console_Default, "Try to change VROM but with didn't have any VROM ! [%04X]\n", VROMBankNb);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||||
{ /* 4K vram */
|
{ /* 4K vram */
|
||||||
//printf("Switching VROM at 0x0000 to 4k bank %d\n", VROMBankNb);
|
//console_printf(Console_Default, "Switching VROM at 0x0000 to 4k bank %d\n", VROMBankNb);
|
||||||
set_vrom_bank_4k(0x0000,VROMBankNb);
|
set_vrom_bank_4k(0x0000,VROMBankNb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* 8K vram */
|
{ /* 8K vram */
|
||||||
//printf("Switching VROM at 0x0000 to 8k bank %d\n", VROMBankNb>>1);
|
//console_printf(Console_Default, "Switching VROM at 0x0000 to 8k bank %d\n", VROMBankNb>>1);
|
||||||
set_vrom_bank_8k(0x0000,VROMBankNb>>1);
|
set_vrom_bank_8k(0x0000,VROMBankNb>>1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -259,7 +259,7 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
|||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg2 = MMC1_REG2_DEFAULT;
|
MMC1_reg2 = MMC1_REG2_DEFAULT;
|
||||||
printf("MMC1: Reg2 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg2 Reset occured !\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -277,21 +277,21 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
|||||||
|
|
||||||
VROMBankNb = (MMC1_reg2 /* & MMC1_R2_VROMB2 */ );
|
VROMBankNb = (MMC1_reg2 /* & MMC1_R2_VROMB2 */ );
|
||||||
|
|
||||||
//printf("Want to switch VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
//console_printf(Console_Default, "Want to switch VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
||||||
if (Cart->VROMSize == 0)
|
if (Cart->VROMSize == 0)
|
||||||
{
|
{
|
||||||
//printf(": No\n");
|
//console_printf(Console_Default, ": No\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||||
{ /* 4K vram */
|
{ /* 4K vram */
|
||||||
//printf("Switching VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
//console_printf(Console_Default, "Switching VROM at 0x1000 to 4k bank %d\n", VROMBankNb);
|
||||||
set_vrom_bank_4k(0x1000,VROMBankNb);
|
set_vrom_bank_4k(0x1000,VROMBankNb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* 8K vram */
|
{ /* 8K vram */
|
||||||
// printf("Switching VROM at 0x1000 to 8k bank %d\n", VROMBankNb>>1);
|
// console_printf(Console_Default, "Switching VROM at 0x1000 to 8k bank %d\n", VROMBankNb>>1);
|
||||||
// set_vrom_bank_8k(0x1000,VROMBankNb>>1);
|
// set_vrom_bank_8k(0x1000,VROMBankNb>>1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -303,7 +303,7 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
|||||||
if (Value & 0x80)
|
if (Value & 0x80)
|
||||||
{
|
{
|
||||||
MMC1_reg3 = MMC1_REG3_DEFAULT;
|
MMC1_reg3 = MMC1_REG3_DEFAULT;
|
||||||
printf("MMC1: Reg3 Reset occured !\n");
|
console_printf(Console_Default, "MMC1: Reg3 Reset occured !\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -327,12 +327,12 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
|||||||
if ( (MMC1_reg0 & MMC1_R0_PRGAREA) != 0 )
|
if ( (MMC1_reg0 & MMC1_R0_PRGAREA) != 0 )
|
||||||
{ /* 0x8000 switch */
|
{ /* 0x8000 switch */
|
||||||
set_prom_bank_16k(0x8000,MMC1_reg3);
|
set_prom_bank_16k(0x8000,MMC1_reg3);
|
||||||
//printf("LowBank is now %d ( 0x%p )\n", MMC1_reg3, mLBank);
|
//console_printf(Console_Default, "LowBank is now %d ( 0x%p )\n", MMC1_reg3, mLBank);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* 0xC000 switch */
|
{ /* 0xC000 switch */
|
||||||
set_prom_bank_16k(0xC000,MMC1_reg3);
|
set_prom_bank_16k(0xC000,MMC1_reg3);
|
||||||
//printf("HighBank is now %d ( 0x%p )\n", MMC1_reg3, mUBank);
|
//console_printf(Console_Default, "HighBank is now %d ( 0x%p )\n", MMC1_reg3, mUBank);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -352,4 +352,4 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("MMC1: Debug (Reg:%d,Val:0x%02X,reg0:0x%02X,reg1:0x%02X,reg2:0x%02X,reg3:0x%02X)\n", MMC1_GetReg(Addr), Value, MMC1_reg0, MMC1_reg1, MMC1_reg2, MMC1_reg3);
|
//console_printf(Console_Default, "MMC1: Debug (Reg:%d,Val:0x%02X,reg0:0x%02X,reg1:0x%02X,reg2:0x%02X,reg3:0x%02X)\n", MMC1_GetReg(Addr), Value, MMC1_reg0, MMC1_reg1, MMC1_reg2, MMC1_reg3);
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
* mappers.c
|
* mappers.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-31 18:00:41 +0200 (jeu, 31 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mappers.c $
|
* $HeadURL$
|
||||||
* $Revision: 56 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ extern char MapperWantIRQ;
|
|||||||
void set_vrom_bank_1k(unsigned short addr,int slot)
|
void set_vrom_bank_1k(unsigned short addr,int slot)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_VROM_BANK_SWITCH
|
#ifdef DEBUG_VROM_BANK_SWITCH
|
||||||
printf("Change vrom 1k bank 0x%X to slot %d\n",addr,slot);
|
console_printf(Console_Default, "Change vrom 1k bank 0x%X to slot %d\n",addr,slot);
|
||||||
#endif
|
#endif
|
||||||
ppu_setPagePtr1k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 1024));
|
ppu_setPagePtr1k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 1024));
|
||||||
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 1024), 0x0400);
|
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 1024), 0x0400);
|
||||||
@@ -47,7 +47,7 @@ void set_vrom_bank_1k(unsigned short addr,int slot)
|
|||||||
void set_vrom_bank_2k(unsigned short addr,int slot)
|
void set_vrom_bank_2k(unsigned short addr,int slot)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_VROM_BANK_SWITCH
|
#ifdef DEBUG_VROM_BANK_SWITCH
|
||||||
printf("Change vrom 2k bank 0x%X to slot %d\n",addr,slot);
|
console_printf(Console_Default, "Change vrom 2k bank 0x%X to slot %d\n",addr,slot);
|
||||||
#endif
|
#endif
|
||||||
ppu_setPagePtr2k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 2 * 1024));
|
ppu_setPagePtr2k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 2 * 1024));
|
||||||
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 2 * 1024), 0x0800);
|
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 2 * 1024), 0x0800);
|
||||||
@@ -56,7 +56,7 @@ void set_vrom_bank_2k(unsigned short addr,int slot)
|
|||||||
void set_vrom_bank_4k(unsigned short addr,int slot)
|
void set_vrom_bank_4k(unsigned short addr,int slot)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_VROM_BANK_SWITCH
|
#ifdef DEBUG_VROM_BANK_SWITCH
|
||||||
printf("Change vrom 4k bank 0x%X to slot %d\n",addr,slot);
|
console_printf(Console_Default, "Change vrom 4k bank 0x%X to slot %d\n",addr,slot);
|
||||||
#endif
|
#endif
|
||||||
ppu_setPagePtr4k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 4 * 1024));
|
ppu_setPagePtr4k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 4 * 1024));
|
||||||
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 4 * 1024), 0x1000);
|
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 4 * 1024), 0x1000);
|
||||||
@@ -65,7 +65,7 @@ void set_vrom_bank_4k(unsigned short addr,int slot)
|
|||||||
void set_vrom_bank_8k(unsigned short addr, int slot)
|
void set_vrom_bank_8k(unsigned short addr, int slot)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_VROM_BANK_SWITCH
|
#ifdef DEBUG_VROM_BANK_SWITCH
|
||||||
printf("Change vrom 8k bank 0x%X to slot %d\n",addr,slot);
|
console_printf(Console_Default, "Change vrom 8k bank 0x%X to slot %d\n",addr,slot);
|
||||||
#endif
|
#endif
|
||||||
ppu_setPagePtr8k(0x00, Cart->VROMBanks + (slot * 8 * 1024));
|
ppu_setPagePtr8k(0x00, Cart->VROMBanks + (slot * 8 * 1024));
|
||||||
// memcpy(ppu.Memory, Cart->VROMBanks + (slot * 8 * 1024) , 0x2000);
|
// memcpy(ppu.Memory, Cart->VROMBanks + (slot * 8 * 1024) , 0x2000);
|
||||||
@@ -76,7 +76,7 @@ void set_vrom_bank_8k(unsigned short addr, int slot)
|
|||||||
void set_prom_bank_8k(unsigned short addr,int slot)
|
void set_prom_bank_8k(unsigned short addr,int slot)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_PROM_BANK_SWITCH
|
#ifdef DEBUG_PROM_BANK_SWITCH
|
||||||
printf("Change prom 8k bank 0x%X to slot %d\n",addr,slot);
|
console_printf(Console_Default, "Change prom 8k bank 0x%X to slot %d\n",addr,slot);
|
||||||
#endif
|
#endif
|
||||||
set_page_ptr_8k(addr >> 8, Cart->PROMBanks + (slot * 8 * 1024));
|
set_page_ptr_8k(addr >> 8, Cart->PROMBanks + (slot * 8 * 1024));
|
||||||
}
|
}
|
||||||
@@ -84,7 +84,7 @@ void set_prom_bank_8k(unsigned short addr,int slot)
|
|||||||
void set_prom_bank_16k(unsigned short addr,int slot)
|
void set_prom_bank_16k(unsigned short addr,int slot)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_PROM_BANK_SWITCH
|
#ifdef DEBUG_PROM_BANK_SWITCH
|
||||||
printf("Change prom 16k bank @ 0x%X [0x%X] to slot 0x%X\n",addr, addr>>8,slot);
|
console_printf(Console_Default, "Change prom 16k bank @ 0x%X [0x%X] to slot 0x%X\n",addr, addr>>8,slot);
|
||||||
#endif
|
#endif
|
||||||
set_page_ptr_16k(addr >> 8, Cart->PROMBanks + (slot * 16 * 1024));
|
set_page_ptr_16k(addr >> 8, Cart->PROMBanks + (slot * 16 * 1024));
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ void set_prom_bank_32k(unsigned short addr,int slot)
|
|||||||
{ /* addr may not be different from 0x8000 !*/
|
{ /* addr may not be different from 0x8000 !*/
|
||||||
/* Anyway I don't use it */
|
/* Anyway I don't use it */
|
||||||
#ifdef DEBUG_PROM_BANK_SWITCH
|
#ifdef DEBUG_PROM_BANK_SWITCH
|
||||||
printf("Change prom 32k bank 0x%X to slot %d\n",addr,slot);
|
console_printf(Console_Default, "Change prom 32k bank 0x%X to slot %d\n",addr,slot);
|
||||||
#endif
|
#endif
|
||||||
set_page_ptr_32k(addr >> 8, Cart->PROMBanks + (slot * 32 * 1024));
|
set_page_ptr_32k(addr >> 8, Cart->PROMBanks + (slot * 32 * 1024));
|
||||||
/* set_page_ptr_16k(0x80, Cart->PROMBanks[(slot<<1)]);
|
/* set_page_ptr_16k(0x80, Cart->PROMBanks[(slot<<1)]);
|
||||||
|
|||||||
12
src/memorymanager/CMakeLists.txt
Normal file
12
src/memorymanager/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
add_library(memorymanager memory.c)
|
||||||
@@ -2,20 +2,22 @@
|
|||||||
* 6502 Memory manager - The TI-NESulator Project
|
* 6502 Memory manager - The TI-NESulator Project
|
||||||
* memory.c - Taken from the Quick6502 project
|
* memory.c - Taken from the Quick6502 project
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 18/09/06.
|
* Created by Manoel Trapier on 18/09/06.
|
||||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/memory.c $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "types.h"
|
#include <types.h>
|
||||||
#include "../include/memory/manager.h"
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
|
#include <memory/manager.h>
|
||||||
|
|
||||||
/* Private structures */
|
/* Private structures */
|
||||||
|
|
||||||
@@ -38,7 +40,7 @@ byte memory_pages_attr[0x100];
|
|||||||
func_rdhook rdh_table[0x100];
|
func_rdhook rdh_table[0x100];
|
||||||
func_wrhook wrh_table[0x100];
|
func_wrhook wrh_table[0x100];
|
||||||
|
|
||||||
//#define DEBUG
|
#define DEBUG
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@@ -50,13 +52,13 @@ func_wrhook wrh_table[0x100];
|
|||||||
/* Public functions */
|
/* Public functions */
|
||||||
void set_page_ptr(byte page, byte *ptr)
|
void set_page_ptr(byte page, byte *ptr)
|
||||||
{
|
{
|
||||||
LOG(printf("Set page 0x%X to ptr %p\n", page, ptr));
|
LOG(console_printf(Console_Default, "Set page 0x%X to ptr %p\n", page, ptr));
|
||||||
memory_pages[page] = ptr;
|
memory_pages[page] = ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_page_ptr_1k(byte page, byte *ptr)
|
void set_page_ptr_1k(byte page, byte *ptr)
|
||||||
{ /* 1k = 4 * 256 */
|
{ /* 1k = 4 * 256 */
|
||||||
LOG(printf("Set page(1k) 0x%X to ptr %p\n", page, ptr));
|
LOG(console_printf(Console_Default, "Set page(1k) 0x%X to ptr %p\n", page, ptr));
|
||||||
memory_pages[page + 0] = ptr;
|
memory_pages[page + 0] = ptr;
|
||||||
memory_pages[page + 1] = ptr + 0x100;
|
memory_pages[page + 1] = ptr + 0x100;
|
||||||
memory_pages[page + 2] = ptr + (0x100 * 2);
|
memory_pages[page + 2] = ptr + (0x100 * 2);
|
||||||
@@ -65,7 +67,7 @@ void set_page_ptr_1k(byte page, byte *ptr)
|
|||||||
|
|
||||||
void set_page_ptr_2k(byte page, byte *ptr)
|
void set_page_ptr_2k(byte page, byte *ptr)
|
||||||
{
|
{
|
||||||
LOG(printf("Set page(2k) 0x%X to ptr %p\n", page, ptr));
|
LOG(console_printf(Console_Default, "Set page(2k) 0x%X to ptr %p\n", page, ptr));
|
||||||
memory_pages[page + 0] = ptr;
|
memory_pages[page + 0] = ptr;
|
||||||
memory_pages[page + 1] = ptr + 0x100;
|
memory_pages[page + 1] = ptr + 0x100;
|
||||||
memory_pages[page + 2] = ptr + (0x100 * 2);
|
memory_pages[page + 2] = ptr + (0x100 * 2);
|
||||||
@@ -78,14 +80,14 @@ void set_page_ptr_2k(byte page, byte *ptr)
|
|||||||
|
|
||||||
void set_page_ptr_4k(byte page, byte *ptr)
|
void set_page_ptr_4k(byte page, byte *ptr)
|
||||||
{
|
{
|
||||||
LOG(printf("Set page(4k) 0x%X to ptr %p\n", page, ptr));
|
LOG(console_printf(Console_Default, "Set page(4k) 0x%X to ptr %p\n", page, ptr));
|
||||||
set_page_ptr_2k(page, ptr);
|
set_page_ptr_2k(page, ptr);
|
||||||
set_page_ptr_2k(page+((4 KBYTE / 256) / 2), ptr + 2 KBYTE);
|
set_page_ptr_2k(page+((4 KBYTE / 256) / 2), ptr + 2 KBYTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_page_ptr_8k(byte page, byte *ptr)
|
void set_page_ptr_8k(byte page, byte *ptr)
|
||||||
{
|
{
|
||||||
LOG(printf("Set page(8k) 0x%X to ptr %p\n", page, ptr));
|
LOG(console_printf(Console_Default, "Set page(8k) 0x%X to ptr %p\n", page, ptr));
|
||||||
set_page_ptr_4k(page, ptr);
|
set_page_ptr_4k(page, ptr);
|
||||||
set_page_ptr_4k(page+((8 KBYTE / 256) / 2), ptr + 4 KBYTE);
|
set_page_ptr_4k(page+((8 KBYTE / 256) / 2), ptr + 4 KBYTE);
|
||||||
}
|
}
|
||||||
@@ -195,26 +197,23 @@ func_wrhook get_page_wrhook(byte page)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
byte ReadMemory(byte page, byte addr)
|
byte ReadMemory(byte page, byte addr)
|
||||||
{
|
{
|
||||||
static byte LastRetByte = 0xA5;
|
static byte LastRetByte = 0xA5;
|
||||||
byte *page_ptr;
|
byte *page_ptr;
|
||||||
byte attributes;
|
byte attributes;
|
||||||
LOG(printf("Read @ 0x%X-%X\n", page, addr));
|
LOG(console_printf(Console_Default, "Read @ 0x%X-%X\n", page, addr));
|
||||||
/* Est-ce que la page est mappé ? && Est-ce que la page est "readable" ? */
|
/* Est-ce que la page est mappé ? && Est-ce que la page est "readable" ? */
|
||||||
if ((page_ptr = memory_pages[page]) &&
|
if ((page_ptr = memory_pages[page]) &&
|
||||||
( (attributes = memory_pages_attr[page]) & ATTR_PAGE_READABLE) )
|
( (attributes = memory_pages_attr[page]) & ATTR_PAGE_READABLE) )
|
||||||
{
|
{
|
||||||
LOG(printf("Page is non null & readable\n"));
|
LOG(console_printf(Console_Default, "Page is non null & readable\n"));
|
||||||
if ( attributes & ATTR_PAGE_HAVE_RDHOOK )
|
if ( attributes & ATTR_PAGE_HAVE_RDHOOK )
|
||||||
return ( LastRetByte = rdh_table[page](addr) );
|
return ( LastRetByte = rdh_table[page](addr) );
|
||||||
else
|
else
|
||||||
return ( LastRetByte = page_ptr[addr] );
|
return ( LastRetByte = page_ptr[addr] );
|
||||||
}
|
}
|
||||||
//printf("Trying to read @ 0x%X-%X\n", page, addr);
|
//console_printf(Console_Default, "Trying to read @ 0x%X-%X\n", page, addr);
|
||||||
return LastRetByte;
|
return LastRetByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,7 +221,7 @@ void WriteMemory(byte page, byte addr, byte value)
|
|||||||
{
|
{
|
||||||
byte *page_ptr;
|
byte *page_ptr;
|
||||||
byte attributes;
|
byte attributes;
|
||||||
LOG(printf("Write 0x%x @ 0x%X-%X\n", value, page, addr));
|
LOG(console_printf(Console_Default, "Write 0x%x @ 0x%X-%X\n", value, page, addr));
|
||||||
/* Est-ce que la page est mappé ? && Est-ce que la page est "writable" ? */
|
/* Est-ce que la page est mappé ? && Est-ce que la page est "writable" ? */
|
||||||
if ( (page_ptr = memory_pages[page]) &&
|
if ( (page_ptr = memory_pages[page]) &&
|
||||||
( (attributes = memory_pages_attr[page]) & ATTR_PAGE_WRITEABLE) )
|
( (attributes = memory_pages_attr[page]) & ATTR_PAGE_WRITEABLE) )
|
||||||
@@ -231,14 +230,14 @@ void WriteMemory(byte page, byte addr, byte value)
|
|||||||
{
|
{
|
||||||
#ifdef DETECT_BUS_CONFLICT
|
#ifdef DETECT_BUS_CONFLICT
|
||||||
if ((page >= 0x80) && (memory_pages[page][addr] != value))
|
if ((page >= 0x80) && (memory_pages[page][addr] != value))
|
||||||
printf("WriteHook: bus conflict at %02X%02X rom:%02X write:%02X\n", page, addr, memory_pages[page][addr], value);
|
console_printf(Console_Default, "WriteHook: bus conflict at %02X%02X rom:%02X write:%02X\n", page, addr, memory_pages[page][addr], value);
|
||||||
#endif
|
#endif
|
||||||
wrh_table[page](addr, value);
|
wrh_table[page](addr, value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
page_ptr[addr] = value;
|
page_ptr[addr] = value;
|
||||||
}
|
}
|
||||||
else { printf("Trying to write 0x%X @ 0x%X-%X\n", value, page, addr); }
|
else { console_printf(Console_Default, "Trying to write 0x%X @ 0x%X-%X\n", value, page, addr); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void DumpMemoryState(FILE *fp)
|
void DumpMemoryState(FILE *fp)
|
||||||
|
|||||||
12
src/os/macos/CMakeLists.txt
Normal file
12
src/os/macos/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
add_library(oslib loadfile.c graphics.c sound.c io.c)
|
||||||
29
src/os/macos/graphics.c
Normal file
29
src/os/macos/graphics.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Graphic Manager - The TI-NESulator Project
|
||||||
|
* os/macos/graphics.c
|
||||||
|
*
|
||||||
|
* Created by Manoel TRAPIER on 08/05/08.
|
||||||
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
|
int graphics_init()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int graphics_drawpixel(long x, long y, long color)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int graphics_blit(long x, long y, long w, long h)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
61
src/os/macos/io.c
Normal file
61
src/os/macos/io.c
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* IO Manager - The TI-NESulator Project
|
||||||
|
* os/macos/graphics.c
|
||||||
|
*
|
||||||
|
* Created by Manoël Trapier on 04/01/09.
|
||||||
|
* Copyright (c) 2003-2009 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
|
char LevelChar[] = { 'E', 'W', 'A', 'N', 'V', 'D'};
|
||||||
|
|
||||||
|
ConsoleLevel console_ActualLevel = Console_Default;
|
||||||
|
|
||||||
|
/* Actually nothing to do */
|
||||||
|
int console_init(ConsoleLevel DefaultLevel)
|
||||||
|
{
|
||||||
|
console_ActualLevel = DefaultLevel;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Actually a simple printf with levels */
|
||||||
|
int console_vprintf(const ConsoleLevel level, const char *format, va_list ap)
|
||||||
|
{
|
||||||
|
if (console_ActualLevel >= level)
|
||||||
|
vprintf(format, ap);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int console_printf(const ConsoleLevel level, const char *format, ...)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, format);
|
||||||
|
|
||||||
|
ret = console_vprintf(level, format, ap);
|
||||||
|
|
||||||
|
va_end(ap);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int console_printf_d(const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, format);
|
||||||
|
|
||||||
|
console_vprintf (Console_Debug, format, ap);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
45
src/os/macos/loadfile.c
Normal file
45
src/os/macos/loadfile.c
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* File functions - The TI-NESulator Project
|
||||||
|
* os/macos/load.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
|
/* Map a file in memory */
|
||||||
|
void *LoadFilePtr(char * filename)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
void *RetPtr = NULL;
|
||||||
|
struct stat FileStat;
|
||||||
|
|
||||||
|
fd = open(filename, O_RDONLY);
|
||||||
|
|
||||||
|
fstat(fd, &FileStat);
|
||||||
|
|
||||||
|
RetPtr = mmap(NULL, FileStat.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
return RetPtr;
|
||||||
|
}
|
||||||
0
src/os/macos/sound.c
Normal file
0
src/os/macos/sound.c
Normal file
12
src/os/ti68k/CMakeLists.txt
Normal file
12
src/os/ti68k/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
add_library(oslib loadfile.c)
|
||||||
34
src/os/ti68k/loadfile.c
Normal file
34
src/os/ti68k/loadfile.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* TI-68k Loading external file functions - The TI-NESulator Project
|
||||||
|
* ti68k/loadfile.c
|
||||||
|
*
|
||||||
|
* Created by Manoel TRAPIER.
|
||||||
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate:$
|
||||||
|
* $Author:$
|
||||||
|
* $HeadURL:$
|
||||||
|
* $Revision:$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define TIGCC_COMPAT
|
||||||
|
#include <tigcclib.h>
|
||||||
|
|
||||||
|
/* Map a file in memory */
|
||||||
|
void *LoadFilePtr(char * filename)
|
||||||
|
{
|
||||||
|
void *RetPtr = NULL;
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if ((fp = fopen(filename,"rb")) == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* TI Related stuff, very uggly, and need to be changed.. */
|
||||||
|
HeapLock(fp->handle);
|
||||||
|
RetPtr = 2 + HeapDeref(fp->handle);
|
||||||
|
|
||||||
|
fclose (fp);
|
||||||
|
|
||||||
|
return RetPtr;
|
||||||
|
}
|
||||||
8
src/os/ti68k/main.c
Normal file
8
src/os/ti68k/main.c
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#include <tigcclib.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
void _main()
|
||||||
|
{
|
||||||
|
main(1, "smb1.nes");
|
||||||
|
}
|
||||||
12
src/os/unix/CMakeLists.txt
Normal file
12
src/os/unix/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
add_library(oslib loadfile.c graphics.c sound.c io.c)
|
||||||
29
src/os/unix/graphics.c
Normal file
29
src/os/unix/graphics.c
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Graphic Manager - The TI-NESulator Project
|
||||||
|
* os/macos/graphics.c
|
||||||
|
*
|
||||||
|
* Created by Manoel TRAPIER on 08/05/08.
|
||||||
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
|
int graphics_init()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int graphics_drawpixel(long x, long y, long color)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int graphics_blit(long x, long y, long w, long h)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
61
src/os/unix/io.c
Normal file
61
src/os/unix/io.c
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* IO Manager - The TI-NESulator Project
|
||||||
|
* os/macos/graphics.c
|
||||||
|
*
|
||||||
|
* Created by Manoël Trapier on 04/01/09.
|
||||||
|
* Copyright (c) 2003-2009 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
|
char LevelChar[] = { 'E', 'W', 'A', 'N', 'V', 'D'};
|
||||||
|
|
||||||
|
ConsoleLevel console_ActualLevel = Console_Default;
|
||||||
|
|
||||||
|
/* Actually nothing to do */
|
||||||
|
int console_init(ConsoleLevel DefaultLevel)
|
||||||
|
{
|
||||||
|
console_ActualLevel = DefaultLevel;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Actually a simple printf with levels */
|
||||||
|
int console_vprintf(const ConsoleLevel level, const char *format, va_list ap)
|
||||||
|
{
|
||||||
|
if (console_ActualLevel >= level)
|
||||||
|
vprintf(format, ap);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int console_printf(const ConsoleLevel level, const char *format, ...)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, format);
|
||||||
|
|
||||||
|
ret = console_vprintf(level, format, ap);
|
||||||
|
|
||||||
|
va_end(ap);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int console_printf_d(const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, format);
|
||||||
|
|
||||||
|
console_vprintf (Console_Debug, format, ap);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
0
src/os/unix/sound.c
Normal file
0
src/os/unix/sound.c
Normal file
12
src/os/win32/CMakeLists.txt
Normal file
12
src/os/win32/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
add_library(oslib loadfile.c)
|
||||||
21
src/paddle.c
21
src/paddle.c
@@ -3,16 +3,23 @@
|
|||||||
* paddle.c
|
* paddle.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/paddle.c $
|
* $HeadURL$
|
||||||
* $Revision: 50 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Allegro includes */
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define USE_CONSOLE
|
||||||
|
#include <Allegro/allegro.h>
|
||||||
|
#else
|
||||||
|
#define USE_CONSOLE
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
|
#endif
|
||||||
#include "paddle.h"
|
#include "paddle.h"
|
||||||
|
|
||||||
void InitPaddle(Paddle * pdl)
|
void InitPaddle(Paddle * pdl)
|
||||||
@@ -99,7 +106,7 @@ unsigned char ReadPaddle(Paddle * pdl)
|
|||||||
|
|
||||||
case 20:
|
case 20:
|
||||||
|
|
||||||
return 0x41;
|
return 0x40;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -116,6 +123,6 @@ unsigned char ReadPaddle(Paddle * pdl)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0x40;
|
return 0x40;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/pluginsmanager/CMakeLists.txt
Normal file
13
src/pluginsmanager/CMakeLists.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
file(GLOB plugins_list plugins/*.c)
|
||||||
|
add_library(pluginsmanager manager.c ${plugins_list})
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
* plugins.c
|
* plugins.c
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER on 02/04/07.
|
* Created by Manoel TRAPIER on 02/04/07.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate$
|
* $LastChangedDate$
|
||||||
* $Author$
|
* $Author$
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
#include <plugins/manager.h>
|
#include <plugins/manager.h>
|
||||||
|
|
||||||
typedef struct Plugin_
|
typedef struct Plugin_
|
||||||
@@ -44,10 +46,10 @@ void plugin_list()
|
|||||||
{
|
{
|
||||||
Plugin *ptr = &(Plugins[0]);
|
Plugin *ptr = &(Plugins[0]);
|
||||||
int i = 1;
|
int i = 1;
|
||||||
printf("Available plugins:\n");
|
console_printf(Console_Default, "Available plugins:\n");
|
||||||
while(ptr->name != NULL)
|
while(ptr->name != NULL)
|
||||||
{
|
{
|
||||||
printf("%d - %s\n", i, ptr->name);
|
console_printf(Console_Default, "%d - %s\n", i, ptr->name);
|
||||||
ptr++; i++;
|
ptr++; i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -57,11 +59,11 @@ int plugin_load(int id)
|
|||||||
Plugin *ptr = &(Plugins[0]);
|
Plugin *ptr = &(Plugins[0]);
|
||||||
int i = id;
|
int i = id;
|
||||||
|
|
||||||
printf("%s(%d)", __func__, id);
|
console_printf(Console_Default, "%s(%d)", __func__, id);
|
||||||
|
|
||||||
for ( ; i > 1 && ptr->name != NULL; i -- )
|
for ( ; i > 1 && ptr->name != NULL; i -- )
|
||||||
{
|
{
|
||||||
printf("%d - %s\n", i, ptr->name);
|
console_printf(Console_Default, "%d - %s\n", i, ptr->name);
|
||||||
ptr ++;
|
ptr ++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Code Breaker plugin - The TI-NESulator Project
|
||||||
|
* gamegenie.c: Hack your games with unlimited lives of add new powers!
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier.
|
||||||
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <allegro.h>
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
#define __TINES_PLUGINS__
|
#define __TINES_PLUGINS__
|
||||||
#include <plugins/manager.h>
|
#include <plugins/manager.h>
|
||||||
@@ -8,7 +23,16 @@
|
|||||||
|
|
||||||
#include <memory/manager.h>
|
#include <memory/manager.h>
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include "allegro.h"
|
|
||||||
|
/* Allegro includes */
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define USE_CONSOLE
|
||||||
|
#include <Allegro/allegro.h>
|
||||||
|
#else
|
||||||
|
#define USE_CONSOLE
|
||||||
|
#include <allegro.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef enum gg_States_
|
typedef enum gg_States_
|
||||||
{
|
{
|
||||||
@@ -296,7 +320,7 @@ unsigned short SelectNumber(char *title, char *msg, byte size)
|
|||||||
|
|
||||||
int DispMenu(int itemc, char *itemv[], char *title)
|
int DispMenu(int itemc, char *itemv[], char *title)
|
||||||
{
|
{
|
||||||
//printf("%s(%d, %p, \"%s\");\n", __func__, itemc, itemv, title);
|
//console_printf(Console_Default, "%s(%d, %p, \"%s\");\n", __func__, itemc, itemv, title);
|
||||||
|
|
||||||
int selection = 0;
|
int selection = 0;
|
||||||
int i;
|
int i;
|
||||||
@@ -414,7 +438,7 @@ byte gg_SelectPatch()
|
|||||||
for (i = 0; i < GG_MAX_PATCH; i++)
|
for (i = 0; i < GG_MAX_PATCH; i++)
|
||||||
{
|
{
|
||||||
tmp = (char*) malloc(0x100);
|
tmp = (char*) malloc(0x100);
|
||||||
printf("Items[%d]: %p\n", i, tmp);
|
console_printf(Console_Default, "Items[%d]: %p\n", i, tmp);
|
||||||
if (gg_PatchUsed[i] == 0x00)
|
if (gg_PatchUsed[i] == 0x00)
|
||||||
sprintf(tmp, "Patch %d: Not used", i);
|
sprintf(tmp, "Patch %d: Not used", i);
|
||||||
else
|
else
|
||||||
@@ -442,7 +466,7 @@ byte gg_SelectPatch()
|
|||||||
|
|
||||||
void gg_PatchManager()
|
void gg_PatchManager()
|
||||||
{
|
{
|
||||||
printf("DTC!\n");
|
console_printf(Console_Default, "DTC!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void gg_InitSearch()
|
void gg_InitSearch()
|
||||||
@@ -470,7 +494,7 @@ typedef enum gg_SearchForMode_
|
|||||||
void gg_SearchForValue(byte value)
|
void gg_SearchForValue(byte value)
|
||||||
{
|
{
|
||||||
unsigned short addr;
|
unsigned short addr;
|
||||||
byte oldValue;
|
//byte oldValue;
|
||||||
byte currentValue;
|
byte currentValue;
|
||||||
gg_ResultNumber = 0x00;
|
gg_ResultNumber = 0x00;
|
||||||
for(addr = 0x000; addr < 0x800; addr ++)
|
for(addr = 0x000; addr < 0x800; addr ++)
|
||||||
@@ -480,7 +504,7 @@ void gg_SearchForValue(byte value)
|
|||||||
/* "Backup" the old ram */
|
/* "Backup" the old ram */
|
||||||
memcpy(gg_OldMainRAM, gg_MainRAM, 0x800);
|
memcpy(gg_OldMainRAM, gg_MainRAM, 0x800);
|
||||||
|
|
||||||
oldValue = gg_MainRAM[addr];
|
//oldValue = gg_MainRAM[addr];
|
||||||
currentValue = ReadMemory((addr&0xFF00)>>8,addr&0x00FF);
|
currentValue = ReadMemory((addr&0xFF00)>>8,addr&0x00FF);
|
||||||
|
|
||||||
if (currentValue != value)
|
if (currentValue != value)
|
||||||
@@ -583,7 +607,7 @@ byte gg_DisplayResults()
|
|||||||
{
|
{
|
||||||
while(gg_use_MainRAM[addr] != 0xFF)
|
while(gg_use_MainRAM[addr] != 0xFF)
|
||||||
addr ++;
|
addr ++;
|
||||||
printf("0x%04X [%d]\n", addr, i);
|
console_printf(Console_Default, "0x%04X [%d]\n", addr, i);
|
||||||
tmp = (char*) malloc(0x100);
|
tmp = (char*) malloc(0x100);
|
||||||
sprintf(tmp,"Patch: %08XAddress 0x%04X - Was: 0x%02X - Actual: 0x%02X",
|
sprintf(tmp,"Patch: %08XAddress 0x%04X - Was: 0x%02X - Actual: 0x%02X",
|
||||||
i,
|
i,
|
||||||
@@ -785,7 +809,7 @@ S02_MENU:
|
|||||||
int gg_Init()
|
int gg_Init()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
printf("Initializing GG plugin...\n");
|
console_printf(Console_Default, "Initializing GG plugin...\n");
|
||||||
|
|
||||||
plugin_install_keypressHandler('g', gg_Start);
|
plugin_install_keypressHandler('g', gg_Start);
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Code Breaker plugin - The TI-NESulator Project
|
||||||
|
* gamegenie.h
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier.
|
||||||
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
int gg_Init();
|
int gg_Init();
|
||||||
int gg_Deinit();
|
int gg_Deinit();
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Plugin Manager plugint list - The TI-NESulator Project
|
||||||
|
* plugins_list.h
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier.
|
||||||
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
/* This file could be generated from the plugins directory... */
|
/* This file could be generated from the plugins directory... */
|
||||||
|
|
||||||
#include "plugins/gamegenie.h"
|
#include "plugins/gamegenie.h"
|
||||||
|
|||||||
13
src/ppu/CMakeLists.txt
Normal file
13
src/ppu/CMakeLists.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# TI-NES CMake
|
||||||
|
#
|
||||||
|
# Created by Manoel TRAPIER.
|
||||||
|
# Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
|
#
|
||||||
|
# $LastChangedDate$
|
||||||
|
# $Author$
|
||||||
|
# $HeadURL$
|
||||||
|
# $Revision$
|
||||||
|
|
||||||
|
file(GLOB ppu_debug_list debug/*.c)
|
||||||
|
add_library(ppu ppu.c ppu.memory.c ${ppu_debug_list})
|
||||||
@@ -1,7 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* PPU Debug utilities - The TI-NESulator Project
|
||||||
|
* ppu.debug.c
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier.
|
||||||
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* Allegro includes */
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define USE_CONSOLE
|
||||||
|
#include <Allegro/allegro.h>
|
||||||
|
#else
|
||||||
|
#define USE_CONSOLE
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __TINES_PPU_INTERNAL__
|
#define __TINES_PPU_INTERNAL__
|
||||||
|
|
||||||
@@ -186,7 +207,7 @@ void DebugSprites()
|
|||||||
|
|
||||||
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
||||||
|
|
||||||
#define GetTileColor(tile,x1,y1) ( ( ppu_readMemory(((tile+y1)>>8)&0xFF, (tile+y1) & 0xFF) & (1<<(7-x1)) ) == 0 ? 0 : 1 ) | \
|
#define GetTileColor(tile,x1,y1) ( ( ppu_readMemory(((tile+y1)>>8)&0xFF, (tile+y1) & 0xFF) & (1<<(7-x1)) ) == 0 ? 0 : 1 ) |\
|
||||||
( ( ppu_readMemory(((tile+y1+8)>>8) & 0xFF, (tile+y1+8) &0xFF) & (1<<(7-x1)) ) == 0 ? 0 : 1<<1 )
|
( ( ppu_readMemory(((tile+y1+8)>>8) & 0xFF, (tile+y1+8) &0xFF) & (1<<(7-x1)) ) == 0 ? 0 : 1<<1 )
|
||||||
|
|
||||||
#define PPU_Rd(addr) ppu_readMemory((addr>>8)&0xFF, addr&0xFF)
|
#define PPU_Rd(addr) ppu_readMemory((addr>>8)&0xFF, addr&0xFF)
|
||||||
@@ -334,8 +355,8 @@ void ppu_dumpPalette(int x, int y)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
textout(Buffer, font, "Bg Palette", x , y, 5);
|
textout_ex(Buffer, font, "Bg Palette", x , y, 5, 0);
|
||||||
textout(Buffer, font, "Sprt Palette", x + 90, y, 5);
|
textout_ex(Buffer, font, "Sprt Palette", x + 90, y, 5, 0);
|
||||||
|
|
||||||
rect(Buffer, x+0, y+20, x+4 * 20 + 2, y + 4 * 20 + 22, 0);
|
rect(Buffer, x+0, y+20, x+4 * 20 + 2, y + 4 * 20 + 22, 0);
|
||||||
rect(Buffer, x+90, y+20, x+90 + 4 * 20 + 2, y + 4 * 20 + 22, 0);
|
rect(Buffer, x+90, y+20, x+90 + 4 * 20 + 2, y + 4 * 20 + 22, 0);
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-03-29 12:05:12 +0200 (jeu, 29 mar 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/oldppu.c $
|
* $HeadURL$
|
||||||
* $Revision: 28 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
@@ -193,7 +193,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
|||||||
else
|
else
|
||||||
if (Addr >= 0x3F00)
|
if (Addr >= 0x3F00)
|
||||||
{
|
{
|
||||||
//printf("%s palette: color %x new value : %d (0x%x)\n", (PalAddr(Addr) < 0x10) ? "Bgnd" : "Sprt", PalAddr(Addr), Value & 0x3F, Addr);
|
//console_printf(Console_Default, "%s palette: color %x new value : %d (0x%x)\n", (PalAddr(Addr) < 0x10) ? "Bgnd" : "Sprt", PalAddr(Addr), Value & 0x3F, Addr);
|
||||||
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
||||||
if (PalAddr(Addr) == 0x10)
|
if (PalAddr(Addr) == 0x10)
|
||||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||||
@@ -399,7 +399,7 @@ unsigned char XScroll, YScroll;
|
|||||||
clear_to_color(Buffer, BgColor);
|
clear_to_color(Buffer, BgColor);
|
||||||
|
|
||||||
/* if (ppu.ControlRegister2.s.Colour != 0)
|
/* if (ppu.ControlRegister2.s.Colour != 0)
|
||||||
printf("ppu.ColorEmphasis : %d", ppu.ControlRegister2.s.Colour);*/
|
console_printf(Console_Default, "ppu.ColorEmphasis : %d", ppu.ControlRegister2.s.Colour);*/
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < 249; i++)
|
for (i = 0; i < 249; i++)
|
||||||
@@ -657,7 +657,7 @@ frame start (line 0) (if background or sprites are enabled):
|
|||||||
v=t
|
v=t
|
||||||
*/
|
*/
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
||||||
//printf("Starting addresses : 0x%X\n",ppu.VRAMAddrReg2.W);
|
//console_printf(Console_Default, "Starting addresses : 0x%X\n",ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
XScroll = ppu.TimedHScroll[0];
|
XScroll = ppu.TimedHScroll[0];
|
||||||
|
|
||||||
@@ -982,7 +982,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case 1: /* Control Register 2 */
|
case 1: /* Control Register 2 */
|
||||||
//printf("PPU: new CR2 ; 0x%x\n", val);
|
//console_printf(Console_Default, "PPU: new CR2 ; 0x%x\n", val);
|
||||||
ppu.ControlRegister2.b = val;
|
ppu.ControlRegister2.b = val;
|
||||||
break;
|
break;
|
||||||
case 3: /* SPR-RAM Addresse Register */
|
case 3: /* SPR-RAM Addresse Register */
|
||||||
@@ -1004,7 +1004,7 @@ x=d:00000111
|
|||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||||
ppu.HScroll = val & 0x7;
|
ppu.HScroll = val & 0x7;
|
||||||
|
|
||||||
//printf("%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1019,9 +1019,9 @@ t:0111 0000 0000 0000=d:0000 0111
|
|||||||
|
|
||||||
ppu.TmpVScroll = ((ppu.TmpVRamPtr & 0x700) >> 12) & 0x7;
|
ppu.TmpVScroll = ((ppu.TmpVRamPtr & 0x700) >> 12) & 0x7;
|
||||||
if (ppu.TmpVScroll != 0)
|
if (ppu.TmpVScroll != 0)
|
||||||
printf("2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
||||||
|
|
||||||
//printf("%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1036,7 +1036,7 @@ t:1100 0000 0000 0000=0
|
|||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
||||||
|
|
||||||
//printf("%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1049,7 +1049,7 @@ v=t
|
|||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||||
|
|
||||||
//printf("%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -5,18 +5,19 @@
|
|||||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
* $HeadURL$
|
||||||
* $Revision: 32 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "ppu.h"
|
#include "ppu.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "M6502.h"
|
#include "M6502.h"
|
||||||
@@ -248,7 +249,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
|||||||
else
|
else
|
||||||
if (Addr >= 0x3F00)
|
if (Addr >= 0x3F00)
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "%s palette: color %x new value : %d (0x%x)\n", (PalAddr(Addr) < 0x10) ? "Bgnd" : "Sprt", PalAddr(Addr), Value & 0x3F, Addr);
|
||||||
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
||||||
if (PalAddr(Addr) == 0x10)
|
if (PalAddr(Addr) == 0x10)
|
||||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||||
@@ -289,7 +290,7 @@ void NewPPUDispSprite()
|
|||||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||||
{
|
{
|
||||||
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
||||||
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
//console_printf(Console_Default, "%d Hohoho!\n", py);
|
||||||
// line(Buffer, 0, py+1, 256, py+1, 10);
|
// line(Buffer, 0, py+1, 256, py+1, 10);
|
||||||
//continue; // Do not display more than 8 sprites on this line :p
|
//continue; // Do not display more than 8 sprites on this line :p
|
||||||
}
|
}
|
||||||
@@ -823,7 +824,7 @@ unsigned char XScroll, YScroll;
|
|||||||
clear_to_color(Buffer, GetColor(BgColor));
|
clear_to_color(Buffer, GetColor(BgColor));
|
||||||
|
|
||||||
if (ppu.ControlRegister2.s.Colour != 0)
|
if (ppu.ControlRegister2.s.Colour != 0)
|
||||||
if (ppu.ControlRegister2.s.Colour != 0)
|
console_printf(Console_Default, "ppu.ColorEmphasis : %d\n", ppu.ControlRegister2.s.Colour);
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < 249; i++)
|
for (i = 0; i < 249; i++)
|
||||||
@@ -847,7 +848,7 @@ frame start (line 0) (if background or sprites are enabled):
|
|||||||
v=t
|
v=t
|
||||||
*/
|
*/
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
//console_printf(Console_Default, "Starting addresses : 0x%X\n",ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
XScroll = ppu.TimedHScroll[0];
|
XScroll = ppu.TimedHScroll[0];
|
||||||
|
|
||||||
@@ -863,14 +864,14 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
|||||||
5432 10
|
5432 10
|
||||||
*/
|
*/
|
||||||
//if (y == 142)
|
//if (y == 142)
|
||||||
//if (y == 142)
|
// console_printf(Console_Default, "______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & 0xFBE0)
|
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & 0xFBE0)
|
||||||
| ((ppu.TimedTmpPtr[y]) & 0x041F)
|
| ((ppu.TimedTmpPtr[y]) & 0x041F)
|
||||||
| 0x2000;
|
| 0x2000;
|
||||||
|
|
||||||
//if (y == 142)
|
//if (y == 142)
|
||||||
//if (y == 142)
|
// console_printf(Console_Default, "______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
||||||
| ppu.Bg_Pattern_Table;
|
| ppu.Bg_Pattern_Table;
|
||||||
@@ -1176,7 +1177,7 @@ void WritePPUReg(byte RegID, byte val)
|
|||||||
switch (RegID)
|
switch (RegID)
|
||||||
{
|
{
|
||||||
default:/* For not writeable reg */
|
default:/* For not writeable reg */
|
||||||
default:/* For not writeable reg */
|
console_printf(Console_Default, "WritePPU error\n");
|
||||||
break;
|
break;
|
||||||
case 0: /* Control Register 1 */
|
case 0: /* Control Register 1 */
|
||||||
ppu.ControlRegister1.b = val;
|
ppu.ControlRegister1.b = val;
|
||||||
@@ -1208,7 +1209,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case 1: /* Control Register 2 */
|
case 1: /* Control Register 2 */
|
||||||
case 1: /* Control Register 2 */
|
//console_printf(Console_Default, "PPU: new CR2 ; 0x%x\n", val);
|
||||||
ppu.ControlRegister2.b = val;
|
ppu.ControlRegister2.b = val;
|
||||||
break;
|
break;
|
||||||
case 3: /* SPR-RAM Addresse Register */
|
case 3: /* SPR-RAM Addresse Register */
|
||||||
@@ -1225,15 +1226,15 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
t:0000 0000 0001 1111=d:1111 1000
|
t:0000 0000 0001 1111=d:1111 1000
|
||||||
x=d:00000111
|
x=d:00000111
|
||||||
*/
|
*/
|
||||||
*/
|
//console_printf(Console_Default, "2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 1;
|
ppu.VRAMAddrMode = 1;
|
||||||
|
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||||
ppu.HScroll = val & 0x7;
|
ppu.HScroll = val & 0x7;
|
||||||
|
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
//console_printf(Console_Default, "%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1248,25 +1249,25 @@ x=d:00000111
|
|||||||
t:0000 0011 1110 0000=d:1111 1000
|
t:0000 0011 1110 0000=d:1111 1000
|
||||||
t:0111 0000 0000 0000=d:0000 0111
|
t:0111 0000 0000 0000=d:0000 0111
|
||||||
*/
|
*/
|
||||||
*/
|
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 0;
|
ppu.VRAMAddrMode = 0;
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFC1F) | ((val & 0xF8) << 2));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFC1F) | ((val & 0xF8) << 2));
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF) | ((val & 0x07) << 12));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF) | ((val & 0x07) << 12));
|
||||||
|
|
||||||
ppu.TmpVScroll = (val & 0x7);
|
ppu.TmpVScroll = (val & 0x7);
|
||||||
//if (ppu.TmpVScroll != 0)
|
//if (ppu.TmpVScroll != 0)
|
||||||
//if (ppu.TmpVScroll != 0)
|
//console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6: /* VRAM Address register 2 */
|
case 6: /* VRAM Address register 2 */
|
||||||
if (ppu.VRAMAddrMode == 0)
|
if (ppu.VRAMAddrMode == 0)
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 1;
|
ppu.VRAMAddrMode = 1;
|
||||||
/*
|
/*
|
||||||
2006 first write:
|
2006 first write:
|
||||||
@@ -1274,13 +1275,13 @@ t:0011 1111 0000 0000 = d:0011 1111
|
|||||||
t:1100 0000 0000 0000=0
|
t:1100 0000 0000 0000=0
|
||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 0;
|
ppu.VRAMAddrMode = 0;
|
||||||
/*
|
/*
|
||||||
2006 second write:
|
2006 second write:
|
||||||
@@ -1289,8 +1290,8 @@ v=t
|
|||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
//console_printf(Console_Default, "2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
//console_printf(Console_Default, "%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
229
src/ppu/ppu.c
229
src/ppu/ppu.c
@@ -5,46 +5,41 @@
|
|||||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-31 18:02:16 +0200 (jeu, 31 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
* $HeadURL$
|
||||||
* $Revision: 58 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Allegro includes */
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define USE_CONSOLE
|
||||||
|
#include <Allegro/allegro.h>
|
||||||
|
#else
|
||||||
|
#define USE_CONSOLE
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#define __TINES_PPU_INTERNAL__
|
#define __TINES_PPU_INTERNAL__
|
||||||
#include <ppu/ppu.h>
|
#include <ppu/ppu.h>
|
||||||
#include <ppu/ppu.memory.h>
|
#include <ppu/ppu.memory.h>
|
||||||
#include <ppu/ppu.debug.h>
|
#include <ppu/ppu.debug.h>
|
||||||
|
|
||||||
#include <M6502.h>
|
|
||||||
|
|
||||||
#include <memory/manager.h>
|
#include <memory/manager.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
#define __TINES_PLUGINS__
|
#define __TINES_PLUGINS__
|
||||||
#include <plugins/manager.h>
|
#include <plugins/manager.h>
|
||||||
|
|
||||||
#if ISPAL && !ISNTSC
|
|
||||||
//#define VBLANK_TIME 70
|
|
||||||
extern int VBLANK_TIME;
|
extern int VBLANK_TIME;
|
||||||
#elif !ISPAL && ISNTSC
|
|
||||||
//#define VBLANK_TIME 20
|
|
||||||
extern int VBLANK_TIME;
|
|
||||||
#else
|
|
||||||
#error Cannot use ISPAL with ISNTSC together !
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NO_N_KEY
|
|
||||||
#define IF_N_KEY if (!key[KEY_N])
|
|
||||||
#else
|
|
||||||
#define IF_N_KEY if (key[KEY_N])
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern BITMAP *Buffer;
|
extern BITMAP *Buffer;
|
||||||
|
|
||||||
@@ -53,6 +48,7 @@ volatile extern unsigned long IPS, FPS;
|
|||||||
|
|
||||||
extern unsigned long ColorPalette[ 9 * 63 ];
|
extern unsigned long ColorPalette[ 9 * 63 ];
|
||||||
extern short IRQScanHit;
|
extern short IRQScanHit;
|
||||||
|
extern short SZHit;
|
||||||
|
|
||||||
BITMAP *VideoBuffer; /* The ppu will only write pixel to this, and then bliting
|
BITMAP *VideoBuffer; /* The ppu will only write pixel to this, and then bliting
|
||||||
this on the screen "surface" */
|
this on the screen "surface" */
|
||||||
@@ -209,7 +205,7 @@ int ppu_init()
|
|||||||
if (!ppu_mem_paletteValues)
|
if (!ppu_mem_paletteValues)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
printf("ppu_mem_nameTables :%p\n"
|
console_printf(Console_Default, "ppu_mem_nameTables :%p\n"
|
||||||
"ppu_mem_patternTables:%p\n"
|
"ppu_mem_patternTables:%p\n"
|
||||||
"ppu_mem_paletteValues:%p\n",
|
"ppu_mem_paletteValues:%p\n",
|
||||||
ppu_mem_nameTables,
|
ppu_mem_nameTables,
|
||||||
@@ -238,9 +234,6 @@ int ppu_init()
|
|||||||
|
|
||||||
//memcpy(ppu_mem_paletteValues, defaultColors, 32);
|
//memcpy(ppu_mem_paletteValues, defaultColors, 32);
|
||||||
|
|
||||||
/* Dump PPU memory state */
|
|
||||||
//ppu_memoryDumpState(stdout);
|
|
||||||
|
|
||||||
/* Set some other variables */
|
/* Set some other variables */
|
||||||
ppu_VramAccessFlipFlop = 0;
|
ppu_VramAccessFlipFlop = 0;
|
||||||
|
|
||||||
@@ -270,12 +263,6 @@ int ppu_init()
|
|||||||
for(i = 0x21; i < 0x40; i++)
|
for(i = 0x21; i < 0x40; i++)
|
||||||
set_page_ghost(i, true, 0x20);
|
set_page_ghost(i, true, 0x20);
|
||||||
|
|
||||||
// plugin_install_keypressHandler('i', ppu_debugSprites);
|
|
||||||
// plugin_install_keypressHandler('I', ppu_debugSprites);
|
|
||||||
|
|
||||||
// plugin_install_keypressHandler('u', ppu_debugColor);
|
|
||||||
// plugin_install_keypressHandler('U', ppu_debugColor);
|
|
||||||
|
|
||||||
/* allocate the PPU Video memory */
|
/* allocate the PPU Video memory */
|
||||||
VideoBuffer = create_bitmap(256, 240);
|
VideoBuffer = create_bitmap(256, 240);
|
||||||
|
|
||||||
@@ -287,8 +274,9 @@ int ppu_init()
|
|||||||
|
|
||||||
void ppu_updateSpriteScanlineTable()
|
void ppu_updateSpriteScanlineTable()
|
||||||
{
|
{
|
||||||
int i, line, j, k;
|
int32_t i,j,k;
|
||||||
volatile int sprite_x, sprite_y, sprite_idx, sprite_attr;
|
int line;
|
||||||
|
volatile int32_t sprite_x, sprite_y, sprite_idx, sprite_attr;
|
||||||
|
|
||||||
int curline;
|
int curline;
|
||||||
|
|
||||||
@@ -322,17 +310,16 @@ void ppu_updateSpriteScanlineTable()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
PPU_NbSpriteByScanLineOverFlow[curline] = 1;
|
PPU_NbSpriteByScanLineOverFlow[curline] = 1;
|
||||||
//printf("sprite of: %u - %u\n", curline, PPU_NbSpriteByScanLine[curline]);
|
|
||||||
continue; /* We have 8 sprite in this line, don't continue */
|
continue; /* We have 8 sprite in this line, don't continue */
|
||||||
}
|
}
|
||||||
if (((sprite_x+8) < 0) && ((sprite_x-8) > 256))
|
if (((sprite_x+8) < 0) && ((sprite_x-8) > 256))
|
||||||
continue; /* this sprite isn't either displayable */
|
continue; /* this sprite isn't either displayable */
|
||||||
/* Now test if this sprite can be put in the sprite list */
|
/* Now test if this sprite can be put in the sprite list */
|
||||||
for (j = 0; j <= PPU_NbSpriteByScanLine[curline]; j++)
|
for (j = 0; j <= (int32_t)PPU_NbSpriteByScanLine[curline]; j++)
|
||||||
{
|
{
|
||||||
/* sprite are ordered by their y value, so, the first time that
|
/* sprite are ordered by their y value, so, the first time that
|
||||||
we have lower y value is where we need to put the sprite */
|
we have lower y value is where we need to put the sprite */
|
||||||
if (sprite_x < PPU_SCANLINESPRITE_GET_X(PPU_SpriteByScanLine[curline][j]))
|
if (sprite_x < (int32_t)PPU_SCANLINESPRITE_GET_X(PPU_SpriteByScanLine[curline][j]))
|
||||||
{
|
{
|
||||||
/* move the j eme item and next to the right in the list, trashing
|
/* move the j eme item and next to the right in the list, trashing
|
||||||
if needed the rightest item. */
|
if needed the rightest item. */
|
||||||
@@ -342,18 +329,12 @@ void ppu_updateSpriteScanlineTable()
|
|||||||
PPU_SpriteByScanLine[curline][j] = 0;
|
PPU_SpriteByScanLine[curline][j] = 0;
|
||||||
|
|
||||||
PPU_SCANLINESPRITE_SET_ATTRS (PPU_SpriteByScanLine[curline][j], sprite_attr);
|
PPU_SCANLINESPRITE_SET_ATTRS (PPU_SpriteByScanLine[curline][j], sprite_attr);
|
||||||
//printf("new sprite [%02X:%02X:%02X:%02X] at sl:%d : 0x%08X ",
|
|
||||||
//sprite_attr, sprite_idx, curline - sprite_x, sprite_y,
|
|
||||||
//curline, PPU_SpriteByScanLine[curline][j]);
|
|
||||||
|
|
||||||
PPU_SCANLINESPRITE_SET_TILIDX(PPU_SpriteByScanLine[curline][j], sprite_idx);
|
PPU_SCANLINESPRITE_SET_TILIDX(PPU_SpriteByScanLine[curline][j], sprite_idx);
|
||||||
//printf("- 0x%08X ", PPU_SpriteByScanLine[curline][j]);
|
|
||||||
|
|
||||||
PPU_SCANLINESPRITE_SET_RELY (PPU_SpriteByScanLine[curline][j], curline - sprite_y);
|
PPU_SCANLINESPRITE_SET_RELY (PPU_SpriteByScanLine[curline][j], curline - sprite_y);
|
||||||
//printf("- 0x%08X ", PPU_SpriteByScanLine[curline][j]);
|
|
||||||
|
|
||||||
PPU_SCANLINESPRITE_SET_X (PPU_SpriteByScanLine[curline][j], sprite_x);
|
PPU_SCANLINESPRITE_SET_X (PPU_SpriteByScanLine[curline][j], sprite_x);
|
||||||
//printf("- 0x%08X\n", PPU_SpriteByScanLine[curline][j]);
|
|
||||||
|
|
||||||
break; /* Stop the for, we don't need to go further in the line list */
|
break; /* Stop the for, we don't need to go further in the line list */
|
||||||
}
|
}
|
||||||
@@ -377,14 +358,12 @@ void ppu_setMirroring(byte direction)
|
|||||||
ppu_mirrorMode = direction;
|
ppu_mirrorMode = direction;
|
||||||
|
|
||||||
case PPU_MIRROR_HORIZTAL: /* Horizontal */
|
case PPU_MIRROR_HORIZTAL: /* Horizontal */
|
||||||
//printf("Set mirror to Hor\n");
|
|
||||||
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
||||||
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x000);
|
||||||
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x400);
|
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x400);
|
||||||
ppu_setPagePtr1k(0x2C, ppu_mem_nameTables + 0x400);
|
ppu_setPagePtr1k(0x2C, ppu_mem_nameTables + 0x400);
|
||||||
break;
|
break;
|
||||||
case PPU_MIRROR_VERTICAL: /* Vertical */
|
case PPU_MIRROR_VERTICAL: /* Vertical */
|
||||||
//printf("Set mirror to Ver\n");
|
|
||||||
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
||||||
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
|
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
|
||||||
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x000);
|
||||||
@@ -408,7 +387,6 @@ void ppu_setSingleScreen(byte screen)
|
|||||||
ppu_singleScreenMode = screen;
|
ppu_singleScreenMode = screen;
|
||||||
|
|
||||||
case PPU_SCREEN_000: /* 0x2000 */
|
case PPU_SCREEN_000: /* 0x2000 */
|
||||||
//printf("Set screen to 0x000\n");
|
|
||||||
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
||||||
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x000);
|
||||||
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x000);
|
||||||
@@ -416,7 +394,6 @@ void ppu_setSingleScreen(byte screen)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PPU_SCREEN_400: /* 0x2400 */
|
case PPU_SCREEN_400: /* 0x2400 */
|
||||||
//printf("Set screen to 0x400\n");
|
|
||||||
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x400);
|
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x400);
|
||||||
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
|
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
|
||||||
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x400);
|
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x400);
|
||||||
@@ -424,7 +401,6 @@ void ppu_setSingleScreen(byte screen)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PPU_SCREEN_800: /* 0x2800 */
|
case PPU_SCREEN_800: /* 0x2800 */
|
||||||
//printf("Set screen to 0x800\n");
|
|
||||||
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x800);
|
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x800);
|
||||||
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x800);
|
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x800);
|
||||||
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x800);
|
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x800);
|
||||||
@@ -432,7 +408,6 @@ void ppu_setSingleScreen(byte screen)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PPU_SCREEN_C00: /* 0x2C00 */
|
case PPU_SCREEN_C00: /* 0x2C00 */
|
||||||
//printf("Set screen to 0xC00\n");
|
|
||||||
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0xC00);
|
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0xC00);
|
||||||
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0xC00);
|
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0xC00);
|
||||||
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0xC00);
|
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0xC00);
|
||||||
@@ -456,7 +431,6 @@ void ppu_setScreenMode(byte mode)
|
|||||||
switch(mode)
|
switch(mode)
|
||||||
{
|
{
|
||||||
case PPU_SCMODE_SINGLE: /* Single screen (1 NT with mirroring) */
|
case PPU_SCMODE_SINGLE: /* Single screen (1 NT with mirroring) */
|
||||||
//printf("Set Single Screen\n");
|
|
||||||
ppu_setSingleScreen(~ppu_singleScreenMode);
|
ppu_setSingleScreen(~ppu_singleScreenMode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -465,12 +439,10 @@ void ppu_setScreenMode(byte mode)
|
|||||||
ppu_screenMode = mode;
|
ppu_screenMode = mode;
|
||||||
|
|
||||||
case PPU_SCMODE_NORMAL: /* Normal screen (2 NT with mirroring) */
|
case PPU_SCMODE_NORMAL: /* Normal screen (2 NT with mirroring) */
|
||||||
//printf("Set Normal Screen\n");
|
|
||||||
ppu_setMirroring(~ppu_mirrorMode);
|
ppu_setMirroring(~ppu_mirrorMode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PPU_SCMODE_FOURSC: /* Four screen (4 NT withou mirroring) */
|
case PPU_SCMODE_FOURSC: /* Four screen (4 NT withou mirroring) */
|
||||||
//printf("Set Four Screen\n");
|
|
||||||
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
|
||||||
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
|
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
|
||||||
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x800);
|
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x800);
|
||||||
@@ -479,11 +451,6 @@ void ppu_setScreenMode(byte mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ppu_setSprite(unsigned short i, PPU_Sprite *sprt)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update whole counters */
|
/* update whole counters */
|
||||||
void ppu_updateCounters()
|
void ppu_updateCounters()
|
||||||
{
|
{
|
||||||
@@ -509,31 +476,26 @@ _AAA BCDD DDDE EEEE
|
|||||||
PPU_Reg_Counter |= PPU_Reg_H << 10;
|
PPU_Reg_Counter |= PPU_Reg_H << 10;
|
||||||
PPU_Reg_Counter |= PPU_Reg_VT << 5;
|
PPU_Reg_Counter |= PPU_Reg_VT << 5;
|
||||||
PPU_Reg_Counter |= PPU_Reg_HT;
|
PPU_Reg_Counter |= PPU_Reg_HT;
|
||||||
|
|
||||||
IF_N_KEY printf("Counter update to %04X\n",PPU_Reg_Counter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern M6502 MainCPU;
|
|
||||||
|
|
||||||
int ppu_hblank(int scanline)
|
int ppu_hblank(int scanline)
|
||||||
{
|
{
|
||||||
int i, j;
|
uint32_t i, j;
|
||||||
byte pixelColor = 0x42;
|
byte pixelColor = 0x42;
|
||||||
byte BgColor = 0x42;
|
byte BgColor = 0x42;
|
||||||
byte SpriteColor = 0x42;
|
byte SpriteColor = 0x42;
|
||||||
unsigned short addr;
|
uint16_t addr;
|
||||||
byte value;
|
byte value;
|
||||||
unsigned short tmp_HHT = 0;
|
uint16_t tmp_HHT = 0;
|
||||||
unsigned short tmp_VVTFV = 0;
|
uint16_t tmp_VVTFV = 0;
|
||||||
unsigned long CurrentSprite;
|
uint32_t CurrentSprite;
|
||||||
byte SpriteVFlip;
|
byte SpriteVFlip;
|
||||||
|
|
||||||
/* If no plan activated, we have nothing to do ! */
|
|
||||||
|
|
||||||
if (scanline == 0)
|
if (scanline == 0)
|
||||||
{
|
{
|
||||||
ppu_bgColor = ppu_readMemory(0x3F,00);
|
ppu_bgColor = ppu_readMemory(0x3F,00);
|
||||||
clear_to_color(VideoBuffer, ppu_bgColor);
|
|
||||||
|
rectfill(Buffer, 256, 0, 277, 260, ppu_bgColor);
|
||||||
|
|
||||||
if ((ppu_spriteVisibility != 0) || (ppu_backgroundVisibility != 0))
|
if ((ppu_spriteVisibility != 0) || (ppu_backgroundVisibility != 0))
|
||||||
ppu_updateCounters();
|
ppu_updateCounters();
|
||||||
@@ -629,7 +591,6 @@ int ppu_hblank(int scanline)
|
|||||||
else
|
else
|
||||||
addr = (((PPU_SCANLINESPRITE_GET_TILIDX(CurrentSprite)&0xFE) + (SpriteVFlip?0:1)) << 4) + ((PPU_SCANLINESPRITE_GET_TILIDX(CurrentSprite)&0x01)?0x1000:0x0000);
|
addr = (((PPU_SCANLINESPRITE_GET_TILIDX(CurrentSprite)&0xFE) + (SpriteVFlip?0:1)) << 4) + ((PPU_SCANLINESPRITE_GET_TILIDX(CurrentSprite)&0x01)?0x1000:0x0000);
|
||||||
}
|
}
|
||||||
//printf("sprite addr: %04X\n", addr);
|
|
||||||
if (SpriteVFlip)
|
if (SpriteVFlip)
|
||||||
{
|
{
|
||||||
addr += 7;
|
addr += 7;
|
||||||
@@ -665,7 +626,12 @@ int ppu_hblank(int scanline)
|
|||||||
if ((PPU_SCANLINESPRITE_GET_ATTRS(CurrentSprite) & 0x04) &&
|
if ((PPU_SCANLINESPRITE_GET_ATTRS(CurrentSprite) & 0x04) &&
|
||||||
(SpriteColor != 0x00) && (BgColor != 0x00))
|
(SpriteColor != 0x00) && (BgColor != 0x00))
|
||||||
{
|
{
|
||||||
ppu_spriteZeroHit = 1;
|
if (!ppu_spriteZeroHit)
|
||||||
|
{
|
||||||
|
ppu_spriteZeroHit = (ppu_backgroundVisibility)?1:0;
|
||||||
|
if (ppu_spriteZeroHit)
|
||||||
|
SZHit = scanline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( ( (PPU_SCANLINESPRITE_GET_ATTRS(CurrentSprite) & PPU_SPRITE_FLAGS_BGPRIO) && (BgColor == 0x0000)) ||
|
if ( ( (PPU_SCANLINESPRITE_GET_ATTRS(CurrentSprite) & PPU_SPRITE_FLAGS_BGPRIO) && (BgColor == 0x0000)) ||
|
||||||
(!(PPU_SCANLINESPRITE_GET_ATTRS(CurrentSprite) & PPU_SPRITE_FLAGS_BGPRIO)) )
|
(!(PPU_SCANLINESPRITE_GET_ATTRS(CurrentSprite) & PPU_SPRITE_FLAGS_BGPRIO)) )
|
||||||
@@ -675,12 +641,13 @@ int ppu_hblank(int scanline)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set to monochrome if needed */
|
||||||
|
if (ppu_displayType)
|
||||||
|
pixelColor &= 0x30;
|
||||||
|
|
||||||
/* draw the pixel */
|
/* draw the pixel */
|
||||||
/*if (ppu_displayType)
|
|
||||||
pixelColor &= 0x30;*/
|
|
||||||
_putpixel(VideoBuffer, i, scanline, pixelColor);
|
_putpixel(VideoBuffer, i, scanline, pixelColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ppu_backgroundVisibility || ppu_spriteVisibility)
|
if (ppu_backgroundVisibility || ppu_spriteVisibility)
|
||||||
if (PPU_NbSpriteByScanLineOverFlow[scanline] == 1)
|
if (PPU_NbSpriteByScanLineOverFlow[scanline] == 1)
|
||||||
@@ -688,31 +655,25 @@ int ppu_hblank(int scanline)
|
|||||||
|
|
||||||
//blit(VideoBuffer, screen, 0, scanline, 0, scanline, 256, 1);
|
//blit(VideoBuffer, screen, 0, scanline, 0, scanline, 256, 1);
|
||||||
|
|
||||||
|
|
||||||
if (ppu_backgroundVisibility == 1)
|
if (ppu_backgroundVisibility == 1)
|
||||||
{
|
{
|
||||||
|
|
||||||
tmp_VVTFV = ((PPU_Reg_Counter >> 3 ) & 0x0100) | /* V */
|
tmp_VVTFV = ((PPU_Reg_Counter >> 3 ) & 0x0100) | /* V */
|
||||||
((PPU_Reg_Counter >> 2 ) & 0x00F8) | /* VT */
|
((PPU_Reg_Counter >> 2 ) & 0x00F8) | /* VT */
|
||||||
((PPU_Reg_Counter >> 12) & 0x0007); /* FV */
|
((PPU_Reg_Counter >> 12) & 0x0007); /* FV */
|
||||||
//printf("counter:%04X vvtfv:%04X ", PPU_Reg_Counter, tmp_VVTFV);
|
|
||||||
|
|
||||||
tmp_VVTFV++;
|
tmp_VVTFV++;
|
||||||
//printf("__ vvtfv:0x%04X == 0x%04X ? ", tmp_VVTFV, 30<<3);
|
|
||||||
if ((tmp_VVTFV&0x0F8) == 0xF0)
|
if ((tmp_VVTFV&0x0F8) == 0xF0)
|
||||||
{
|
{
|
||||||
tmp_VVTFV &= ~0x0F8;
|
tmp_VVTFV &= ~0x0F8;
|
||||||
tmp_VVTFV ^= 0x100;
|
tmp_VVTFV ^= 0x100;
|
||||||
//printf("YES _");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("vvtfv:%04X ", tmp_VVTFV);
|
|
||||||
PPU_Reg_Counter = ( PPU_Reg_Counter & 0x041F) |
|
PPU_Reg_Counter = ( PPU_Reg_Counter & 0x041F) |
|
||||||
((tmp_VVTFV & 0x0100 ) << 3 ) | /* V */
|
((tmp_VVTFV & 0x0100 ) << 3 ) | /* V */
|
||||||
((tmp_VVTFV & 0x00F8 ) << 2 ) | /* VT */
|
((tmp_VVTFV & 0x00F8 ) << 2 ) | /* VT */
|
||||||
((tmp_VVTFV & 0x0007 ) << 12); /* FV */
|
((tmp_VVTFV & 0x0007 ) << 12); /* FV */
|
||||||
|
|
||||||
//printf("counter:%04X ", PPU_Reg_Counter);
|
|
||||||
/* Update H & HT */
|
/* Update H & HT */
|
||||||
PPU_Reg_Counter = (PPU_Reg_Counter & ~0x041F) |
|
PPU_Reg_Counter = (PPU_Reg_Counter & ~0x041F) |
|
||||||
(PPU_Reg_H << 10) |
|
(PPU_Reg_H << 10) |
|
||||||
@@ -720,7 +681,6 @@ int ppu_hblank(int scanline)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Increment only V & VT & FV*/
|
/* Increment only V & VT & FV*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
8421 8421 8421 8421
|
8421 8421 8421 8421
|
||||||
@@ -745,49 +705,40 @@ E = HT
|
|||||||
*/
|
*/
|
||||||
if (scanline == 239)
|
if (scanline == 239)
|
||||||
{
|
{
|
||||||
ppu_inVBlankTime = 1;
|
ppu_inVBlankTime = 1;
|
||||||
IF_N_KEY printf("============= enter vblank =================\n");
|
textprintf_ex(Buffer, font, 260, 3, 4, 0, "FPS : %ld (CPU@~%2.2fMhz : %d%%)", FPS, (float) (((float) IPS) / 1000000.0), (int) ((((float) IPS) / 1770000.0) * 100.0));
|
||||||
|
|
||||||
|
blit(VideoBuffer, Buffer, 0, 0, 0, 0, 256, 240);
|
||||||
|
blit(Buffer, screen, 0, 0, 0, 0, 512+256, 512);
|
||||||
|
|
||||||
return ppu_execNMIonVBlank;
|
return ppu_execNMIonVBlank;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (scanline == SZHit)
|
||||||
|
{
|
||||||
|
line(Buffer, 257, scanline, 267, scanline, 0x12);
|
||||||
|
line(Buffer, 257, scanline, 260, scanline-2, 0x12);
|
||||||
|
line(Buffer, 257, scanline, 260, scanline+2, 0x12);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scanline == IRQScanHit)
|
||||||
|
{
|
||||||
|
line(Buffer, 267, scanline, 277, scanline, 0x13);
|
||||||
|
line(Buffer, 267, scanline, 270, scanline-2, 0x13);
|
||||||
|
line(Buffer, 267, scanline, 270, scanline+2, 0x13);
|
||||||
|
}
|
||||||
|
|
||||||
if (key[KEY_B])
|
if (key[KEY_B])
|
||||||
{
|
{
|
||||||
blit(VideoBuffer, Buffer, 0, 0, 0, 0, 256, 240);
|
blit(VideoBuffer, Buffer, 0, 0, 0, 0, 256, 240);
|
||||||
blit(Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
|
blit(Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (scanline == (239 + VBLANK_TIME)+0)
|
||||||
if (scanline >= (240 + VBLANK_TIME))
|
|
||||||
{
|
{
|
||||||
/*for ( i = 0; i < 256; i++)
|
|
||||||
for ( j = 0; j < 256; j++)
|
|
||||||
{
|
|
||||||
int i2 = i<<1, j2 = j<<1;
|
|
||||||
putpixel(Buffer, i2 , j2 , Op6502(i+j*256));
|
|
||||||
putpixel(Buffer, i2 , j2+1, Op6502(i+j*256));
|
|
||||||
putpixel(Buffer, i2+1, j2 , Op6502(i+j*256));
|
|
||||||
// putpixel(Buffer, i2+1, j2+1, Op6502(i+j*256));
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//textprintf(Buffer, font, 5, 340, 4, "(SL:%d) FPS : %d IPS : %d", scanline, FPS, IPS);
|
|
||||||
textprintf(Buffer, font, 260, 3, 4, "FPS : %d (CPU@~%2.2fMhz : %d%%)", FPS, (float) (((float) IPS) / 1000000.0), (int) ((((float) IPS) / 1770000.0) * 100.0));
|
|
||||||
//printf("(SL:%d) FPS : %d IPS : %d\n", scanline, FPS, IPS);
|
|
||||||
|
|
||||||
ppu_dumpPalette(0, 241);
|
|
||||||
ppu_dumpPattern(280, 150);
|
|
||||||
ppu_dumpNameTable(256,0);
|
|
||||||
//ppu_dumpAttributeTable(257, 0);
|
|
||||||
|
|
||||||
blit(VideoBuffer, Buffer, 0, 0, 0, 0, 256, 240);
|
|
||||||
blit(Buffer, screen, 0, 0, 0, 0, 512+256, 512);
|
|
||||||
//blit(VideoBuffer, screen, 0, 0, 0, 0, 256, 240);
|
|
||||||
|
|
||||||
|
|
||||||
IF_N_KEY printf("_____________ leave vblank _________________\n");
|
|
||||||
ppu_inVBlankTime = 0;
|
ppu_inVBlankTime = 0;
|
||||||
ppu_spriteZeroHit = 0;
|
ppu_spriteZeroHit = 0;
|
||||||
ppu_scanlineSpriteOverflow = 0;
|
ppu_scanlineSpriteOverflow = 0;
|
||||||
//ppu_updateCounters();
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -803,7 +754,6 @@ byte ppu_readReg(byte id)
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
garbage = PPU_RegValues[id];
|
garbage = PPU_RegValues[id];
|
||||||
printf("%s: try to read 0x20%02X\n", __func__, id);
|
|
||||||
break;
|
break;
|
||||||
case 0x02: /* PPU Status Register */
|
case 0x02: /* PPU Status Register */
|
||||||
|
|
||||||
@@ -814,9 +764,6 @@ byte ppu_readReg(byte id)
|
|||||||
garbage |= (ppu_inVBlankTime!=0) ?PPU_FLAG_SR_VBLANK:0;
|
garbage |= (ppu_inVBlankTime!=0) ?PPU_FLAG_SR_VBLANK:0;
|
||||||
garbage |= (ppu_spriteZeroHit!=0) ?PPU_FLAG_SR_SPRT0:0;
|
garbage |= (ppu_spriteZeroHit!=0) ?PPU_FLAG_SR_SPRT0:0;
|
||||||
garbage |= (ppu_scanlineSpriteOverflow!=0)?PPU_FLAG_SR_8SPRT:0;
|
garbage |= (ppu_scanlineSpriteOverflow!=0)?PPU_FLAG_SR_8SPRT:0;
|
||||||
/*garbage ^= PPU_FLAG_SR_RDWRALLOW;*/
|
|
||||||
|
|
||||||
IF_N_KEY printf("%s() = %02X\n", __func__, garbage);
|
|
||||||
|
|
||||||
ppu_inVBlankTime = 0;
|
ppu_inVBlankTime = 0;
|
||||||
break;
|
break;
|
||||||
@@ -844,7 +791,6 @@ byte ppu_readReg(byte id)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//printf("ppuread %02X return: %02X\n", id, garbage);
|
|
||||||
return garbage;
|
return garbage;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -852,12 +798,10 @@ byte ppu_readReg(byte id)
|
|||||||
void ppu_writeReg(byte id, byte val)
|
void ppu_writeReg(byte id, byte val)
|
||||||
{
|
{
|
||||||
id &= 0x07;
|
id &= 0x07;
|
||||||
//printf("ppuwrte %02X val: %02X\n", id, val);
|
|
||||||
PPU_RegValues[id] = val;
|
PPU_RegValues[id] = val;
|
||||||
switch(id)
|
switch(id)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
//printf("%s: try to write 0x%02X @ 0x20%02X\n", __func__, val, id);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x00: /* PPU Control Register #1 */
|
case 0x00: /* PPU Control Register #1 */
|
||||||
@@ -872,18 +816,6 @@ void ppu_writeReg(byte id, byte val)
|
|||||||
| |+===++=++=++=====++=====+ |
|
| |+===++=++=++=====++=====+ |
|
||||||
+---------------+-----------------------------------------------+
|
+---------------+-----------------------------------------------+
|
||||||
*/
|
*/
|
||||||
IF_N_KEY
|
|
||||||
printf("%s(%02X, %02X); /* 2000: "
|
|
||||||
"NMI:%c SPRTSIZE:%02d BGTA:%04X[0x%04X] SPTA:%04X INC:%02d NTA:%04X */\n",
|
|
||||||
__func__, id, val,
|
|
||||||
(val & 0x80)?'E':'D',
|
|
||||||
(val & 0x20)?16:8,
|
|
||||||
(val & 0x10)?0x1000:0x0000, PPU_Reg_S,
|
|
||||||
(val & 0x08)?0x1000:0x0000,
|
|
||||||
(val & 0x04)?32:1,
|
|
||||||
(val & 0x03)<<10|0x2000
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Set PPU internal registers */
|
/* Set PPU internal registers */
|
||||||
PPU_Reg_V = (val & 0x02)?1:0;
|
PPU_Reg_V = (val & 0x02)?1:0;
|
||||||
PPU_Reg_H = (val & 0x01)?1:0;
|
PPU_Reg_H = (val & 0x01)?1:0;
|
||||||
@@ -905,17 +837,6 @@ void ppu_writeReg(byte id, byte val)
|
|||||||
ppu_displayType = (val & 0x01)?1:0;
|
ppu_displayType = (val & 0x01)?1:0;
|
||||||
|
|
||||||
ppu_updateSpriteScanlineTable();
|
ppu_updateSpriteScanlineTable();
|
||||||
|
|
||||||
IF_N_KEY
|
|
||||||
printf("%s(%02X, %02X); /* 2001 : "
|
|
||||||
"SprtV:%c BckgV:%c SprtC:%c BckgC:%c DispT:%c"
|
|
||||||
" */\n", __func__, id, val,
|
|
||||||
ppu_spriteVisibility?'y':'n',
|
|
||||||
ppu_backgroundVisibility?'y':'n',
|
|
||||||
ppu_spriteClipping?'y':'n',
|
|
||||||
ppu_backgroundClipping?'y':'n',
|
|
||||||
ppu_displayType?'m':'c'
|
|
||||||
);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x03: /* SPR-RAM Address Register */
|
case 0x03: /* SPR-RAM Address Register */
|
||||||
@@ -945,8 +866,6 @@ void ppu_writeReg(byte id, byte val)
|
|||||||
|
|
||||||
PPU_Reg_FH = val & 0x07;
|
PPU_Reg_FH = val & 0x07;
|
||||||
PPU_Reg_HT = (val & 0xF8) >> 3;
|
PPU_Reg_HT = (val & 0xF8) >> 3;
|
||||||
IF_N_KEY
|
|
||||||
printf("2005/1[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -954,8 +873,6 @@ void ppu_writeReg(byte id, byte val)
|
|||||||
|
|
||||||
PPU_Reg_FV = val & 0x07;
|
PPU_Reg_FV = val & 0x07;
|
||||||
PPU_Reg_VT = (val & 0xF8) >> 3;
|
PPU_Reg_VT = (val & 0xF8) >> 3;
|
||||||
IF_N_KEY
|
|
||||||
printf("2005/2[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -980,8 +897,6 @@ void ppu_writeReg(byte id, byte val)
|
|||||||
PPU_Reg_V = (val >> 3) & 0x01;
|
PPU_Reg_V = (val >> 3) & 0x01;
|
||||||
PPU_Reg_H = (val >> 2) & 0x01;
|
PPU_Reg_H = (val >> 2) & 0x01;
|
||||||
PPU_Reg_VT = (PPU_Reg_VT & 0x07) | ((val & 0x03) << 3);
|
PPU_Reg_VT = (PPU_Reg_VT & 0x07) | ((val & 0x03) << 3);
|
||||||
IF_N_KEY
|
|
||||||
printf("2006/1[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -989,9 +904,6 @@ void ppu_writeReg(byte id, byte val)
|
|||||||
PPU_Reg_VT = (PPU_Reg_VT & 0x18) | ((val >> 5) & 0x07);
|
PPU_Reg_VT = (PPU_Reg_VT & 0x18) | ((val >> 5) & 0x07);
|
||||||
PPU_Reg_HT = val & 0x1F;
|
PPU_Reg_HT = val & 0x1F;
|
||||||
|
|
||||||
IF_N_KEY
|
|
||||||
printf("2006/2[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
|
|
||||||
|
|
||||||
ppu_updateCounters();
|
ppu_updateCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1009,25 +921,7 @@ void ppu_writeReg(byte id, byte val)
|
|||||||
+===============+===============================================+
|
+===============+===============================================+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//if ( (PPU_Reg_Counter&0xFF00) == 0x3F00)
|
|
||||||
//{
|
|
||||||
// printf("fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
|
|
||||||
// printf("will write ppu: counter:%04X pa:%02X%02X v:%02X\n",
|
|
||||||
// PPU_Reg_Counter, (PPU_Reg_Counter>>8) & 0x3F, PPU_Reg_Counter & 0xFF, val);
|
|
||||||
// }
|
|
||||||
|
|
||||||
ppu_writeMemory((PPU_Reg_Counter>>8) & 0x3F, PPU_Reg_Counter & 0xFF, val);
|
ppu_writeMemory((PPU_Reg_Counter>>8) & 0x3F, PPU_Reg_Counter & 0xFF, val);
|
||||||
|
|
||||||
IF_N_KEY
|
|
||||||
{
|
|
||||||
ppu_dumpPalette(0, 241);
|
|
||||||
ppu_dumpPattern(280, 150);
|
|
||||||
ppu_dumpNameTable(256,0);
|
|
||||||
blit(Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
|
|
||||||
}
|
|
||||||
|
|
||||||
PPU_Reg_Counter += ppu_addrIncrement;
|
PPU_Reg_Counter += ppu_addrIncrement;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -1042,6 +936,5 @@ void ppu_fillSprRamDMA(byte value)
|
|||||||
{
|
{
|
||||||
ppu_mem_spritesTable[(ppu_mem_sptrTablePtr + i)&0xFF] = *(ptr+i);
|
ppu_mem_spritesTable[(ppu_mem_sptrTablePtr + i)&0xFF] = *(ptr+i);
|
||||||
}
|
}
|
||||||
//memcpy(ppu_mem_spritesTable, ptr, 0xFF);
|
|
||||||
ppu_updateSpriteScanlineTable();
|
ppu_updateSpriteScanlineTable();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,22 +2,24 @@
|
|||||||
* PPU Memory manager - The TI-NESulator Project
|
* PPU Memory manager - The TI-NESulator Project
|
||||||
* ppu.memory.c - Inspired from the memory manager of the Quick6502 Project.
|
* ppu.memory.c - Inspired from the memory manager of the Quick6502 Project.
|
||||||
*
|
*
|
||||||
* Created by Manoël Trapier on 12/04/07.
|
* Created by Manoel Trapier on 12/04/07.
|
||||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu/ppu.memory.c $
|
* $HeadURL$
|
||||||
* $Revision: 53 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <os_dependent.h>
|
||||||
|
|
||||||
#define __TINES_PPU_INTERNAL__
|
#define __TINES_PPU_INTERNAL__
|
||||||
|
|
||||||
#include <ppu.h>
|
#include <ppu/ppu.h>
|
||||||
#include <ppu/ppu.memory.h>
|
#include <ppu/ppu.memory.h>
|
||||||
|
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
@@ -120,7 +122,7 @@ void ppu_setPageGhost(byte page, bool value, byte ghost)
|
|||||||
{
|
{
|
||||||
ppu_memoryPages[page] = ppu_memoryPages[ghost];
|
ppu_memoryPages[page] = ppu_memoryPages[ghost];
|
||||||
ppu_memoryGhostLink[ghost] = page;
|
ppu_memoryGhostLink[ghost] = page;
|
||||||
printf("set ghost of 0x%02X to 0x%02X (ptr: %p)\n", ghost, page, ppu_memoryGhostLink[ghost]);
|
console_printf(Console_Default, "set ghost of 0x%02X to 0x%02X (ptr: %p)\n", ghost, page, &(ppu_memoryGhostLink[ghost]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +157,7 @@ void ppu_writeMemory(byte page, byte addr, byte value)
|
|||||||
{
|
{
|
||||||
/* Here we will cheat with the palette miroring, since we didn't write
|
/* Here we will cheat with the palette miroring, since we didn't write
|
||||||
as often as we read the palette, we will mirror here */
|
as often as we read the palette, we will mirror here */
|
||||||
//printf("%s palette: color %02X new value : %02d (0x%02X%02X)\n", ((addr&0x10)< 0x10) ? "Bgnd" : "Sprt", addr&0x1F, value & 0x3F, page, addr);
|
//console_printf(Console_Default, "%s palette: color %02X new value : %02d (0x%02X%02X)\n", ((addr&0x10)< 0x10) ? "Bgnd" : "Sprt", addr&0x1F, value & 0x3F, page, addr);
|
||||||
if ((addr & 0xEF) == 0x00)
|
if ((addr & 0xEF) == 0x00)
|
||||||
{
|
{
|
||||||
ppu_memoryPages[0x3F][0x00] = value;
|
ppu_memoryPages[0x3F][0x00] = value;
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-04 18:46:30 +0200 (mer, 04 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
* $HeadURL$
|
||||||
* $Revision: 30 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
|||||||
else
|
else
|
||||||
if (Addr >= 0x3F00)
|
if (Addr >= 0x3F00)
|
||||||
{
|
{
|
||||||
//printf("%s palette: color %x new value : %d (0x%x)\n", (PalAddr(Addr) < 0x10) ? "Bgnd" : "Sprt", PalAddr(Addr), Value & 0x3F, Addr);
|
//console_printf(Console_Default, "%s palette: color %x new value : %d (0x%x)\n", (PalAddr(Addr) < 0x10) ? "Bgnd" : "Sprt", PalAddr(Addr), Value & 0x3F, Addr);
|
||||||
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
||||||
if (PalAddr(Addr) == 0x10)
|
if (PalAddr(Addr) == 0x10)
|
||||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||||
@@ -260,7 +260,7 @@ void NewPPUDispSprite()
|
|||||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||||
{
|
{
|
||||||
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
||||||
//printf("%d Hohoho!\n", py);
|
//console_printf(Console_Default, "%d Hohoho!\n", py);
|
||||||
// line(Buffer, 0, py+1, 256, py+1, 10);
|
// line(Buffer, 0, py+1, 256, py+1, 10);
|
||||||
//continue; // Do not display more than 8 sprites on this line :p
|
//continue; // Do not display more than 8 sprites on this line :p
|
||||||
}
|
}
|
||||||
@@ -551,7 +551,7 @@ struct timeval timeStart, timeEnd;
|
|||||||
clear_to_color(Buffer, BgColor);
|
clear_to_color(Buffer, BgColor);
|
||||||
|
|
||||||
/* if (ppu.ControlRegister2.s.Colour != 0)
|
/* if (ppu.ControlRegister2.s.Colour != 0)
|
||||||
printf("ppu.ColorEmphasis : %d", ppu.ControlRegister2.s.Colour);*/
|
console_printf(Console_Default, "ppu.ColorEmphasis : %d", ppu.ControlRegister2.s.Colour);*/
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < 249; i++)
|
for (i = 0; i < 249; i++)
|
||||||
@@ -809,7 +809,7 @@ frame start (line 0) (if background or sprites are enabled):
|
|||||||
v=t
|
v=t
|
||||||
*/
|
*/
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
||||||
//printf("Starting addresses : 0x%X\n",ppu.VRAMAddrReg2.W);
|
//console_printf(Console_Default, "Starting addresses : 0x%X\n",ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
XScroll = ppu.TimedHScroll[0];
|
XScroll = ppu.TimedHScroll[0];
|
||||||
|
|
||||||
@@ -836,13 +836,13 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
|||||||
XScroll = ppu.TimedHScroll[y];
|
XScroll = ppu.TimedHScroll[y];
|
||||||
|
|
||||||
/*YScroll += ppu.TimedVScroll[y];*/
|
/*YScroll += ppu.TimedVScroll[y];*/
|
||||||
/* printf("Y:%d -_- ", YScroll);
|
/* console_printf(Console_Default, "Y:%d -_- ", YScroll);
|
||||||
if (ppu.TimedVScroll[y] != 0)
|
if (ppu.TimedVScroll[y] != 0)
|
||||||
{
|
{
|
||||||
YScroll = ppu.TimedVScroll[y];
|
YScroll = ppu.TimedVScroll[y];
|
||||||
printf("Y:%d", YScroll);
|
console_printf(Console_Default, "Y:%d", YScroll);
|
||||||
}
|
}
|
||||||
printf("\n");*/
|
console_printf(Console_Default, "\n");*/
|
||||||
for (x = 0; x < 256; x++)
|
for (x = 0; x < 256; x++)
|
||||||
{
|
{
|
||||||
/* Calculer la couleur du point */
|
/* Calculer la couleur du point */
|
||||||
@@ -1068,7 +1068,7 @@ NoDraw:
|
|||||||
TimeStart = 1000000 * timeStart.tv_sec + timeStart.tv_usec;
|
TimeStart = 1000000 * timeStart.tv_sec + timeStart.tv_usec;
|
||||||
TimeEnd = 1000000 * timeEnd.tv_sec + timeEnd.tv_usec;
|
TimeEnd = 1000000 * timeEnd.tv_sec + timeEnd.tv_usec;
|
||||||
|
|
||||||
//printf("Start: %d\nEnd: %d\nResult: %d\n",TimeStart, TimeEnd, 16666 - (TimeEnd - TimeStart));
|
//console_printf(Console_Default, "Start: %d\nEnd: %d\nResult: %d\n",TimeStart, TimeEnd, 16666 - (TimeEnd - TimeStart));
|
||||||
WaitTime = 14000 - (TimeEnd - TimeStart);
|
WaitTime = 14000 - (TimeEnd - TimeStart);
|
||||||
if (!key[KEY_PGUP])
|
if (!key[KEY_PGUP])
|
||||||
usleep(WaitTime<0?0:WaitTime);
|
usleep(WaitTime<0?0:WaitTime);
|
||||||
@@ -1138,7 +1138,7 @@ void WritePPUReg(byte RegID, byte val)
|
|||||||
switch (RegID)
|
switch (RegID)
|
||||||
{
|
{
|
||||||
default:/* For not writeable reg */
|
default:/* For not writeable reg */
|
||||||
printf("WritePPU error\n");
|
console_printf(Console_Default, "WritePPU error\n");
|
||||||
break;
|
break;
|
||||||
case 0: /* Control Register 1 */
|
case 0: /* Control Register 1 */
|
||||||
ppu.ControlRegister1.b = val;
|
ppu.ControlRegister1.b = val;
|
||||||
@@ -1170,7 +1170,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case 1: /* Control Register 2 */
|
case 1: /* Control Register 2 */
|
||||||
//printf("PPU: new CR2 ; 0x%x\n", val);
|
//console_printf(Console_Default, "PPU: new CR2 ; 0x%x\n", val);
|
||||||
ppu.ControlRegister2.b = val;
|
ppu.ControlRegister2.b = val;
|
||||||
break;
|
break;
|
||||||
case 3: /* SPR-RAM Addresse Register */
|
case 3: /* SPR-RAM Addresse Register */
|
||||||
@@ -1192,7 +1192,7 @@ x=d:00000111
|
|||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||||
ppu.HScroll = val & 0x7;
|
ppu.HScroll = val & 0x7;
|
||||||
|
|
||||||
//printf("%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1207,9 +1207,9 @@ t:0111 0000 0000 0000=d:0000 0111
|
|||||||
|
|
||||||
ppu.TmpVScroll = ((ppu.TmpVRamPtr & 0x700) >> 12) & 0x7;
|
ppu.TmpVScroll = ((ppu.TmpVRamPtr & 0x700) >> 12) & 0x7;
|
||||||
if (ppu.TmpVScroll != 0)
|
if (ppu.TmpVScroll != 0)
|
||||||
printf("2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
||||||
|
|
||||||
//printf("%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1224,7 +1224,7 @@ t:1100 0000 0000 0000=0
|
|||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
||||||
|
|
||||||
//printf("%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1237,7 +1237,7 @@ v=t
|
|||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||||
|
|
||||||
//printf("%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
//console_printf(Console_Default, "%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -5,18 +5,19 @@
|
|||||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
* $HeadURL$
|
||||||
* $Revision: 32 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "ppu.h"
|
#include "ppu.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "M6502.h"
|
#include "M6502.h"
|
||||||
@@ -248,7 +249,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
|||||||
else
|
else
|
||||||
if (Addr >= 0x3F00)
|
if (Addr >= 0x3F00)
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "%s palette: color %x new value : %d (0x%x)\n", (PalAddr(Addr) < 0x10) ? "Bgnd" : "Sprt", PalAddr(Addr), Value & 0x3F, Addr);
|
||||||
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
||||||
if (PalAddr(Addr) == 0x10)
|
if (PalAddr(Addr) == 0x10)
|
||||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||||
@@ -289,7 +290,7 @@ void NewPPUDispSprite()
|
|||||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||||
{
|
{
|
||||||
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
||||||
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
//console_printf(Console_Default, "%d Hohoho!\n", py);
|
||||||
// line(Buffer, 0, py+1, 256, py+1, 10);
|
// line(Buffer, 0, py+1, 256, py+1, 10);
|
||||||
//continue; // Do not display more than 8 sprites on this line :p
|
//continue; // Do not display more than 8 sprites on this line :p
|
||||||
}
|
}
|
||||||
@@ -826,7 +827,7 @@ unsigned char XScroll, YScroll;
|
|||||||
ppu_displayNameTables();
|
ppu_displayNameTables();
|
||||||
|
|
||||||
if (ppu.ControlRegister2.s.Colour != 0)
|
if (ppu.ControlRegister2.s.Colour != 0)
|
||||||
if (ppu.ControlRegister2.s.Colour != 0)
|
console_printf(Console_Default, "ppu.ColorEmphasis : %d\n", ppu.ControlRegister2.s.Colour);
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < 249; i++)
|
for (i = 0; i < 249; i++)
|
||||||
@@ -850,7 +851,7 @@ frame start (line 0) (if background or sprites are enabled):
|
|||||||
v=t
|
v=t
|
||||||
*/
|
*/
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0]|0x2000;
|
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0]|0x2000;
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0]|0x2000;
|
//console_printf(Console_Default, "Starting addresses : 0x%X\n",ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
YScroll = ppu.TmpVScroll;
|
YScroll = ppu.TmpVScroll;
|
||||||
|
|
||||||
@@ -864,7 +865,7 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
|||||||
5432 10
|
5432 10
|
||||||
*/
|
*/
|
||||||
if ((y == IRQScanHit)||(y == IRQScanHit + 1))
|
if ((y == IRQScanHit)||(y == IRQScanHit + 1))
|
||||||
if ((y == IRQScanHit)||(y == IRQScanHit + 1))
|
console_printf(Console_Default, "%s: IRQ Hit : bf Reg2: 0x%04X\n", __func__, ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
#define PPU_SSCAN_MASK 0x041F
|
#define PPU_SSCAN_MASK 0x041F
|
||||||
|
|
||||||
@@ -879,10 +880,10 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
|||||||
XScroll = ppu.TimedHScroll[y];
|
XScroll = ppu.TimedHScroll[y];
|
||||||
|
|
||||||
if (y == IRQScanHit)
|
if (y == IRQScanHit)
|
||||||
if (y == IRQScanHit)
|
console_printf(Console_Default, "%s: IRQ Hit : Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
||||||
|
|
||||||
if (y == IRQScanHit + 1)
|
if (y == IRQScanHit + 1)
|
||||||
if (y == IRQScanHit + 1)
|
console_printf(Console_Default, "%s: IRQ Hit + 1: Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
||||||
|
|
||||||
|
|
||||||
for (x = 0; x < 256; x++)
|
for (x = 0; x < 256; x++)
|
||||||
@@ -1193,7 +1194,7 @@ void WritePPUReg(byte RegID, byte val)
|
|||||||
switch (RegID)
|
switch (RegID)
|
||||||
{
|
{
|
||||||
default:/* For not writeable reg */
|
default:/* For not writeable reg */
|
||||||
default:/* For not writeable reg */
|
console_printf(Console_Default, "WritePPU error\n");
|
||||||
break;
|
break;
|
||||||
case 0: /* Control Register 1 */
|
case 0: /* Control Register 1 */
|
||||||
ppu.ControlRegister1.b = val;
|
ppu.ControlRegister1.b = val;
|
||||||
@@ -1225,7 +1226,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case 1: /* Control Register 2 */
|
case 1: /* Control Register 2 */
|
||||||
case 1: /* Control Register 2 */
|
//console_printf(Console_Default, "PPU: new CR2 ; 0x%x\n", val);
|
||||||
ppu.ControlRegister2.b = val;
|
ppu.ControlRegister2.b = val;
|
||||||
break;
|
break;
|
||||||
case 3: /* SPR-RAM Addresse Register */
|
case 3: /* SPR-RAM Addresse Register */
|
||||||
@@ -1242,15 +1243,15 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
t:0000 0000 0001 1111=d:1111 1000
|
t:0000 0000 0001 1111=d:1111 1000
|
||||||
x=d:00000111
|
x=d:00000111
|
||||||
*/
|
*/
|
||||||
*/
|
//console_printf(Console_Default, "2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 1;
|
ppu.VRAMAddrMode = 1;
|
||||||
|
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||||
ppu.HScroll = val & 0x7;
|
ppu.HScroll = val & 0x7;
|
||||||
|
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
//console_printf(Console_Default, "%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1265,25 +1266,25 @@ x=d:00000111
|
|||||||
t:0000 0011 1110 0000=d:1111 1000
|
t:0000 0011 1110 0000=d:1111 1000
|
||||||
t:0111 0000 0000 0000=d:0000 0111
|
t:0111 0000 0000 0000=d:0000 0111
|
||||||
*/
|
*/
|
||||||
*/
|
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 0;
|
ppu.VRAMAddrMode = 0;
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & ~(0x03E0)) | ((val & 0xF8) << 2));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & ~(0x03E0)) | ((val & 0xF8) << 2));
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF ) | ((val & 0x07) << 12));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF ) | ((val & 0x07) << 12));
|
||||||
|
|
||||||
ppu.TmpVScroll = (val & 0x7);
|
ppu.TmpVScroll = (val & 0x7);
|
||||||
//if (ppu.TmpVScroll != 0)
|
//if (ppu.TmpVScroll != 0)
|
||||||
//if (ppu.TmpVScroll != 0)
|
//console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6: /* VRAM Address register 2 */
|
case 6: /* VRAM Address register 2 */
|
||||||
if (ppu.VRAMAddrMode == 0)
|
if (ppu.VRAMAddrMode == 0)
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 1;
|
ppu.VRAMAddrMode = 1;
|
||||||
/*
|
/*
|
||||||
2006 first write:
|
2006 first write:
|
||||||
@@ -1291,13 +1292,13 @@ t:0011 1111 0000 0000 = d:0011 1111
|
|||||||
t:1100 0000 0000 0000=0
|
t:1100 0000 0000 0000=0
|
||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x00FF) | ((val&0x3F) << 8));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x00FF) | ((val&0x3F) << 8));
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x00FF) | ((val&0x3F) << 8));
|
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 0;
|
ppu.VRAMAddrMode = 0;
|
||||||
/*
|
/*
|
||||||
2006 second write:
|
2006 second write:
|
||||||
@@ -1306,8 +1307,8 @@ v=t
|
|||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
//console_printf(Console_Default, "2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
//console_printf(Console_Default, "%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -5,18 +5,19 @@
|
|||||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||||
*
|
*
|
||||||
* Created by Manoel TRAPIER.
|
* Created by Manoel TRAPIER.
|
||||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||||
*
|
*
|
||||||
* $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
* $LastChangedDate$
|
||||||
* $Author: mtrapier $
|
* $Author$
|
||||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
* $HeadURL$
|
||||||
* $Revision: 32 $
|
* $Revision$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "ppu.h"
|
#include "ppu.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "M6502.h"
|
#include "M6502.h"
|
||||||
@@ -230,7 +231,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
|||||||
else
|
else
|
||||||
if (Addr >= 0x3F00)
|
if (Addr >= 0x3F00)
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "%s palette: color %x new value : %d (0x%x)\n", (PalAddr(Addr) < 0x10) ? "Bgnd" : "Sprt", PalAddr(Addr), Value & 0x3F, Addr);
|
||||||
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
ppu.Memory[ /* 0x3F00 | PalAddr(Addr) */ Addr] = Value & 0x3F;
|
||||||
if (PalAddr(Addr) == 0x10)
|
if (PalAddr(Addr) == 0x10)
|
||||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||||
@@ -271,7 +272,7 @@ void NewPPUDispSprite()
|
|||||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||||
{
|
{
|
||||||
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
||||||
ppu.StatusRegister.b |= PPU_FLAG_SR_8SPRT ;
|
//console_printf(Console_Default, "%d Hohoho!\n", py);
|
||||||
// line(Buffer, 0, py+1, 256, py+1, 10);
|
// line(Buffer, 0, py+1, 256, py+1, 10);
|
||||||
//continue; // Do not display more than 8 sprites on this line :p
|
//continue; // Do not display more than 8 sprites on this line :p
|
||||||
}
|
}
|
||||||
@@ -805,7 +806,7 @@ unsigned char XScroll, YScroll;
|
|||||||
clear_to_color(Buffer, BgColor);
|
clear_to_color(Buffer, BgColor);
|
||||||
|
|
||||||
/* if (ppu.ControlRegister2.s.Colour != 0)
|
/* if (ppu.ControlRegister2.s.Colour != 0)
|
||||||
/* if (ppu.ControlRegister2.s.Colour != 0)
|
console_printf(Console_Default, "ppu.ColorEmphasis : %d", ppu.ControlRegister2.s.Colour);*/
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < 249; i++)
|
for (i = 0; i < 249; i++)
|
||||||
@@ -829,7 +830,7 @@ frame start (line 0) (if background or sprites are enabled):
|
|||||||
v=t
|
v=t
|
||||||
*/
|
*/
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
||||||
ppu.VRAMAddrReg2.W = ppu.TimedTmpPtr[0] | 0x2000;
|
//console_printf(Console_Default, "Starting addresses : 0x%X\n",ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
XScroll = ppu.TimedHScroll[0];
|
XScroll = ppu.TimedHScroll[0];
|
||||||
|
|
||||||
@@ -845,14 +846,14 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
|||||||
5432 10
|
5432 10
|
||||||
*/
|
*/
|
||||||
//if (y == 142)
|
//if (y == 142)
|
||||||
//if (y == 142)
|
// console_printf(Console_Default, "______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & 0xFBE0)
|
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & 0xFBE0)
|
||||||
| ((ppu.TimedTmpPtr[y]) & 0x041F)
|
| ((ppu.TimedTmpPtr[y]) & 0x041F)
|
||||||
| 0x2000;
|
| 0x2000;
|
||||||
|
|
||||||
//if (y == 142)
|
//if (y == 142)
|
||||||
//if (y == 142)
|
// console_printf(Console_Default, "______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
|
||||||
|
|
||||||
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
||||||
| ppu.Bg_Pattern_Table;
|
| ppu.Bg_Pattern_Table;
|
||||||
@@ -1144,7 +1145,7 @@ void WritePPUReg(byte RegID, byte val)
|
|||||||
switch (RegID)
|
switch (RegID)
|
||||||
{
|
{
|
||||||
default:/* For not writeable reg */
|
default:/* For not writeable reg */
|
||||||
default:/* For not writeable reg */
|
console_printf(Console_Default, "WritePPU error\n");
|
||||||
break;
|
break;
|
||||||
case 0: /* Control Register 1 */
|
case 0: /* Control Register 1 */
|
||||||
ppu.ControlRegister1.b = val;
|
ppu.ControlRegister1.b = val;
|
||||||
@@ -1176,7 +1177,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case 1: /* Control Register 2 */
|
case 1: /* Control Register 2 */
|
||||||
case 1: /* Control Register 2 */
|
//console_printf(Console_Default, "PPU: new CR2 ; 0x%x\n", val);
|
||||||
ppu.ControlRegister2.b = val;
|
ppu.ControlRegister2.b = val;
|
||||||
break;
|
break;
|
||||||
case 3: /* SPR-RAM Addresse Register */
|
case 3: /* SPR-RAM Addresse Register */
|
||||||
@@ -1193,15 +1194,15 @@ t:0000 1100 0000 0000 = d:0000 0011
|
|||||||
t:0000 0000 0001 1111=d:1111 1000
|
t:0000 0000 0001 1111=d:1111 1000
|
||||||
x=d:00000111
|
x=d:00000111
|
||||||
*/
|
*/
|
||||||
*/
|
//console_printf(Console_Default, "2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 1;
|
ppu.VRAMAddrMode = 1;
|
||||||
|
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||||
ppu.HScroll = val & 0x7;
|
ppu.HScroll = val & 0x7;
|
||||||
|
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
//console_printf(Console_Default, "%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1216,25 +1217,25 @@ x=d:00000111
|
|||||||
t:0000 0011 1110 0000=d:1111 1000
|
t:0000 0011 1110 0000=d:1111 1000
|
||||||
t:0111 0000 0000 0000=d:0000 0111
|
t:0111 0000 0000 0000=d:0000 0111
|
||||||
*/
|
*/
|
||||||
*/
|
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 0;
|
ppu.VRAMAddrMode = 0;
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFC1F) | ((val & 0xF8) << 2));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFC1F) | ((val & 0xF8) << 2));
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF) | ((val & 0x07) << 12));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF) | ((val & 0x07) << 12));
|
||||||
|
|
||||||
ppu.TmpVScroll = (val & 0x7);
|
ppu.TmpVScroll = (val & 0x7);
|
||||||
//if (ppu.TmpVScroll != 0)
|
//if (ppu.TmpVScroll != 0)
|
||||||
//if (ppu.TmpVScroll != 0)
|
//console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "%d -> 2005 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6: /* VRAM Address register 2 */
|
case 6: /* VRAM Address register 2 */
|
||||||
if (ppu.VRAMAddrMode == 0)
|
if (ppu.VRAMAddrMode == 0)
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 1;
|
ppu.VRAMAddrMode = 1;
|
||||||
/*
|
/*
|
||||||
2006 first write:
|
2006 first write:
|
||||||
@@ -1242,13 +1243,13 @@ t:0011 1111 0000 0000 = d:0011 1111
|
|||||||
t:1100 0000 0000 0000=0
|
t:1100 0000 0000 0000=0
|
||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xC0FF) | ((val&0x3F) << 8)) & 0x3FFF;
|
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
|
|
||||||
|
//console_printf(Console_Default, "%d -> 2006 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
{
|
//console_printf(Console_Default, "2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
ppu.VRAMAddrMode = 0;
|
ppu.VRAMAddrMode = 0;
|
||||||
/*
|
/*
|
||||||
2006 second write:
|
2006 second write:
|
||||||
@@ -1257,8 +1258,8 @@ v=t
|
|||||||
*/
|
*/
|
||||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
//console_printf(Console_Default, "2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||||
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
//console_printf(Console_Default, "%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* bin to header - Part of The TI-NESulator Project
|
||||||
|
* bin2h.c: Convert a binary file to a table of byte in a C header file.
|
||||||
|
*
|
||||||
|
* Created by Manoel Trapier.
|
||||||
|
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||||
|
*
|
||||||
|
* $LastChangedDate$
|
||||||
|
* $Author$
|
||||||
|
* $HeadURL$
|
||||||
|
* $Revision$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@@ -24,7 +38,7 @@ int main(int argc, char *argv[])
|
|||||||
infile = argv[i+1];
|
infile = argv[i+1];
|
||||||
if (fpin == NULL)
|
if (fpin == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"Error: cannot open in file '%s'\n", argv[i+1]);
|
fprintf (stderr, "Error: cannot open in file '%s'\n", argv[i+1]);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
@@ -35,14 +49,14 @@ int main(int argc, char *argv[])
|
|||||||
fpout = fopen(argv[i+1], "wb");
|
fpout = fopen(argv[i+1], "wb");
|
||||||
if (fpout == NULL)
|
if (fpout == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr,"Error: cannot open out file '%s'\n", argv[i+1]);
|
fprintf (stderr, "Error: cannot open out file '%s'\n", argv[i+1]);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fprintf(stderr,"Error: unknown argument: %s\n", argv[i]);
|
fprintf (stderr, "Error: unknown argument: %s\n", argv[i]);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
ti68k/Makefile
Normal file
14
ti68k/Makefile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
INCLUDE_FILES = ../src/include
|
||||||
|
|
||||||
|
APU_FILES = ../src/apu/Sound.c
|
||||||
|
CORECPU_FILES = ../src/corecpu/corecpu.c
|
||||||
|
MAPPERS_FILES = ../src/mappersmanager/manager.c ../src/mappersmanager/mappers/aorom.c ../src/mappersmanager/mappers/cnrom.c ../src/mappersmanager/mappers/iremh3001.c ../src/mappersmanager/mappers/mmc1.c ../src/mappersmanager/mappers/mmc3.c ../src/mappersmanager/mappers/mmc4.c ../src/mappersmanager/mappers/norom.c ../src/mappersmanager/mappers/unrom.c
|
||||||
|
MEMORY_FILES = ../src/memorymanager/memory.c
|
||||||
|
PLUGINS_FILES = ../src/pluginsmanager/manager.c
|
||||||
|
PPU_FILES = ../src/ppu/ppu.c
|
||||||
|
|
||||||
|
C_FILES = ../src/os/ti68k/main.c ../src/main.c ../src/NESCarts.c ../src/paddle.c ${APU_FILES} ${CORECPU_FILES} ${MAPPERS_FILES} ${MEMORY_FILES} ${PLUGINS_FILES} ${PPU_FILES}
|
||||||
|
|
||||||
|
|
||||||
|
tines: ${C_FILES}
|
||||||
|
gtc -I ${INCLUDE_FILES} -o $@ ${C_FILES}
|
||||||
@@ -27,30 +27,30 @@ MAPPERS=$(shell ls $(SRC)/$(MAPPERS_DIR)/*.c)
|
|||||||
|
|
||||||
all: tines
|
all: tines
|
||||||
|
|
||||||
tines: tines.a corecpu.a apu.a ppu.a plugins.a mappers.a memory.a
|
tines: tines.o corecpu.o apu.o ppu.o plugins.o mappers.o memory.o
|
||||||
$(CC) -o $@ $(LDFLAGS) $^
|
$(CC) -o $@ $(LDFLAGS) $^
|
||||||
|
|
||||||
apu.a: $(SRC)/apu/Sound.c $(SRC)/apu/SndAlleg.c
|
apu.o: $(SRC)/apu/Sound.c $(SRC)/apu/SndAlleg.c
|
||||||
$(CC) $(CFLAGS) -c $^ -o $@
|
$(CC) $(CFLAGS) -c $^ -o $@
|
||||||
|
|
||||||
corecpu.a: $(SRC)/corecpu/Debug.c $(SRC)/corecpu/M6502.c
|
corecpu.o: $(SRC)/corecpu/corecpu.c
|
||||||
$(CC) $(CFLAGS) -Wno-pointer-sign -c $^ -o $@
|
$(CC) $(CFLAGS) -Wno-pointer-sign -c $^ -o $@
|
||||||
|
|
||||||
tines.a: $(SRC)/main.c $(SRC)/paddle.c $(SRC)/NESCarts.c
|
tines.o: $(SRC)/main.c $(SRC)/paddle.c $(SRC)/NESCarts.c
|
||||||
$(CC) $(CFLAGS) -c $^ -o $@
|
$(CC) $(CFLAGS) -c $^ -o $@
|
||||||
|
|
||||||
memory.a: $(SRC)/memorymanager/memory.c
|
memory.o: $(SRC)/memorymanager/memory.c
|
||||||
$(CC) $(CFLAGS) -c $^ -o $@
|
$(CC) $(CFLAGS) -c $^ -o $@
|
||||||
|
|
||||||
ppu.a: $(SRC)/ppu/ppu.c $(SRC)/ppu/ppu.memory.c $(SRC)/ppu/debug/ppu.debug.c
|
ppu.o: $(SRC)/ppu/ppu.c $(SRC)/ppu/ppu.memory.c $(SRC)/ppu/debug/ppu.debug.c
|
||||||
$(CC) $(CFLAGS) -c $^ -o $@
|
$(CC) $(CFLAGS) -c $^ -o $@
|
||||||
|
|
||||||
mappers.a: $(SRC)/mappersmanager/manager.c $(SRC)/mappersmanager/utils.c $(MAPPERS)
|
mappers.o: $(SRC)/mappersmanager/manager.c $(SRC)/mappersmanager/utils.c $(MAPPERS)
|
||||||
$(CC) $(CFLAGS) -c $^ -o $@
|
$(CC) $(CFLAGS) -c $^ -o $@
|
||||||
|
|
||||||
plugins.a: $(SRC)/pluginsmanager/manager.c $(PLUGINS)
|
plugins.o: $(SRC)/pluginsmanager/manager.c $(PLUGINS)
|
||||||
$(CC) $(CFLAGS) -c $^ -o $@
|
$(CC) $(CFLAGS) -c $^ -o $@
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
rm -Rf *.o *~ core
|
rm -Rf *.a *.o *~ core
|
||||||
|
|||||||
Reference in New Issue
Block a user