9 Commits

Author SHA1 Message Date
godzil
bc65a7a4f0 Merge newcore branch into master/trunk. Correct lots of warning. (now warning are threat as error by default)
Signed-off-by: Godzil <godzil@godzil.net>
2012-01-31 15:15:55 +00:00
godzil
211b1f86c8 More changes 2012-01-30 23:37:10 +00:00
godzil
8e99ac85ff Update documentation 2008-02-25 14:52:06 +00:00
godzil
c2ae371bed Just a bit of cosmetic 2008-02-23 17:37:45 +00:00
godzil
79ac4c42f1 minors modifications on cycle count, re-add correct svn:keywords and update correct source file headers 2008-02-23 17:35:15 +00:00
godzil
02a8b24523 Some more 2008-02-21 13:03:48 +00:00
godzil
735217df00 Update some parts 2008-02-21 12:46:05 +00:00
godzil
5d3895f08a Update PPU to new version, correct a lot of bugs:
- Scanline counts was wrongPAL counts was wrong, correct some bugs in the plugins manager, remove a lot of warning
2008-02-21 12:21:01 +00:00
godzil
bc118baac8 prepare to move files 2008-02-21 00:01:40 +00:00
99 changed files with 7456 additions and 4516 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
#Temp files
/build*
*~
*.swp

16
CMakeLists.txt Normal file
View 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)

View File

@@ -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$
--------------------------------------------------------------------------------

View File

@@ -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$
--------------------------------------------------------------------------------

View File

@@ -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$
--------------------------------------------------------------------------------

View File

@@ -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
View 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})

View File

@@ -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
View 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)

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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;

View 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)

File diff suppressed because it is too large Load Diff

View File

@@ -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 */

View File

@@ -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)
{

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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 },

View File

@@ -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();

View File

@@ -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
View 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
View 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
View 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 */

View File

@@ -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

View File

@@ -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

View 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 */

View File

@@ -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$
*
*/

View File

@@ -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 },
};

View File

@@ -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$

View File

@@ -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$
*
*/

View File

@@ -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$
*
*/

View File

@@ -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

View File

@@ -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
View 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

File diff suppressed because it is too large Load Diff

View 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} )

View File

@@ -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;
}
}

View File

@@ -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);
}

View 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);

View File

@@ -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);

View 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);

View File

@@ -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$
*
*/

View File

@@ -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;
}

View 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);

View File

@@ -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);

View File

@@ -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 ();

View File

@@ -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;
}

View 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);

View File

@@ -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;
}

View 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);

View File

@@ -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 */

View File

@@ -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 ();

View File

@@ -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);
}

View File

@@ -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;

View 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);

View File

@@ -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 }
};

View File

@@ -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);
}

View File

@@ -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$
*
*/

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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)]);

View 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)

View File

@@ -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)

View 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
View 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
View 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
View 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
View File

View 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
View 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
View File

@@ -0,0 +1,8 @@
#include <tigcclib.h>
int main(int argc, char *argv[]);
void _main()
{
main(1, "smb1.nes");
}

View 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
View 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
View 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
View File

View 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)

View File

@@ -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;
}

View 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})

View File

@@ -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;

View File

@@ -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);

View File

@@ -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();

View File

@@ -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
View 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})

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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
View 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}

View File

@@ -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