Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc65a7a4f0 | ||
|
|
211b1f86c8 | ||
|
|
8e99ac85ff | ||
|
|
c2ae371bed | ||
|
|
79ac4c42f1 | ||
|
|
02a8b24523 | ||
|
|
735217df00 | ||
|
|
5d3895f08a | ||
|
|
bc118baac8 |
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 ...
|
||||
- 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.
|
||||
@@ -101,5 +113,5 @@
|
||||
- Premiere version public, ne sert que de d<>monstration.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
$Id: Changements.txt 29 2007-04-03 14:34:02Z mtrapier $
|
||||
$Id$
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@@ -1,20 +1,32 @@
|
||||
05/10/2007 V0.30 part 2 ... In progress ...
|
||||
- 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 !
|
||||
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)
|
||||
|
||||
25/10/2007:
|
||||
- Savestate now work correctly (It was not loaded at the right time...)
|
||||
- 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] Change the make util. Maybe cmake ?
|
||||
- [TODO] Remerge all mappers with the new manager
|
||||
- [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
|
||||
- Started the process of PPU total rewrite.
|
||||
@@ -123,5 +135,5 @@
|
||||
- Premiere version public, ne sert que de d<>monstration.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
$Id: Changes.txt 51 2007-05-22 16:33:04Z mtrapier $
|
||||
$Id$
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
438
doc/LisezMoi.txt
438
doc/LisezMoi.txt
@@ -1,233 +1,205 @@
|
||||
<---------------------------------------------------------------------------------->
|
||||
TI-NESulator
|
||||
Version 0.26 beta
|
||||
|
||||
Par Manoël TRAPIER aka Godzil
|
||||
godzil at godzil point net
|
||||
|
||||
1 -> #include <disclamer.h>
|
||||
|
||||
L'utilisation de se logiciel se fait a vos risque et périls. Il s'agit d'une pars
|
||||
d'une version non terminée, et en cours de dévellopement, et la diffusion n'a été
|
||||
faite que pour permettre le teste, et la démonstration de se que sera le logiciel
|
||||
final.
|
||||
|
||||
Je ne peut donc être tenu pour responsable en cas de problème lié a l'utilisation
|
||||
ou posession de se logiciel.
|
||||
|
||||
Vous êtes libre de l'utiliser à partir du moment au se logiciel n'a pas été modifié
|
||||
que sa soit de manière binaire, ou par désassemblage. Si vous trouver une version
|
||||
modifié ou fourni avec des fichiers illégaux, veuillez me le faire 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
|
||||
paquetage original sont laissé intouché (les fichiers Changements.txt LisezMoi.txt
|
||||
et TINes.exe)
|
||||
|
||||
Information légales :
|
||||
NES, Famicon, Nintendo Entertainment System, Nintendo sont des marques déposé de
|
||||
Nintendo France, Nintendo of america et Nintendo Company, Ltd.
|
||||
Tout les titres et marques apparaisant dans se fichier texte sont la propriété de
|
||||
leurs auteurs respectifs.
|
||||
|
||||
N'oubliez pas aussi que la posession de ROM (Fichier binaire représentant le
|
||||
contenue d'une cartouche) sans en posseder l'originale (la cartouche) est absolument
|
||||
illégale, que vous la gardiez 24 heures ou seulement 30 secondes
|
||||
|
||||
|
||||
2 -> Qu'est-ce que TI-NESulator ?
|
||||
|
||||
TI-NESulator est un émulateur de la console Nintendo Entertainment System
|
||||
(connunément appelé NES) fabriqué par Nintendo au milieu des année 80. L'originalité
|
||||
de cet emulateur est que sa plateforme de fonctionnement principal est les
|
||||
calculatrices TI-89 et TI-92+ de chez Texas Instrument. Ses calculatrices on la
|
||||
particularité de posseder un microprocesseur 68000 de chez motorola, qui est pour
|
||||
se genre de plateforme relativement puissant et programmer un emulateur, meme de
|
||||
NES, sur ses machine est un véritable défit.
|
||||
Tant au niveau matériel que mémoire, la NES et les TI-68k sont completements
|
||||
différents.
|
||||
La NES utilise une version légérement personalisé du microprocesseur 6502
|
||||
fonctionnant a environ 1.7Mhz.
|
||||
|
||||
Vous avez actuellement une version spéciale (comprendre pas faite pour
|
||||
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
|
||||
de debuggueur C dans le monde TI.)
|
||||
|
||||
Cette version est et sera toujours plus avancé que la version TI dans le sens ou
|
||||
elle me sert a expérimenter les nouveaux hardware émulé et a finaliser le hardware
|
||||
deja emuler. Une fois fonctionnant d'un maniere convenable sur le portage Windows,
|
||||
les mises a jours sont faites dans la version TI. Mais la version Windows au final
|
||||
contiendra plus de fonctionnalité que la version TI (support des palletes, de la
|
||||
couleur, voir meme le son etc...)
|
||||
|
||||
|
||||
3 -> Utilisation de TI-NESulator
|
||||
|
||||
[A faire.]
|
||||
|
||||
Version courte :
|
||||
|
||||
C:\TINes\>TINES jeux.nes
|
||||
|
||||
Utilisation du Joystick :
|
||||
|
||||
Manette NES Clavier
|
||||
|
||||
HAUT HAUT
|
||||
BAS BAS
|
||||
GAUCHE GAUCHE
|
||||
DROITE DROITE
|
||||
A W
|
||||
B S
|
||||
START ENTER
|
||||
SELECT P
|
||||
|
||||
--------------------------
|
||||
|
||||
Autres touches :
|
||||
R identique a l'apuis du bouton Reset de la console
|
||||
|
||||
|
||||
1-2 A un effet, mais vous risque de pas le voir ;)
|
||||
3 Affiche les Name Tables
|
||||
4 Affiche les Tables d'attributs (de couleur)
|
||||
5 Affiche les palettes
|
||||
6 Affiche la table des sprites
|
||||
|
||||
--------------------------
|
||||
|
||||
Il faut noter aussi qu'afficher ces tables ralenti considérablement la vitesse de
|
||||
l'émulateur
|
||||
|
||||
4 -> Compatibilité
|
||||
|
||||
TI-NESulator version Win32 est normalement compatible avec tous les Windows (95, 98,
|
||||
Me, NT 4, 2000, XP)
|
||||
TI-NESulator version .X (MacOS X) est normalement compatible toutes version de OS X
|
||||
(.1.x .2.x .3.x)
|
||||
L'émulateur émule actuellement avec les mappers :
|
||||
|
||||
- 0 aucun mapper (Super Mario Bros 1, Donkey Kong, ...)
|
||||
|
||||
- 1 MMC1 (a 99%, Megaman 2, Zelda1 & 2, Final Fantasy 1, ...)
|
||||
|
||||
- 2 UNROM (MegaMan, Final fantasy 2, ...)
|
||||
|
||||
- 3 CNROM
|
||||
|
||||
- 4 *NOUVEAU* MMC3 (Super mario Bross 2 & 3, MegaMan 3 à 6, ...)
|
||||
|
||||
- 7 *NOUVEAU* AOROM (Battletoad, ...)
|
||||
|
||||
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 ?
|
||||
R: TI-NESulator est actuellement en cours de dévellopement. Beaucoup de jeux ne
|
||||
sont pas supporté.
|
||||
|
||||
Q: Vous dites que certain de jeux ne sont pas supporté, mais si j'essaye xxx, il
|
||||
marche ! Pourquoi ?
|
||||
R: Ceci est du a une des particularité du Hardware de la NES/Famicon. Le hardware
|
||||
de base de la console est assé limité, et la mémoire est aussi tres limité. pour
|
||||
palier à ses limitations, certains jeux utilise ce qu'on appele des Mappers, qui
|
||||
permettent notemment d'avoir des jeux plus gros, et qui sont implémenté dans la
|
||||
cartouche du jeu. Malheureusement supporter tout ses mappers font grossir
|
||||
l'emulateur, et certain on un fonctionnement qui est malheureusement encore
|
||||
inconnu. N'oubliez pas non plus que TI-NESulator est encore en dévellopement.
|
||||
Certain mapper connu ne sont pas encore implémenté.
|
||||
|
||||
Q: Oui puis-je trouver le jeux xxxx ?
|
||||
R: Désolé, 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
|
||||
24h une ROM, vous raconte absolument n'importe quoi. Il est absolument *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
|
||||
R: Cet emulateur n'est pas parfait. Certain jeux/demo demandent un fonctionnement
|
||||
tres proche de celui de la console originale, ce que TI-NESulator est encore loin
|
||||
d'arriver a faire
|
||||
|
||||
Q:J'ai des problèmes graphiques avec XXXX
|
||||
R:Cf réponse-ci dessus
|
||||
|
||||
Q: C'est lent :(
|
||||
R: Désolé. Le code est toujours en cours de devellopement. Si vous trouvez trop lent,
|
||||
attendez la prochaine version une surprise vous y attendra peut-etre !
|
||||
|
||||
7 -> En cas de problème
|
||||
|
||||
a) Un jeu indiqué compatible ne fonctionne pas (ie "Mapper non supporté")
|
||||
|
||||
Alors plusieurs possibilité, soit vous avez une autre version du jeu officielle
|
||||
ou non, cela peut changer par exemple le mapper utilisé par le jeux, soit vous
|
||||
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.
|
||||
|
||||
b) TI-NESulator à planté !!
|
||||
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
|
||||
(pour pouvoir la copier tranquillement il faut lancer a partir d'une console
|
||||
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
|
||||
les infos que vous trouverez pertinante (manipulation a faire etc...)
|
||||
|
||||
|
||||
8 -> Remerciement
|
||||
|
||||
PpHd pour PreOS, et SMA :)
|
||||
TiMad Membre de la XTeam sans lequel XLib existerait pas.
|
||||
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
|
||||
|
||||
9 -> Litérature
|
||||
|
||||
[A faire.]
|
||||
|
||||
mais lien rapide :
|
||||
|
||||
http://www.nesdev.org
|
||||
|
||||
10 -> Comment me contacter ?
|
||||
s
|
||||
Vous pouvez me contacter grace au forum yAronet
|
||||
http://www.yaronet.com
|
||||
|
||||
Et surtout grace au lien suivant :
|
||||
http://www.yaronet.com/posts.php?sl=&s=2339
|
||||
|
||||
Vous pouvez aussi me joindre par mail en m'écrivant à "godzil chez godzil point net"
|
||||
Vous pouvez aussi essayer de visiter un de mes sites :
|
||||
http://www.godzil.net
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
$Id: LisezMoi.txt 17 2007-03-27 09:25:23Z mtrapier $
|
||||
--------------------------------------------------------------------------------
|
||||
<------------------------------------------------------------------------------>
|
||||
TI-NESulator
|
||||
Version 0.30.2 beta
|
||||
|
||||
Par Manoel TRAPIER aka Godzil
|
||||
godzil at godzil point net
|
||||
|
||||
1 -> #include <disclamer.h>
|
||||
|
||||
L'utilisation de se logiciel se fait a vos risque et p<EFBFBD>rils. Il s'agit d'une
|
||||
pars d'une version non termin<EFBFBD>e, et en cours de d<EFBFBD>vellopement, et la diffusion
|
||||
n'a <20>t<EFBFBD> faite que pour permettre le teste, et la d<EFBFBD>monstration de se que sera le
|
||||
logiciel final.
|
||||
|
||||
Je ne peut donc <EFBFBD>tre tenu pour responsable en cas de probl<EFBFBD>me li<EFBFBD> <20>
|
||||
l'utilisation ou posession de se logiciel.
|
||||
|
||||
Vous <EFBFBD>tes libre de l'utiliser <EFBFBD> partir du moment au se logiciel n'a pas <EFBFBD>t<EFBFBD>
|
||||
modifi<EFBFBD> que sa soit de mani<EFBFBD>re binaire, ou par d<EFBFBD>sassemblage. Si vous trouver
|
||||
une version modifi<EFBFBD> ou fourni avec des fichiers ill<EFBFBD>gaux, veuillez me le faire
|
||||
savoir. Vous trouverez comment me contacter dans la suite de se fichier.
|
||||
|
||||
Vous <EFBFBD>tes libre aussi de le distribuer tant que les fichiers contenus dans le
|
||||
paquetage original sont laiss<EFBFBD> intouch<EFBFBD>.
|
||||
|
||||
Information l<>gales :
|
||||
NES, Famicon, Nintendo Entertainment System, Nintendo sont des marques d<>pos<6F> de
|
||||
Nintendo France, Nintendo of america et Nintendo Company, Ltd.
|
||||
Tout les titres et marques apparaisant dans se fichier texte sont la propri<72>t<EFBFBD>
|
||||
de leurs auteurs respectifs.
|
||||
|
||||
N'oubliez pas aussi que la posession de ROM (Fichier binaire repr<70>sentant le
|
||||
contenue d'une cartouche) sans en posseder l'originale (la cartouche) est
|
||||
absolument ill<6C>gale, que vous la gardiez 24 heures ou seulement 30 secondes
|
||||
|
||||
|
||||
2 -> Qu'est-ce que TI-NESulator ?
|
||||
|
||||
TI-NESulator est un <20>mulateur de la console Nintendo Entertainment System
|
||||
(connun<75>ment appel<65> NES) fabriqu<71> par Nintendo au milieu des ann<6E>e 80.
|
||||
L'originalit<69> de cet emulateur est que sa plateforme de fonctionnement principal
|
||||
est les calculatrices TI-89 et TI-92+ de chez Texas Instrument. Ses
|
||||
calculatrices on la particularit<69> de posseder un microprocesseur 68000 de chez
|
||||
motorola, qui est pour se genre de plateforme relativement puissant et
|
||||
programmer un emulateur, meme de NES, sur ses machine est un v<>ritable d<>fit
|
||||
tant au niveau mat<61>riel que m<>moire, la NES et les TI-68k sont completements
|
||||
diff<EFBFBD>rents.
|
||||
La NES utilise une version l<>g<EFBFBD>rement personalis<69> du microprocesseur 6502
|
||||
fonctionnant <20> environ 1.7Mhz.
|
||||
|
||||
Vous avez actuellement une version sp<73>ciale (comprendre pas faite pour
|
||||
calculatrices TI.) Cette version ne me sert qu'a mettre en oeuvre de nouvelles
|
||||
choses dans la version TI de l'<27>mulateur (notemment a cause d'un gros manque
|
||||
de debuggueur C dans le monde TI.)
|
||||
|
||||
Cette version est et sera toujours plus avanc<6E> que la version TI dans le sens ou
|
||||
elle me sert a exp<78>rimenter les nouveaux hardware <20>mul<75> et a finaliser le
|
||||
hardware deja emuler. Une fois fonctionnant d'un maniere convenable sur le
|
||||
portage Windows, les mises a jours sont faites dans la version TI. Mais la
|
||||
version Windows au final contiendra plus de fonctionnalit<69> que la version TI
|
||||
(support des palletes, de la couleur, voir meme le son etc...)
|
||||
|
||||
|
||||
3 -> Utilisation de TI-NESulator
|
||||
|
||||
[A faire.]
|
||||
|
||||
Version courte :
|
||||
|
||||
C:\TINes\>TINES jeux.nes
|
||||
|
||||
Utilisation du Joystick :
|
||||
|
||||
Manette NES Clavier
|
||||
|
||||
HAUT HAUT
|
||||
BAS BAS
|
||||
GAUCHE GAUCHE
|
||||
DROITE DROITE
|
||||
A W
|
||||
B S
|
||||
START ENTER
|
||||
SELECT P
|
||||
|
||||
--------------------------
|
||||
|
||||
Autres touches :
|
||||
R identique <20> l'apuis du bouton Reset de la console
|
||||
|
||||
|
||||
1-2 A un effet, mais vous risque de pas le voir ;)
|
||||
3 Affiche les Name Tables
|
||||
4 Affiche les Tables d'attributs (de couleur)
|
||||
5 Affiche les palettes
|
||||
6 Affiche la table des sprites
|
||||
|
||||
--------------------------
|
||||
|
||||
Il faut noter aussi qu'afficher ces tables ralentisent consid<69>rablement la
|
||||
vitesse de l'<27>mulateur
|
||||
|
||||
4 -> Compatibilit<69>
|
||||
|
||||
TI-NESulator version Win32 est normalement compatible avec tous les Windows
|
||||
(95, 98,Me, NT 4, 2000, XP)
|
||||
TI-NESulator version .X (MacOS X) est normalement compatible toutes version
|
||||
de OS X (.1.x .2.x .3.x)
|
||||
|
||||
L'<EFBFBD>mulateur <EFBFBD>mule actuellement avec les mappers :
|
||||
|
||||
- 0 aucun mapper (Super Mario Bros 1, Donkey Kong, ...)
|
||||
- 1 MMC1 (a 99%, Megaman 2, Zelda1 & 2, Final Fantasy 1, ...)
|
||||
- 2 UNROM (MegaMan, Final fantasy 2, ...)
|
||||
- 3 CNROM
|
||||
- 4 MMC3 (Super mario Bross 2 & 3, MegaMan 3 <20> 6, ...)
|
||||
- 7 AOROM (Battletoad, ...)
|
||||
|
||||
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.
|
||||
|
||||
5 -> Question R<>ponses
|
||||
|
||||
Q: Pourquoi le jeu xxx ne fonctionne pas ?
|
||||
R: TI-NESulator est actuellement en cours de d<>vellopement. Beaucoup de jeux ne
|
||||
sont pas support<72>.
|
||||
|
||||
Q: Vous dites que certain de jeux ne sont pas support<72>, mais si j'essaye xxx, il
|
||||
marche ! Pourquoi ?
|
||||
R: Ceci est du a une des particularit<69> du Hardware de la NES/Famicon. Le
|
||||
hardware de base de la console est ass<73> limit<69>, et la m<>moire est aussi tres
|
||||
limit<EFBFBD>. pour palier <20> ses limitations, certains jeux utilise ce qu'on appele des
|
||||
Mappers, qui permettent notemment d'avoir des jeux plus gros, et qui sont
|
||||
impl<EFBFBD>ment<EFBFBD> dans la cartouche du jeu. Malheureusement supporter tout ses mappers
|
||||
font grossir l'emulateur, et certain on un fonctionnement qui est
|
||||
malheureusement encore inconnu. N'oubliez pas non plus que TI-NESulator est
|
||||
encore en d<>vellopement. Certain mapper connu ne sont pas encore impl<70>ment<6E>.
|
||||
|
||||
Q: Oui puis-je trouver le jeux xxxx ?
|
||||
R: D<>sol<6F>, 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 24h une ROM, vous raconte absolument n'importe quoi. Il est absolument
|
||||
*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
|
||||
R: Cet emulateur n'est pas parfait. Certain jeux/demo demandent un
|
||||
fonctionnement tres proche de celui de la console originale, ce que TI-NESulator
|
||||
est encore loin d'arriver a faire.
|
||||
|
||||
Q: J'ai des probl<62>mes graphiques avec XXXX
|
||||
R: Cf r<>ponse-ci dessus
|
||||
|
||||
Q: C'est lent :(
|
||||
R: D<>sol<6F>. Le code est toujours en cours de devellopement. Si vous trouvez trop
|
||||
lent, attendez la prochaine version une surprise vous y attendra peut-etre !
|
||||
|
||||
7 -> En cas de probl<62>me
|
||||
|
||||
a) Un jeu indiqu<71> compatible ne fonctionne pas (ie "Mapper non support<72>")
|
||||
|
||||
Alors plusieurs possibilit<69>, soit vous avez une autre version du jeu officielle
|
||||
ou non, cela peut changer par exemple le mapper utilis<69> par le jeux, soit vous
|
||||
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.
|
||||
|
||||
b) TI-NESulator <20> plant<6E> !!
|
||||
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
|
||||
(pour pouvoir la copier tranquillement il faut lancer a partir d'une console
|
||||
et pas faire glisser la rom sur l'executable)
|
||||
|
||||
N'oubliez pas de pr<70>ciser le nom complet du jeu, la taille du fichier et toutes
|
||||
les infos que vous trouverez pertinante (manipulation a faire etc...)
|
||||
|
||||
8 -> Remerciement
|
||||
|
||||
Loopy, Y0Shi, Marrat Fayzullin, et bcp d'autre pour la documentation technique
|
||||
sur la NES
|
||||
|
||||
Ainsi que tout ceux que j'ai pu oublier
|
||||
|
||||
9 -> Lit<69>rature
|
||||
|
||||
[A faire.]
|
||||
|
||||
mais lien rapide :
|
||||
|
||||
http://nesdev.parodius.com/
|
||||
http://nesdevwiki.org/
|
||||
|
||||
|
||||
10 -> Comment me contacter ?
|
||||
|
||||
Vous pouvez me contacter grace au forum yAronet: http://www.yaronet.com
|
||||
|
||||
Et surtout grace au lien suivant : http://www.yaronet.com/posts.php?sl=&s=2339
|
||||
|
||||
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$
|
||||
--------------------------------------------------------------------------------
|
||||
14
doc/TODO.txt
14
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 [ ]
|
||||
- Change the make util for UNIX. Maybe cmake ? [ ]
|
||||
- Cleanup os/win32 folder [ ]
|
||||
- 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
|
||||
*
|
||||
* 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) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/NESCarts.c $
|
||||
* $Revision: 50 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "include/NESCarts.h"
|
||||
#include "include/mappers/manager.h"
|
||||
|
||||
/* System Headers */
|
||||
#if !defined(__TIGCC__) && !defined(__GCC4TI__) && !defined(__GTC__)
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <memory.h>
|
||||
|
||||
/* Plateform dependent function */
|
||||
void *LoadFilePtr(char * filename);
|
||||
#else /* Support for TI-68k compilation */
|
||||
|
||||
#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)
|
||||
{
|
||||
fprintf(out,
|
||||
console_printf(Console_Verbose,
|
||||
"'%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"
|
||||
" Battery ? : %s | 4 Screen ? : %s \n"
|
||||
" PROMBanks start at : %p |\n"
|
||||
@@ -43,12 +52,12 @@ void DumpCartProperties(FILE *out, NesCart * cart)
|
||||
|
||||
int LoadCart(const char *filename, NesCart * cart)
|
||||
{
|
||||
byte buffer[6];
|
||||
char buffer[6];
|
||||
/* 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;
|
||||
|
||||
sprintf(buffer, "%c%c%c%c", 0x4E, 0x45, 0x53, 0x1A);
|
||||
@@ -56,15 +65,12 @@ int LoadCart(const char *filename, NesCart * cart)
|
||||
/* Verify that this is a real iNES valid file */
|
||||
if (memcmp(cart->File, buffer, 4))
|
||||
return -1;
|
||||
|
||||
if ((cart->File == NULL) || (cart->File == -1))
|
||||
return -1;
|
||||
|
||||
/* Before go elsewhere, verify that the header is clean !
|
||||
(aka no DiskDude! in it) */
|
||||
if (memcmp(cart->File+7, "DiskDude!", 9) == 0)
|
||||
{
|
||||
printf("\n"
|
||||
console_printf(Console_Warning, "\n"
|
||||
"*******************WARNING****************\n"
|
||||
"* The header of this game is not clean *\n"
|
||||
"* (DiskDude! pollution) I will only use *\n"
|
||||
@@ -83,7 +89,7 @@ int LoadCart(const char *filename, NesCart * cart)
|
||||
}
|
||||
|
||||
/* Now fill the structure */
|
||||
cart->FileName = filename;
|
||||
cart->FileName = (char *)filename;
|
||||
|
||||
cart->PROMSize = cart->File[4] * 16 * 1024; /* Size of PROM */
|
||||
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 */
|
||||
if (cart->Flags & iNES_TRAINER)
|
||||
{
|
||||
printf("\n"
|
||||
console_printf(Console_Error, "\n"
|
||||
"********************ERROR*****************\n"
|
||||
"* This cart have an embedded trainer. *\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)
|
||||
@@ -1,18 +1,28 @@
|
||||
/** EMULib Emulation Library *********************************/
|
||||
/** **/
|
||||
/** SndUnix.c **/
|
||||
/** **/
|
||||
/** This file contains standard sound generation routines **/
|
||||
/** for Unix using /dev/dsp and /dev/audio. **/
|
||||
/** **/
|
||||
/** Copyright (C) Marat Fayzullin 1996-2002 **/
|
||||
/** You are not allowed to distribute this software **/
|
||||
/** commercially. Please, notify me, if you make any **/
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
#include "Sound.h"
|
||||
/*
|
||||
* Allegro Sound Driver for EMULib Sound system - The TI-NESulator Project
|
||||
* SndAlleg.C
|
||||
*
|
||||
* Created by Manoel Trapier
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
#include <Sound.h>
|
||||
|
||||
/* Allegro includes */
|
||||
#ifdef __APPLE__
|
||||
#define USE_CONSOLE
|
||||
#include <Allegro/allegro.h>
|
||||
#else
|
||||
#define USE_CONSOLE
|
||||
#include <allegro.h>
|
||||
#endif
|
||||
|
||||
#include <os_dependent.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -27,21 +37,20 @@
|
||||
AUDIOSTREAM *stream;
|
||||
|
||||
static pthread_t ThreadID;
|
||||
static int SoundFD;
|
||||
static int SoundRate = 0;
|
||||
static int MasterVolume = 64;
|
||||
static int MasterSwitch = (1<<SND_CHANNELS)-1;
|
||||
static int LoopFreq = 25;
|
||||
static int NoiseGen = 1;
|
||||
static int Suspended = 0;
|
||||
|
||||
static int SoundRun = 0;
|
||||
static struct
|
||||
{
|
||||
int Type; /* Channel type (SND_*) */
|
||||
int Freq; /* Channel frequency (Hz) */
|
||||
int Volume; /* Channel volume (0..255) */
|
||||
|
||||
signed char *Data; /* Wave data (-128..127 each) */
|
||||
const signed char *Data; /* Wave data (-128..127 each) */
|
||||
int Length; /* Wave length in Data */
|
||||
int Rate; /* Wave playback rate (or 0Hz) */
|
||||
int Pos; /* Wave current position in Data */
|
||||
@@ -49,7 +58,7 @@ static struct
|
||||
int Count; /* Phase counter */
|
||||
} CH[SND_CHANNELS];
|
||||
|
||||
static void UnixSetWave(int Channel,signed char *Data,int Length,int Rate);
|
||||
static void UnixSetWave(int Channel,const signed char *Data,int Length,int Rate);
|
||||
static void UnixSetSound(int Channel,int NewType);
|
||||
static void UnixDrum(int Type,int Force);
|
||||
static void UnixSetChannels(int Volume,int Switch);
|
||||
@@ -89,6 +98,7 @@ static void *DSPLoop(void *Arg)
|
||||
unsigned char *Buf;
|
||||
register int J,I,K,L,M,N,L1,L2,A1,A2,V;
|
||||
int FreqCount;
|
||||
N = L = A2 = 0;
|
||||
|
||||
for(J=0;J<SND_CHANNELS;J++)
|
||||
{
|
||||
@@ -252,7 +262,7 @@ static void *DSPLoop(void *Arg)
|
||||
}
|
||||
CH[J].Count=L1;
|
||||
break;
|
||||
|
||||
|
||||
case SND_TRIANGLE: /* Default Sound */
|
||||
/* Do not allow frequencies that are too high */
|
||||
if(CH[J].Freq>=SoundRate/3) break;
|
||||
@@ -262,8 +272,10 @@ static void *DSPLoop(void *Arg)
|
||||
for(I=0;I<SND_BUFSIZE;I++)
|
||||
{
|
||||
L2=L1+K;
|
||||
Wave[I]+= L1&0x2000?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;
|
||||
|
||||
|
||||
}
|
||||
CH[J].Count=L1;
|
||||
break;
|
||||
@@ -313,14 +325,14 @@ int InitSound(int Rate,int Verbose)
|
||||
|
||||
if (install_sound(DIGI_AUTODETECT, MIDI_NONE, "") != 0)
|
||||
{
|
||||
fprintf(stderr, "%s!\n", allegro_error);
|
||||
console_printf(Console_Error, "%s!\n", allegro_error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
stream = play_audio_stream(SND_BUFSIZE, 8, FALSE, Rate, 255, 128);
|
||||
if (!stream) {
|
||||
fprintf(stderr, "Error creating audio stream!\n");
|
||||
console_printf(Console_Error, "Error creating audio stream!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -331,7 +343,7 @@ int InitSound(int Rate,int Verbose)
|
||||
if(!(Rate=OpenSoundDevice(Rate,Verbose))) return(0);
|
||||
|
||||
/* Create DSPLoop() thread */
|
||||
if(Verbose) printf(" Creating thread...");
|
||||
if(Verbose) console_printf(Console_Default, " Creating thread...");
|
||||
if(pthread_create(&ThreadID,0,DSPLoop,0))
|
||||
{ if(Verbose) puts("FAILED");return(0); }
|
||||
|
||||
@@ -339,6 +351,7 @@ int InitSound(int Rate,int Verbose)
|
||||
pthread_detach(ThreadID);
|
||||
|
||||
/* Done */
|
||||
SoundRun = 1;
|
||||
if(Verbose) puts("OK");
|
||||
return(SoundRate=Rate);
|
||||
}
|
||||
@@ -348,10 +361,13 @@ int InitSound(int Rate,int Verbose)
|
||||
/*************************************************************/
|
||||
void TrashSound(void)
|
||||
{
|
||||
StopSound();
|
||||
printf("%s: Kill thread...\n", __func__);
|
||||
if(ThreadID) pthread_cancel(ThreadID);
|
||||
|
||||
if (SoundRun == 1)
|
||||
{
|
||||
StopSound();
|
||||
console_printf(Console_Default, "%s: Kill thread...\n", __func__);
|
||||
if(ThreadID) pthread_cancel(ThreadID);
|
||||
}
|
||||
SoundRun = 0;
|
||||
SoundRate = 0;
|
||||
ThreadID = 0;
|
||||
}
|
||||
@@ -397,7 +413,7 @@ void UnixSetSound(int Channel,int NewType)
|
||||
/** waveform to be an instrument or set it to the waveform **/
|
||||
/** own playback rate. **/
|
||||
/*************************************************************/
|
||||
void UnixSetWave(int Channel,signed char *Data,int Length,int Rate)
|
||||
void UnixSetWave(int Channel,const signed char *Data,int Length,int Rate)
|
||||
{
|
||||
if((Channel<0)||(Channel>=SND_CHANNELS)||(Length<=0)) return;
|
||||
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
/** commercially. Please, notify me, if you make any **/
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
#ifdef UNIX
|
||||
|
||||
#include "Sound.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -21,6 +19,8 @@
|
||||
#include <pthread.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include <os_dependent.h>
|
||||
|
||||
#ifdef SUN_AUDIO
|
||||
|
||||
#include <sys/audioio.h>
|
||||
@@ -90,7 +90,7 @@ static int MasterVolume = 64;
|
||||
static int MasterSwitch = (1<<SND_CHANNELS)-1;
|
||||
static int LoopFreq = 25;
|
||||
static int NoiseGen = 1;
|
||||
static int Suspended = 0;
|
||||
static int Suspended = 0;
|
||||
|
||||
static struct
|
||||
{
|
||||
@@ -106,7 +106,7 @@ static struct
|
||||
int Count; /* Phase counter */
|
||||
} 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 UnixDrum(int Type,int Force);
|
||||
static void UnixSetChannels(int Volume,int Switch);
|
||||
@@ -135,7 +135,7 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
||||
|
||||
#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(Verbose) puts("FAILED");
|
||||
@@ -150,13 +150,13 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
||||
#else /* SUN_AUDIO */
|
||||
|
||||
/* 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);
|
||||
|
||||
/* Set 8-bit sound */
|
||||
if(!I)
|
||||
{
|
||||
if(Verbose) printf("OK\n Setting mode: 8bit...");
|
||||
if(Verbose) console_printf(Console_Default, "OK\n Setting mode: 8bit...");
|
||||
J=AFMT_U8;
|
||||
I=(ioctl(SoundFD,SNDCTL_DSP_SETFMT,&J)<0);
|
||||
}
|
||||
@@ -164,7 +164,7 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
||||
/* Set mono sound */
|
||||
if(!I)
|
||||
{
|
||||
if(Verbose) printf("mono...");
|
||||
if(Verbose) console_printf(Console_Default, "mono...");
|
||||
J=0;
|
||||
I=(ioctl(SoundFD,SNDCTL_DSP_STEREO,&J)<0);
|
||||
}
|
||||
@@ -172,9 +172,9 @@ static int OpenSoundDevice(int Rate,int Verbose)
|
||||
/* Set sampling rate */
|
||||
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);
|
||||
if(Verbose) printf("(got %dHz)...",Rate);
|
||||
if(Verbose) console_printf(Console_Default, "(got %dHz)...",Rate);
|
||||
}
|
||||
|
||||
/* Here we set the number of buffers to use */
|
||||
@@ -221,6 +221,9 @@ static void *DSPLoop(void *Arg)
|
||||
unsigned char Buf[SND_BUFSIZE];
|
||||
register int J,I,K,L,M,N,L1,L2,A1,A2,V;
|
||||
int FreqCount;
|
||||
int ret;
|
||||
|
||||
L = N = A2 = 0;
|
||||
|
||||
for(J=0;J<SND_CHANNELS;J++)
|
||||
{
|
||||
@@ -318,9 +321,9 @@ static void *DSPLoop(void *Arg)
|
||||
CH[J].Pos = L1;
|
||||
CH[J].Count = L2;
|
||||
break;
|
||||
|
||||
|
||||
case SND_QS_DU0:
|
||||
|
||||
|
||||
case SND_QS_DU0:
|
||||
/* Do not allow frequencies that are too high */
|
||||
if(CH[J].Freq>=SoundRate/3) break;
|
||||
K=0x10000*CH[J].Freq/SoundRate;
|
||||
@@ -333,9 +336,9 @@ static void *DSPLoop(void *Arg)
|
||||
L1=L2;
|
||||
}
|
||||
CH[J].Count=L1;
|
||||
break;
|
||||
|
||||
case SND_QS_DU1:
|
||||
break;
|
||||
|
||||
case SND_QS_DU1:
|
||||
/* Do not allow frequencies that are too high */
|
||||
if(CH[J].Freq>=SoundRate/3) break;
|
||||
K=0x10000*CH[J].Freq/SoundRate;
|
||||
@@ -348,9 +351,9 @@ static void *DSPLoop(void *Arg)
|
||||
L1=L2;
|
||||
}
|
||||
CH[J].Count=L1;
|
||||
break;
|
||||
|
||||
case SND_QS_DU3:
|
||||
break;
|
||||
|
||||
case SND_QS_DU3:
|
||||
/* Do not allow frequencies that are too high */
|
||||
if(CH[J].Freq>=SoundRate/3) break;
|
||||
K=0x10000*CH[J].Freq/SoundRate;
|
||||
@@ -363,8 +366,8 @@ static void *DSPLoop(void *Arg)
|
||||
L1=L2;
|
||||
}
|
||||
CH[J].Count=L1;
|
||||
break;
|
||||
|
||||
break;
|
||||
|
||||
case SND_QS_DU2:
|
||||
case SND_MELODIC: /* Melodic Sound */
|
||||
default: /* Default Sound */
|
||||
@@ -380,8 +383,8 @@ static void *DSPLoop(void *Arg)
|
||||
L1=L2;
|
||||
}
|
||||
CH[J].Count=L1;
|
||||
break;
|
||||
|
||||
break;
|
||||
|
||||
case SND_TRIANGLE: /* Default Sound */
|
||||
/* Do not allow frequencies that are too high */
|
||||
if(CH[J].Freq>=SoundRate/3) break;
|
||||
@@ -421,7 +424,7 @@ static void *DSPLoop(void *Arg)
|
||||
/* We'll block here until next DMA buffer becomes free. It happens
|
||||
** once per (1<<SND_BITS)/SoundRate seconds.
|
||||
*/
|
||||
write(SoundFD,Buf,SND_BUFSIZE);
|
||||
ret = write(SoundFD,Buf,SND_BUFSIZE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -462,7 +465,7 @@ int InitSound(int Rate,int Verbose)
|
||||
if(!(Rate=OpenSoundDevice(Rate,Verbose))) return(0);
|
||||
|
||||
/* Create DSPLoop() thread */
|
||||
if(Verbose) printf(" Creating thread...");
|
||||
if(Verbose) console_printf(Console_Default, " Creating thread...");
|
||||
if(pthread_create(&ThreadID,0,DSPLoop,0))
|
||||
{ if(Verbose) puts("FAILED");return(0); }
|
||||
|
||||
@@ -480,9 +483,9 @@ int InitSound(int Rate,int Verbose)
|
||||
void TrashSound(void)
|
||||
{
|
||||
StopSound();
|
||||
printf("%s: Kill thread...\n", __func__);
|
||||
if(ThreadID) pthread_cancel(ThreadID);
|
||||
printf("%s: close /dev/xxx ...\n", __func__);
|
||||
console_printf(Console_Default, "%s: Kill thread...\n", __func__);
|
||||
if(ThreadID) pthread_cancel(ThreadID);
|
||||
console_printf(Console_Default, "%s: close /dev/xxx ...\n", __func__);
|
||||
if(SoundFD!=-1) close(SoundFD);
|
||||
|
||||
SoundRate = 0;
|
||||
@@ -531,13 +534,13 @@ void UnixSetSound(int Channel,int NewType)
|
||||
/** waveform to be an instrument or set it to the waveform **/
|
||||
/** 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;
|
||||
|
||||
CH[Channel].Type = SND_WAVE;
|
||||
CH[Channel].Length = Length;
|
||||
CH[Channel].Rate = Rate;
|
||||
CH[Channel].Rate = Freq;
|
||||
CH[Channel].Pos = 0;
|
||||
CH[Channel].Count = 0;
|
||||
CH[Channel].Data = Data;
|
||||
@@ -550,5 +553,3 @@ void UnixDrum(int Type,int Force)
|
||||
{
|
||||
/* This function is currently empty */
|
||||
}
|
||||
|
||||
#endif /* UNIX */
|
||||
|
||||
@@ -11,6 +11,13 @@
|
||||
/** commercially. Please, notify me, if you make any **/
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#include "Sound.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -29,7 +36,7 @@ struct SndDriverStruct SndDriver =
|
||||
(void (*)(int,int))0,
|
||||
(void (*)(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
|
||||
};
|
||||
|
||||
@@ -160,7 +167,7 @@ void SetChannels(int Volume,int Switch)
|
||||
/** waveform to be an instrument or set it to the waveform **/
|
||||
/** 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;
|
||||
|
||||
|
||||
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)
|
||||
1671
src/corecpu/Codes.h
1671
src/corecpu/Codes.h
File diff suppressed because it is too large
Load Diff
@@ -1,480 +1,482 @@
|
||||
/** M6502: portable 6502 emulator ****************************/
|
||||
/** **/
|
||||
/** Debug.c **/
|
||||
/** **/
|
||||
/** This file contains the built-in debugging routine for **/
|
||||
/** the 6502 emulator which is called on each 6502 step **/
|
||||
/** when Trap!=0. **/
|
||||
/** **/
|
||||
/** Copyright (C) Marat Fayzullin 1996-1997 **/
|
||||
/** Alex Krasivsky 1996 **/
|
||||
/** You are not allowed to distribute this software **/
|
||||
/** commercially. Please, notify me, if you make any **/
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate: 2007-04-19 18:18:57 +0200 (jeu, 19 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/Debug.c $
|
||||
* $Revision: 43 $
|
||||
*/
|
||||
|
||||
#include "M6502.h"
|
||||
#ifdef DEBUG
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <ppu/ppu.h>
|
||||
|
||||
#include <Sound.h>
|
||||
|
||||
#define RDWORD(A) (Rd6502(A+1)*256+Rd6502(A))
|
||||
|
||||
extern unsigned char *Memory;
|
||||
|
||||
void showlastop();
|
||||
|
||||
enum Addressing_Modes
|
||||
{
|
||||
Ac = 0, Il, Im, Ab, Zp, Zx, Zy, Ax, Ay, Rl, Ix, Iy, In, No
|
||||
};
|
||||
|
||||
|
||||
|
||||
static byte *mn[] =
|
||||
{
|
||||
"adc ", "and ", "asl ", "bcc ", "bcs ", "beq ", "bit ", "bmi ",
|
||||
"bne ", "bpl ", "brk", "bvc ", "bvs ", "clc", "cld", "cli",
|
||||
"clv", "cmp ", "cpx ", "cpy ", "dec ", "dex", "dey", "inx",
|
||||
"iny", "eor ", "inc ", "jmp ", "jsr ", "lda ", "nop ", "ldx ",
|
||||
"ldy ", "lsr ", "ora ", "pha", "php", "pla", "plp", "rol ",
|
||||
"ror ", "rti", "rts", "sbc ", "sta ", "stx ", "sty ", "sec ",
|
||||
"sed", "sei", "tax", "tay", "txa", "tya", "tsx", "txs"
|
||||
};
|
||||
|
||||
|
||||
|
||||
static byte ad[512] =
|
||||
{
|
||||
10, Il, 34, Ix, No, No, No, No, No, No, 34, Zp, 2, Zp, No, No,
|
||||
36, Il, 34, Im, 2, Ac, No, No, No, No, 34, Ab, 2, Ab, No, No,
|
||||
9, Rl, 34, Iy, No, No, No, No, No, No, 34, Zx, 2, Zx, No, No,
|
||||
13, Il, 34, Ay, No, No, No, No, No, No, 34, Ax, 2, Ax, No, No,
|
||||
28, Ab, 1, Ix, No, No, No, No, 6, Zp, 1, Zp, 39, Zp, No, No,
|
||||
38, Il, 1, Im, 39, Ac, No, No, 6, Ab, 1, Ab, 39, Ab, No, No,
|
||||
7, Rl, 1, Iy, No, No, No, No, No, No, 1, Zx, 39, Zx, No, No,
|
||||
47, Il, 1, Ay, No, No, No, No, No, No, 1, Ax, 39, Ax, No, No,
|
||||
41, Il, 25, Ix, No, No, No, No, No, No, 25, Zp, 33, Zp, No, No,
|
||||
35, Il, 25, Im, 33, Ac, No, No, 27, Ab, 25, Ab, 33, Ab, No, No,
|
||||
11, Rl, 25, Iy, No, No, No, No, No, No, 25, Zx, 33, Zx, No, No,
|
||||
15, Il, 25, Ay, No, No, No, No, No, No, 25, Ax, 33, Ax, No, No,
|
||||
42, Il, 0, Ix, No, No, No, No, No, No, 0, Zp, 40, Zp, No, No,
|
||||
37, Il, 0, Im, 40, Ac, No, No, 27, In, 0, Ab, 40, Ab, No, No,
|
||||
12, Rl, 0, Iy, No, No, No, No, No, No, 0, Zx, 40, Zx, No, No,
|
||||
49, Il, 0, Ay, No, No, No, No, No, No, 0, Ax, 40, Ax, No, No,
|
||||
No, No, 44, Ix, No, No, No, No, 46, Zp, 44, Zp, 45, Zp, No, No,
|
||||
22, Il, No, No, 52, Il, No, No, 46, Ab, 44, Ab, 45, Ab, No, No,
|
||||
3, Rl, 44, Iy, No, No, No, No, 46, Zx, 44, Zx, 45, Zy, No, No,
|
||||
53, Il, 44, Ay, 55, Il, No, No, No, No, 44, Ax, No, No, No, No,
|
||||
32, Im, 29, Ix, 31, Im, No, No, 32, Zp, 29, Zp, 31, Zp, No, No,
|
||||
51, Il, 29, Im, 50, Il, No, No, 32, Ab, 29, Ab, 31, Ab, No, No,
|
||||
4, Rl, 29, Iy, No, No, No, No, 32, Zx, 29, Zx, 31, Zy, No, No,
|
||||
16, Il, 29, Ay, 54, Il, No, No, 32, Ax, 29, Ax, 31, Ay, No, No,
|
||||
19, Im, 17, Ix, No, No, No, No, 19, Zp, 17, Zp, 20, Zp, No, No,
|
||||
24, Il, 17, Im, 21, Il, No, No, 19, Ab, 17, Ab, 20, Ab, No, No,
|
||||
8, Rl, 17, Iy, No, No, No, No, No, No, 17, Zx, 20, Zx, No, No,
|
||||
14, Il, 17, Ay, No, No, No, No, No, No, 17, Ax, 20, Ax, No, No,
|
||||
18, Im, 43, Ix, No, No, No, No, 18, Zp, 43, Zp, 26, Zp, No, No,
|
||||
23, Il, 43, Im, 30, Il, No, No, 18, Ab, 43, Ab, 26, Ab, No, No,
|
||||
5, Rl, 43, Iy, No, No, No, No, No, No, 43, Zx, 26, Zx, No, No,
|
||||
48, Il, 43, Ay, No, No, No, No, No, No, 43, Ax, 26, Ax, No, No
|
||||
};
|
||||
|
||||
|
||||
|
||||
/** DAsm() ****************************************************/
|
||||
/** This function will disassemble a single command and **/
|
||||
/** return the number of bytes disassembled. **/
|
||||
/**************************************************************/
|
||||
int DAsm(char *S, word A)
|
||||
{
|
||||
|
||||
byte J;
|
||||
|
||||
word B, OP, TO;
|
||||
|
||||
|
||||
B = A;
|
||||
OP = Rd6502(B++) * 2;
|
||||
|
||||
|
||||
switch (ad[OP + 1])
|
||||
|
||||
{
|
||||
|
||||
case Ac:
|
||||
sprintf(S, "%s a", mn[ad[OP]]);
|
||||
break;
|
||||
|
||||
case Il:
|
||||
sprintf(S, "%s", mn[ad[OP]]);
|
||||
break;
|
||||
|
||||
|
||||
case Rl:
|
||||
J = Rd6502(B++);
|
||||
TO = A + 2 + ((J < 0x80) ? J : (J - 256));
|
||||
|
||||
sprintf(S, "%s $%04X", mn[ad[OP]], TO);
|
||||
break;
|
||||
|
||||
|
||||
case Im:
|
||||
sprintf(S, "%s #$%02X", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zp:
|
||||
sprintf(S, "%s $%02X", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zx:
|
||||
sprintf(S, "%s $%02X,x", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zy:
|
||||
sprintf(S, "%s $%02X,y", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Ix:
|
||||
sprintf(S, "%s ($%02X,x)", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Iy:
|
||||
sprintf(S, "%s ($%02X),y", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
|
||||
case Ab:
|
||||
sprintf(S, "%s $%04X", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case Ax:
|
||||
sprintf(S, "%s $%04X,x", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case Ay:
|
||||
sprintf(S, "%s $%04X,y", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case In:
|
||||
sprintf(S, "%s ($%04X)", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
sprintf(S, ".db $%02X; <Invalid OPcode>", OP / 2);
|
||||
|
||||
}
|
||||
return (B - A);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Debug6502() **********************************************/
|
||||
/** This function should exist if DEBUG is #defined. When **/
|
||||
/** Trace!=0, it is called after each command executed by **/
|
||||
/** the CPU, and given the 6502 registers. Emulation exits **/
|
||||
/** if Debug6502() returns 0. **/
|
||||
/*************************************************************/
|
||||
byte Debug6502(M6502 * R)
|
||||
{
|
||||
static char FA[8] = "NVRBDIZC";
|
||||
char S[128];
|
||||
byte F;
|
||||
int J, I;
|
||||
|
||||
DAsm(S, R->PC.W);
|
||||
|
||||
printf
|
||||
(
|
||||
"A:%02X P:%02X X:%02X Y:%02X S:%04X PC:%04X Flags:[",
|
||||
R->A, R->P, R->X, R->Y, R->S + 0x0100, R->PC.W
|
||||
);
|
||||
|
||||
|
||||
for (J = 0, F = R->P; J < 8; J++, F <<= 1)
|
||||
|
||||
printf("%c", F & 0x80 ? FA[J] : '.');
|
||||
|
||||
puts("]");
|
||||
|
||||
|
||||
printf
|
||||
(
|
||||
"AT PC: [%02X - %s] AT SP: [%02X %02X %02X]\n",
|
||||
Rd6502(R->PC.W), S,
|
||||
Rd6502(0x0100 + (byte) (R->S + 1)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 2)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 3))
|
||||
);
|
||||
|
||||
|
||||
sprintf(S, "");
|
||||
remove_keyboard();
|
||||
|
||||
#ifdef USE_SOUND
|
||||
StopSound();
|
||||
#endif
|
||||
|
||||
|
||||
while (1)
|
||||
{
|
||||
printf("\n[Command,'?']-> ");
|
||||
|
||||
fflush(stdout);
|
||||
fflush(stdin);
|
||||
|
||||
|
||||
fgets(S, 50, stdin);
|
||||
|
||||
for (J = 0; S[J] >= ' '; J++)
|
||||
S[J] = toupper(S[J]);
|
||||
|
||||
S[J] = '\0';
|
||||
|
||||
|
||||
switch (S[0])
|
||||
{
|
||||
case 'H':
|
||||
case '?':
|
||||
puts("\n***** Built-in 6502 Debugger Commands *****");
|
||||
puts("<CR> : Break at the next instruction");
|
||||
puts("= <addr> : Break at addr");
|
||||
puts("+ <offset> : Break at PC + offset");
|
||||
puts("t <addr> : Set PC to addr");
|
||||
puts("c : Continue without break");
|
||||
puts("j <addr> : Continue from addr");
|
||||
puts("m <addr> : Memory dump at addr");
|
||||
puts("d <addr> : Disassembly at addr");
|
||||
puts("v : Show ;interrupt vectors");
|
||||
puts("?,h : Show this help text");
|
||||
puts("r : Show Register Status");
|
||||
puts("q : Exit 6502 emulation");
|
||||
|
||||
puts("----- TI-NES Specific -----");
|
||||
puts("w : Dump Memory State");
|
||||
puts("o : Show PPU registers");
|
||||
puts("p <addr> : Dump PPU memory at addr");
|
||||
puts("a : Dump all memory to memory.log");
|
||||
puts("s : Dump sprite table to sprite.log");
|
||||
puts("n <nb> : Dump name table <nb> to nt.log");
|
||||
puts("z : Show lastest opcode executed");
|
||||
puts("i : SpriteTable Dump");
|
||||
puts("g <nb> : Get sprite <nb> info");
|
||||
break;
|
||||
|
||||
case '\0':
|
||||
return (1);
|
||||
|
||||
case 'Z':
|
||||
showlastop();
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
DumpMemoryState(stdout);
|
||||
break;
|
||||
|
||||
|
||||
case 'A':
|
||||
{
|
||||
|
||||
FILE * fpDmpMem;
|
||||
|
||||
if ((fpDmpMem = fopen("memory.log", "wb")) != NULL)
|
||||
|
||||
{
|
||||
|
||||
// fwrite(Memory, 1, 0x8000, fpDmpMem);
|
||||
//fwrite(mLBank, 1, 0x4000, fpDmpMem);
|
||||
//fwrite(mUBank, 1, 0x4000, fpDmpMem);
|
||||
|
||||
fclose(fpDmpMem);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
case '=':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
sscanf(S + 1, "%hX", &(R->Trap));
|
||||
R->Trace = 0;
|
||||
return (1);
|
||||
}
|
||||
break;
|
||||
|
||||
case '+':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
|
||||
sscanf(S + 1, "%hX", &(R->Trap));
|
||||
|
||||
R->Trap += R->PC.W;
|
||||
R->Trace = 0;
|
||||
|
||||
return (1);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 'J':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
sscanf(S + 1, "%hX", &(R->PC.W));
|
||||
R->Trace = 0;
|
||||
return (1);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
sscanf(S + 1, "%hX", &(R->PC.W));
|
||||
R->Trace = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
R->Trap = 0xFFFF;
|
||||
R->Trace = 0;
|
||||
install_keyboard();
|
||||
|
||||
//ResumeSound();
|
||||
|
||||
SetSound(0, SND_RECTANGLE);
|
||||
SetSound(1, SND_RECTANGLE);
|
||||
SetSound(2, SND_TRIANGLE);
|
||||
SetSound(3, SND_NOISE);
|
||||
|
||||
return (1);
|
||||
|
||||
case 'Q':
|
||||
return (0);
|
||||
|
||||
|
||||
case 'V':
|
||||
puts("\n6502 Interrupt Vectors:");
|
||||
printf("[$FFFC] INIT: $%04X\n", Rd6502(0xFFFC) + 256 * Rd6502(0xFFFD));
|
||||
printf("[$FFFE] IRQ: $%04X\n", Rd6502(0xFFFE) + 256 * Rd6502(0xFFFF));
|
||||
printf("[$FFFA] NMI: $%04X\n", Rd6502(0xFFFA) + 256 * Rd6502(0xFFFB));
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
{
|
||||
word Addr;
|
||||
|
||||
if (strlen(S) > 1)
|
||||
sscanf(S + 1, "%hX", &Addr);
|
||||
else
|
||||
Addr = R->PC.W;
|
||||
puts("");
|
||||
for (J = 0; J < 16; J++)
|
||||
{
|
||||
printf("%04X: ", Addr);
|
||||
for (I = 0; I < 16; I++, Addr++)
|
||||
|
||||
printf("%02X ", Rd6502(Addr));
|
||||
|
||||
printf(" | ");
|
||||
Addr -= 16;
|
||||
|
||||
for (I = 0; I < 16; I++, Addr++)
|
||||
|
||||
putchar(isprint(Rd6502(Addr)) ? Rd6502(Addr) : '.');
|
||||
|
||||
puts("");
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
|
||||
printf
|
||||
(
|
||||
"A:%02X P:%02X X:%02X Y:%02X S:%04X PC:%04X Flags:[",
|
||||
R->A, R->P, R->X, R->Y, R->S + 0x0100, R->PC.W
|
||||
);
|
||||
|
||||
|
||||
for (J = 0, F = R->P; J < 8; J++, F <<= 1)
|
||||
|
||||
printf("%c", F & 0x80 ? FA[J] : '.');
|
||||
|
||||
puts("]");
|
||||
|
||||
|
||||
printf
|
||||
(
|
||||
"AT PC: [%02X - %s] AT SP: [%02X %02X %02X]\n",
|
||||
Rd6502(R->PC.W), S,
|
||||
Rd6502(0x0100 + (byte) (R->S + 1)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 2)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 3))
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case 'D':
|
||||
|
||||
{
|
||||
|
||||
word Addr;
|
||||
|
||||
|
||||
if (strlen(S) > 1)
|
||||
sscanf(S + 1, "%hX", &Addr);
|
||||
else
|
||||
Addr = R->PC.W;
|
||||
|
||||
puts("");
|
||||
|
||||
for (J = 0; J < 16; J++)
|
||||
|
||||
{
|
||||
|
||||
printf("%04X: ", Addr);
|
||||
|
||||
Addr += DAsm(S, Addr);
|
||||
|
||||
puts(S);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Continue with emulation */
|
||||
return (1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif /* DEBUG */
|
||||
/** M6502: portable 6502 emulator ****************************/
|
||||
/** **/
|
||||
/** Debug.c **/
|
||||
/** **/
|
||||
/** This file contains the built-in debugging routine for **/
|
||||
/** the 6502 emulator which is called on each 6502 step **/
|
||||
/** when Trap!=0. **/
|
||||
/** **/
|
||||
/** Copyright (C) Marat Fayzullin 1996-1997 **/
|
||||
/** Alex Krasivsky 1996 **/
|
||||
/** You are not allowed to distribute this software **/
|
||||
/** commercially. Please, notify me, if you make any **/
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#include "M6502.h"
|
||||
#ifdef DEBUG
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <ppu/ppu.h>
|
||||
|
||||
#include <mappers/manager.h>
|
||||
#include <memory/manager.h>
|
||||
#include <Sound.h>
|
||||
|
||||
#define RDWORD(A) (Rd6502(A+1)*256+Rd6502(A))
|
||||
|
||||
extern unsigned char *Memory;
|
||||
|
||||
void showlastop();
|
||||
|
||||
enum Addressing_Modes
|
||||
{
|
||||
Ac = 0, Il, Im, Ab, Zp, Zx, Zy, Ax, Ay, Rl, Ix, Iy, In, No
|
||||
};
|
||||
|
||||
|
||||
|
||||
static char *mn[] =
|
||||
{
|
||||
"adc ", "and ", "asl ", "bcc ", "bcs ", "beq ", "bit ", "bmi ",
|
||||
"bne ", "bpl ", "brk", "bvc ", "bvs ", "clc", "cld", "cli",
|
||||
"clv", "cmp ", "cpx ", "cpy ", "dec ", "dex", "dey", "inx",
|
||||
"iny", "eor ", "inc ", "jmp ", "jsr ", "lda ", "nop ", "ldx ",
|
||||
"ldy ", "lsr ", "ora ", "pha", "php", "pla", "plp", "rol ",
|
||||
"ror ", "rti", "rts", "sbc ", "sta ", "stx ", "sty ", "sec ",
|
||||
"sed", "sei", "tax", "tay", "txa", "tya", "tsx", "txs"
|
||||
};
|
||||
|
||||
|
||||
|
||||
static byte ad[512] =
|
||||
{
|
||||
10, Il, 34, Ix, No, No, No, No, No, No, 34, Zp, 2, Zp, No, No,
|
||||
36, Il, 34, Im, 2, Ac, No, No, No, No, 34, Ab, 2, Ab, No, No,
|
||||
9, Rl, 34, Iy, No, No, No, No, No, No, 34, Zx, 2, Zx, No, No,
|
||||
13, Il, 34, Ay, No, No, No, No, No, No, 34, Ax, 2, Ax, No, No,
|
||||
28, Ab, 1, Ix, No, No, No, No, 6, Zp, 1, Zp, 39, Zp, No, No,
|
||||
38, Il, 1, Im, 39, Ac, No, No, 6, Ab, 1, Ab, 39, Ab, No, No,
|
||||
7, Rl, 1, Iy, No, No, No, No, No, No, 1, Zx, 39, Zx, No, No,
|
||||
47, Il, 1, Ay, No, No, No, No, No, No, 1, Ax, 39, Ax, No, No,
|
||||
41, Il, 25, Ix, No, No, No, No, No, No, 25, Zp, 33, Zp, No, No,
|
||||
35, Il, 25, Im, 33, Ac, No, No, 27, Ab, 25, Ab, 33, Ab, No, No,
|
||||
11, Rl, 25, Iy, No, No, No, No, No, No, 25, Zx, 33, Zx, No, No,
|
||||
15, Il, 25, Ay, No, No, No, No, No, No, 25, Ax, 33, Ax, No, No,
|
||||
42, Il, 0, Ix, No, No, No, No, No, No, 0, Zp, 40, Zp, No, No,
|
||||
37, Il, 0, Im, 40, Ac, No, No, 27, In, 0, Ab, 40, Ab, No, No,
|
||||
12, Rl, 0, Iy, No, No, No, No, No, No, 0, Zx, 40, Zx, No, No,
|
||||
49, Il, 0, Ay, No, No, No, No, No, No, 0, Ax, 40, Ax, No, No,
|
||||
No, No, 44, Ix, No, No, No, No, 46, Zp, 44, Zp, 45, Zp, No, No,
|
||||
22, Il, No, No, 52, Il, No, No, 46, Ab, 44, Ab, 45, Ab, No, No,
|
||||
3, Rl, 44, Iy, No, No, No, No, 46, Zx, 44, Zx, 45, Zy, No, No,
|
||||
53, Il, 44, Ay, 55, Il, No, No, No, No, 44, Ax, No, No, No, No,
|
||||
32, Im, 29, Ix, 31, Im, No, No, 32, Zp, 29, Zp, 31, Zp, No, No,
|
||||
51, Il, 29, Im, 50, Il, No, No, 32, Ab, 29, Ab, 31, Ab, No, No,
|
||||
4, Rl, 29, Iy, No, No, No, No, 32, Zx, 29, Zx, 31, Zy, No, No,
|
||||
16, Il, 29, Ay, 54, Il, No, No, 32, Ax, 29, Ax, 31, Ay, No, No,
|
||||
19, Im, 17, Ix, No, No, No, No, 19, Zp, 17, Zp, 20, Zp, No, No,
|
||||
24, Il, 17, Im, 21, Il, No, No, 19, Ab, 17, Ab, 20, Ab, No, No,
|
||||
8, Rl, 17, Iy, No, No, No, No, No, No, 17, Zx, 20, Zx, No, No,
|
||||
14, Il, 17, Ay, No, No, No, No, No, No, 17, Ax, 20, Ax, No, No,
|
||||
18, Im, 43, Ix, No, No, No, No, 18, Zp, 43, Zp, 26, Zp, No, No,
|
||||
23, Il, 43, Im, 30, Il, No, No, 18, Ab, 43, Ab, 26, Ab, No, No,
|
||||
5, Rl, 43, Iy, No, No, No, No, No, No, 43, Zx, 26, Zx, No, No,
|
||||
48, Il, 43, Ay, No, No, No, No, No, No, 43, Ax, 26, Ax, No, No
|
||||
};
|
||||
|
||||
|
||||
|
||||
/** DAsm() ****************************************************/
|
||||
/** This function will disassemble a single command and **/
|
||||
/** return the number of bytes disassembled. **/
|
||||
/**************************************************************/
|
||||
int DAsm(char *S, word A)
|
||||
{
|
||||
|
||||
byte J;
|
||||
|
||||
word B, OP, TO;
|
||||
|
||||
|
||||
B = A;
|
||||
OP = Rd6502(B++) * 2;
|
||||
|
||||
|
||||
switch (ad[OP + 1])
|
||||
|
||||
{
|
||||
|
||||
case Ac:
|
||||
sprintf(S, "%s a", mn[ad[OP]]);
|
||||
break;
|
||||
|
||||
case Il:
|
||||
sprintf(S, "%s", mn[ad[OP]]);
|
||||
break;
|
||||
|
||||
|
||||
case Rl:
|
||||
J = Rd6502(B++);
|
||||
TO = A + 2 + ((J < 0x80) ? J : (J - 256));
|
||||
|
||||
sprintf(S, "%s $%04X", mn[ad[OP]], TO);
|
||||
break;
|
||||
|
||||
|
||||
case Im:
|
||||
sprintf(S, "%s #$%02X", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zp:
|
||||
sprintf(S, "%s $%02X", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zx:
|
||||
sprintf(S, "%s $%02X,x", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zy:
|
||||
sprintf(S, "%s $%02X,y", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Ix:
|
||||
sprintf(S, "%s ($%02X,x)", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Iy:
|
||||
sprintf(S, "%s ($%02X),y", mn[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
|
||||
case Ab:
|
||||
sprintf(S, "%s $%04X", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case Ax:
|
||||
sprintf(S, "%s $%04X,x", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case Ay:
|
||||
sprintf(S, "%s $%04X,y", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case In:
|
||||
sprintf(S, "%s ($%04X)", mn[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
sprintf(S, ".db $%02X; <Invalid OPcode>", OP / 2);
|
||||
|
||||
}
|
||||
return (B - A);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/** Debug6502() **********************************************/
|
||||
/** This function should exist if DEBUG is #defined. When **/
|
||||
/** Trace!=0, it is called after each command executed by **/
|
||||
/** the CPU, and given the 6502 registers. Emulation exits **/
|
||||
/** if Debug6502() returns 0. **/
|
||||
/*************************************************************/
|
||||
byte Debug6502(M6502 * R)
|
||||
{
|
||||
static char FA[8] = "NVRBDIZC";
|
||||
char S[128];
|
||||
byte F;
|
||||
int J, I;
|
||||
|
||||
DAsm(S, R->PC.W);
|
||||
|
||||
printf
|
||||
(
|
||||
"A:%02X P:%02X X:%02X Y:%02X S:%04X PC:%04X Flags:[",
|
||||
R->A, R->P, R->X, R->Y, R->S + 0x0100, R->PC.W
|
||||
);
|
||||
|
||||
|
||||
for (J = 0, F = R->P; J < 8; J++, F <<= 1)
|
||||
|
||||
printf("%c", F & 0x80 ? FA[J] : '.');
|
||||
|
||||
puts("]");
|
||||
|
||||
|
||||
printf
|
||||
(
|
||||
"AT PC: [%02X - %s] AT SP: [%02X %02X %02X]\n",
|
||||
Rd6502(R->PC.W), S,
|
||||
Rd6502(0x0100 + (byte) (R->S + 1)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 2)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 3))
|
||||
);
|
||||
|
||||
|
||||
S[0] = 0;
|
||||
remove_keyboard();
|
||||
|
||||
#ifdef USE_SOUND
|
||||
StopSound();
|
||||
#endif
|
||||
|
||||
|
||||
while (1)
|
||||
{
|
||||
printf("\n[Command,'?']-> ");
|
||||
|
||||
fflush(stdout);
|
||||
fflush(stdin);
|
||||
|
||||
|
||||
fgets(S, 50, stdin);
|
||||
|
||||
for (J = 0; S[J] >= ' '; J++)
|
||||
S[J] = toupper(S[J]);
|
||||
|
||||
S[J] = '\0';
|
||||
|
||||
|
||||
switch (S[0])
|
||||
{
|
||||
case 'H':
|
||||
case '?':
|
||||
puts("\n***** Built-in 6502 Debugger Commands *****");
|
||||
puts("<CR> : Break at the next instruction");
|
||||
puts("= <addr> : Break at addr");
|
||||
puts("+ <offset> : Break at PC + offset");
|
||||
puts("t <addr> : Set PC to addr");
|
||||
puts("c : Continue without break");
|
||||
puts("j <addr> : Continue from addr");
|
||||
puts("m <addr> : Memory dump at addr");
|
||||
puts("d <addr> : Disassembly at addr");
|
||||
puts("v : Show ;interrupt vectors");
|
||||
puts("?,h : Show this help text");
|
||||
puts("r : Show Register Status");
|
||||
puts("q : Exit 6502 emulation");
|
||||
|
||||
puts("----- TI-NES Specific -----");
|
||||
puts("w : Dump Memory State");
|
||||
puts("o : Show PPU registers");
|
||||
puts("p <addr> : Dump PPU memory at addr");
|
||||
puts("a : Dump all memory to memory.log");
|
||||
puts("s : Dump sprite table to sprite.log");
|
||||
puts("n <nb> : Dump name table <nb> to nt.log");
|
||||
puts("z : Dump mapper status");
|
||||
puts("i : SpriteTable Dump");
|
||||
puts("g <nb> : Get sprite <nb> info");
|
||||
break;
|
||||
|
||||
case '\0':
|
||||
return (1);
|
||||
|
||||
case 'Z':
|
||||
mapper_dump(stdout);
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
DumpMemoryState(stdout);
|
||||
break;
|
||||
|
||||
|
||||
case 'A':
|
||||
{
|
||||
|
||||
FILE * fpDmpMem;
|
||||
|
||||
if ((fpDmpMem = fopen("memory.log", "wb")) != NULL)
|
||||
|
||||
{
|
||||
|
||||
// fwrite(Memory, 1, 0x8000, fpDmpMem);
|
||||
//fwrite(mLBank, 1, 0x4000, fpDmpMem);
|
||||
//fwrite(mUBank, 1, 0x4000, fpDmpMem);
|
||||
|
||||
fclose(fpDmpMem);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
case '=':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
sscanf(S + 1, "%hX", &(R->Trap));
|
||||
R->Trace = 0;
|
||||
return (1);
|
||||
}
|
||||
break;
|
||||
|
||||
case '+':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
|
||||
sscanf(S + 1, "%hX", &(R->Trap));
|
||||
|
||||
R->Trap += R->PC.W;
|
||||
R->Trace = 0;
|
||||
|
||||
return (1);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case 'J':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
sscanf(S + 1, "%hX", &(R->PC.W));
|
||||
R->Trace = 0;
|
||||
return (1);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
if (strlen(S) >= 2)
|
||||
|
||||
{
|
||||
sscanf(S + 1, "%hX", &(R->PC.W));
|
||||
R->Trace = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
R->Trap = 0xFFFF;
|
||||
R->Trace = 0;
|
||||
install_keyboard();
|
||||
|
||||
//ResumeSound();
|
||||
|
||||
SetSound(0, SND_RECTANGLE);
|
||||
SetSound(1, SND_RECTANGLE);
|
||||
SetSound(2, SND_TRIANGLE);
|
||||
SetSound(3, SND_NOISE);
|
||||
|
||||
return (1);
|
||||
|
||||
case 'Q':
|
||||
return (0);
|
||||
|
||||
|
||||
case 'V':
|
||||
puts("\n6502 Interrupt Vectors:");
|
||||
printf("[$FFFC] INIT: $%04X\n", Rd6502(0xFFFC) + 256 * Rd6502(0xFFFD));
|
||||
printf("[$FFFE] IRQ: $%04X\n", Rd6502(0xFFFE) + 256 * Rd6502(0xFFFF));
|
||||
printf("[$FFFA] NMI: $%04X\n", Rd6502(0xFFFA) + 256 * Rd6502(0xFFFB));
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
{
|
||||
word Addr;
|
||||
|
||||
if (strlen(S) > 1)
|
||||
sscanf(S + 1, "%hX", &Addr);
|
||||
else
|
||||
Addr = R->PC.W;
|
||||
puts("");
|
||||
for (J = 0; J < 16; J++)
|
||||
{
|
||||
printf("%04X: ", Addr);
|
||||
for (I = 0; I < 16; I++, Addr++)
|
||||
|
||||
printf("%02X ", Rd6502(Addr));
|
||||
|
||||
printf(" | ");
|
||||
Addr -= 16;
|
||||
|
||||
for (I = 0; I < 16; I++, Addr++)
|
||||
|
||||
putchar(isprint(Rd6502(Addr)) ? Rd6502(Addr) : '.');
|
||||
|
||||
puts("");
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
|
||||
printf
|
||||
(
|
||||
"A:%02X P:%02X X:%02X Y:%02X S:%04X PC:%04X Flags:[",
|
||||
R->A, R->P, R->X, R->Y, R->S + 0x0100, R->PC.W
|
||||
);
|
||||
|
||||
|
||||
for (J = 0, F = R->P; J < 8; J++, F <<= 1)
|
||||
|
||||
printf("%c", F & 0x80 ? FA[J] : '.');
|
||||
|
||||
puts("]");
|
||||
|
||||
|
||||
printf
|
||||
(
|
||||
"AT PC: [%02X - %s] AT SP: [%02X %02X %02X]\n",
|
||||
Rd6502(R->PC.W), S,
|
||||
Rd6502(0x0100 + (byte) (R->S + 1)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 2)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 3))
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case 'D':
|
||||
|
||||
{
|
||||
|
||||
word Addr;
|
||||
|
||||
|
||||
if (strlen(S) > 1)
|
||||
sscanf(S + 1, "%hX", &Addr);
|
||||
else
|
||||
Addr = R->PC.W;
|
||||
|
||||
puts("");
|
||||
|
||||
for (J = 0; J < 16; J++)
|
||||
|
||||
{
|
||||
|
||||
printf("%04X: ", Addr);
|
||||
|
||||
Addr += DAsm(S, Addr);
|
||||
|
||||
puts(S);
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Continue with emulation */
|
||||
return (1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif /* DEBUG */
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/M6502.c $
|
||||
* $Revision: 39 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#include "M6502.h"
|
||||
@@ -201,7 +201,7 @@ INLINE byte Op6502(register word A) { return(Page[A>>13][A&0x1FFF]); }
|
||||
void Reset6502(M6502 *R)
|
||||
{
|
||||
R->A=R->X=R->Y=0x00;
|
||||
R->P=Z_FLAG|R_FLAG;
|
||||
R->P=Z_FLAG;
|
||||
R->S=0xFF;
|
||||
R->PC.B.l=Rd6502(0xFFFC);
|
||||
R->PC.B.h=Rd6502(0xFFFD);
|
||||
@@ -245,7 +245,7 @@ void Int6502(M6502 *R,byte Type)
|
||||
R->ICount-=7;
|
||||
M_PUSH(R->PC.B.h);
|
||||
M_PUSH(R->PC.B.l);
|
||||
M_PUSH(R->P&~B_FLAG);
|
||||
M_PUSH(R->P & ~(B_FLAG|R_FLAG));
|
||||
R->P&=~D_FLAG;
|
||||
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; }
|
||||
@@ -254,6 +254,158 @@ void Int6502(M6502 *R,byte Type)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TRACE_EXECUTION
|
||||
|
||||
enum Addressing_Modes
|
||||
{
|
||||
Ac = 0, Il, Im, Ab, Zp, Zx, Zy, Ax, Ay, Rl, Ix, Iy, In, No
|
||||
};
|
||||
|
||||
static char *mnCAP[] =
|
||||
{
|
||||
"ADC", "AND", "ASL", "BCC", "BCS", "BEQ", "BIT", "BMI",
|
||||
"BNE", "BPL", "BRK", "BVC", "BVS", "CLC", "CLD", "CLI",
|
||||
"CLV", "CMP", "CPX", "CPY", "DEC", "DEX", "DEY", "INX",
|
||||
"INY", "EOR", "INC", "JMP", "JSR", "LDA", "NOP", "LDX",
|
||||
"LDY", "LSR", "ORA", "PHA", "PHP", "PLA", "PLP", "ROL",
|
||||
"ROR", "RTI", "RTS", "SBC", "STA", "STX", "STY", "SEC",
|
||||
"SED", "SEI", "TAX", "TAY", "TXA", "TYA", "TSX", "TXS"
|
||||
};
|
||||
|
||||
#define DAsm DAsmCAP
|
||||
|
||||
static byte ad[512] =
|
||||
{
|
||||
10, Il, 34, Ix, No, No, No, No, No, No, 34, Zp, 2, Zp, No, No,
|
||||
36, Il, 34, Im, 2, Ac, No, No, No, No, 34, Ab, 2, Ab, No, No,
|
||||
9, Rl, 34, Iy, No, No, No, No, No, No, 34, Zx, 2, Zx, No, No,
|
||||
13, Il, 34, Ay, No, No, No, No, No, No, 34, Ax, 2, Ax, No, No,
|
||||
28, Ab, 1, Ix, No, No, No, No, 6, Zp, 1, Zp, 39, Zp, No, No,
|
||||
38, Il, 1, Im, 39, Ac, No, No, 6, Ab, 1, Ab, 39, Ab, No, No,
|
||||
7, Rl, 1, Iy, No, No, No, No, No, No, 1, Zx, 39, Zx, No, No,
|
||||
47, Il, 1, Ay, No, No, No, No, No, No, 1, Ax, 39, Ax, No, No,
|
||||
41, Il, 25, Ix, No, No, No, No, No, No, 25, Zp, 33, Zp, No, No,
|
||||
35, Il, 25, Im, 33, Ac, No, No, 27, Ab, 25, Ab, 33, Ab, No, No,
|
||||
11, Rl, 25, Iy, No, No, No, No, No, No, 25, Zx, 33, Zx, No, No,
|
||||
15, Il, 25, Ay, No, No, No, No, No, No, 25, Ax, 33, Ax, No, No,
|
||||
42, Il, 0, Ix, No, No, No, No, No, No, 0, Zp, 40, Zp, No, No,
|
||||
37, Il, 0, Im, 40, Ac, No, No, 27, In, 0, Ab, 40, Ab, No, No,
|
||||
12, Rl, 0, Iy, No, No, No, No, No, No, 0, Zx, 40, Zx, No, No,
|
||||
49, Il, 0, Ay, No, No, No, No, No, No, 0, Ax, 40, Ax, No, No,
|
||||
No, No, 44, Ix, No, No, No, No, 46, Zp, 44, Zp, 45, Zp, No, No,
|
||||
22, Il, No, No, 52, Il, No, No, 46, Ab, 44, Ab, 45, Ab, No, No,
|
||||
3, Rl, 44, Iy, No, No, No, No, 46, Zx, 44, Zx, 45, Zy, No, No,
|
||||
53, Il, 44, Ay, 55, Il, No, No, No, No, 44, Ax, No, No, No, No,
|
||||
32, Im, 29, Ix, 31, Im, No, No, 32, Zp, 29, Zp, 31, Zp, No, No,
|
||||
51, Il, 29, Im, 50, Il, No, No, 32, Ab, 29, Ab, 31, Ab, No, No,
|
||||
4, Rl, 29, Iy, No, No, No, No, 32, Zx, 29, Zx, 31, Zy, No, No,
|
||||
16, Il, 29, Ay, 54, Il, No, No, 32, Ax, 29, Ax, 31, Ay, No, No,
|
||||
19, Im, 17, Ix, No, No, No, No, 19, Zp, 17, Zp, 20, Zp, No, No,
|
||||
24, Il, 17, Im, 21, Il, No, No, 19, Ab, 17, Ab, 20, Ab, No, No,
|
||||
8, Rl, 17, Iy, No, No, No, No, No, No, 17, Zx, 20, Zx, No, No,
|
||||
14, Il, 17, Ay, No, No, No, No, No, No, 17, Ax, 20, Ax, No, No,
|
||||
18, Im, 43, Ix, No, No, No, No, 18, Zp, 43, Zp, 26, Zp, No, No,
|
||||
23, Il, 43, Im, 30, Il, No, No, 18, Ab, 43, Ab, 26, Ab, No, No,
|
||||
5, Rl, 43, Iy, No, No, No, No, No, No, 43, Zx, 26, Zx, No, No,
|
||||
48, Il, 43, Ay, No, No, No, No, No, No, 43, Ax, 26, Ax, No, No
|
||||
};
|
||||
|
||||
#define RDWORD(A) (Rd6502(A+1)*256+Rd6502(A))
|
||||
|
||||
/** DAsm() ****************************************************/
|
||||
/** This function will disassemble a single command and **/
|
||||
/** return the number of bytes disassembled. **/
|
||||
/**************************************************************/
|
||||
int DAsmCAP(char *S, word A)
|
||||
{
|
||||
|
||||
byte J;
|
||||
|
||||
word B, OP, TO;
|
||||
|
||||
|
||||
B = A;
|
||||
OP = Rd6502(B++) * 2;
|
||||
|
||||
|
||||
switch (ad[OP + 1])
|
||||
|
||||
{
|
||||
|
||||
case Ac:
|
||||
sprintf(S, "%s A", mnCAP[ad[OP]]);
|
||||
break;
|
||||
|
||||
case Il:
|
||||
sprintf(S, "%s", mnCAP[ad[OP]]);
|
||||
break;
|
||||
|
||||
|
||||
case Rl:
|
||||
J = Rd6502(B++);
|
||||
TO = A + 2 + ((J < 0x80) ? J : (J - 256));
|
||||
|
||||
sprintf(S, "%s $%04x", mnCAP[ad[OP]], TO);
|
||||
break;
|
||||
|
||||
|
||||
case Im:
|
||||
sprintf(S, "%s #$%02x", mnCAP[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zp:
|
||||
sprintf(S, "%s $%02x", mnCAP[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zx:
|
||||
sprintf(S, "%s $%02x,X", mnCAP[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Zy:
|
||||
sprintf(S, "%s $%02x,Y", mnCAP[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Ix:
|
||||
sprintf(S, "%s ($%02x,X)", mnCAP[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
case Iy:
|
||||
sprintf(S, "%s ($%02x),Y", mnCAP[ad[OP]], Rd6502(B++));
|
||||
break;
|
||||
|
||||
|
||||
case Ab:
|
||||
sprintf(S, "%s $%04x", mnCAP[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case Ax:
|
||||
sprintf(S, "%s $%04x,X", mnCAP[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case Ay:
|
||||
sprintf(S, "%s $%04x,Y", mnCAP[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
case In:
|
||||
sprintf(S, "%s ($%04x)", mnCAP[ad[OP]], RDWORD(B));
|
||||
B += 2;
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
sprintf(S, ".db $%02x; <Invalid OPcode>", OP / 2);
|
||||
|
||||
}
|
||||
return (B - A);
|
||||
|
||||
}
|
||||
|
||||
extern unsigned short ScanLine;
|
||||
|
||||
#endif
|
||||
|
||||
/** Run6502() ************************************************/
|
||||
/** This function will run 6502 code until Loop6502() call **/
|
||||
@@ -264,7 +416,7 @@ word Run6502(M6502 *R)
|
||||
{
|
||||
register pair J,K;
|
||||
register byte I;
|
||||
|
||||
byte nb_of_cycle;
|
||||
for(;;)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
@@ -274,21 +426,68 @@ word Run6502(M6502 *R)
|
||||
if(R->Trace)
|
||||
if(!Debug6502(R)) return(R->PC.W);
|
||||
#endif
|
||||
|
||||
#ifdef TRACE_EXECUTION
|
||||
while(1)
|
||||
{
|
||||
|
||||
I=Op6502(R->PC.W++);
|
||||
R->ICount-=Cycles[I];
|
||||
|
||||
static char FA[8] = "NV.BDIZC";
|
||||
char S[128];
|
||||
byte F;
|
||||
int J, I;
|
||||
|
||||
DAsm(S, R->PC.W);
|
||||
|
||||
printf
|
||||
(
|
||||
"AT PC: [%02x - %s]\n",
|
||||
Rd6502(R->PC.W), S
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
I=Op6502(R->PC.W++);
|
||||
nb_of_cycle = Cycles[I];
|
||||
//#ifdef DEBUG
|
||||
// pushop(I);
|
||||
//#endif
|
||||
|
||||
icount++;
|
||||
|
||||
switch(I)
|
||||
{
|
||||
#include "Codes.h"
|
||||
}
|
||||
|
||||
#ifdef TRACE_EXECUTION
|
||||
while(1)
|
||||
{
|
||||
static char FA[8] = "NV.BDIZC";
|
||||
char S[128];
|
||||
byte F;
|
||||
int J, I;
|
||||
|
||||
printf
|
||||
(
|
||||
"A:%02x X:%02x Y:%02x S:%04x, PC:%04x Flags:[",
|
||||
R->A, R->X, R->Y, R->S + 0x0100, R->PC.W
|
||||
);
|
||||
|
||||
|
||||
for (J = 0, F = R->P; J < 8; J++, F <<= 1)
|
||||
|
||||
printf("%c", F & 0x80 ? FA[J] : '.');
|
||||
|
||||
printf("], Stack[%02x, %02x, %02x], %03d, %03d\n",
|
||||
Rd6502(0x0100 + (byte) (R->S + 1)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 2)),
|
||||
Rd6502(0x0100 + (byte) (R->S + 3)),
|
||||
R->ICount,
|
||||
ScanLine
|
||||
);
|
||||
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
R->ICount-= nb_of_cycle;
|
||||
/* If cycle counter expired... */
|
||||
if(R->ICount<=0)
|
||||
{
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate: 2007-04-23 18:55:35 +0200 (lun, 23 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/M6502.h $
|
||||
* $Revision: 45 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#ifndef M6502_H
|
||||
|
||||
@@ -13,29 +13,29 @@
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate: 2007-05-24 15:07:13 +0200 (jeu, 24 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/Tables.h $
|
||||
* $Revision: 52 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
static byte Cycles[256] =
|
||||
{
|
||||
7, 6, 2, 1, 5, 3, 5, 5, 3, 2, 2, 1, 6, 4, 6, 2,
|
||||
2, 5, 5, 1, 5, 4, 6, 5, 2, 4, 2, 1, 6, 4, 6, 2,
|
||||
6, 6, 2, 1, 3, 3, 5, 5, 4, 2, 2, 1, 4, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 2, 4, 2, 1, 4, 4, 6, 2,
|
||||
6, 6, 2, 1, 3, 3, 5, 5, 3, 2, 2, 1, 3, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 2, 4, 3, 1, 8, 4, 6, 2,
|
||||
6, 6, 2, 1, 3, 3, 5, 5, 4, 2, 2, 1, 6, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 5, 4, 4, 1, 6, 4, 6, 2,
|
||||
3, 6, 2, 1, 3, 3, 3, 5, 2, 2, 2, 1, 4, 4, 4, 2,
|
||||
2, 6, 5, 1, 4, 4, 4, 5, 2, 5, 2, 1, 4, 5, 5, 2,
|
||||
2, 6, 2, 1, 3, 3, 3, 5, 2, 2, 2, 1, 4, 4, 4, 2,
|
||||
2, 5, 5, 1, 4, 4, 4, 5, 2, 4, 2, 1, 4, 4, 4, 2,
|
||||
2, 6, 2, 1, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 2, 4, 3, 2, 4, 4, 6, 2,
|
||||
2, 6, 2, 1, 3, 3, 5, 5, 2, 2, 2, 1, 4, 4, 6, 2,
|
||||
|
||||
static byte Cycles[256] =
|
||||
{
|
||||
7, 6, 2, 1, 5, 3, 5, 5, 3, 2, 2, 1, 6, 4, 6, 2,
|
||||
2, 5, 5, 1, 5, 4, 6, 5, 2, 4, 2, 1, 6, 4, 6, 2,
|
||||
6, 6, 2, 1, 3, 3, 5, 5, 4, 2, 2, 1, 4, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 2, 4, 2, 1, 4, 4, 6, 2,
|
||||
6, 6, 2, 1, 3, 3, 5, 5, 3, 2, 2, 1, 3, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 2, 4, 3, 1, 8, 4, 6, 2,
|
||||
6, 6, 2, 1, 3, 3, 5, 5, 4, 2, 2, 1, 6, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 5, 4, 4, 1, 6, 4, 6, 2,
|
||||
3, 6, 2, 1, 3, 3, 3, 5, 2, 2, 2, 1, 4, 4, 4, 2,
|
||||
2, 6, 5, 1, 4, 4, 4, 5, 2, 5, 2, 1, 4, 5, 5, 2,
|
||||
2, 6, 2, 1, 3, 3, 3, 5, 2, 2, 2, 1, 4, 4, 4, 2,
|
||||
2, 5, 5, 1, 4, 4, 4, 5, 2, 4, 2, 1, 4, 4, 4, 2,
|
||||
2, 6, 2, 1, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 2, 4, 3, 2, 4, 4, 6, 2,
|
||||
2, 6, 2, 1, 3, 3, 5, 5, 2, 2, 2, 1, 4, 4, 6, 2,
|
||||
2, 5, 5, 1, 4, 4, 6, 5, 2, 4, 4, 1, 4, 4, 6, 2
|
||||
};
|
||||
|
||||
|
||||
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 **/
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
{ -36, 8063 },{ -12, 8063 },{ -3, 8298 },{ 3, 8358 },
|
||||
{ 8, 8201 },{ 12, 8063 },{ 15, 8054 },{ 17, 8238 },
|
||||
|
||||
@@ -3,18 +3,19 @@
|
||||
* NESCart.h
|
||||
*
|
||||
* 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) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/NESCarts.h $
|
||||
* $Revision: 39 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#ifndef NESCARTS_H
|
||||
#define NESCARTS_H
|
||||
|
||||
#include "types.h"
|
||||
#include <stdint.h>
|
||||
#include <types.h>
|
||||
|
||||
#define iNES_MIRROR 0x01
|
||||
#define iNES_BATTERY 0x02
|
||||
@@ -23,14 +24,14 @@
|
||||
|
||||
typedef struct NesCart_
|
||||
{
|
||||
unsigned long PROMSize, /* Size of PROM */
|
||||
VROMSize; /* Size of VROM */
|
||||
char MapperID; /* Mapper Type */
|
||||
byte Flags;
|
||||
char *FileName;
|
||||
byte *File; /* Pointer on the file in memory */
|
||||
byte *PROMBanks; /* Pointer on the first PROM */
|
||||
byte *VROMBanks; /* Pointer on the first VROM */
|
||||
uint32_t PROMSize, /* Size of PROM */
|
||||
VROMSize; /* Size of VROM */
|
||||
char MapperID; /* Mapper Type */
|
||||
uint8_t Flags;
|
||||
char *FileName;
|
||||
uint8_t *File; /* Pointer on the file in memory */
|
||||
uint8_t *PROMBanks; /* Pointer on the first PROM */
|
||||
uint8_t *VROMBanks; /* Pointer on the first VROM */
|
||||
} NesCart;
|
||||
|
||||
void DumpCartProperties();
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
/** commercially. Please, notify me, if you make any **/
|
||||
/** changes to this file. **/
|
||||
/*************************************************************/
|
||||
/*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
#ifndef 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 **/
|
||||
/** 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() ************************************************/
|
||||
/** Get current read position for the buffer set with the **/
|
||||
@@ -123,7 +129,7 @@ int MIDILogging(int Switch);
|
||||
void MIDITicks(int N);
|
||||
|
||||
//#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_BUFSIZE 256 /* Buffer size, <= 2^SND_BITS */
|
||||
#define SND_BITS 8 /* Number of bits in a fragment */
|
||||
@@ -137,7 +143,6 @@ void MIDITicks(int N);
|
||||
/** skip initialization and be silent. Pass Verbose!=0 to **/
|
||||
/** see initialization messages. **/
|
||||
/*************************************************************/
|
||||
#warning You Suck !
|
||||
int InitSound(int Rate,int Verbose);
|
||||
|
||||
/** StopSound() **********************************************/
|
||||
@@ -220,7 +225,7 @@ struct SndDriverStruct
|
||||
void (*Drum)(int Type,int Force);
|
||||
void (*SetChannels)(int Volume,int Switch);
|
||||
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);
|
||||
};
|
||||
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
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
@@ -27,6 +27,10 @@ typedef void (*MapperDump) ();
|
||||
|
||||
#ifdef __TINES_MAPPERS__
|
||||
|
||||
#include <ppu/ppu.h>
|
||||
#include <memory/manager.h>
|
||||
#include <os_dependent.h>
|
||||
|
||||
extern NesCart *Cart;
|
||||
|
||||
/* Available functions for mappers */
|
||||
@@ -34,9 +38,6 @@ extern NesCart *Cart;
|
||||
#define GETLAST16KBANK(c) ((c->PROMSize>>14)-1)
|
||||
#define GETLAST32KBANK(c) ((c->PROMSize>>15)-1)
|
||||
|
||||
void map_sram(); /* Map SRAM */
|
||||
void unmap_sram(); /* Unmap SRAM */
|
||||
|
||||
void set_vrom_bank_1k(unsigned short addr,int slot);
|
||||
void set_vrom_bank_2k(unsigned short addr,int slot);
|
||||
void set_vrom_bank_4k(unsigned short addr,int slot);
|
||||
@@ -57,4 +58,7 @@ extern void (*mapper_dump) (FILE *fp);
|
||||
|
||||
#endif /* __TINES_MAPPERS__ */
|
||||
|
||||
void map_sram(); /* Map SRAM */
|
||||
void unmap_sram(); /* Unmap SRAM */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
* 6502 Memory manager - The TI-NESulator Project
|
||||
* memory.h - Taken from the Quick6502 project
|
||||
*
|
||||
* Created by Manoël Trapier on 18/09/06.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel Trapier on 18/09/06.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-05 16:30:20 +0200 (jeu, 05 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/memory.h $
|
||||
* $Revision: 31 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
#ifndef MEMORY_H
|
||||
@@ -63,6 +63,6 @@ void InitMemory();
|
||||
byte ReadMemory(byte page, byte addr);
|
||||
void WriteMemory(byte page, byte addr, byte value);
|
||||
|
||||
void DumpMemoryState();
|
||||
void DumpMemoryState(FILE *fp);
|
||||
|
||||
#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
|
||||
*
|
||||
* 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) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/paddle.h $
|
||||
* $Revision: 39 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
/* Generated data file from file 'stdin' */
|
||||
|
||||
/*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*/
|
||||
|
||||
PALETTE basicPalette = {
|
||||
{ 0x1E, 0x1E, 0x1E, 0x07 },
|
||||
@@ -257,5 +262,5 @@ PALETTE basicPalette = {
|
||||
{ 0x29, 0x3C, 0x3C, 0x08 },
|
||||
{ 0x32, 0x31, 0x32, 0xB7 },
|
||||
{ 0x01, 0x01, 0x01, 0x08 },
|
||||
{ 0x01, 0x01, 0x01, 0xBF }
|
||||
{ 0x01, 0x01, 0x01, 0xBF },
|
||||
};
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* plugins.h
|
||||
*
|
||||
* 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$
|
||||
* $Author$
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
* PPU debug utilities - The TI-NESulator Project
|
||||
* ppu.debug.h
|
||||
*
|
||||
* Created by Manoël Trapier on 12/04/07.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel Trapier on 12/04/07.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu/ppu.debug.h $
|
||||
* $Revision: 53 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* 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) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.h $
|
||||
* $Revision: 46 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
* PPU Memory manager - The TI-NESulator Project
|
||||
* ppu.memory.h - Inspired from the memory manager of the Quick6502 Project.
|
||||
*
|
||||
* Created by Manoël Trapier on 12/04/07.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel Trapier on 12/04/07.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu/ppu.memory.h $
|
||||
* $Revision: 53 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -27,6 +27,8 @@ void ppu_memoryDumpState(FILE *fp);
|
||||
byte ppu_readMemory(byte page, byte addr);
|
||||
void ppu_writeMemory(byte page, byte addr, byte value);
|
||||
|
||||
void ppu_setPageGhost(byte page, bool value, byte ghost);
|
||||
|
||||
#else
|
||||
#error Must only be included inside the PPU code
|
||||
#endif
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
* Base type definitions - The TI-NESulator Project
|
||||
* types.h - Taken from the Quick6502 project
|
||||
*
|
||||
* Created by Manoël Trapier on 18/09/06.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel Trapier on 18/09/06.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-03-28 15:50:50 +0200 (mer, 28 mar 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/types.h $
|
||||
* $Revision: 25 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $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");
|
||||
}
|
||||
}
|
||||
}
|
||||
1304
src/main.c
1304
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
|
||||
* TI-NESulator.X
|
||||
*
|
||||
* Created by Manoël Trapier on 07/10/07.
|
||||
* Copyright 2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -12,6 +17,8 @@
|
||||
|
||||
#include <mappers/manager.h>
|
||||
|
||||
#include <os_dependent.h>
|
||||
|
||||
MapperIRQ mapper_irqloop;
|
||||
MapperDump mapper_dump;
|
||||
MapperWriteHook mapper_hook;
|
||||
@@ -19,12 +26,12 @@ MapperWriteHook mapper_hook;
|
||||
typedef struct Mapper_
|
||||
{
|
||||
byte id;
|
||||
byte *name;
|
||||
char *name;
|
||||
|
||||
MapperInit init;
|
||||
MapperIRQ irq;
|
||||
MapperDump dump;
|
||||
|
||||
|
||||
} Mapper;
|
||||
|
||||
#include "mappers_list.h"
|
||||
@@ -32,10 +39,10 @@ typedef struct Mapper_
|
||||
void mapper_list ()
|
||||
{
|
||||
Mapper *ptr = &(Mappers[0]);
|
||||
printf("Available mapers:\n");
|
||||
console_printf(Console_Default, "Available mapers:\n");
|
||||
while(ptr->name != NULL)
|
||||
{
|
||||
printf("%d - %s\n", ptr->id, ptr->name);
|
||||
console_printf(Console_Default, "%d - %s\n", ptr->id, ptr->name);
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
@@ -43,13 +50,14 @@ void mapper_list ()
|
||||
int mapper_init (NesCart *cart)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (ptr->id == cart->MapperID)
|
||||
{
|
||||
printf ("Found mapper ID #%X - '%s'\n", ptr->id, ptr->name);
|
||||
ptr->init (cart);
|
||||
console_printf (Console_Default, "Found mapper ID #%d - '%s'\n", ptr->id, ptr->name);
|
||||
if (ptr->init)
|
||||
ptr->init (cart);
|
||||
|
||||
mapper_irqloop = ptr->irq;
|
||||
mapper_dump = ptr->dump;
|
||||
@@ -58,5 +66,6 @@ int mapper_init (NesCart *cart)
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
console_printf (Console_Default, "No compatible mapper found!\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,63 +1,65 @@
|
||||
/*
|
||||
* AOROM Mapper - The TI-NESulator Project
|
||||
* aorom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-26 18:47:34 +0200 (jeu, 26 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/aorom.h $
|
||||
* $Revision: 46 $
|
||||
*
|
||||
*/
|
||||
|
||||
unsigned char aorom_load_bank;
|
||||
|
||||
void aorom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
/*
|
||||
* AOROM Mapper - The TI-NESulator Project
|
||||
* aorom.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "aorom.h"
|
||||
|
||||
unsigned char aorom_load_bank;
|
||||
|
||||
void aorom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
|
||||
extern byte *ppu_mem_nameTables;
|
||||
|
||||
int aorom_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_32k(0x8000,0);
|
||||
|
||||
int aorom_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_32k(0x8000,0);
|
||||
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
|
||||
aorom_load_bank = 0;
|
||||
|
||||
/* Register the write hook */
|
||||
for (i = 0x80; i < 0x100; i++)
|
||||
{
|
||||
set_page_wr_hook(i, aorom_MapperWriteHook);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void aorom_MapperWriteHook(register byte Addr, register byte Value)
|
||||
{
|
||||
int BankNb;
|
||||
|
||||
if (Value & (1 << 4))
|
||||
ppu_setSingleScreen(PPU_SCREEN_000);
|
||||
else
|
||||
|
||||
aorom_load_bank = 0;
|
||||
|
||||
/* Register the write hook */
|
||||
for (i = 0x80; i < 0x100; i++)
|
||||
{
|
||||
set_page_wr_hook(i, aorom_MapperWriteHook);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void aorom_MapperWriteHook(register byte Addr, register byte Value)
|
||||
{
|
||||
int BankNb;
|
||||
|
||||
if (Value & (1 << 4))
|
||||
ppu_setSingleScreen(PPU_SCREEN_000);
|
||||
else
|
||||
ppu_setSingleScreen(PPU_SCREEN_400);
|
||||
|
||||
BankNb = Value & 0x0F;
|
||||
|
||||
aorom_load_bank = BankNb;
|
||||
|
||||
//printf("aorom: Asking bank %d (giving %d & %d) - mirror is %d\n",BankNb,BankNb,(Value<<1)+1,Value&0x0F);
|
||||
set_prom_bank_32k(0x8000,BankNb);
|
||||
}
|
||||
|
||||
void aorom_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"aorom: bank:%d\n",aorom_load_bank);
|
||||
}
|
||||
|
||||
BankNb = Value & 0x0F;
|
||||
|
||||
aorom_load_bank = BankNb;
|
||||
|
||||
console_printf(Console_Default, "aorom: Asking bank %d - NT is 0x%04X\n",BankNb,(Value&0x10)?0x2400:0x2000);
|
||||
set_prom_bank_32k(0x8000,BankNb);
|
||||
}
|
||||
|
||||
void aorom_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"aorom: bank:%d\n",aorom_load_bank);
|
||||
}
|
||||
19
src/mappersmanager/mappers/aorom.h
Executable file
19
src/mappersmanager/mappers/aorom.h
Executable file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* AOROM Mapper - The TI-NESulator Project
|
||||
* aorom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#define __TINES_MAPPERS__
|
||||
#include <mappers/manager.h>
|
||||
|
||||
int aorom_InitMapper(NesCart * cart);
|
||||
void aorom_MapperDump(FILE *fp);
|
||||
@@ -1,17 +1,19 @@
|
||||
/*
|
||||
* CNROM Mapper - The TI-NESulator Project
|
||||
* cnrom.h
|
||||
* cnrom.c
|
||||
*
|
||||
* 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) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/cnrom.h $
|
||||
* $Revision: 39 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "cnrom.h"
|
||||
|
||||
unsigned char cnrom_load_bank;
|
||||
|
||||
void cnrom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
19
src/mappersmanager/mappers/cnrom.h
Executable file
19
src/mappersmanager/mappers/cnrom.h
Executable file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* CNROM Mapper - The TI-NESulator Project
|
||||
* cnrom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#define __TINES_MAPPERS__
|
||||
#include <mappers/manager.h>
|
||||
|
||||
int cnrom_InitMapper(NesCart * cart);
|
||||
void cnrom_MapperDump(FILE *fp);
|
||||
@@ -3,12 +3,12 @@
|
||||
* genericmapper.h
|
||||
*
|
||||
* 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) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/genericmapper.h $
|
||||
* $Revision: 39 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -1,125 +1,127 @@
|
||||
/*
|
||||
* IREMH3001 Mapper - The TI-NESulator Project
|
||||
* iremh3001.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/iremh3001.h $
|
||||
* $Revision: 39 $
|
||||
*
|
||||
*/
|
||||
|
||||
unsigned short iremh3001_prom_slot[3];
|
||||
|
||||
unsigned short iremh3001_vrom_slot[8];
|
||||
|
||||
int iremh3001_InitMapper(NesCart * cart)
|
||||
{
|
||||
|
||||
set_prom_bank_16k(0x8000, 0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
iremh3001_prom_slot[0] = 0;
|
||||
iremh3001_prom_slot[1] = 1;
|
||||
iremh3001_prom_slot[2] = GETLAST16KBANK(cart);
|
||||
|
||||
set_vrom_bank_8k(0x0000,4);
|
||||
|
||||
iremh3001_vrom_slot[0] = 0;
|
||||
iremh3001_vrom_slot[1] = 0;
|
||||
iremh3001_vrom_slot[2] = 0;
|
||||
iremh3001_vrom_slot[3] = 0;
|
||||
iremh3001_vrom_slot[4] = 0;
|
||||
iremh3001_vrom_slot[5] = 0;
|
||||
iremh3001_vrom_slot[6] = 0;
|
||||
iremh3001_vrom_slot[7] = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int iremh3001_MapperWriteHook(register word Addr, register byte Value)
|
||||
{
|
||||
|
||||
switch(Addr)
|
||||
{
|
||||
case 0x8000: /* Set 8k PROM @ 8000 */
|
||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0x8000, Value);
|
||||
iremh3001_prom_slot[0] = Value;
|
||||
break;
|
||||
|
||||
case 0x9003: /* Mirroring ??? */
|
||||
printf("iremh3001: Mirroring[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0x9005: /* IRQ ??? */
|
||||
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0x9006: /* IRQ ??? */
|
||||
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0xA000: /* Set 8k PROM @ A000 */
|
||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0xA000, Value);
|
||||
iremh3001_prom_slot[1] = Value;
|
||||
break;
|
||||
|
||||
case 0xB000: /* Set 1k VROM @ 0000 */
|
||||
case 0xB001: /* Set 1k VROM @ 0400 */
|
||||
case 0xB002: /* Set 1k VROM @ 0800 */
|
||||
case 0xB003: /* Set 1k VROM @ 0C00 */
|
||||
case 0xB004: /* Set 1k VROM @ 1000 */
|
||||
case 0xB005: /* Set 1k VROM @ 1400 */
|
||||
case 0xB006: /* Set 1k VROM @ 1800 */
|
||||
case 0xB007: /* Set 1k VROM @ 1C00 */
|
||||
printf("iremh3001: %X: change VROM to %d[%X]\n", (Addr&0x0F)<<10, Value, Value);
|
||||
set_vrom_bank_1k((Addr&0xF)<<10, Value);
|
||||
iremh3001_vrom_slot[Addr&0x0F] = Value;
|
||||
break;
|
||||
|
||||
case 0xC000: /* Set 8k PROM @ C000 */
|
||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0xC000, Value);
|
||||
iremh3001_prom_slot[2] = Value;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("@:%X -- V:%X", Addr, Value);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void iremh3001_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"iremh3001: prom: $8000:%d $A000:%d $C000:%d\n",
|
||||
iremh3001_prom_slot[0],
|
||||
iremh3001_prom_slot[1],
|
||||
iremh3001_prom_slot[2]);
|
||||
|
||||
fprintf(fp,"iremh3001: vrom: $0000:%d $0400:%d $0800:%d $0C00:%d\n" \
|
||||
" $1000:%d $1400:%d $1800:%d $1C00:%d\n",
|
||||
iremh3001_vrom_slot[0],
|
||||
iremh3001_vrom_slot[1],
|
||||
iremh3001_vrom_slot[2],
|
||||
iremh3001_vrom_slot[3],
|
||||
iremh3001_vrom_slot[4],
|
||||
iremh3001_vrom_slot[5],
|
||||
iremh3001_vrom_slot[6],
|
||||
iremh3001_prom_slot[7]);
|
||||
}
|
||||
|
||||
|
||||
int iremh3001_MapperIRQ(int cycledone)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* IREMH3001 Mapper - The TI-NESulator Project
|
||||
* iremh3001.c
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "iremh3001.h"
|
||||
|
||||
unsigned short iremh3001_prom_slot[3];
|
||||
|
||||
unsigned short iremh3001_vrom_slot[8];
|
||||
|
||||
int iremh3001_InitMapper(NesCart * cart)
|
||||
{
|
||||
|
||||
set_prom_bank_16k(0x8000, 0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
iremh3001_prom_slot[0] = 0;
|
||||
iremh3001_prom_slot[1] = 1;
|
||||
iremh3001_prom_slot[2] = GETLAST16KBANK(cart);
|
||||
|
||||
set_vrom_bank_8k(0x0000,4);
|
||||
|
||||
iremh3001_vrom_slot[0] = 0;
|
||||
iremh3001_vrom_slot[1] = 0;
|
||||
iremh3001_vrom_slot[2] = 0;
|
||||
iremh3001_vrom_slot[3] = 0;
|
||||
iremh3001_vrom_slot[4] = 0;
|
||||
iremh3001_vrom_slot[5] = 0;
|
||||
iremh3001_vrom_slot[6] = 0;
|
||||
iremh3001_vrom_slot[7] = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int iremh3001_MapperWriteHook(register byte Addr, register byte Value)
|
||||
{
|
||||
#if 0
|
||||
switch(Addr)
|
||||
{
|
||||
case 0x8000: /* Set 8k PROM @ 8000 */
|
||||
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0x8000, Value);
|
||||
iremh3001_prom_slot[0] = Value;
|
||||
break;
|
||||
|
||||
case 0x9003: /* Mirroring ??? */
|
||||
console_printf(Console_Default, "iremh3001: Mirroring[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0x9005: /* IRQ ??? */
|
||||
console_printf(Console_Default, "iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0x9006: /* IRQ ??? */
|
||||
console_printf(Console_Default, "iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0xA000: /* Set 8k PROM @ A000 */
|
||||
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0xA000, Value);
|
||||
iremh3001_prom_slot[1] = Value;
|
||||
break;
|
||||
|
||||
case 0xB000: /* Set 1k VROM @ 0000 */
|
||||
case 0xB001: /* Set 1k VROM @ 0400 */
|
||||
case 0xB002: /* Set 1k VROM @ 0800 */
|
||||
case 0xB003: /* Set 1k VROM @ 0C00 */
|
||||
case 0xB004: /* Set 1k VROM @ 1000 */
|
||||
case 0xB005: /* Set 1k VROM @ 1400 */
|
||||
case 0xB006: /* Set 1k VROM @ 1800 */
|
||||
case 0xB007: /* Set 1k VROM @ 1C00 */
|
||||
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);
|
||||
iremh3001_vrom_slot[Addr&0x0F] = Value;
|
||||
break;
|
||||
|
||||
case 0xC000: /* Set 8k PROM @ C000 */
|
||||
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0xC000, Value);
|
||||
iremh3001_prom_slot[2] = Value;
|
||||
break;
|
||||
|
||||
default:
|
||||
console_printf(Console_Default, "@:%X -- V:%X", Addr, Value);
|
||||
return 0;
|
||||
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
void iremh3001_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"iremh3001: prom: $8000:%d $A000:%d $C000:%d\n",
|
||||
iremh3001_prom_slot[0],
|
||||
iremh3001_prom_slot[1],
|
||||
iremh3001_prom_slot[2]);
|
||||
|
||||
fprintf(fp,"iremh3001: vrom: $0000:%d $0400:%d $0800:%d $0C00:%d\n" \
|
||||
" $1000:%d $1400:%d $1800:%d $1C00:%d\n",
|
||||
iremh3001_vrom_slot[0],
|
||||
iremh3001_vrom_slot[1],
|
||||
iremh3001_vrom_slot[2],
|
||||
iremh3001_vrom_slot[3],
|
||||
iremh3001_vrom_slot[4],
|
||||
iremh3001_vrom_slot[5],
|
||||
iremh3001_vrom_slot[6],
|
||||
iremh3001_vrom_slot[7]);
|
||||
}
|
||||
|
||||
|
||||
int iremh3001_MapperIRQ(int cycledone)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
20
src/mappersmanager/mappers/iremh3001.h
Executable file
20
src/mappersmanager/mappers/iremh3001.h
Executable file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* IREMH3001 Mapper - The TI-NESulator Project
|
||||
* iremh3001.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#define __TINES_MAPPERS__
|
||||
#include <mappers/manager.h>
|
||||
|
||||
int iremh3001_InitMapper(NesCart * cart);
|
||||
void iremh3001_MapperDump(FILE *fp);
|
||||
int iremh3001_MapperIRQ(int cycledone);
|
||||
@@ -3,29 +3,26 @@
|
||||
* mmc1.h
|
||||
*
|
||||
* 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) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc1.h $
|
||||
* $Revision: 50 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "norom.h"
|
||||
#include "mmc1.h"
|
||||
|
||||
#include <ppu/ppu.h>
|
||||
#include <memory/manager.h>
|
||||
uint8_t MMC1_reg0;
|
||||
|
||||
unsigned char MMC1_reg0;
|
||||
uint8_t MMC1_reg1;
|
||||
|
||||
unsigned char MMC1_reg1;
|
||||
uint8_t MMC1_reg2;
|
||||
|
||||
unsigned char MMC1_reg2;
|
||||
uint8_t MMC1_reg3;
|
||||
|
||||
unsigned char MMC1_reg3;
|
||||
|
||||
unsigned char mmc1_CurrentBank;
|
||||
uint8_t mmc1_CurrentBank;
|
||||
|
||||
#define MMC1_R0_MIRROR 0x01
|
||||
#define MMC1_R0_ONESCREEN 0x02
|
||||
@@ -52,7 +49,6 @@ unsigned char mmc1_CurrentBank;
|
||||
#define MMC1_REG2_DEFAULT 0
|
||||
#define MMC1_REG3_DEFAULT 0
|
||||
|
||||
|
||||
void mmc1_MapperWriteReg0(register byte Addr, register byte Value);
|
||||
void mmc1_MapperWriteReg1(register byte Addr, register byte Value);
|
||||
void mmc1_MapperWriteReg2(register byte Addr, register byte Value);
|
||||
@@ -139,11 +135,11 @@ Reg 0
|
||||
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)
|
||||
{
|
||||
@@ -186,16 +182,16 @@ void mmc1_ApplyReg0Mod()
|
||||
|
||||
}
|
||||
|
||||
int VROMBankNb;
|
||||
unsigned char Bit = 0;
|
||||
unsigned char BitBuf = 0;
|
||||
uint32_t VROMBankNb;
|
||||
uint8_t Bit = 0;
|
||||
uint8_t BitBuf = 0;
|
||||
|
||||
void mmc1_MapperWriteReg0(register byte Addr, register byte Value)
|
||||
{
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg0 = MMC1_REG0_DEFAULT;
|
||||
printf("MMC1: Reg0 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg0 Reset occured !\n");
|
||||
mmc1_ApplyReg0Mod();
|
||||
}
|
||||
else
|
||||
@@ -222,7 +218,7 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg1 = MMC1_REG1_DEFAULT;
|
||||
printf("MMC1: Reg1 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg1 Reset occured !\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -242,18 +238,18 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||
{ /* 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);
|
||||
}
|
||||
else
|
||||
{ /* 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);
|
||||
}
|
||||
}
|
||||
@@ -265,7 +261,7 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg2 = MMC1_REG2_DEFAULT;
|
||||
printf("MMC1: Reg2 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg2 Reset occured !\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -283,21 +279,21 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
||||
|
||||
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)
|
||||
{
|
||||
//printf(": No\n");
|
||||
//console_printf(Console_Default, ": No\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||
{ /* 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);
|
||||
}
|
||||
else
|
||||
{ /* 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);
|
||||
}
|
||||
}
|
||||
@@ -309,7 +305,7 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg3 = MMC1_REG3_DEFAULT;
|
||||
printf("MMC1: Reg3 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg3 Reset occured !\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -325,7 +321,7 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
||||
|
||||
MMC1_reg3 = BitBuf;
|
||||
|
||||
if (MMC1_reg3<<14 > Cart->PROMSize)
|
||||
if ( ((uint32_t)MMC1_reg3 << 14) > Cart->PROMSize)
|
||||
return;
|
||||
|
||||
if ( (MMC1_reg0 & MMC1_R0_PRGSIZE) != 0 )
|
||||
@@ -333,12 +329,12 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
||||
if ( (MMC1_reg0 & MMC1_R0_PRGAREA) != 0 )
|
||||
{ /* 0x8000 switch */
|
||||
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
|
||||
{ /* 0xC000 switch */
|
||||
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
|
||||
@@ -358,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);
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
/*
|
||||
* MMC1 Mapper - The TI-NESulator Project
|
||||
* mmc1.h
|
||||
* TI-NESulator.X
|
||||
*
|
||||
* Created by Manoël Trapier on 02/12/07.
|
||||
* Copyright 2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -12,5 +17,4 @@
|
||||
|
||||
int mmc1_InitMapper (NesCart *cart);
|
||||
int mmc1_MapperIRQ (int cycledone);
|
||||
void mmc1_MapperDump ();
|
||||
void mmc1_MapperWriteHook(register byte Addr, register byte Value);
|
||||
void mmc1_MapperDump ();
|
||||
@@ -3,14 +3,17 @@
|
||||
* mmc3.h
|
||||
*
|
||||
* 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) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc3.h $
|
||||
* $Revision: 50 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
#include "mmc3.h"
|
||||
|
||||
extern unsigned short ScanLine;
|
||||
|
||||
unsigned short mmc3_command;
|
||||
|
||||
@@ -43,8 +46,6 @@ void mmc3_MapperDump(FILE *fp)
|
||||
|
||||
int mmc3_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_16k(0x8000, 0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
@@ -56,7 +57,7 @@ int mmc3_InitMapper(NesCart * cart)
|
||||
mmc3_command = -1;
|
||||
|
||||
mmc3_irq_counter = -1;
|
||||
mmc3_irq_enable = 1;
|
||||
mmc3_irq_enable = 0;
|
||||
mmc3_irq_counter_reload = 0;
|
||||
|
||||
mmc3_use_xor = 0x42;
|
||||
@@ -75,8 +76,6 @@ int mmc3_InitMapper(NesCart * cart)
|
||||
|
||||
mmc3_first_prom_page = 0x8000;
|
||||
mmc3_second_prom_page = 0xA000;
|
||||
//mmc3_first_prom_page = 0; // Set it to 0x8000
|
||||
|
||||
|
||||
/* Register mapper write hook */
|
||||
set_page_wr_hook(0x80, mmc3_MapperWrite80Hook);
|
||||
@@ -92,12 +91,11 @@ int mmc3_InitMapper(NesCart * cart)
|
||||
set_page_writeable(0xE0, true);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
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)
|
||||
return;
|
||||
|
||||
@@ -134,7 +132,7 @@ void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
||||
{
|
||||
if (!(Value & 0x40))
|
||||
{
|
||||
printf("MMC3: Switch -> 8/A\n");
|
||||
console_printf(Console_Default, "MMC3: Switch -> 8/A\n");
|
||||
mmc3_first_prom_page = 0x8000;
|
||||
mmc3_second_prom_page = 0xA000;
|
||||
|
||||
@@ -147,7 +145,7 @@ void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("MMC3: Switch -> C/A\n");
|
||||
console_printf(Console_Default, "MMC3: Switch -> C/A\n");
|
||||
mmc3_first_prom_page = 0xC000;
|
||||
mmc3_second_prom_page = 0xA000;
|
||||
|
||||
@@ -159,9 +157,9 @@ void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
||||
|
||||
//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;
|
||||
|
||||
|
||||
|
||||
@@ -225,13 +223,13 @@ void mmc3_MapperWrite80Hook(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)
|
||||
return;
|
||||
|
||||
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)
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
@@ -241,7 +239,7 @@ void mmc3_MapperWriteA0Hook(byte addr, byte Value)
|
||||
}
|
||||
else
|
||||
{
|
||||
//printf("MMC3: SaveRAM Toggle (0xA001) : 0x%X\n",Value);
|
||||
//console_printf(Console_Default, "MMC3: SaveRAM Toggle (0xA001) : 0x%X\n",Value);
|
||||
if (Value)
|
||||
map_sram();
|
||||
else
|
||||
@@ -250,11 +248,9 @@ void mmc3_MapperWriteA0Hook(byte addr, byte Value)
|
||||
|
||||
}
|
||||
|
||||
extern unsigned short ScanLine;
|
||||
|
||||
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)
|
||||
return;
|
||||
|
||||
@@ -262,33 +258,33 @@ void mmc3_MapperWriteC0Hook(byte addr, byte Value)
|
||||
{
|
||||
mmc3_irq_counter_reload = 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 */
|
||||
//printf("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: New tmp IRQ value (0xC001) : 0x%X\n",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;
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
return;
|
||||
|
||||
if (!addr)
|
||||
{
|
||||
//printf("MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||
//printf("MMC3 IRQ[%d]: IRQ disabled\n", ScanLine);
|
||||
//console_printf(Console_Default, "MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||
//console_printf(Console_Default, "MMC3 IRQ[%d]: IRQ disabled\n", ScanLine);
|
||||
mmc3_irq_enable = 0;
|
||||
//MapperWantIRQ = 1;
|
||||
// Add a way to raise an IRQ
|
||||
|
||||
}else{ /* E001 */
|
||||
//printf("MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||
//printf("MMC3: IRQ Enabled (value : %d)\n",mmc3_irq_counter);
|
||||
//printf("MMC3 IRQ[%d]: Enable IRQ\nr", ScanLine);
|
||||
//console_printf(Console_Default, "MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||
//console_printf(Console_Default, "MMC3: IRQ Enabled (value : %d)\n",mmc3_irq_counter);
|
||||
//console_printf(Console_Default, "MMC3 IRQ[%d]: Enable IRQ\nr", ScanLine);
|
||||
mmc3_irq_enable = 1;
|
||||
}
|
||||
}
|
||||
@@ -309,7 +305,7 @@ int mmc3_MapperIRQ(int cycledone)
|
||||
|
||||
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;
|
||||
}
|
||||
20
src/mappersmanager/mappers/mmc3.h
Executable file
20
src/mappersmanager/mappers/mmc3.h
Executable file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* MMC3 Mapper - The TI-NESulator Project
|
||||
* mmc3.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#define __TINES_MAPPERS__
|
||||
#include <mappers/manager.h>
|
||||
|
||||
void mmc3_MapperDump(FILE *fp);
|
||||
int mmc3_InitMapper(NesCart * cart);
|
||||
int mmc3_MapperIRQ(int cycledone);
|
||||
@@ -1,35 +1,37 @@
|
||||
/*
|
||||
* MMC4 Mapper - The TI-NESulator Project
|
||||
* mmc4.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-31 18:00:41 +0200 (jeu, 31 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc4.h $
|
||||
* $Revision: 56 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* MMC4 Mapper - The TI-NESulator Project
|
||||
* mmc4.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2007-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "mmc4.h"
|
||||
|
||||
byte mmc4_RegA;
|
||||
byte mmc4_RegB;
|
||||
byte mmc4_RegC;
|
||||
byte mmc4_RegD;
|
||||
byte mmc4_RegE;
|
||||
byte mmc4_RegF;
|
||||
byte mmc4_RegF;
|
||||
|
||||
#ifdef DEBUG
|
||||
#define LOG
|
||||
//printf
|
||||
#define LOG(s) printf s
|
||||
#else
|
||||
#define LOG
|
||||
#define LOG(s) { }
|
||||
#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)
|
||||
{
|
||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
||||
LOG(("%s(%02X, %02X)\n", __func__, Addr, Value));
|
||||
mmc4_RegA = Value;
|
||||
|
||||
set_prom_bank_16k(0x8000, Value & 0x0F);
|
||||
@@ -38,7 +40,7 @@ void mmc4_MapperWriteRegA(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;
|
||||
|
||||
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
||||
@@ -46,28 +48,28 @@ void mmc4_MapperWriteRegB(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;
|
||||
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
||||
}
|
||||
|
||||
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;
|
||||
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
||||
}
|
||||
|
||||
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;
|
||||
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
||||
}
|
||||
|
||||
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;
|
||||
if (Value & 0x01)
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
@@ -75,51 +77,52 @@ void mmc4_MapperWriteRegF(register byte Addr, register byte Value)
|
||||
ppu_setMirroring(PPU_MIRROR_VERTICAL);
|
||||
}
|
||||
|
||||
|
||||
void mmc4_MapperDump(FILE *fp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int mmc4_InitMapper(NesCart * cart)
|
||||
|
||||
void mmc4_MapperDump(FILE *fp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int mmc4_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_16k(0x8000,0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
if (cart->VROMSize > 0)
set_vrom_bank_8k(0x0000,0);
|
||||
|
||||
/* Mapper should register itself for write hook */
|
||||
for (i = 0xA0; i < 0xB0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegA);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xB0; i < 0xC0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegB);
|
||||
set_page_writeable(i, true);
|
||||
|
||||
set_prom_bank_16k(0x8000, 0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
if (cart->VROMSize > 0)
|
||||
set_vrom_bank_8k(0x0000,0);
|
||||
|
||||
/* Mapper should register itself for write hook */
|
||||
for (i = 0xA0; i < 0xB0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegA);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xB0; i < 0xC0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegB);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xC0; i < 0xD0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegC);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xD0; i < 0xE0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegD);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xE0; i < 0xF0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegE);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xF0; i < 0x100 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegF);
|
||||
set_page_writeable(i, true);
|
||||
for (i = 0xC0; i < 0xD0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegC);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xD0; i < 0xE0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegD);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xE0; i < 0xF0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegE);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xF0; i < 0x100 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegF);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
|
||||
for (i = 0x60; i < 0x80 ; i++)
|
||||
@@ -130,8 +133,8 @@ int mmc4_InitMapper(NesCart * cart)
|
||||
|
||||
//ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
//ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
19
src/mappersmanager/mappers/mmc4.h
Normal file
19
src/mappersmanager/mappers/mmc4.h
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* MMC4 Mapper - The TI-NESulator Project
|
||||
* mmc4.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2007-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#define __TINES_MAPPERS__
|
||||
#include <mappers/manager.h>
|
||||
|
||||
void mmc4_MapperDump(FILE *fp);
|
||||
int mmc4_InitMapper(NesCart * cart);
|
||||
@@ -1,9 +1,14 @@
|
||||
/*
|
||||
* NOROM Mapper - The TI-NESulator Project
|
||||
* norom.c
|
||||
* TI-NESulator.X
|
||||
*
|
||||
* Created by Manoël Trapier on 25/10/07.
|
||||
* Copyright 2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -11,8 +16,6 @@
|
||||
|
||||
int norom_InitMapper(NesCart *cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_page_ptr_16k(0x80, cart->PROMBanks);
|
||||
|
||||
/* mUBank = 0xC000 */
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
/*
|
||||
* norom.h
|
||||
* TI-NESulator.X
|
||||
* NOROM Mapper - The TI-NESulator Project
|
||||
* norom.c
|
||||
*
|
||||
* Created by Manoël Trapier on 25/10/07.
|
||||
* Copyright 2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -12,5 +17,4 @@
|
||||
|
||||
int norom_InitMapper (NesCart *cart);
|
||||
int norom_MapperIRQ (int cycledone);
|
||||
void norom_MapperDump ();
|
||||
void norom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
void norom_MapperDump ();
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* AOROM Mapper - The TI-NESulator Project
|
||||
* aorom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-26 18:47:34 +0200 (jeu, 26 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/aorom.h $
|
||||
* $Revision: 46 $
|
||||
*
|
||||
*/
|
||||
|
||||
unsigned char aorom_load_bank;
|
||||
|
||||
void aorom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
|
||||
extern byte *ppu_mem_nameTables;
|
||||
|
||||
int aorom_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_32k(0x8000,0);
|
||||
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
|
||||
aorom_load_bank = 0;
|
||||
|
||||
/* Register the write hook */
|
||||
for (i = 0x80; i < 0x100; i++)
|
||||
{
|
||||
set_page_wr_hook(i, aorom_MapperWriteHook);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void aorom_MapperWriteHook(register byte Addr, register byte Value)
|
||||
{
|
||||
int BankNb;
|
||||
|
||||
if (Value & (1 << 4))
|
||||
ppu_setSingleScreen(PPU_SCREEN_000);
|
||||
else
|
||||
ppu_setSingleScreen(PPU_SCREEN_400);
|
||||
|
||||
BankNb = Value & 0x0F;
|
||||
|
||||
aorom_load_bank = BankNb;
|
||||
|
||||
//printf("aorom: Asking bank %d (giving %d & %d) - mirror is %d\n",BankNb,BankNb,(Value<<1)+1,Value&0x0F);
|
||||
set_prom_bank_32k(0x8000,BankNb);
|
||||
}
|
||||
|
||||
void aorom_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"aorom: bank:%d\n",aorom_load_bank);
|
||||
}
|
||||
@@ -3,18 +3,20 @@
|
||||
* unrom.h
|
||||
*
|
||||
* 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) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/unrom.h $
|
||||
* $Revision: 39 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "unrom.h"
|
||||
|
||||
unsigned char unrom_load_vbank;
|
||||
|
||||
void unrom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
void unrom_MapperWriteHook(byte Addr, byte Value);
|
||||
|
||||
int unrom_InitMapper(NesCart * cart)
|
||||
{
|
||||
@@ -39,7 +41,7 @@ int unrom_InitMapper(NesCart * cart)
|
||||
}
|
||||
|
||||
|
||||
void unrom_MapperWriteHook(register byte Addr, register byte Value)
|
||||
void unrom_MapperWriteHook(byte Addr, byte Value)
|
||||
{
|
||||
set_vrom_bank_8k(0x0000,Value);
|
||||
unrom_load_vbank = Value;
|
||||
19
src/mappersmanager/mappers/unrom.h
Executable file
19
src/mappersmanager/mappers/unrom.h
Executable file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* UNROM Mapper - The TI-NESulator Project
|
||||
* unrom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#define __TINES_MAPPERS__
|
||||
#include <mappers/manager.h>
|
||||
|
||||
int unrom_InitMapper(NesCart * cart);
|
||||
void unrom_MapperDump(FILE *fp);
|
||||
@@ -1,20 +1,43 @@
|
||||
/*
|
||||
* Mapper list - The TI-NESulator Project
|
||||
* mappers_list.h
|
||||
* TI-NESulator.X
|
||||
*
|
||||
* Created by Manoël Trapier on 25/10/07.
|
||||
* Copyright 2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel TRAPIER on 25/10/07.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
/* This file could be generated from the mappers directory... */
|
||||
#include "mappers/norom.h"
|
||||
#include "mappers/aorom.h"
|
||||
#include "mappers/unrom.h"
|
||||
#include "mappers/cnrom.h"
|
||||
|
||||
#include "mappers/iremh3001.h"
|
||||
|
||||
#include "mappers/mmc1.h"
|
||||
#include "mappers/mmc3.h"
|
||||
#include "mappers/mmc4.h"
|
||||
|
||||
Mapper Mappers[] = {
|
||||
{ 0, "No Mapper", norom_InitMapper, norom_MapperIRQ, norom_MapperDump },
|
||||
{ 1, "MMC1", mmc1_InitMapper, norom_MapperIRQ, mmc1_MapperDump },
|
||||
{ 0 , "No Mapper", norom_InitMapper, norom_MapperIRQ, norom_MapperDump },
|
||||
{ 7 , "AOROM", aorom_InitMapper, norom_MapperIRQ, aorom_MapperDump },
|
||||
{ 2 , "CNROM", cnrom_InitMapper, norom_MapperIRQ, cnrom_MapperDump },
|
||||
{ 3 , "UNROM", unrom_InitMapper, norom_MapperIRQ, unrom_MapperDump },
|
||||
|
||||
{ 1 , "MMC1", mmc1_InitMapper, norom_MapperIRQ, mmc1_MapperDump },
|
||||
{ 4 , "MMC3", mmc3_InitMapper, mmc3_MapperIRQ, mmc3_MapperDump },
|
||||
{ 10, "MMC4", mmc4_InitMapper, norom_MapperIRQ, mmc4_MapperDump },
|
||||
|
||||
{ 65, "Irem H3001", iremh3001_InitMapper, iremh3001_MapperIRQ, iremh3001_MapperDump },
|
||||
|
||||
|
||||
{ 100, "Floppy Disk System", NULL, norom_MapperIRQ, norom_MapperDump },
|
||||
/* EOL tag */
|
||||
{ 0, NULL, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* CNROM Mapper - The TI-NESulator Project
|
||||
* cnrom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/cnrom.h $
|
||||
* $Revision: 39 $
|
||||
*
|
||||
*/
|
||||
|
||||
unsigned char cnrom_load_bank;
|
||||
|
||||
void cnrom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
|
||||
int cnrom_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_16k(0x8000, 0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart)); /* Set the last one */
|
||||
cnrom_load_bank = 0;
|
||||
|
||||
/* Register the write hook */
|
||||
for (i = 0x80; i < 0x100; i++)
|
||||
{
|
||||
set_page_wr_hook(i, cnrom_MapperWriteHook);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void cnrom_MapperWriteHook(register byte Addr, register byte Value)
|
||||
{
|
||||
set_prom_bank_16k(0x8000,Value);
|
||||
cnrom_load_bank = Value;
|
||||
}
|
||||
|
||||
void cnrom_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"cnrom: bank:%d\n",cnrom_load_bank);
|
||||
}
|
||||
@@ -3,12 +3,12 @@
|
||||
* genericmapper.h
|
||||
*
|
||||
* 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) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/genericmapper.h $
|
||||
* $Revision: 39 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
/*
|
||||
* IREMH3001 Mapper - The TI-NESulator Project
|
||||
* iremh3001.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/iremh3001.h $
|
||||
* $Revision: 39 $
|
||||
*
|
||||
*/
|
||||
|
||||
unsigned short iremh3001_prom_slot[3];
|
||||
|
||||
unsigned short iremh3001_vrom_slot[8];
|
||||
|
||||
int iremh3001_InitMapper(NesCart * cart)
|
||||
{
|
||||
|
||||
set_prom_bank_16k(0x8000, 0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
iremh3001_prom_slot[0] = 0;
|
||||
iremh3001_prom_slot[1] = 1;
|
||||
iremh3001_prom_slot[2] = GETLAST16KBANK(cart);
|
||||
|
||||
set_vrom_bank_8k(0x0000,4);
|
||||
|
||||
iremh3001_vrom_slot[0] = 0;
|
||||
iremh3001_vrom_slot[1] = 0;
|
||||
iremh3001_vrom_slot[2] = 0;
|
||||
iremh3001_vrom_slot[3] = 0;
|
||||
iremh3001_vrom_slot[4] = 0;
|
||||
iremh3001_vrom_slot[5] = 0;
|
||||
iremh3001_vrom_slot[6] = 0;
|
||||
iremh3001_vrom_slot[7] = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int iremh3001_MapperWriteHook(register word Addr, register byte Value)
|
||||
{
|
||||
|
||||
switch(Addr)
|
||||
{
|
||||
case 0x8000: /* Set 8k PROM @ 8000 */
|
||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0x8000, Value);
|
||||
iremh3001_prom_slot[0] = Value;
|
||||
break;
|
||||
|
||||
case 0x9003: /* Mirroring ??? */
|
||||
printf("iremh3001: Mirroring[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0x9005: /* IRQ ??? */
|
||||
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0x9006: /* IRQ ??? */
|
||||
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
|
||||
break;
|
||||
|
||||
case 0xA000: /* Set 8k PROM @ A000 */
|
||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0xA000, Value);
|
||||
iremh3001_prom_slot[1] = Value;
|
||||
break;
|
||||
|
||||
case 0xB000: /* Set 1k VROM @ 0000 */
|
||||
case 0xB001: /* Set 1k VROM @ 0400 */
|
||||
case 0xB002: /* Set 1k VROM @ 0800 */
|
||||
case 0xB003: /* Set 1k VROM @ 0C00 */
|
||||
case 0xB004: /* Set 1k VROM @ 1000 */
|
||||
case 0xB005: /* Set 1k VROM @ 1400 */
|
||||
case 0xB006: /* Set 1k VROM @ 1800 */
|
||||
case 0xB007: /* Set 1k VROM @ 1C00 */
|
||||
printf("iremh3001: %X: change VROM to %d[%X]\n", (Addr&0x0F)<<10, Value, Value);
|
||||
set_vrom_bank_1k((Addr&0xF)<<10, Value);
|
||||
iremh3001_vrom_slot[Addr&0x0F] = Value;
|
||||
break;
|
||||
|
||||
case 0xC000: /* Set 8k PROM @ C000 */
|
||||
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
|
||||
set_prom_bank_8k(0xC000, Value);
|
||||
iremh3001_prom_slot[2] = Value;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("@:%X -- V:%X", Addr, Value);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void iremh3001_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"iremh3001: prom: $8000:%d $A000:%d $C000:%d\n",
|
||||
iremh3001_prom_slot[0],
|
||||
iremh3001_prom_slot[1],
|
||||
iremh3001_prom_slot[2]);
|
||||
|
||||
fprintf(fp,"iremh3001: vrom: $0000:%d $0400:%d $0800:%d $0C00:%d\n" \
|
||||
" $1000:%d $1400:%d $1800:%d $1C00:%d\n",
|
||||
iremh3001_vrom_slot[0],
|
||||
iremh3001_vrom_slot[1],
|
||||
iremh3001_vrom_slot[2],
|
||||
iremh3001_vrom_slot[3],
|
||||
iremh3001_vrom_slot[4],
|
||||
iremh3001_vrom_slot[5],
|
||||
iremh3001_vrom_slot[6],
|
||||
iremh3001_prom_slot[7]);
|
||||
}
|
||||
|
||||
|
||||
int iremh3001_MapperIRQ(int cycledone)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -3,12 +3,12 @@
|
||||
* mmc1.h
|
||||
*
|
||||
* 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) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc1.h $
|
||||
* $Revision: 50 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
unsigned char MMC1_reg0;
|
||||
@@ -137,26 +137,26 @@ 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)
|
||||
{
|
||||
case 0:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_000);
|
||||
break;
|
||||
case 1:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_400);
|
||||
break;
|
||||
case 2:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_VERTICAL);
|
||||
break;
|
||||
case 3:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
break;
|
||||
switch (MMC1_reg0 & 0x03)
|
||||
{
|
||||
case 0:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_000);
|
||||
break;
|
||||
case 1:
|
||||
ppu_setScreenMode(PPU_SCMODE_SINGLE);
|
||||
ppu_setSingleScreen(PPU_SCREEN_400);
|
||||
break;
|
||||
case 2:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_VERTICAL);
|
||||
break;
|
||||
case 3:
|
||||
ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
break;
|
||||
}
|
||||
|
||||
if ( (OldSwitchArea != (MMC1_reg0 & MMC1_R0_PRGAREA)) && ((MMC1_reg0 & MMC1_R0_PRGSIZE) != 0 ) )
|
||||
@@ -175,7 +175,7 @@ void mmc1_ApplyReg0Mod()
|
||||
|
||||
}
|
||||
|
||||
OldSwitchArea = (MMC1_reg0 & MMC1_R0_PRGAREA);
|
||||
OldSwitchArea = (MMC1_reg0 & MMC1_R0_PRGAREA);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -189,7 +189,7 @@ void mmc1_MapperWriteReg0(register byte Addr, register byte Value)
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg0 = MMC1_REG0_DEFAULT;
|
||||
printf("MMC1: Reg0 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg0 Reset occured !\n");
|
||||
mmc1_ApplyReg0Mod();
|
||||
}
|
||||
else
|
||||
@@ -216,7 +216,7 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg1 = MMC1_REG1_DEFAULT;
|
||||
printf("MMC1: Reg1 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg1 Reset occured !\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -234,20 +234,20 @@ void mmc1_MapperWriteReg1(register byte Addr, register byte Value)
|
||||
|
||||
VROMBankNb = (MMC1_reg1 /* & MMC1_R1_VROMB1 */ );
|
||||
|
||||
if (Cart->VROMSize == 0)
|
||||
{
|
||||
printf("Try to change VROM but with didn't have any VROM ! [%04X]\n", VROMBankNb);
|
||||
return;
|
||||
if (Cart->VROMSize == 0)
|
||||
{
|
||||
console_printf(Console_Default, "Try to change VROM but with didn't have any VROM ! [%04X]\n", VROMBankNb);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||
{ /* 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);
|
||||
}
|
||||
else
|
||||
{ /* 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);
|
||||
}
|
||||
}
|
||||
@@ -259,7 +259,7 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg2 = MMC1_REG2_DEFAULT;
|
||||
printf("MMC1: Reg2 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg2 Reset occured !\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -277,21 +277,21 @@ void mmc1_MapperWriteReg2(register byte Addr, register byte Value)
|
||||
|
||||
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)
|
||||
{
|
||||
//printf(": No\n");
|
||||
//console_printf(Console_Default, ": No\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (MMC1_reg0 & MMC1_R0_VROMSW) != 0 )
|
||||
{ /* 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);
|
||||
}
|
||||
else
|
||||
{ /* 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);
|
||||
}
|
||||
}
|
||||
@@ -303,7 +303,7 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
||||
if (Value & 0x80)
|
||||
{
|
||||
MMC1_reg3 = MMC1_REG3_DEFAULT;
|
||||
printf("MMC1: Reg3 Reset occured !\n");
|
||||
console_printf(Console_Default, "MMC1: Reg3 Reset occured !\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -327,12 +327,12 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
|
||||
if ( (MMC1_reg0 & MMC1_R0_PRGAREA) != 0 )
|
||||
{ /* 0x8000 switch */
|
||||
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
|
||||
{ /* 0xC000 switch */
|
||||
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
|
||||
@@ -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);
|
||||
|
||||
@@ -1,317 +0,0 @@
|
||||
/*
|
||||
* MMC3 Mapper - The TI-NESulator Project
|
||||
* mmc3.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc3.h $
|
||||
* $Revision: 50 $
|
||||
*
|
||||
*/
|
||||
|
||||
unsigned short mmc3_command;
|
||||
|
||||
unsigned char mmc3_irq_counter;
|
||||
unsigned char mmc3_irq_counter_reload;
|
||||
unsigned char mmc3_irq_enable;
|
||||
|
||||
unsigned short mmc3_first_prom_page;
|
||||
unsigned short mmc3_second_prom_page;
|
||||
|
||||
unsigned char mmc3_use_xor;
|
||||
unsigned char mmc3_last_vrom[6];
|
||||
|
||||
unsigned char mmc3_last_prom[2];
|
||||
unsigned char mmc3_last_prom_switch;
|
||||
|
||||
unsigned short dummy;
|
||||
|
||||
void mmc3_MapperWrite80Hook(byte addr, byte value);
|
||||
void mmc3_MapperWriteA0Hook(byte addr, byte value);
|
||||
void mmc3_MapperWriteC0Hook(byte addr, byte value);
|
||||
void mmc3_MapperWriteE0Hook(byte addr, byte value);
|
||||
|
||||
void mmc3_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"MMC3: CMD:%d IC:%d IR:%d IE:%d FPP:0x%04X SPP:0x%04X UX:%d\n",mmc3_command,mmc3_irq_counter,mmc3_irq_counter_reload,mmc3_irq_enable,mmc3_first_prom_page,mmc3_second_prom_page,mmc3_use_xor);
|
||||
fprintf(fp,"MMC3: LV0:%d LV1:%d LV2:%d LV3:%d LV4:%d LV5:%d\n",mmc3_last_vrom[0],mmc3_last_vrom[1],mmc3_last_vrom[2],mmc3_last_vrom[3],mmc3_last_vrom[4],mmc3_last_vrom[5]);
|
||||
fprintf(fp,"MMC3: LP0:%d LP1:%d LPS:%d\n",mmc3_last_prom[0],mmc3_last_prom[1],mmc3_last_prom_switch);
|
||||
}
|
||||
|
||||
int mmc3_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_16k(0x8000, 0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
if ( Cart->VROMSize > 0)
|
||||
{
|
||||
set_vrom_bank_8k(0, 0x0000);
|
||||
}
|
||||
|
||||
mmc3_command = -1;
|
||||
|
||||
mmc3_irq_counter = -1;
|
||||
mmc3_irq_enable = 1;
|
||||
mmc3_irq_counter_reload = 0;
|
||||
|
||||
mmc3_use_xor = 0x42;
|
||||
|
||||
mmc3_last_prom_switch = 0x42;
|
||||
|
||||
mmc3_last_prom[0] = 0;
|
||||
mmc3_last_prom[1] = 1;
|
||||
|
||||
mmc3_last_vrom[0] = 0;
|
||||
mmc3_last_vrom[1] = 2;
|
||||
mmc3_last_vrom[2] = 3;
|
||||
mmc3_last_vrom[3] = 4;
|
||||
mmc3_last_vrom[4] = 5;
|
||||
mmc3_last_vrom[5] = 6;
|
||||
|
||||
mmc3_first_prom_page = 0x8000;
|
||||
mmc3_second_prom_page = 0xA000;
|
||||
//mmc3_first_prom_page = 0; // Set it to 0x8000
|
||||
|
||||
|
||||
/* Register mapper write hook */
|
||||
set_page_wr_hook(0x80, mmc3_MapperWrite80Hook);
|
||||
set_page_writeable(0x80, true);
|
||||
|
||||
set_page_wr_hook(0xA0, mmc3_MapperWriteA0Hook);
|
||||
set_page_writeable(0xA0, true);
|
||||
|
||||
set_page_wr_hook(0xC0, mmc3_MapperWriteC0Hook);
|
||||
set_page_writeable(0xC0, true);
|
||||
|
||||
set_page_wr_hook(0xE0, mmc3_MapperWriteE0Hook);
|
||||
set_page_writeable(0xE0, true);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void mmc3_MapperWrite80Hook(byte addr, byte Value)
|
||||
{
|
||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||
if (addr > 0x01)
|
||||
return;
|
||||
|
||||
if (!addr)
|
||||
{
|
||||
|
||||
if ((Cart->VROMSize > 0) && ( mmc3_use_xor != (Value & 0x80) ))
|
||||
{
|
||||
if (Value & 0x80)
|
||||
{
|
||||
set_vrom_bank_1k(0x0000, mmc3_last_vrom[2]);
|
||||
set_vrom_bank_1k(0x0400, mmc3_last_vrom[3]);
|
||||
set_vrom_bank_1k(0x0800, mmc3_last_vrom[4]);
|
||||
set_vrom_bank_1k(0x0C00, mmc3_last_vrom[5]);
|
||||
set_vrom_bank_2k(0x1000, mmc3_last_vrom[0]>>1);
|
||||
set_vrom_bank_2k(0x1800, mmc3_last_vrom[1]>>1);
|
||||
//chr4,chr5,chr6,chr7,chr01,chr01+1,chr23,chr23+1
|
||||
}
|
||||
else
|
||||
{
|
||||
set_vrom_bank_2k(0x0000, mmc3_last_vrom[0]>>1);
|
||||
set_vrom_bank_2k(0x0800, mmc3_last_vrom[1]>>1);
|
||||
set_vrom_bank_1k(0x1000, mmc3_last_vrom[2]);
|
||||
set_vrom_bank_1k(0x1400, mmc3_last_vrom[3]);
|
||||
set_vrom_bank_1k(0x1800, mmc3_last_vrom[4]);
|
||||
set_vrom_bank_1k(0x1C00, mmc3_last_vrom[5]);
|
||||
//chr01,chr01+1,chr23,chr23+1,chr4,chr5,chr6,chr7
|
||||
}
|
||||
mmc3_use_xor = (Value & 0x80);
|
||||
}
|
||||
|
||||
|
||||
if (mmc3_last_prom_switch != (Value & 0x40))
|
||||
{
|
||||
if (!(Value & 0x40))
|
||||
{
|
||||
printf("MMC3: Switch -> 8/A\n");
|
||||
mmc3_first_prom_page = 0x8000;
|
||||
mmc3_second_prom_page = 0xA000;
|
||||
|
||||
set_prom_bank_8k(mmc3_first_prom_page, mmc3_last_prom[0]);
|
||||
set_prom_bank_8k(mmc3_second_prom_page, mmc3_last_prom[1]);
|
||||
|
||||
set_prom_bank_8k(0xC000, GETLAST08KBANK(Cart)-1);
|
||||
//set_prom_bank_8k(0xE000, GETLAST08KBANK(cart));
|
||||
//prg_bank(prg0,prg1,max_prg-1,max_prg);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("MMC3: Switch -> C/A\n");
|
||||
mmc3_first_prom_page = 0xC000;
|
||||
mmc3_second_prom_page = 0xA000;
|
||||
|
||||
set_prom_bank_8k(mmc3_first_prom_page, mmc3_last_prom[0]);
|
||||
set_prom_bank_8k(mmc3_second_prom_page, mmc3_last_prom[1]);
|
||||
|
||||
set_prom_bank_8k(0x8000, GETLAST08KBANK(Cart)-1);
|
||||
|
||||
|
||||
//prg_bank(max_prg-1,prg1,prg0,max_prg);
|
||||
}
|
||||
mmc3_last_prom_switch = (Value & 0x40);
|
||||
}
|
||||
mmc3_command = Value & 0x07;
|
||||
|
||||
|
||||
|
||||
} else { /* 8001 */
|
||||
switch (mmc3_command)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
if (Cart->VROMSize == 0)
|
||||
return;
|
||||
|
||||
mmc3_last_vrom[mmc3_command] = Value;
|
||||
|
||||
if (mmc3_use_xor)
|
||||
{
|
||||
set_vrom_bank_1k(0x0000, mmc3_last_vrom[2]);
|
||||
set_vrom_bank_1k(0x0400, mmc3_last_vrom[3]);
|
||||
set_vrom_bank_1k(0x0800, mmc3_last_vrom[4]);
|
||||
set_vrom_bank_1k(0x0C00, mmc3_last_vrom[5]);
|
||||
set_vrom_bank_2k(0x1000, mmc3_last_vrom[0]>>1);
|
||||
set_vrom_bank_2k(0x1800, mmc3_last_vrom[1]>>1);
|
||||
//chr4,chr5,chr6,chr7,chr01,chr01+1,chr23,chr23+1
|
||||
}
|
||||
else
|
||||
{
|
||||
set_vrom_bank_2k(0x0000, mmc3_last_vrom[0]>>1);
|
||||
set_vrom_bank_2k(0x0800, mmc3_last_vrom[1]>>1);
|
||||
set_vrom_bank_1k(0x1000, mmc3_last_vrom[2]);
|
||||
set_vrom_bank_1k(0x1400, mmc3_last_vrom[3]);
|
||||
set_vrom_bank_1k(0x1800, mmc3_last_vrom[4]);
|
||||
set_vrom_bank_1k(0x1C00, mmc3_last_vrom[5]);
|
||||
//chr01,chr01+1,chr23,chr23+1,chr4,chr5,chr6,chr7
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 6:
|
||||
mmc3_last_prom[0] = Value;
|
||||
set_prom_bank_8k(mmc3_first_prom_page, mmc3_last_prom[0]);
|
||||
break;
|
||||
|
||||
case 7:
|
||||
mmc3_last_prom[1] = Value;
|
||||
set_prom_bank_8k(mmc3_second_prom_page, mmc3_last_prom[1]);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
/*if(mmc3_use_xor)
|
||||
chr_bank(chr4,chr5,chr6,chr7,chr01,chr01+1,chr23,chr23+1);
|
||||
else
|
||||
chr_bank(chr01,chr01+1,chr23,chr23+1,chr4,chr5,chr6,chr7);*/
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void mmc3_MapperWriteA0Hook(byte addr, byte Value)
|
||||
{
|
||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||
if (addr > 0x01)
|
||||
return;
|
||||
|
||||
if (!addr)
|
||||
{
|
||||
//printf("MMC3: Select mirroring (0xA000) : 0x%X\n",Value);
|
||||
|
||||
if (Value & 0x1)
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
else
|
||||
ppu_setMirroring(PPU_MIRROR_VERTICAL);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//printf("MMC3: SaveRAM Toggle (0xA001) : 0x%X\n",Value);
|
||||
if (Value)
|
||||
map_sram();
|
||||
else
|
||||
unmap_sram();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extern unsigned short ScanLine;
|
||||
|
||||
void mmc3_MapperWriteC0Hook(byte addr, byte Value)
|
||||
{
|
||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||
if (addr > 0x01)
|
||||
return;
|
||||
|
||||
if (!addr)
|
||||
{
|
||||
mmc3_irq_counter_reload = Value;
|
||||
mmc3_irq_counter = Value;
|
||||
//printf("MMC3 IRQ[%d]: SetIRQ reload to %d\n", ScanLine, Value);
|
||||
|
||||
}else{ /* C001 */
|
||||
//printf("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);
|
||||
mmc3_irq_counter = Value;
|
||||
}
|
||||
}
|
||||
|
||||
void mmc3_MapperWriteE0Hook(byte addr, byte Value)
|
||||
{
|
||||
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
|
||||
if (addr > 0x01)
|
||||
return;
|
||||
|
||||
if (!addr)
|
||||
{
|
||||
//printf("MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||
//printf("MMC3 IRQ[%d]: IRQ disabled\n", ScanLine);
|
||||
mmc3_irq_enable = 0;
|
||||
//MapperWantIRQ = 1;
|
||||
// Add a way to raise an IRQ
|
||||
|
||||
}else{ /* E001 */
|
||||
//printf("MMC3: Writing to 0xE001 : 0x%X\n",Value);
|
||||
//printf("MMC3: IRQ Enabled (value : %d)\n",mmc3_irq_counter);
|
||||
//printf("MMC3 IRQ[%d]: Enable IRQ\nr", ScanLine);
|
||||
mmc3_irq_enable = 1;
|
||||
}
|
||||
}
|
||||
|
||||
int mmc3_MapperIRQ(int cycledone)
|
||||
{
|
||||
if (((cycledone > 0) && (cycledone < 241)) /*&&
|
||||
(ppu.ControlRegister2.b & (PPU_CR2_BGVISIBILITY | PPU_CR2_SPRTVISIBILITY)) == (PPU_CR2_BGVISIBILITY | PPU_CR2_SPRTVISIBILITY)*/)
|
||||
{
|
||||
|
||||
if ((mmc3_irq_counter --) > 0 )return 0;
|
||||
|
||||
|
||||
/* Load next counter position */
|
||||
mmc3_irq_counter = mmc3_irq_counter_reload;
|
||||
|
||||
if (mmc3_irq_enable == 0) return 0;
|
||||
|
||||
mmc3_irq_enable = 0;
|
||||
|
||||
//printf("MMC3 IRQ[%d]: Tick next at %d\n", ScanLine, mmc3_irq_counter_reload);
|
||||
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,137 +0,0 @@
|
||||
/*
|
||||
* MMC4 Mapper - The TI-NESulator Project
|
||||
* mmc4.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-31 18:00:41 +0200 (jeu, 31 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mmc4.h $
|
||||
* $Revision: 56 $
|
||||
*
|
||||
*/
|
||||
|
||||
byte mmc4_RegA;
|
||||
byte mmc4_RegB;
|
||||
byte mmc4_RegC;
|
||||
byte mmc4_RegD;
|
||||
byte mmc4_RegE;
|
||||
byte mmc4_RegF;
|
||||
|
||||
#ifdef DEBUG
|
||||
#define LOG
|
||||
//printf
|
||||
#else
|
||||
#define LOG
|
||||
#endif
|
||||
|
||||
|
||||
void mmc4_MapperWriteRegA(register byte Addr, register byte Value)
|
||||
{
|
||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
||||
mmc4_RegA = Value;
|
||||
|
||||
set_prom_bank_16k(0x8000, Value & 0x0F);
|
||||
|
||||
}
|
||||
|
||||
void mmc4_MapperWriteRegB(register byte Addr, register byte Value)
|
||||
{
|
||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
||||
mmc4_RegB = Value;
|
||||
|
||||
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
||||
}
|
||||
|
||||
void mmc4_MapperWriteRegC(register byte Addr, register byte Value)
|
||||
{
|
||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
||||
mmc4_RegC = Value;
|
||||
set_vrom_bank_4k(0x0000, Value & 0x1F);
|
||||
}
|
||||
|
||||
void mmc4_MapperWriteRegD(register byte Addr, register byte Value)
|
||||
{
|
||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
||||
mmc4_RegD = Value;
|
||||
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
||||
}
|
||||
|
||||
void mmc4_MapperWriteRegE(register byte Addr, register byte Value)
|
||||
{
|
||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
||||
mmc4_RegE = Value;
|
||||
set_vrom_bank_4k(0x1000, Value & 0x1F);
|
||||
}
|
||||
|
||||
void mmc4_MapperWriteRegF(register byte Addr, register byte Value)
|
||||
{
|
||||
LOG("%s(%02X, %02X)\n", __func__, Addr, Value);
|
||||
mmc4_RegF = Value;
|
||||
if (Value & 0x01)
|
||||
ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
else
|
||||
ppu_setMirroring(PPU_MIRROR_VERTICAL);
|
||||
}
|
||||
|
||||
|
||||
void mmc4_MapperDump(FILE *fp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int mmc4_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_16k(0x8000,0);
|
||||
set_prom_bank_16k(0xC000, GETLAST16KBANK(cart));
|
||||
|
||||
if (cart->VROMSize > 0)
|
||||
set_vrom_bank_8k(0x0000,0);
|
||||
|
||||
/* Mapper should register itself for write hook */
|
||||
for (i = 0xA0; i < 0xB0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegA);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xB0; i < 0xC0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegB);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xC0; i < 0xD0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegC);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xD0; i < 0xE0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegD);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xE0; i < 0xF0 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegE);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
for (i = 0xF0; i < 0x100 ; i++)
|
||||
{
|
||||
set_page_wr_hook(i, mmc4_MapperWriteRegF);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
|
||||
for (i = 0x60; i < 0x80 ; i++)
|
||||
{
|
||||
set_page_writeable(i, true);
|
||||
set_page_readable(i, true);
|
||||
}
|
||||
|
||||
//ppu_setScreenMode(PPU_SCMODE_NORMAL);
|
||||
//ppu_setMirroring(PPU_MIRROR_HORIZTAL);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* UNROM Mapper - The TI-NESulator Project
|
||||
* unrom.h
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-16 01:55:35 +0200 (lun, 16 avr 2007) $
|
||||
* $Author: godzil $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/unrom.h $
|
||||
* $Revision: 39 $
|
||||
*
|
||||
*/
|
||||
|
||||
unsigned char unrom_load_vbank;
|
||||
|
||||
void unrom_MapperWriteHook(register byte Addr, register byte Value);
|
||||
|
||||
int unrom_InitMapper(NesCart * cart)
|
||||
{
|
||||
int i;
|
||||
|
||||
set_prom_bank_16k(0xC000, 0);
|
||||
set_prom_bank_16k(0x8000, GETLAST16KBANK(cart)); /* Set the last one */
|
||||
|
||||
if (Cart->VROMSize > 0)
|
||||
set_vrom_bank_8k(0x0000,0);
|
||||
|
||||
unrom_load_vbank = 0;
|
||||
|
||||
/* Register the write hook */
|
||||
for (i = 0x80; i < 0x100; i++)
|
||||
{
|
||||
set_page_wr_hook(i, unrom_MapperWriteHook);
|
||||
set_page_writeable(i, true);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void unrom_MapperWriteHook(register byte Addr, register byte Value)
|
||||
{
|
||||
set_vrom_bank_8k(0x0000,Value);
|
||||
unrom_load_vbank = Value;
|
||||
}
|
||||
|
||||
void unrom_MapperDump(FILE *fp)
|
||||
{
|
||||
fprintf(fp,"unrom: vbank:%d\n",unrom_load_vbank);
|
||||
}
|
||||
@@ -3,12 +3,12 @@
|
||||
* mappers.c
|
||||
*
|
||||
* 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) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/mappers.c $
|
||||
* $Revision: 56 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
#include <mappers/manager.h>
|
||||
#include <memory/manager.h>
|
||||
|
||||
#define __TINES_PPU_INTERNAL__
|
||||
#include <ppu/ppu.memory.h>
|
||||
#undef __TINES_PPU_INTERNAL__
|
||||
|
||||
extern NesCart *Cart;
|
||||
|
||||
extern char MapperWantIRQ;
|
||||
@@ -34,7 +38,7 @@ extern char MapperWantIRQ;
|
||||
void set_vrom_bank_1k(unsigned short addr,int slot)
|
||||
{
|
||||
#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
|
||||
ppu_setPagePtr1k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 1024));
|
||||
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 1024), 0x0400);
|
||||
@@ -43,7 +47,7 @@ void set_vrom_bank_1k(unsigned short addr,int slot)
|
||||
void set_vrom_bank_2k(unsigned short addr,int slot)
|
||||
{
|
||||
#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
|
||||
ppu_setPagePtr2k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 2 * 1024));
|
||||
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 2 * 1024), 0x0800);
|
||||
@@ -52,7 +56,7 @@ void set_vrom_bank_2k(unsigned short addr,int slot)
|
||||
void set_vrom_bank_4k(unsigned short addr,int slot)
|
||||
{
|
||||
#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
|
||||
ppu_setPagePtr4k((addr>>8)&0xFF, Cart->VROMBanks + (slot * 4 * 1024));
|
||||
// memcpy(ppu.Memory+addr, Cart->VROMBanks + (slot * 4 * 1024), 0x1000);
|
||||
@@ -61,7 +65,7 @@ void set_vrom_bank_4k(unsigned short addr,int slot)
|
||||
void set_vrom_bank_8k(unsigned short addr, int slot)
|
||||
{
|
||||
#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
|
||||
ppu_setPagePtr8k(0x00, Cart->VROMBanks + (slot * 8 * 1024));
|
||||
// memcpy(ppu.Memory, Cart->VROMBanks + (slot * 8 * 1024) , 0x2000);
|
||||
@@ -72,7 +76,7 @@ void set_vrom_bank_8k(unsigned short addr, int slot)
|
||||
void set_prom_bank_8k(unsigned short addr,int slot)
|
||||
{
|
||||
#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
|
||||
set_page_ptr_8k(addr >> 8, Cart->PROMBanks + (slot * 8 * 1024));
|
||||
}
|
||||
@@ -80,7 +84,7 @@ void set_prom_bank_8k(unsigned short addr,int slot)
|
||||
void set_prom_bank_16k(unsigned short addr,int slot)
|
||||
{
|
||||
#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
|
||||
set_page_ptr_16k(addr >> 8, Cart->PROMBanks + (slot * 16 * 1024));
|
||||
}
|
||||
@@ -89,7 +93,7 @@ void set_prom_bank_32k(unsigned short addr,int slot)
|
||||
{ /* addr may not be different from 0x8000 !*/
|
||||
/* Anyway I don't use it */
|
||||
#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
|
||||
set_page_ptr_32k(addr >> 8, Cart->PROMBanks + (slot * 32 * 1024));
|
||||
/* 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
|
||||
* memory.c - Taken from the Quick6502 project
|
||||
*
|
||||
* Created by Manoël Trapier on 18/09/06.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel Trapier on 18/09/06.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-02 18:37:41 +0200 (mer, 02 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/memory.c $
|
||||
* $Revision: 50 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include "types.h"
|
||||
#include "../include/memory/manager.h"
|
||||
#include <types.h>
|
||||
|
||||
#include <os_dependent.h>
|
||||
|
||||
#include <memory/manager.h>
|
||||
|
||||
/* Private structures */
|
||||
|
||||
@@ -38,7 +40,7 @@ byte memory_pages_attr[0x100];
|
||||
func_rdhook rdh_table[0x100];
|
||||
func_wrhook wrh_table[0x100];
|
||||
|
||||
//#define DEBUG
|
||||
#define DEBUG
|
||||
#undef DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -50,13 +52,13 @@ func_wrhook wrh_table[0x100];
|
||||
/* Public functions */
|
||||
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;
|
||||
}
|
||||
|
||||
void set_page_ptr_1k(byte page, byte *ptr)
|
||||
{ /* 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 + 1] = ptr + 0x100;
|
||||
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)
|
||||
{
|
||||
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 + 1] = ptr + 0x100;
|
||||
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)
|
||||
{
|
||||
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+((4 KBYTE / 256) / 2), ptr + 2 KBYTE);
|
||||
}
|
||||
|
||||
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+((8 KBYTE / 256) / 2), ptr + 4 KBYTE);
|
||||
}
|
||||
@@ -195,26 +197,23 @@ func_wrhook get_page_wrhook(byte page)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
byte ReadMemory(byte page, byte addr)
|
||||
{
|
||||
static byte LastRetByte = 0xA5;
|
||||
byte *page_ptr;
|
||||
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" ? */
|
||||
if ((page_ptr = memory_pages[page]) &&
|
||||
( (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 )
|
||||
return ( LastRetByte = rdh_table[page](addr) );
|
||||
else
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -222,7 +221,7 @@ void WriteMemory(byte page, byte addr, byte value)
|
||||
{
|
||||
byte *page_ptr;
|
||||
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" ? */
|
||||
if ( (page_ptr = memory_pages[page]) &&
|
||||
( (attributes = memory_pages_attr[page]) & ATTR_PAGE_WRITEABLE) )
|
||||
@@ -231,14 +230,14 @@ void WriteMemory(byte page, byte addr, byte value)
|
||||
{
|
||||
#ifdef DETECT_BUS_CONFLICT
|
||||
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
|
||||
wrh_table[page](addr, value);
|
||||
}
|
||||
else
|
||||
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)
|
||||
|
||||
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
|
||||
*
|
||||
* 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) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/paddle.c $
|
||||
* $Revision: 50 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
/* Allegro includes */
|
||||
#ifdef __APPLE__
|
||||
#define USE_CONSOLE
|
||||
#include <Allegro/allegro.h>
|
||||
#else
|
||||
#define USE_CONSOLE
|
||||
#include <allegro.h>
|
||||
#endif
|
||||
#include "paddle.h"
|
||||
|
||||
void InitPaddle(Paddle * pdl)
|
||||
@@ -99,7 +106,7 @@ unsigned char ReadPaddle(Paddle * pdl)
|
||||
|
||||
case 20:
|
||||
|
||||
return 0x41;
|
||||
return 0x40;
|
||||
|
||||
break;
|
||||
|
||||
@@ -116,6 +123,6 @@ unsigned char ReadPaddle(Paddle * pdl)
|
||||
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
|
||||
*
|
||||
* 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$
|
||||
* $Author$
|
||||
@@ -15,11 +15,13 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <os_dependent.h>
|
||||
|
||||
#include <plugins/manager.h>
|
||||
|
||||
typedef struct Plugin_
|
||||
{
|
||||
byte *name;
|
||||
char *name;
|
||||
|
||||
PluginInit init;
|
||||
PluginDeinit deinit;
|
||||
@@ -44,10 +46,10 @@ void plugin_list()
|
||||
{
|
||||
Plugin *ptr = &(Plugins[0]);
|
||||
int i = 1;
|
||||
printf("Available plugins:\n");
|
||||
console_printf(Console_Default, "Available plugins:\n");
|
||||
while(ptr->name != NULL)
|
||||
{
|
||||
printf("%d - %s\n", i, ptr->name);
|
||||
console_printf(Console_Default, "%d - %s\n", i, ptr->name);
|
||||
ptr++; i++;
|
||||
}
|
||||
}
|
||||
@@ -55,9 +57,15 @@ void plugin_list()
|
||||
int plugin_load(int id)
|
||||
{
|
||||
Plugin *ptr = &(Plugins[0]);
|
||||
int i = id;
|
||||
|
||||
for ( ; id == 0 && ptr != NULL; id -- )
|
||||
ptr ++;
|
||||
console_printf(Console_Default, "%s(%d)", __func__, id);
|
||||
|
||||
for ( ; i > 1 && ptr->name != NULL; i -- )
|
||||
{
|
||||
console_printf(Console_Default, "%d - %s\n", i, ptr->name);
|
||||
ptr ++;
|
||||
}
|
||||
|
||||
if (ptr == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -1,13 +1,38 @@
|
||||
/*
|
||||
* 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 <stdlib.h>
|
||||
#include <allegro.h>
|
||||
|
||||
#include <os_dependent.h>
|
||||
|
||||
#define __TINES_PLUGINS__
|
||||
#include <plugins/manager.h>
|
||||
#undef __TINES_PLUGINS_
|
||||
|
||||
#include <memory/manager.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_
|
||||
{
|
||||
@@ -53,7 +78,6 @@ byte gg_RdHookPatch##d(byte addr) \
|
||||
}
|
||||
|
||||
#define GG_MAX_PATCH 10
|
||||
|
||||
/* Defines the rdhook patches */
|
||||
GG_RDHOOKPATCH(0)
|
||||
GG_RDHOOKPATCH(1)
|
||||
@@ -68,7 +92,7 @@ GG_RDHOOKPATCH(9)
|
||||
|
||||
void gg_SetPatch(int id, byte page, byte addr, byte value)
|
||||
{
|
||||
func_rdhook *fptr;
|
||||
func_rdhook fptr;
|
||||
|
||||
if (id >= GG_MAX_PATCH)
|
||||
return;
|
||||
@@ -296,7 +320,7 @@ unsigned short SelectNumber(char *title, char *msg, byte size)
|
||||
|
||||
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 i;
|
||||
@@ -414,11 +438,11 @@ byte gg_SelectPatch()
|
||||
for (i = 0; i < GG_MAX_PATCH; i++)
|
||||
{
|
||||
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)
|
||||
sprintf(tmp, "Patch %d: Not used", i);
|
||||
else
|
||||
sprintf(tmp, "Patch %d: Put 0x%02X on address 0x%02X%02X (Code: %08X)",
|
||||
sprintf(tmp, "Patch %d: Put 0x%02X on address 0x%02X%02X (Code: %08lX)",
|
||||
i, gg_PatchedValue[i], gg_PatchedPage[i], gg_PatchedAddr[i],
|
||||
gg_MakeCode((gg_PatchedPage[i]<<8) | gg_PatchedAddr[i], gg_PatchedValue[i]));
|
||||
|
||||
@@ -442,7 +466,7 @@ byte gg_SelectPatch()
|
||||
|
||||
void gg_PatchManager()
|
||||
{
|
||||
printf("DTC!\n");
|
||||
console_printf(Console_Default, "DTC!\n");
|
||||
}
|
||||
|
||||
void gg_InitSearch()
|
||||
@@ -470,7 +494,7 @@ typedef enum gg_SearchForMode_
|
||||
void gg_SearchForValue(byte value)
|
||||
{
|
||||
unsigned short addr;
|
||||
byte oldValue;
|
||||
//byte oldValue;
|
||||
byte currentValue;
|
||||
gg_ResultNumber = 0x00;
|
||||
for(addr = 0x000; addr < 0x800; addr ++)
|
||||
@@ -480,7 +504,7 @@ void gg_SearchForValue(byte value)
|
||||
/* "Backup" the old ram */
|
||||
memcpy(gg_OldMainRAM, gg_MainRAM, 0x800);
|
||||
|
||||
oldValue = gg_MainRAM[addr];
|
||||
//oldValue = gg_MainRAM[addr];
|
||||
currentValue = ReadMemory((addr&0xFF00)>>8,addr&0x00FF);
|
||||
|
||||
if (currentValue != value)
|
||||
@@ -583,7 +607,7 @@ byte gg_DisplayResults()
|
||||
{
|
||||
while(gg_use_MainRAM[addr] != 0xFF)
|
||||
addr ++;
|
||||
printf("0x%04X [%d]\n", addr, i);
|
||||
console_printf(Console_Default, "0x%04X [%d]\n", addr, i);
|
||||
tmp = (char*) malloc(0x100);
|
||||
sprintf(tmp,"Patch: %08XAddress 0x%04X - Was: 0x%02X - Actual: 0x%02X",
|
||||
i,
|
||||
@@ -785,7 +809,7 @@ S02_MENU:
|
||||
int gg_Init()
|
||||
{
|
||||
int i;
|
||||
printf("Initializing GG plugin...\n");
|
||||
console_printf(Console_Default, "Initializing GG plugin...\n");
|
||||
|
||||
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_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... */
|
||||
|
||||
#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 <stdlib.h>
|
||||
|
||||
/* Allegro includes */
|
||||
#ifdef __APPLE__
|
||||
#define USE_CONSOLE
|
||||
#include <Allegro/allegro.h>
|
||||
#else
|
||||
#define USE_CONSOLE
|
||||
#include <allegro.h>
|
||||
#endif
|
||||
|
||||
#define __TINES_PPU_INTERNAL__
|
||||
|
||||
@@ -186,7 +207,7 @@ void DebugSprites()
|
||||
|
||||
#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 )
|
||||
|
||||
#define PPU_Rd(addr) ppu_readMemory((addr>>8)&0xFF, addr&0xFF)
|
||||
@@ -218,7 +239,7 @@ void ppu_dumpOneNameTable(unsigned short nametable, int xd, int yd)
|
||||
|
||||
void ppu_dumpOneAttributeTable(unsigned short nametable, int xd, int yd)
|
||||
{
|
||||
int x, y, x1, y1, Color, AttrByte;
|
||||
int x, x1, y1, Color, AttrByte;
|
||||
for (x = 0; x < 0x40; x++)
|
||||
{
|
||||
AttrByte = PPU_Rd(nametable + 0x23C0 + x);
|
||||
@@ -334,8 +355,8 @@ void ppu_dumpPalette(int x, int y)
|
||||
{
|
||||
int i;
|
||||
|
||||
textout(Buffer, font, "Bg Palette", x , y, 5);
|
||||
textout(Buffer, font, "Sprt Palette", x + 90, y, 5);
|
||||
textout_ex(Buffer, font, "Bg Palette", x , y, 5, 0);
|
||||
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+90, y+20, x+90 + 4 * 20 + 2, y + 4 * 20 + 22, 0);
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* oldppu.c
|
||||
*
|
||||
* Old code for the PPU, still here for unknown purposes
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-03-29 12:05:12 +0200 (jeu, 29 mar 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/oldppu.c $
|
||||
* $Revision: 28 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* oldppu.c
|
||||
*
|
||||
* Old code for the PPU, still here for unknown purposes
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -193,7 +193,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
||||
else
|
||||
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;
|
||||
if (PalAddr(Addr) == 0x10)
|
||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||
@@ -399,7 +399,7 @@ unsigned char XScroll, YScroll;
|
||||
clear_to_color(Buffer, BgColor);
|
||||
|
||||
/* 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++)
|
||||
@@ -657,7 +657,7 @@ frame start (line 0) (if background or sprites are enabled):
|
||||
v=t
|
||||
*/
|
||||
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];
|
||||
|
||||
@@ -982,7 +982,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case 3: /* SPR-RAM Addresse Register */
|
||||
@@ -1004,7 +1004,7 @@ x=d:00000111
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||
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
|
||||
{
|
||||
@@ -1019,9 +1019,9 @@ t:0111 0000 0000 0000=d:0000 0111
|
||||
|
||||
ppu.TmpVScroll = ((ppu.TmpVRamPtr & 0x700) >> 12) & 0x7;
|
||||
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;
|
||||
@@ -1036,7 +1036,7 @@ t:1100 0000 0000 0000=0
|
||||
*/
|
||||
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
|
||||
{
|
||||
@@ -1049,7 +1049,7 @@ v=t
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||
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;
|
||||
|
||||
273
src/ppu/ppu.24.c
273
src/ppu/ppu.24.c
@@ -1,33 +1,34 @@
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
||||
* $Revision: 32 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "ppu.h"
|
||||
#include "ppu.h"
|
||||
#include "memory.h"
|
||||
#include "M6502.h"
|
||||
#include "M6502.h"
|
||||
|
||||
#define __TINES_PLUGINS__
|
||||
|
||||
#define __TINES_PLUGINS__
|
||||
#include "plugins.h"
|
||||
|
||||
#define GetTileColor(tile,x1,y1) ( ( ppu.Memory[tile+y1] & (1<<(7-x1)) ) == 0 ? 0 : 1 ) | \
|
||||
( ( ppu.Memory[tile+y1+8] & (1<<(7-x1)) ) == 0 ? 0 : 1<<1 )
|
||||
( ( ppu.Memory[tile+y1+8] & (1<<(7-x1)) ) == 0 ? 0 : 1<<1 )
|
||||
|
||||
|
||||
#define GetColor(col) (col)
|
||||
|
||||
extern PPU ppu;
|
||||
extern BITMAP *Buffer;
|
||||
@@ -37,22 +38,22 @@ unsigned long BgColor;
|
||||
volatile extern int frame;
|
||||
|
||||
volatile extern unsigned long IPS, FPS;
|
||||
volatile extern unsigned long IPS, FPS;
|
||||
|
||||
extern unsigned long ColorPalette[ 8 * 63 ];
|
||||
|
||||
|
||||
extern unsigned long ColorPalette[ 8 * 63 ];
|
||||
|
||||
extern short IRQScanHit;
|
||||
|
||||
byte NOBLIT = 0;
|
||||
|
||||
int InitPPU(PPU * ppu)
|
||||
int InitPPU(PPU * ppu)
|
||||
{
|
||||
int i;
|
||||
if ((ppu->Memory = (unsigned char *) malloc(0x4000)) == NULL)
|
||||
return -1;
|
||||
|
||||
NOBLIT = 0;
|
||||
NOBLIT = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Initializing register.. */
|
||||
ppu->In_VBlank = 0;
|
||||
@@ -83,28 +84,28 @@ int InitPPU(PPU * ppu)
|
||||
ppu->DisplayAttributeTable = ~0;
|
||||
ppu->DisplayPalette = ~0;
|
||||
ppu->DisplayVRAM = ~0;
|
||||
ppu->DisplayVRAM = ~0;
|
||||
|
||||
|
||||
/* Set PPU registers */
|
||||
set_page_rd_hook(0x20, ReadPPUReg);
|
||||
set_page_wr_hook(0x20, WritePPUReg);
|
||||
|
||||
set_page_readable(0x20, true);
|
||||
set_page_writeable(0x20, true);
|
||||
|
||||
|
||||
/* Set PPU Ghost Registers */
|
||||
for(i = 0x21; i < 0x40; i++)
|
||||
set_page_ghost(i, true, 0x20);
|
||||
|
||||
plugin_install_keypressHandler('i', DebugSprites);
|
||||
plugin_install_keypressHandler('I', DebugSprites);
|
||||
|
||||
plugin_install_keypressHandler('u', DebugColor);
|
||||
plugin_install_keypressHandler('U', DebugColor);
|
||||
|
||||
|
||||
|
||||
|
||||
/* Set PPU registers */
|
||||
set_page_rd_hook(0x20, ReadPPUReg);
|
||||
set_page_wr_hook(0x20, WritePPUReg);
|
||||
|
||||
set_page_readable(0x20, true);
|
||||
set_page_writeable(0x20, true);
|
||||
|
||||
|
||||
/* Set PPU Ghost Registers */
|
||||
for(i = 0x21; i < 0x40; i++)
|
||||
set_page_ghost(i, true, 0x20);
|
||||
|
||||
plugin_install_keypressHandler('i', DebugSprites);
|
||||
plugin_install_keypressHandler('I', DebugSprites);
|
||||
|
||||
plugin_install_keypressHandler('u', DebugColor);
|
||||
plugin_install_keypressHandler('U', DebugColor);
|
||||
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -248,7 +249,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
||||
else
|
||||
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;
|
||||
if (PalAddr(Addr) == 0x10)
|
||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||
@@ -289,7 +290,7 @@ void NewPPUDispSprite()
|
||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||
{
|
||||
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);
|
||||
//continue; // Do not display more than 8 sprites on this line :p
|
||||
}
|
||||
@@ -550,19 +551,19 @@ void DebugSprites()
|
||||
}
|
||||
NOBLIT = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
||||
|
||||
void ppu_displayNameTables()
|
||||
|
||||
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
||||
|
||||
void ppu_displayNameTables()
|
||||
{
|
||||
int x, y, x1, y1, i;
|
||||
|
||||
unsigned long Reg2;
|
||||
unsigned short ab_x, ab_y;
|
||||
unsigned short Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
unsigned short TileID;
|
||||
|
||||
if (ppu.DisplayAttributeTable)
|
||||
{
|
||||
/* NT 2000 */
|
||||
@@ -795,8 +796,8 @@ unsigned short TileID;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
@@ -808,13 +809,13 @@ unsigned long Reg2;
|
||||
unsigned short ab_x, ab_y;
|
||||
unsigned long Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
static short LAST_FPS = 0;
|
||||
static short LAST_FPS = 0;
|
||||
unsigned char XScroll, YScroll;
|
||||
|
||||
ppu.StatusRegister.b |= PPU_FLAG_SR_VBLANK;
|
||||
|
||||
|
||||
BgColor = ppu.Memory[0x3F00];//0xC0;
|
||||
|
||||
//goto NoDraw;
|
||||
|
||||
@@ -823,7 +824,7 @@ unsigned char XScroll, YScroll;
|
||||
clear_to_color(Buffer, GetColor(BgColor));
|
||||
|
||||
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++)
|
||||
@@ -836,7 +837,7 @@ unsigned char XScroll, YScroll;
|
||||
* A faires les choses qui faut faire durant un lanc<6E> de vblank,
|
||||
* comme dessiner par ex..
|
||||
*/
|
||||
*/
|
||||
|
||||
|
||||
if (((ppu.ControlRegister2.b & PPU_CR2_BGVISIBILITY) != 0) || ppu.ForceBgVisibility)
|
||||
{
|
||||
@@ -847,7 +848,7 @@ frame start (line 0) (if background or sprites are enabled):
|
||||
v=t
|
||||
*/
|
||||
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];
|
||||
|
||||
@@ -862,20 +863,20 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
||||
1111 1198 7654 3210
|
||||
5432 10
|
||||
*/
|
||||
*/
|
||||
//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.TimedTmpPtr[y]) & 0x041F)
|
||||
| 0x2000;
|
||||
| 0x2000;
|
||||
|
||||
//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)
|
||||
| ppu.Bg_Pattern_Table;
|
||||
|
||||
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
for (x = 0; x < 256; x++)
|
||||
{
|
||||
@@ -1072,31 +1073,31 @@ appeared as a negative scroll value.
|
||||
}
|
||||
|
||||
for (i = 0; i < 240; i++)
|
||||
for (i = 0; i < 240; i++)
|
||||
{
|
||||
{
|
||||
_putpixel8(Buffer, 257 + 0, i, 0xFFFFFFFF);
|
||||
|
||||
|
||||
_putpixel8(Buffer, 257 + 1, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 2, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 1, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 2, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 3, i, ppu.TimedTmpPtr[y]*4 | 0xFF000000);
|
||||
|
||||
|
||||
_putpixel8(Buffer, 257 + 4, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 5, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 4, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 5, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 6, i, ppu.TmpVScroll*4 | 0xFF000000);
|
||||
|
||||
|
||||
_putpixel8(Buffer, 257 + 7, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 8, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 9, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
|
||||
_putpixel8(Buffer, 257 + 7, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 8, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
_putpixel8(Buffer, 257 + 9, i, ppu.TimedHScroll[i]*4 | 0xFF000000);
|
||||
|
||||
_putpixel8(Buffer, 257 + 10, i, 0xFFFFFFFF);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (IRQScanHit != -1)
|
||||
{
|
||||
line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 0xFF00FF);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 0xFF00FF);
|
||||
}
|
||||
|
||||
|
||||
if (IRQScanHit != -1)
|
||||
{
|
||||
line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 0xFF00FF);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 0xFF00FF);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit+3, 0xFF00FF);
|
||||
}
|
||||
|
||||
NoDraw:
|
||||
@@ -1123,7 +1124,7 @@ byte ReadPPUReg(byte RegID)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
unsigned char ret;
|
||||
unsigned char ret;
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
@@ -1170,13 +1171,13 @@ byte ReadPPUReg(byte RegID)
|
||||
void WritePPUReg(byte RegID, byte val)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
|
||||
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
{
|
||||
default:/* For not writeable reg */
|
||||
default:/* For not writeable reg */
|
||||
console_printf(Console_Default, "WritePPU error\n");
|
||||
break;
|
||||
case 0: /* Control Register 1 */
|
||||
ppu.ControlRegister1.b = val;
|
||||
@@ -1208,7 +1209,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case 3: /* SPR-RAM Addresse Register */
|
||||
@@ -1224,49 +1225,49 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
2005 first write:
|
||||
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.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||
ppu.HScroll = val & 0x7;
|
||||
ppu.HScroll = val & 0x7;
|
||||
|
||||
|
||||
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||
|
||||
|
||||
//console_printf(Console_Default, "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
|
||||
{
|
||||
/*
|
||||
/*
|
||||
2005 second write:
|
||||
|
||||
1111 1100 0000 0000
|
||||
5432 1098 7654 3210
|
||||
|
||||
2005 second write:
|
||||
|
||||
1111 1100 0000 0000
|
||||
5432 1098 7654 3210
|
||||
|
||||
8421 8421 8421 8421
|
||||
-------------------
|
||||
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.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFC1F) | ((val & 0xF8) << 2));
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF) | ((val & 0x07) << 12));
|
||||
|
||||
ppu.TmpVScroll = (val & 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);
|
||||
|
||||
//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;
|
||||
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;
|
||||
/*
|
||||
2006 first write:
|
||||
@@ -1274,13 +1275,13 @@ t:0011 1111 0000 0000 = d:0011 1111
|
||||
t:1100 0000 0000 0000=0
|
||||
*/
|
||||
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;
|
||||
/*
|
||||
2006 second write:
|
||||
@@ -1289,8 +1290,8 @@ v=t
|
||||
*/
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||
//console_printf(Console_Default, "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;
|
||||
@@ -1300,12 +1301,12 @@ v=t
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
}
|
||||
|
||||
669
src/ppu/ppu.c
669
src/ppu/ppu.c
File diff suppressed because it is too large
Load Diff
@@ -2,22 +2,21 @@
|
||||
* PPU Memory manager - The TI-NESulator Project
|
||||
* ppu.memory.c - Inspired from the memory manager of the Quick6502 Project.
|
||||
*
|
||||
* Created by Manoël Trapier on 12/04/07.
|
||||
* Copyright 2003-2007 986 Corp. All rights reserved.
|
||||
* Created by Manoel Trapier on 12/04/07.
|
||||
* Copyright 2003-2008 986 Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-05-24 15:11:55 +0200 (jeu, 24 mai 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu/ppu.memory.c $
|
||||
* $Revision: 53 $
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PPU_MEMORY_H
|
||||
#define PPU_MEMORY_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <os_dependent.h>
|
||||
|
||||
#define __TINES_PPU_INTERNAL__
|
||||
|
||||
#include <ppu/ppu.h>
|
||||
@@ -39,7 +38,7 @@ byte ppu_SpriteRam[0x100];
|
||||
/*
|
||||
* Memory management functions
|
||||
*
|
||||
* Yes that true, PPU memory & CPU memory work in a nearly same fashion depite
|
||||
* Yes that true, PPU memory & CPU memory work in a nearly same fashion despite
|
||||
* the fact that we actually didn't have any Read/Write hook and ReadWrite
|
||||
* protection. We even didn't need "attributes" for the page. One of the only
|
||||
* need is the "powerful" ghost system
|
||||
@@ -123,7 +122,7 @@ void ppu_setPageGhost(byte page, bool value, byte ghost)
|
||||
{
|
||||
ppu_memoryPages[page] = ppu_memoryPages[ghost];
|
||||
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]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,18 +157,14 @@ void ppu_writeMemory(byte page, byte addr, byte value)
|
||||
{
|
||||
/* Here we will cheat with the palette miroring, since we didn't write
|
||||
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);
|
||||
if ((addr & 0x10) == 0x00)
|
||||
//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)
|
||||
{
|
||||
ppu_memoryPages[0x3F][addr&0x1F] = value;
|
||||
ppu_memoryPages[0x3F][(addr&0x1F) | 0x10] = value;
|
||||
ppu_memoryPages[0x3F][0x00] = value;
|
||||
ppu_memoryPages[0x3F][0x10] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
ppu_memoryPages[0x3F][addr&0x1F] = value;
|
||||
if (( addr & 0x1F ) == 0x10 )
|
||||
ppu_memoryPages[0x3F][(addr&0x1F) & 0xEF] = value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -177,5 +172,3 @@ void ppu_writeMemory(byte page, byte addr, byte value)
|
||||
ptr[addr] = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-04 18:46:30 +0200 (mer, 04 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
||||
* $Revision: 30 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#include "ppu.h"
|
||||
#include "M6502.h"
|
||||
@@ -44,8 +44,8 @@ int InitPPU(PPU * ppu)
|
||||
return -1;
|
||||
|
||||
NOBLIT = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* Initializing register.. */
|
||||
ppu->In_VBlank = 0;
|
||||
@@ -219,7 +219,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
||||
else
|
||||
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;
|
||||
if (PalAddr(Addr) == 0x10)
|
||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||
@@ -260,7 +260,7 @@ void NewPPUDispSprite()
|
||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||
{
|
||||
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);
|
||||
//continue; // Do not display more than 8 sprites on this line :p
|
||||
}
|
||||
@@ -533,16 +533,16 @@ unsigned short ab_x, ab_y;
|
||||
unsigned short Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
static short WaitTime = 7000;
|
||||
static short WaitTime = 7000;
|
||||
static short LAST_FPS = 0;
|
||||
unsigned char XScroll, YScroll;
|
||||
struct timeval timeStart, timeEnd;
|
||||
struct timeval timeStart, timeEnd;
|
||||
|
||||
ppu.StatusRegister.b |= PPU_FLAG_SR_VBLANK;
|
||||
|
||||
BgColor = ppu.Memory[0x3F00];//0xC0;
|
||||
|
||||
gettimeofday(&timeStart, NULL);
|
||||
|
||||
gettimeofday(&timeStart, NULL);
|
||||
|
||||
//goto NoDraw;
|
||||
|
||||
@@ -551,7 +551,7 @@ struct timeval timeStart, timeEnd;
|
||||
clear_to_color(Buffer, BgColor);
|
||||
|
||||
/* 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++)
|
||||
@@ -809,7 +809,7 @@ frame start (line 0) (if background or sprites are enabled):
|
||||
v=t
|
||||
*/
|
||||
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];
|
||||
|
||||
@@ -833,16 +833,16 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
||||
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
||||
| ppu.Bg_Pattern_Table;
|
||||
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
/*YScroll += ppu.TimedVScroll[y];*/
|
||||
/* printf("Y:%d -_- ", YScroll);
|
||||
if (ppu.TimedVScroll[y] != 0)
|
||||
{
|
||||
YScroll = ppu.TimedVScroll[y];
|
||||
printf("Y:%d", YScroll);
|
||||
}
|
||||
printf("\n");*/
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
/*YScroll += ppu.TimedVScroll[y];*/
|
||||
/* console_printf(Console_Default, "Y:%d -_- ", YScroll);
|
||||
if (ppu.TimedVScroll[y] != 0)
|
||||
{
|
||||
YScroll = ppu.TimedVScroll[y];
|
||||
console_printf(Console_Default, "Y:%d", YScroll);
|
||||
}
|
||||
console_printf(Console_Default, "\n");*/
|
||||
for (x = 0; x < 256; x++)
|
||||
{
|
||||
/* Calculer la couleur du point */
|
||||
@@ -1059,17 +1059,17 @@ NoDraw:
|
||||
release_bitmap(Buffer);
|
||||
|
||||
if (NOBLIT == 0)
|
||||
{
|
||||
{
|
||||
unsigned long TimeStart, TimeEnd;
|
||||
blit(Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
|
||||
//stretch_blit(Buffer, screen, 0, 0, 256, 240, 0, 0, 512, 480);
|
||||
gettimeofday(&timeEnd, NULL);
|
||||
|
||||
TimeStart = 1000000 * timeStart.tv_sec + timeStart.tv_usec;
|
||||
TimeEnd = 1000000 * timeEnd.tv_sec + timeEnd.tv_usec;
|
||||
|
||||
//printf("Start: %d\nEnd: %d\nResult: %d\n",TimeStart, TimeEnd, 16666 - (TimeEnd - TimeStart));
|
||||
WaitTime = 14000 - (TimeEnd - TimeStart);
|
||||
//stretch_blit(Buffer, screen, 0, 0, 256, 240, 0, 0, 512, 480);
|
||||
gettimeofday(&timeEnd, NULL);
|
||||
|
||||
TimeStart = 1000000 * timeStart.tv_sec + timeStart.tv_usec;
|
||||
TimeEnd = 1000000 * timeEnd.tv_sec + timeEnd.tv_usec;
|
||||
|
||||
//console_printf(Console_Default, "Start: %d\nEnd: %d\nResult: %d\n",TimeStart, TimeEnd, 16666 - (TimeEnd - TimeStart));
|
||||
WaitTime = 14000 - (TimeEnd - TimeStart);
|
||||
if (!key[KEY_PGUP])
|
||||
usleep(WaitTime<0?0:WaitTime);
|
||||
}
|
||||
@@ -1085,7 +1085,7 @@ byte ReadPPUReg(byte RegID)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
unsigned char ret;
|
||||
RegID &= 0x07;
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
@@ -1132,13 +1132,13 @@ byte ReadPPUReg(byte RegID)
|
||||
void WritePPUReg(byte RegID, byte val)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
|
||||
RegID &= 0x07;
|
||||
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
default:/* For not writeable reg */
|
||||
printf("WritePPU error\n");
|
||||
default:/* For not writeable reg */
|
||||
console_printf(Console_Default, "WritePPU error\n");
|
||||
break;
|
||||
case 0: /* Control Register 1 */
|
||||
ppu.ControlRegister1.b = val;
|
||||
@@ -1170,7 +1170,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case 3: /* SPR-RAM Addresse Register */
|
||||
@@ -1192,7 +1192,7 @@ x=d:00000111
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||
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
|
||||
{
|
||||
@@ -1207,9 +1207,9 @@ t:0111 0000 0000 0000=d:0000 0111
|
||||
|
||||
ppu.TmpVScroll = ((ppu.TmpVRamPtr & 0x700) >> 12) & 0x7;
|
||||
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;
|
||||
@@ -1224,7 +1224,7 @@ t:1100 0000 0000 0000=0
|
||||
*/
|
||||
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
|
||||
{
|
||||
@@ -1237,7 +1237,7 @@ v=t
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||
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;
|
||||
@@ -1247,12 +1247,12 @@ v=t
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,34 @@
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
||||
* $Revision: 32 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "ppu.h"
|
||||
#include "ppu.h"
|
||||
#include "memory.h"
|
||||
#include "M6502.h"
|
||||
#include "M6502.h"
|
||||
|
||||
#define __TINES_PLUGINS__
|
||||
|
||||
#define __TINES_PLUGINS__
|
||||
#include "plugins.h"
|
||||
|
||||
#define GetTileColor(tile,x1,y1) ( ( ppu.Memory[tile+y1] & (1<<(7-x1)) ) == 0 ? 0 : 1 ) | \
|
||||
( ( ppu.Memory[tile+y1+8] & (1<<(7-x1)) ) == 0 ? 0 : 1<<1 )
|
||||
( ( ppu.Memory[tile+y1+8] & (1<<(7-x1)) ) == 0 ? 0 : 1<<1 )
|
||||
|
||||
|
||||
#define GetColor(col) (col&0xFF)
|
||||
|
||||
extern PPU ppu;
|
||||
extern BITMAP *Buffer;
|
||||
@@ -37,22 +38,22 @@ unsigned long BgColor;
|
||||
volatile extern int frame;
|
||||
|
||||
volatile extern unsigned long IPS, FPS;
|
||||
volatile extern unsigned long IPS, FPS;
|
||||
|
||||
extern unsigned long ColorPalette[ 8 * 63 ];
|
||||
|
||||
|
||||
extern unsigned long ColorPalette[ 8 * 63 ];
|
||||
|
||||
extern short IRQScanHit;
|
||||
|
||||
byte NOBLIT = 0;
|
||||
|
||||
int InitPPU(PPU * ppu)
|
||||
int InitPPU(PPU * ppu)
|
||||
{
|
||||
int i;
|
||||
if ((ppu->Memory = (unsigned char *) malloc(0x4000)) == NULL)
|
||||
return -1;
|
||||
|
||||
NOBLIT = 0;
|
||||
NOBLIT = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Initializing register.. */
|
||||
ppu->In_VBlank = 0;
|
||||
@@ -83,28 +84,28 @@ int InitPPU(PPU * ppu)
|
||||
ppu->DisplayAttributeTable = ~0;
|
||||
ppu->DisplayPalette = ~0;
|
||||
ppu->DisplayVRAM = ~0;
|
||||
ppu->DisplayVRAM = ~0;
|
||||
|
||||
|
||||
/* Set PPU registers */
|
||||
set_page_rd_hook(0x20, ReadPPUReg);
|
||||
set_page_wr_hook(0x20, WritePPUReg);
|
||||
|
||||
set_page_readable(0x20, true);
|
||||
set_page_writeable(0x20, true);
|
||||
|
||||
|
||||
/* Set PPU Ghost Registers */
|
||||
for(i = 0x21; i < 0x40; i++)
|
||||
set_page_ghost(i, true, 0x20);
|
||||
|
||||
plugin_install_keypressHandler('i', DebugSprites);
|
||||
plugin_install_keypressHandler('I', DebugSprites);
|
||||
|
||||
plugin_install_keypressHandler('u', DebugColor);
|
||||
plugin_install_keypressHandler('U', DebugColor);
|
||||
|
||||
|
||||
|
||||
|
||||
/* Set PPU registers */
|
||||
set_page_rd_hook(0x20, ReadPPUReg);
|
||||
set_page_wr_hook(0x20, WritePPUReg);
|
||||
|
||||
set_page_readable(0x20, true);
|
||||
set_page_writeable(0x20, true);
|
||||
|
||||
|
||||
/* Set PPU Ghost Registers */
|
||||
for(i = 0x21; i < 0x40; i++)
|
||||
set_page_ghost(i, true, 0x20);
|
||||
|
||||
plugin_install_keypressHandler('i', DebugSprites);
|
||||
plugin_install_keypressHandler('I', DebugSprites);
|
||||
|
||||
plugin_install_keypressHandler('u', DebugColor);
|
||||
plugin_install_keypressHandler('U', DebugColor);
|
||||
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -248,7 +249,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
||||
else
|
||||
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;
|
||||
if (PalAddr(Addr) == 0x10)
|
||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||
@@ -269,7 +270,7 @@ void NewPPUDispSprite()
|
||||
unsigned long Color;
|
||||
PPUSprite sprite;
|
||||
unsigned short bg;
|
||||
unsigned short bg;
|
||||
short SprtAddr;
|
||||
|
||||
for (i = 63; i >= 0; i--)
|
||||
{
|
||||
@@ -289,7 +290,7 @@ void NewPPUDispSprite()
|
||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||
{
|
||||
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);
|
||||
//continue; // Do not display more than 8 sprites on this line :p
|
||||
}
|
||||
@@ -550,19 +551,19 @@ void DebugSprites()
|
||||
}
|
||||
NOBLIT = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
||||
|
||||
void ppu_displayNameTables()
|
||||
|
||||
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
||||
|
||||
void ppu_displayNameTables()
|
||||
{
|
||||
int x, y, x1, y1, i;
|
||||
|
||||
unsigned long Reg2;
|
||||
unsigned short ab_x, ab_y;
|
||||
unsigned short Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
unsigned short TileID;
|
||||
|
||||
if (ppu.DisplayAttributeTable)
|
||||
{
|
||||
/* NT 2000 */
|
||||
@@ -795,8 +796,8 @@ unsigned short TileID;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
@@ -808,25 +809,25 @@ unsigned long Reg2;
|
||||
unsigned short ab_x, ab_y;
|
||||
unsigned long Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
static short LAST_FPS = 0;
|
||||
static short LAST_FPS = 0;
|
||||
unsigned char XScroll, YScroll;
|
||||
|
||||
ppu.StatusRegister.b |= PPU_FLAG_SR_VBLANK;
|
||||
|
||||
|
||||
BgColor = ppu.Memory[0x3F00];//0xC0;
|
||||
|
||||
//goto NoDraw;
|
||||
|
||||
acquire_bitmap(Buffer);
|
||||
|
||||
clear_to_color(Buffer, GetColor(BgColor));
|
||||
clear_to_color(Buffer, GetColor(BgColor));
|
||||
|
||||
|
||||
|
||||
|
||||
ppu_displayNameTables();
|
||||
|
||||
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++)
|
||||
@@ -839,7 +840,7 @@ unsigned char XScroll, YScroll;
|
||||
* A faires les choses qui faut faire durant un lanc<6E> de vblank,
|
||||
* comme dessiner par ex..
|
||||
*/
|
||||
*/
|
||||
|
||||
|
||||
if (((ppu.ControlRegister2.b & PPU_CR2_BGVISIBILITY) != 0) || ppu.ForceBgVisibility)
|
||||
{
|
||||
@@ -850,7 +851,7 @@ frame start (line 0) (if background or sprites are enabled):
|
||||
v=t
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -862,28 +863,28 @@ scanline start (if background and sprites are enabled):
|
||||
v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
||||
1111 1198 7654 3210
|
||||
5432 10
|
||||
5432 10
|
||||
*/
|
||||
if ((y == IRQScanHit)||(y == IRQScanHit + 1))
|
||||
printf("%s: IRQ Hit : bf Reg2: 0x%04X\n", __func__, ppu.VRAMAddrReg2.W);
|
||||
|
||||
*/
|
||||
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
|
||||
|
||||
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & (~PPU_SSCAN_MASK))
|
||||
| (ppu.TimedTmpPtr[y] & PPU_SSCAN_MASK )
|
||||
| 0x2000;
|
||||
| 0x2000;
|
||||
|
||||
|
||||
|
||||
TileID = (PPU_Rd(ppu.VRAMAddrReg2.W) << 4)
|
||||
| ppu.Bg_Pattern_Table;
|
||||
|
||||
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
if (y == IRQScanHit)
|
||||
printf("%s: IRQ Hit : Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
||||
|
||||
if (y == IRQScanHit + 1)
|
||||
printf("%s: IRQ Hit + 1: Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
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)
|
||||
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++)
|
||||
{
|
||||
@@ -953,7 +954,7 @@ Y = (ppu.VRAMAddrReg2.W & 0x3E0) >> 5
|
||||
/* if ((ppu.VRAMAddrReg2.W & 0x400))
|
||||
ppu.VRAMAddrReg2.W &= ~0x400;
|
||||
else
|
||||
else
|
||||
ppu.VRAMAddrReg2.W |= 0x400;*/
|
||||
ppu.VRAMAddrReg2.W ^= 0x400;
|
||||
}
|
||||
else
|
||||
@@ -973,12 +974,12 @@ from this.. if you manually set the value above 29 (from either 2005 or
|
||||
2006), the wrapping from 29 obviously won't happen, and attrib data will be
|
||||
used as name table data. the "y scroll" still wraps to 0 from 31, but
|
||||
without switching bit 11. this explains why writing 240+ to 'Y' in 2005
|
||||
without switching bit 11. this explains why writing 240+ to 'Y' in 2005
|
||||
appeared as a negative scroll value.
|
||||
appeared as a negative scroll value.
|
||||
|
||||
8421 8421 8421 8421
|
||||
v:0000 0011 1110 0000
|
||||
1111 1198 7654 3210
|
||||
1111 1198 7654 3210
|
||||
5432 10
|
||||
|
||||
*/
|
||||
YScroll++;
|
||||
@@ -993,13 +994,13 @@ v:0000 0011 1110 0000
|
||||
/* if ((ppu.VRAMAddrReg2.W & 0x800))
|
||||
ppu.VRAMAddrReg2.W &= ~0x800;
|
||||
else
|
||||
else
|
||||
ppu.VRAMAddrReg2.W |= 0x800;*/
|
||||
ppu.VRAMAddrReg2.W |= 0x800;*/
|
||||
|
||||
ppu.VRAMAddrReg2.W ^= 0x800;
|
||||
}
|
||||
else
|
||||
{ /* on incremente juste */
|
||||
{ /* on incremente juste */
|
||||
ppu.VRAMAddrReg2.W = (ppu.VRAMAddrReg2.W & (~0x3F0))
|
||||
| ((((ppu.VRAMAddrReg2.W & 0x3F0) >> 5) + 1) << 5);
|
||||
}
|
||||
}
|
||||
@@ -1089,31 +1090,31 @@ v:0000 0011 1110 0000
|
||||
}
|
||||
|
||||
for (i = 0; i < 240; i++)
|
||||
for (i = 0; i < 240; i++)
|
||||
{
|
||||
{
|
||||
_putpixel(Buffer, 257 + 0, i, 48);
|
||||
|
||||
|
||||
_putpixel(Buffer, 257 + 1, i, ((ppu.TimedTmpPtr[y]*4))&0xFF);
|
||||
_putpixel(Buffer, 257 + 2, i, ((ppu.TimedTmpPtr[y]*4)>>8)&0xFF);
|
||||
_putpixel(Buffer, 257 + 1, i, ((ppu.TimedTmpPtr[y]*4))&0xFF);
|
||||
_putpixel(Buffer, 257 + 2, i, ((ppu.TimedTmpPtr[y]*4)>>8)&0xFF);
|
||||
_putpixel(Buffer, 257 + 3, i, ((ppu.TimedTmpPtr[y]*4)>>16)&0xFF);
|
||||
|
||||
|
||||
_putpixel(Buffer, 257 + 4, i, ((ppu.TmpVScroll*4))&0xFF);
|
||||
_putpixel(Buffer, 257 + 5, i, ((ppu.TmpVScroll*4)>>8)&0xFF);
|
||||
_putpixel(Buffer, 257 + 4, i, ((ppu.TmpVScroll*4))&0xFF);
|
||||
_putpixel(Buffer, 257 + 5, i, ((ppu.TmpVScroll*4)>>8)&0xFF);
|
||||
_putpixel(Buffer, 257 + 6, i, ((ppu.TmpVScroll*4)>>16)&0xFF);
|
||||
|
||||
|
||||
_putpixel(Buffer, 257 + 7, i, ((ppu.TimedHScroll[i]*4)) & 0xFF);
|
||||
_putpixel(Buffer, 257 + 8, i, ((ppu.TimedHScroll[i]*4)>>8) & 0xFF);
|
||||
_putpixel(Buffer, 257 + 9, i, ((ppu.TimedHScroll[i]*4)>>16)& 0xFF);
|
||||
|
||||
_putpixel(Buffer, 257 + 7, i, ((ppu.TimedHScroll[i]*4)) & 0xFF);
|
||||
_putpixel(Buffer, 257 + 8, i, ((ppu.TimedHScroll[i]*4)>>8) & 0xFF);
|
||||
_putpixel(Buffer, 257 + 9, i, ((ppu.TimedHScroll[i]*4)>>16)& 0xFF);
|
||||
|
||||
_putpixel(Buffer, 257 + 10, i, 48);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (IRQScanHit != -1)
|
||||
{
|
||||
line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 10);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 10);
|
||||
}
|
||||
|
||||
|
||||
if (IRQScanHit != -1)
|
||||
{
|
||||
line(Buffer, 257+12, IRQScanHit, 257+22, IRQScanHit, 10);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit-3, 10);
|
||||
line(Buffer, 257+12, IRQScanHit, 257+18, IRQScanHit+3, 10);
|
||||
}
|
||||
|
||||
NoDraw:
|
||||
@@ -1140,7 +1141,7 @@ byte ReadPPUReg(byte RegID)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
unsigned char ret;
|
||||
unsigned char ret;
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
@@ -1187,13 +1188,13 @@ byte ReadPPUReg(byte RegID)
|
||||
void WritePPUReg(byte RegID, byte val)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
|
||||
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
{
|
||||
default:/* For not writeable reg */
|
||||
default:/* For not writeable reg */
|
||||
console_printf(Console_Default, "WritePPU error\n");
|
||||
break;
|
||||
case 0: /* Control Register 1 */
|
||||
ppu.ControlRegister1.b = val;
|
||||
@@ -1221,11 +1222,11 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
*/
|
||||
ppu.TmpVRamPtr = ( (ppu.TmpVRamPtr & 0xF3FF)
|
||||
| ( (ppu.ControlRegister1.s.NameTblAddr & 0x03) << 10 )
|
||||
| ( (ppu.ControlRegister1.s.NameTblAddr & 0x03) << 10 )
|
||||
);
|
||||
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case 3: /* SPR-RAM Addresse Register */
|
||||
@@ -1241,49 +1242,49 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
2005 first write:
|
||||
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.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||
ppu.HScroll = val & 0x7;
|
||||
ppu.HScroll = val & 0x7;
|
||||
|
||||
|
||||
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||
|
||||
|
||||
//console_printf(Console_Default, "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
|
||||
{
|
||||
/*
|
||||
/*
|
||||
2005 second write:
|
||||
|
||||
1111 1100 0000 0000
|
||||
5432 1098 7654 3210
|
||||
|
||||
2005 second write:
|
||||
|
||||
1111 1100 0000 0000
|
||||
5432 1098 7654 3210
|
||||
|
||||
8421 8421 8421 8421
|
||||
-------------------
|
||||
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.TmpVRamPtr = ((ppu.TmpVRamPtr & ~(0x03E0)) | ((val & 0xF8) << 2));
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF ) | ((val & 0x07) << 12));
|
||||
|
||||
ppu.TmpVScroll = (val & 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);
|
||||
|
||||
//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;
|
||||
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;
|
||||
/*
|
||||
2006 first write:
|
||||
@@ -1291,13 +1292,13 @@ t:0011 1111 0000 0000 = d:0011 1111
|
||||
t:1100 0000 0000 0000=0
|
||||
*/
|
||||
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;
|
||||
/*
|
||||
2006 second write:
|
||||
@@ -1306,8 +1307,8 @@ v=t
|
||||
*/
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||
//console_printf(Console_Default, "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;
|
||||
@@ -1317,12 +1318,12 @@ v=t
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2007 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate: 2007-04-06 17:17:01 +0200 (ven, 06 avr 2007) $
|
||||
* $Author: mtrapier $
|
||||
* $HeadURL: file:///media/HD6G/SVNROOT/trunk/TI-NESulator/src/ppu.c $
|
||||
* $Revision: 32 $
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* PPU emulation - The TI-NESulator Project
|
||||
* ppu.c
|
||||
*
|
||||
* Define and emulate the PPU (Picture Processing Unit) of the real NES
|
||||
*
|
||||
* Created by Manoel TRAPIER.
|
||||
* Copyright (c) 2003-2008 986Corp. All rights reserved.
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Author$
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
*
|
||||
*/
|
||||
|
||||
#include <allegro.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "ppu.h"
|
||||
#include "ppu.h"
|
||||
#include "memory.h"
|
||||
#include "M6502.h"
|
||||
|
||||
#define GetTileColor(tile,x1,y1) ( ( ppu.Memory[tile+y1] & (1<<(7-x1)) ) == 0 ? 0 : 1 ) | \
|
||||
@@ -36,14 +37,14 @@ volatile extern unsigned long IPS, FPS;
|
||||
byte NOBLIT = 0;
|
||||
|
||||
int InitPPU(PPU * ppu)
|
||||
int InitPPU(PPU * ppu)
|
||||
{
|
||||
int i;
|
||||
if ((ppu->Memory = (unsigned char *) malloc(0x4000)) == NULL)
|
||||
return -1;
|
||||
|
||||
NOBLIT = 0;
|
||||
NOBLIT = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Initializing register.. */
|
||||
ppu->In_VBlank = 0;
|
||||
@@ -74,19 +75,19 @@ int InitPPU(PPU * ppu)
|
||||
ppu->DisplayAttributeTable = ~0;
|
||||
ppu->DisplayPalette = ~0;
|
||||
ppu->DisplayVRAM = ~0;
|
||||
ppu->DisplayVRAM = ~0;
|
||||
|
||||
|
||||
/* Set PPU registers */
|
||||
set_page_rd_hook(0x20, ReadPPUReg);
|
||||
set_page_wr_hook(0x20, WritePPUReg);
|
||||
|
||||
set_page_readable(0x20, true);
|
||||
set_page_writeable(0x20, true);
|
||||
|
||||
|
||||
/* Set PPU Ghost Registers */
|
||||
for(i = 0x21; i < 0x40; i++)
|
||||
|
||||
|
||||
/* Set PPU registers */
|
||||
set_page_rd_hook(0x20, ReadPPUReg);
|
||||
set_page_wr_hook(0x20, WritePPUReg);
|
||||
|
||||
set_page_readable(0x20, true);
|
||||
set_page_writeable(0x20, true);
|
||||
|
||||
|
||||
/* Set PPU Ghost Registers */
|
||||
for(i = 0x21; i < 0x40; i++)
|
||||
set_page_ghost(i, true, 0x20);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -230,7 +231,7 @@ void PPU_Wr(unsigned short Addr, unsigned char Value)
|
||||
else
|
||||
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;
|
||||
if (PalAddr(Addr) == 0x10)
|
||||
ppu.Memory[0x3F00] = Value & 0x3F;
|
||||
@@ -271,7 +272,7 @@ void NewPPUDispSprite()
|
||||
if ((py > 0) && (py < 249) && ((++NbOfSprite[py]) > 7))
|
||||
{
|
||||
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);
|
||||
//continue; // Do not display more than 8 sprites on this line :p
|
||||
}
|
||||
@@ -532,19 +533,19 @@ void DebugSprites()
|
||||
}
|
||||
NOBLIT = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
||||
|
||||
void ppu_displayNameTables()
|
||||
|
||||
#define GetTilePos(addr,x,y) (addr+x+(y*32))
|
||||
|
||||
void ppu_displayNameTables()
|
||||
{
|
||||
int x, y, x1, y1, i;
|
||||
|
||||
unsigned long Reg2;
|
||||
unsigned short ab_x, ab_y;
|
||||
unsigned short Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
unsigned short TileID;
|
||||
|
||||
if (ppu.DisplayAttributeTable)
|
||||
{
|
||||
/* NT 2000 */
|
||||
@@ -777,8 +778,8 @@ unsigned short TileID;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
@@ -790,13 +791,13 @@ unsigned long Reg2;
|
||||
unsigned short ab_x, ab_y;
|
||||
unsigned short Color;
|
||||
unsigned short AttrByte;
|
||||
unsigned short AttrByte;
|
||||
unsigned short TileID;
|
||||
static short LAST_FPS = 0;
|
||||
static short LAST_FPS = 0;
|
||||
unsigned char XScroll, YScroll;
|
||||
|
||||
ppu.StatusRegister.b |= PPU_FLAG_SR_VBLANK;
|
||||
|
||||
|
||||
BgColor = ppu.Memory[0x3F00];//0xC0;
|
||||
|
||||
//goto NoDraw;
|
||||
|
||||
@@ -805,7 +806,7 @@ unsigned char XScroll, YScroll;
|
||||
clear_to_color(Buffer, BgColor);
|
||||
|
||||
/* 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++)
|
||||
@@ -818,7 +819,7 @@ unsigned char XScroll, YScroll;
|
||||
* A faires les choses qui faut faire durant un lanc<6E> de vblank,
|
||||
* comme dessiner par ex..
|
||||
*/
|
||||
*/
|
||||
|
||||
|
||||
if (((ppu.ControlRegister2.b & PPU_CR2_BGVISIBILITY) != 0) || ppu.ForceBgVisibility)
|
||||
{
|
||||
@@ -829,7 +830,7 @@ frame start (line 0) (if background or sprites are enabled):
|
||||
v=t
|
||||
*/
|
||||
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];
|
||||
|
||||
@@ -844,20 +845,20 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
|
||||
1111 1198 7654 3210
|
||||
5432 10
|
||||
*/
|
||||
*/
|
||||
//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.TimedTmpPtr[y]) & 0x041F)
|
||||
| 0x2000;
|
||||
| 0x2000;
|
||||
|
||||
//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)
|
||||
| ppu.Bg_Pattern_Table;
|
||||
|
||||
|
||||
XScroll = ppu.TimedHScroll[y];
|
||||
|
||||
for (x = 0; x < 256; x++)
|
||||
{
|
||||
@@ -1091,7 +1092,7 @@ byte ReadPPUReg(byte RegID)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
unsigned char ret;
|
||||
unsigned char ret;
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
@@ -1138,13 +1139,13 @@ byte ReadPPUReg(byte RegID)
|
||||
void WritePPUReg(byte RegID, byte val)
|
||||
{
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
/* RegID is the nb of the reg 0-7 */
|
||||
|
||||
|
||||
RegID &= 0x07;
|
||||
|
||||
switch (RegID)
|
||||
{
|
||||
{
|
||||
default:/* For not writeable reg */
|
||||
default:/* For not writeable reg */
|
||||
console_printf(Console_Default, "WritePPU error\n");
|
||||
break;
|
||||
case 0: /* Control Register 1 */
|
||||
ppu.ControlRegister1.b = val;
|
||||
@@ -1176,7 +1177,7 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case 3: /* SPR-RAM Addresse Register */
|
||||
@@ -1192,49 +1193,49 @@ t:0000 1100 0000 0000 = d:0000 0011
|
||||
2005 first write:
|
||||
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.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
|
||||
ppu.HScroll = val & 0x7;
|
||||
ppu.HScroll = val & 0x7;
|
||||
|
||||
|
||||
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||
|
||||
|
||||
//console_printf(Console_Default, "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
|
||||
{
|
||||
/*
|
||||
/*
|
||||
2005 second write:
|
||||
|
||||
1111 1100 0000 0000
|
||||
5432 1098 7654 3210
|
||||
|
||||
2005 second write:
|
||||
|
||||
1111 1100 0000 0000
|
||||
5432 1098 7654 3210
|
||||
|
||||
8421 8421 8421 8421
|
||||
-------------------
|
||||
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.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFC1F) | ((val & 0xF8) << 2));
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0x8FFF) | ((val & 0x07) << 12));
|
||||
|
||||
ppu.TmpVScroll = (val & 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);
|
||||
|
||||
//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;
|
||||
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;
|
||||
/*
|
||||
2006 first write:
|
||||
@@ -1242,13 +1243,13 @@ t:0011 1111 0000 0000 = d:0011 1111
|
||||
t:1100 0000 0000 0000=0
|
||||
*/
|
||||
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;
|
||||
/*
|
||||
2006 second write:
|
||||
@@ -1257,8 +1258,8 @@ v=t
|
||||
*/
|
||||
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
|
||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
|
||||
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
|
||||
//console_printf(Console_Default, "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;
|
||||
@@ -1268,12 +1269,12 @@ v=t
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
|
||||
void FillSprRamDMA(byte value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0x00; i < 0x100; i++)
|
||||
{
|
||||
ppu.SPRRAM[i] = ReadMemory( value, i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 <stdlib.h>
|
||||
|
||||
@@ -24,7 +38,7 @@ int main(int argc, char *argv[])
|
||||
infile = argv[i+1];
|
||||
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);
|
||||
}
|
||||
i++;
|
||||
@@ -35,14 +49,14 @@ int main(int argc, char *argv[])
|
||||
fpout = fopen(argv[i+1], "wb");
|
||||
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);
|
||||
}
|
||||
i++;
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr,"Error: unknown argument: %s\n", argv[i]);
|
||||
fprintf (stderr, "Error: unknown argument: %s\n", argv[i]);
|
||||
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
|
||||
|
||||
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) $^
|
||||
|
||||
apu.a: $(SRC)/apu/Sound.c $(SRC)/apu/SndAlleg.c
|
||||
apu.o: $(SRC)/apu/Sound.c $(SRC)/apu/SndAlleg.c
|
||||
$(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 $@
|
||||
|
||||
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 $@
|
||||
|
||||
memory.a: $(SRC)/memorymanager/memory.c
|
||||
memory.o: $(SRC)/memorymanager/memory.c
|
||||
$(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 $@
|
||||
|
||||
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 $@
|
||||
|
||||
plugins.a: $(SRC)/pluginsmanager/manager.c $(PLUGINS)
|
||||
plugins.o: $(SRC)/pluginsmanager/manager.c $(PLUGINS)
|
||||
$(CC) $(CFLAGS) -c $^ -o $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -Rf *.o *~ core
|
||||
rm -Rf *.a *.o *~ core
|
||||
|
||||
Reference in New Issue
Block a user