More changes

This commit is contained in:
godzil 2012-01-30 23:37:10 +00:00
parent 8e99ac85ff
commit 211b1f86c8
55 changed files with 3171 additions and 759 deletions

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.4)
project (TINES)
add_subdirectory (src)

View File

@ -8,7 +8,7 @@
- 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)
- 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

137
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,137 @@
#
# 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
##########################
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/win32)
else (TARGET_TI68k)
#So we target UNIX like OS
add_subdirectory(os/unix)
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 optimized alleg-main)
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

@ -12,20 +12,29 @@
*
*/
#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);
@ -57,14 +66,11 @@ int LoadCart(const char *filename, NesCart * cart)
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"

12
src/apu/CMakeLists.txt Normal 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(apu SndAlleg.c Sound.c)

View File

@ -13,7 +13,16 @@
*/
#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>
@ -265,6 +274,8 @@ static void *DSPLoop(void *Arg)
L2=L1+K;
Wave[I]+= L1&0x8000?V:-V /*(L2&0x8000? V:0):(L2&0x8000? 0:-V)*/;
L1=L2;
}
CH[J].Count=L1;
break;
@ -314,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;
}
@ -332,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); }
@ -350,7 +361,7 @@ int InitSound(int Rate,int Verbose)
void TrashSound(void)
{
StopSound();
printf("%s: Kill thread...\n", __func__);
console_printf(Console_Default, "%s: Kill thread...\n", __func__);
if(ThreadID) pthread_cancel(ThreadID);
SoundRate = 0;

View File

@ -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 */
@ -462,7 +462,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 +480,9 @@ int InitSound(int Rate,int Verbose)
void TrashSound(void)
{
StopSound();
printf("%s: Kill thread...\n", __func__);
console_printf(Console_Default, "%s: Kill thread...\n", __func__);
if(ThreadID) pthread_cancel(ThreadID);
printf("%s: close /dev/xxx ...\n", __func__);
console_printf(Console_Default, "%s: close /dev/xxx ...\n", __func__);
if(SoundFD!=-1) close(SoundFD);
SoundRate = 0;

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)

1850
src/corecpu/corecpu.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -14,7 +14,7 @@
#ifndef NESCARTS_H
#define NESCARTS_H
#include "types.h"
#include <types.h>
#define iNES_MIRROR 0x01
#define iNES_BATTERY 0x02

View File

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

164
src/include/corecpu.h Normal file
View File

@ -0,0 +1,164 @@
/**
* 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 :
* NO_DECIMAL Quick6502 will not support BDC arithemtic (used for NES)
* CMOS_6502 Quick6502 will act as a CMOS 6502 (Not actually used)
*
*/
#ifdef CMOS_6502
//#warning Quick6502 CMOS support is actually desactivated, desactivate it
#undef CMOS_6502
#endif
#ifndef NO_DECIMAL
//#warning Quick6502 have actually no BCD support, fallback to no NO_DECIMAL
#define 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;
} 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 */
void quick6502_getinstruction(quick6502_cpu *cpu, unsigned short addr, char *buffer);
/**
* 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_ */

View File

@ -29,6 +29,7 @@ typedef void (*MapperDump) ();
#include <ppu/ppu.h>
#include <memory/manager.h>
#include <os_dependent.h>
extern NesCart *Cart;

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

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

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

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

@ -17,6 +17,8 @@
#include <mappers/manager.h>
#include <os_dependent.h>
MapperIRQ mapper_irqloop;
MapperDump mapper_dump;
MapperWriteHook mapper_hook;
@ -37,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++;
}
}
@ -48,12 +50,12 @@ 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 #%X:\n", cart->MapperID);
while (ptr->name != NULL)
{
if (ptr->id == cart->MapperID)
{
printf ("Found mapper ID #%X - '%s'\n", ptr->id, ptr->name);
console_printf (Console_Default, "Found mapper ID #%X - '%s'\n", ptr->id, ptr->name);
ptr->init (cart);
mapper_irqloop = ptr->irq;

View File

@ -55,7 +55,7 @@ void aorom_MapperWriteHook(register byte Addr, register byte Value)
aorom_load_bank = BankNb;
//printf("aorom: Asking bank %d (giving %d & %d) - mirror is %d\n",BankNb,BankNb,(Value<<1)+1,Value&0x0F);
//console_printf(Console_Default, "aorom: Asking bank %d (giving %d & %d) - mirror is %d\n",BankNb,BankNb,(Value<<1)+1,Value&0x0F);
set_prom_bank_32k(0x8000,BankNb);
}

View File

@ -45,29 +45,29 @@ int iremh3001_InitMapper(NesCart * cart)
int iremh3001_MapperWriteHook(register byte Addr, register byte Value)
{
#if 0
switch(Addr)
{
case 0x8000: /* Set 8k PROM @ 8000 */
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
set_prom_bank_8k(0x8000, Value);
iremh3001_prom_slot[0] = Value;
break;
case 0x9003: /* Mirroring ??? */
printf("iremh3001: Mirroring[0x%X:%d] ?\n", Value, Value);
console_printf(Console_Default, "iremh3001: Mirroring[0x%X:%d] ?\n", Value, Value);
break;
case 0x9005: /* IRQ ??? */
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
console_printf(Console_Default, "iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
break;
case 0x9006: /* IRQ ??? */
printf("iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
console_printf(Console_Default, "iremh3001: IRQ[0x%X:%d] ?\n", Value, Value);
break;
case 0xA000: /* Set 8k PROM @ A000 */
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
set_prom_bank_8k(0xA000, Value);
iremh3001_prom_slot[1] = Value;
break;
@ -80,23 +80,23 @@ int iremh3001_MapperWriteHook(register byte Addr, register byte Value)
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);
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 */
printf("iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
console_printf(Console_Default, "iremh3001: %X: change PROM to %d[%X]\n", Addr, Value, Value);
set_prom_bank_8k(0xC000, Value);
iremh3001_prom_slot[2] = Value;
break;
default:
printf("@:%X -- V:%X", Addr, Value);
console_printf(Console_Default, "@:%X -- V:%X", Addr, Value);
return 0;
}
#endif
return 1;
}

View File

@ -139,7 +139,7 @@ void mmc1_ApplyReg0Mod()
//printf("Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
//console_printf(Console_Default, "Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
switch (MMC1_reg0 & 0x03)
{
@ -191,7 +191,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
@ -218,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
{
@ -238,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);
}
}
@ -261,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
{
@ -279,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);
}
}
@ -305,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
{
@ -329,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
@ -354,4 +354,4 @@ void mmc1_MapperWriteReg3(register byte Addr, register byte Value)
}
}
//printf("MMC1: Debug (Reg:%d,Val:0x%02X,reg0:0x%02X,reg1:0x%02X,reg2:0x%02X,reg3:0x%02X)\n", MMC1_GetReg(Addr), Value, MMC1_reg0, MMC1_reg1, MMC1_reg2, MMC1_reg3);
//console_printf(Console_Default, "MMC1: Debug (Reg:%d,Val:0x%02X,reg0:0x%02X,reg1:0x%02X,reg2:0x%02X,reg3:0x%02X)\n", MMC1_GetReg(Addr), Value, MMC1_reg0, MMC1_reg1, MMC1_reg2, MMC1_reg3);

View File

@ -11,7 +11,6 @@
* $Revision$
*
*/
#include "mmc3.h"
extern unsigned short ScanLine;
@ -58,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;
@ -96,7 +95,7 @@ int mmc3_InitMapper(NesCart * cart)
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;
@ -133,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;
@ -146,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;
@ -158,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;
@ -224,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);
@ -240,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
@ -251,7 +250,7 @@ void mmc3_MapperWriteA0Hook(byte addr, byte Value)
void mmc3_MapperWriteC0Hook(byte addr, byte Value)
{
//printf("%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
//console_printf(Console_Default, "%s(0x%02X, 0x%02X)\n", __func__, addr, Value);
if (addr > 0x01)
return;
@ -259,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;
}
}
@ -306,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

@ -22,16 +22,15 @@ byte mmc4_RegE;
byte mmc4_RegF;
#ifdef DEBUG
#define LOG
//printf
#define LOG(s) printf s
#else
#define LOG
#define LOG(s) { }
#endif
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);
@ -40,7 +39,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);
@ -48,28 +47,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);

View File

@ -137,7 +137,7 @@ void mmc1_ApplyReg0Mod()
//printf("Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
//console_printf(Console_Default, "Change to reg0 done ! (0x%x)\n\tMiror flag : %d\n\tOneScreen Flag : %d\n\tPRG Size : %d\n\tPRG Area : %d\n\tVROM Switch size : %d\n", MMC1_reg0, MMC1_reg0 & MMC1_R0_MIRROR, MMC1_reg0 & MMC1_R0_ONESCREEN, MMC1_reg0 & MMC1_R0_PRGAREA, MMC1_reg0 & MMC1_R0_PRGSIZE, MMC1_reg0 & MMC1_R0_VROMSW);
switch (MMC1_reg0 & 0x03)
{
@ -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
{
@ -236,18 +236,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);
}
}
@ -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

@ -38,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);
@ -47,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);
@ -56,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);
@ -65,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);
@ -76,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));
}
@ -84,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));
}
@ -93,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

@ -12,10 +12,12 @@
*
*/
#include <stdio.h>
#include "types.h"
#include "../include/memory/manager.h"
#include <types.h>
#include <os_dependent.h>
#include <memory/manager.h>
/* Private structures */
@ -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)

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

@ -12,7 +12,14 @@
*
*/
/* 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

@ -15,6 +15,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <os_dependent.h>
#include <plugins/manager.h>
typedef struct Plugin_
@ -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++;
}
}
@ -57,11 +59,11 @@ int plugin_load(int id)
Plugin *ptr = &(Plugins[0]);
int i = id;
printf("%s(%d)", __func__, id);
console_printf(Console_Default, "%s(%d)", __func__, id);
for ( ; i > 1 && ptr->name != NULL; i -- )
{
printf("%d - %s\n", i, ptr->name);
console_printf(Console_Default, "%d - %s\n", i, ptr->name);
ptr ++;
}

View File

@ -14,7 +14,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
#include <os_dependent.h>
#define __TINES_PLUGINS__
#include <plugins/manager.h>
@ -22,7 +23,16 @@
#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_
{
@ -310,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;
@ -428,7 +438,7 @@ 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
@ -456,7 +466,7 @@ byte gg_SelectPatch()
void gg_PatchManager()
{
printf("DTC!\n");
console_printf(Console_Default, "DTC!\n");
}
void gg_InitSearch()
@ -484,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 ++)
@ -494,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)
@ -597,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,
@ -799,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);

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

@ -15,7 +15,14 @@
#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__
@ -200,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)

View File

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

@ -249,7 +249,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;
@ -290,7 +290,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
}
@ -824,7 +824,7 @@ unsigned char XScroll, YScroll;
clear_to_color(Buffer, GetColor(BgColor));
if (ppu.ControlRegister2.s.Colour != 0)
printf("ppu.ColorEmphasis : %d\n", ppu.ControlRegister2.s.Colour);
console_printf(Console_Default, "ppu.ColorEmphasis : %d\n", ppu.ControlRegister2.s.Colour);
for (i = 0; i < 249; i++)
@ -848,7 +848,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];
@ -864,14 +864,14 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
5432 10
*/
//if (y == 142)
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
// 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;
//if (y == 142)
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
// 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;
@ -1177,7 +1177,7 @@ void WritePPUReg(byte RegID, byte val)
switch (RegID)
{
default:/* For not writeable reg */
printf("WritePPU error\n");
console_printf(Console_Default, "WritePPU error\n");
break;
case 0: /* Control Register 1 */
ppu.ControlRegister1.b = val;
@ -1209,7 +1209,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 */
@ -1226,15 +1226,15 @@ t:0000 1100 0000 0000 = d:0000 0011
t:0000 0000 0001 1111=d:1111 1000
x=d:00000111
*/
//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);
ppu.VRAMAddrMode = 1;
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
ppu.HScroll = val & 0x7;
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//printf("%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
//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
{
@ -1249,25 +1249,25 @@ x=d:00000111
t:0000 0011 1110 0000=d:1111 1000
t:0111 0000 0000 0000=d:0000 0111
*/
//printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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)
//printf("2002: TmpVScroll == %d \n", ppu.TmpVScroll);
//console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
//printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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;
case 6: /* VRAM Address register 2 */
if (ppu.VRAMAddrMode == 0)
{
//printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
ppu.VRAMAddrMode = 1;
/*
2006 first write:
@ -1275,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;
//printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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
{
//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);
ppu.VRAMAddrMode = 0;
/*
2006 second write:
@ -1290,8 +1290,8 @@ v=t
*/
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//printf("%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
//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;

View File

@ -14,7 +14,15 @@
*
*/
/* Allegro includes */
#ifdef __APPLE__
#define USE_CONSOLE
#include <Allegro/allegro.h>
#else
#define USE_CONSOLE
#include <allegro.h>
#endif
#include <stdio.h>
#include <stdlib.h>
@ -23,28 +31,14 @@
#include <ppu/ppu.memory.h>
#include <ppu/ppu.debug.h>
#include <M6502.h>
#include <memory/manager.h>
#include <os_dependent.h>
#define __TINES_PLUGINS__
#include <plugins/manager.h>
#if ISPAL && !ISNTSC
//#define VBLANK_TIME 70
extern int VBLANK_TIME;
#elif !ISPAL && ISNTSC
//#define VBLANK_TIME 20
extern int VBLANK_TIME;
#else
#error Cannot use ISPAL with ISNTSC together !
#endif
#ifdef NO_N_KEY
#define IF_N_KEY if (!key[KEY_N])
#else
#define IF_N_KEY if (key[KEY_N])
#endif
extern BITMAP *Buffer;
@ -209,7 +203,7 @@ int ppu_init()
if (!ppu_mem_paletteValues)
return -1;
printf("ppu_mem_nameTables :%p\n"
console_printf(Console_Default, "ppu_mem_nameTables :%p\n"
"ppu_mem_patternTables:%p\n"
"ppu_mem_paletteValues:%p\n",
ppu_mem_nameTables,
@ -238,9 +232,6 @@ int ppu_init()
//memcpy(ppu_mem_paletteValues, defaultColors, 32);
/* Dump PPU memory state */
//ppu_memoryDumpState(stdout);
/* Set some other variables */
ppu_VramAccessFlipFlop = 0;
@ -270,12 +261,6 @@ int ppu_init()
for(i = 0x21; i < 0x40; i++)
set_page_ghost(i, true, 0x20);
// plugin_install_keypressHandler('i', ppu_debugSprites);
// plugin_install_keypressHandler('I', ppu_debugSprites);
// plugin_install_keypressHandler('u', ppu_debugColor);
// plugin_install_keypressHandler('U', ppu_debugColor);
/* allocate the PPU Video memory */
VideoBuffer = create_bitmap(256, 240);
@ -322,7 +307,6 @@ void ppu_updateSpriteScanlineTable()
else
{
PPU_NbSpriteByScanLineOverFlow[curline] = 1;
//printf("sprite of: %u - %u\n", curline, PPU_NbSpriteByScanLine[curline]);
continue; /* We have 8 sprite in this line, don't continue */
}
if (((sprite_x+8) < 0) && ((sprite_x-8) > 256))
@ -342,18 +326,12 @@ void ppu_updateSpriteScanlineTable()
PPU_SpriteByScanLine[curline][j] = 0;
PPU_SCANLINESPRITE_SET_ATTRS (PPU_SpriteByScanLine[curline][j], sprite_attr);
//printf("new sprite [%02X:%02X:%02X:%02X] at sl:%d : 0x%08X ",
//sprite_attr, sprite_idx, curline - sprite_x, sprite_y,
//curline, PPU_SpriteByScanLine[curline][j]);
PPU_SCANLINESPRITE_SET_TILIDX(PPU_SpriteByScanLine[curline][j], sprite_idx);
//printf("- 0x%08X ", PPU_SpriteByScanLine[curline][j]);
PPU_SCANLINESPRITE_SET_RELY (PPU_SpriteByScanLine[curline][j], curline - sprite_y);
//printf("- 0x%08X ", PPU_SpriteByScanLine[curline][j]);
PPU_SCANLINESPRITE_SET_X (PPU_SpriteByScanLine[curline][j], sprite_x);
//printf("- 0x%08X\n", PPU_SpriteByScanLine[curline][j]);
break; /* Stop the for, we don't need to go further in the line list */
}
@ -377,14 +355,12 @@ void ppu_setMirroring(byte direction)
ppu_mirrorMode = direction;
case PPU_MIRROR_HORIZTAL: /* Horizontal */
//printf("Set mirror to Hor\n");
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x000);
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x400);
ppu_setPagePtr1k(0x2C, ppu_mem_nameTables + 0x400);
break;
case PPU_MIRROR_VERTICAL: /* Vertical */
//printf("Set mirror to Ver\n");
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x000);
@ -408,7 +384,6 @@ void ppu_setSingleScreen(byte screen)
ppu_singleScreenMode = screen;
case PPU_SCREEN_000: /* 0x2000 */
//printf("Set screen to 0x000\n");
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x000);
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x000);
@ -416,7 +391,6 @@ void ppu_setSingleScreen(byte screen)
break;
case PPU_SCREEN_400: /* 0x2400 */
//printf("Set screen to 0x400\n");
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x400);
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x400);
@ -424,7 +398,6 @@ void ppu_setSingleScreen(byte screen)
break;
case PPU_SCREEN_800: /* 0x2800 */
//printf("Set screen to 0x800\n");
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x800);
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x800);
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x800);
@ -432,7 +405,6 @@ void ppu_setSingleScreen(byte screen)
break;
case PPU_SCREEN_C00: /* 0x2C00 */
//printf("Set screen to 0xC00\n");
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0xC00);
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0xC00);
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0xC00);
@ -456,7 +428,6 @@ void ppu_setScreenMode(byte mode)
switch(mode)
{
case PPU_SCMODE_SINGLE: /* Single screen (1 NT with mirroring) */
//printf("Set Single Screen\n");
ppu_setSingleScreen(~ppu_singleScreenMode);
break;
@ -465,12 +436,10 @@ void ppu_setScreenMode(byte mode)
ppu_screenMode = mode;
case PPU_SCMODE_NORMAL: /* Normal screen (2 NT with mirroring) */
//printf("Set Normal Screen\n");
ppu_setMirroring(~ppu_mirrorMode);
break;
case PPU_SCMODE_FOURSC: /* Four screen (4 NT withou mirroring) */
//printf("Set Four Screen\n");
ppu_setPagePtr1k(0x20, ppu_mem_nameTables + 0x000);
ppu_setPagePtr1k(0x24, ppu_mem_nameTables + 0x400);
ppu_setPagePtr1k(0x28, ppu_mem_nameTables + 0x800);
@ -479,11 +448,6 @@ void ppu_setScreenMode(byte mode)
}
}
void ppu_setSprite(unsigned short i, PPU_Sprite *sprt)
{
}
/* update whole counters */
void ppu_updateCounters()
{
@ -509,12 +473,8 @@ _AAA BCDD DDDE EEEE
PPU_Reg_Counter |= PPU_Reg_H << 10;
PPU_Reg_Counter |= PPU_Reg_VT << 5;
PPU_Reg_Counter |= PPU_Reg_HT;
IF_N_KEY printf("Counter update to %04X\n",PPU_Reg_Counter);
}
extern M6502 MainCPU;
int ppu_hblank(int scanline)
{
int i, j;
@ -528,12 +488,9 @@ int ppu_hblank(int scanline)
unsigned long CurrentSprite;
byte SpriteVFlip;
/* If no plan activated, we have nothing to do ! */
if (scanline == 0)
{
ppu_bgColor = ppu_readMemory(0x3F,00);
clear_to_color(VideoBuffer, ppu_bgColor);
if ((ppu_spriteVisibility != 0) || (ppu_backgroundVisibility != 0))
ppu_updateCounters();
@ -629,7 +586,6 @@ int ppu_hblank(int scanline)
else
addr = (((PPU_SCANLINESPRITE_GET_TILIDX(CurrentSprite)&0xFE) + (SpriteVFlip?0:1)) << 4) + ((PPU_SCANLINESPRITE_GET_TILIDX(CurrentSprite)&0x01)?0x1000:0x0000);
}
//printf("sprite addr: %04X\n", addr);
if (SpriteVFlip)
{
addr += 7;
@ -675,12 +631,13 @@ int ppu_hblank(int scanline)
}
}
/* Set to monochrome if needed */
if (ppu_displayType)
pixelColor &= 0x30;
/* draw the pixel */
/*if (ppu_displayType)
pixelColor &= 0x30;*/
_putpixel(VideoBuffer, i, scanline, pixelColor);
}
}
if (ppu_backgroundVisibility || ppu_spriteVisibility)
if (PPU_NbSpriteByScanLineOverFlow[scanline] == 1)
@ -695,24 +652,19 @@ int ppu_hblank(int scanline)
tmp_VVTFV = ((PPU_Reg_Counter >> 3 ) & 0x0100) | /* V */
((PPU_Reg_Counter >> 2 ) & 0x00F8) | /* VT */
((PPU_Reg_Counter >> 12) & 0x0007); /* FV */
//printf("counter:%04X vvtfv:%04X ", PPU_Reg_Counter, tmp_VVTFV);
tmp_VVTFV++;
//printf("__ vvtfv:0x%04X == 0x%04X ? ", tmp_VVTFV, 30<<3);
if ((tmp_VVTFV&0x0F8) == 0xF0)
{
tmp_VVTFV &= ~0x0F8;
tmp_VVTFV ^= 0x100;
//printf("YES _");
}
//printf("vvtfv:%04X ", tmp_VVTFV);
PPU_Reg_Counter = ( PPU_Reg_Counter & 0x041F) |
((tmp_VVTFV & 0x0100 ) << 3 ) | /* V */
((tmp_VVTFV & 0x00F8 ) << 2 ) | /* VT */
((tmp_VVTFV & 0x0007 ) << 12); /* FV */
//printf("counter:%04X ", PPU_Reg_Counter);
/* Update H & HT */
PPU_Reg_Counter = (PPU_Reg_Counter & ~0x041F) |
(PPU_Reg_H << 10) |
@ -720,7 +672,6 @@ int ppu_hblank(int scanline)
}
}
/* Increment only V & VT & FV*/
/*
8421 8421 8421 8421
@ -745,8 +696,13 @@ E = HT
*/
if (scanline == 239)
{
ppu_inVBlankTime = 1;
IF_N_KEY printf("============= enter vblank =================\n");
ppu_inVBlankTime = 1;
textprintf(Buffer, font, 260, 3, 4, "FPS : %ld (CPU@~%2.2fMhz : %d%%)", FPS, (float) (((float) IPS) / 1000000.0), (int) ((((float) IPS) / 1770000.0) * 100.0));
blit(VideoBuffer, Buffer, 0, 0, 0, 0, 256, 240);
blit(Buffer, screen, 0, 0, 0, 0, 512+256, 512);
return ppu_execNMIonVBlank;
}
@ -757,37 +713,11 @@ E = HT
}
if (scanline >= (240 + VBLANK_TIME - 1))
if (scanline == (239 + VBLANK_TIME))
{
/*for ( i = 0; i < 256; i++)
for ( j = 0; j < 256; j++)
{
int i2 = i<<1, j2 = j<<1;
putpixel(Buffer, i2 , j2 , Op6502(i+j*256));
putpixel(Buffer, i2 , j2+1, Op6502(i+j*256));
putpixel(Buffer, i2+1, j2 , Op6502(i+j*256));
// putpixel(Buffer, i2+1, j2+1, Op6502(i+j*256));
}*/
//textprintf(Buffer, font, 5, 340, 4, "(SL:%d) FPS : %d IPS : %d", scanline, FPS, IPS);
textprintf(Buffer, font, 260, 3, 4, "FPS : %d (CPU@~%2.2fMhz : %d%%)", FPS, (float) (((float) IPS) / 1000000.0), (int) ((((float) IPS) / 1770000.0) * 100.0));
//printf("(SL:%d) FPS : %d IPS : %d\n", scanline, FPS, IPS);
//ppu_dumpPalette(0, 241);
//ppu_dumpPattern(280, 150);
//ppu_dumpNameTable(256,0);
//ppu_dumpAttributeTable(257, 0);
blit(VideoBuffer, Buffer, 0, 0, 0, 0, 256, 240);
blit(Buffer, screen, 0, 0, 0, 0, 512+256, 512);
//blit(VideoBuffer, screen, 0, 0, 0, 0, 256, 240);
IF_N_KEY printf("_____________ leave vblank _________________\n");
ppu_inVBlankTime = 0;
ppu_spriteZeroHit = 0;
ppu_scanlineSpriteOverflow = 0;
//ppu_updateCounters();
}
return 0;
}
@ -803,7 +733,6 @@ byte ppu_readReg(byte id)
{
default:
garbage = PPU_RegValues[id];
printf("%s: try to read 0x20%02X\n", __func__, id);
break;
case 0x02: /* PPU Status Register */
@ -814,9 +743,6 @@ byte ppu_readReg(byte id)
garbage |= (ppu_inVBlankTime!=0) ?PPU_FLAG_SR_VBLANK:0;
garbage |= (ppu_spriteZeroHit!=0) ?PPU_FLAG_SR_SPRT0:0;
garbage |= (ppu_scanlineSpriteOverflow!=0)?PPU_FLAG_SR_8SPRT:0;
/*garbage ^= PPU_FLAG_SR_RDWRALLOW;*/
IF_N_KEY printf("%s() = %02X\n", __func__, garbage);
ppu_inVBlankTime = 0;
break;
@ -844,7 +770,6 @@ byte ppu_readReg(byte id)
break;
}
//printf("ppuread %02X return: %02X\n", id, garbage);
return garbage;
}
@ -852,12 +777,10 @@ byte ppu_readReg(byte id)
void ppu_writeReg(byte id, byte val)
{
id &= 0x07;
//printf("ppuwrte %02X val: %02X\n", id, val);
PPU_RegValues[id] = val;
switch(id)
{
default:
//printf("%s: try to write 0x%02X @ 0x20%02X\n", __func__, val, id);
break;
case 0x00: /* PPU Control Register #1 */
@ -872,18 +795,6 @@ void ppu_writeReg(byte id, byte val)
| |+===++=++=++=====++=====+ |
+---------------+-----------------------------------------------+
*/
IF_N_KEY
printf("%s(%02X, %02X); /* 2000: "
"NMI:%c SPRTSIZE:%02d BGTA:%04X[0x%04X] SPTA:%04X INC:%02d NTA:%04X */\n",
__func__, id, val,
(val & 0x80)?'E':'D',
(val & 0x20)?16:8,
(val & 0x10)?0x1000:0x0000, PPU_Reg_S,
(val & 0x08)?0x1000:0x0000,
(val & 0x04)?32:1,
(val & 0x03)<<10|0x2000
);
/* Set PPU internal registers */
PPU_Reg_V = (val & 0x02)?1:0;
PPU_Reg_H = (val & 0x01)?1:0;
@ -905,17 +816,6 @@ void ppu_writeReg(byte id, byte val)
ppu_displayType = (val & 0x01)?1:0;
ppu_updateSpriteScanlineTable();
IF_N_KEY
printf("%s(%02X, %02X); /* 2001 : "
"SprtV:%c BckgV:%c SprtC:%c BckgC:%c DispT:%c"
" */\n", __func__, id, val,
ppu_spriteVisibility?'y':'n',
ppu_backgroundVisibility?'y':'n',
ppu_spriteClipping?'y':'n',
ppu_backgroundClipping?'y':'n',
ppu_displayType?'m':'c'
);
break;
case 0x03: /* SPR-RAM Address Register */
@ -945,8 +845,6 @@ void ppu_writeReg(byte id, byte val)
PPU_Reg_FH = val & 0x07;
PPU_Reg_HT = (val & 0xF8) >> 3;
IF_N_KEY
printf("2005/1[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
}
else
{
@ -954,8 +852,6 @@ void ppu_writeReg(byte id, byte val)
PPU_Reg_FV = val & 0x07;
PPU_Reg_VT = (val & 0xF8) >> 3;
IF_N_KEY
printf("2005/2[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
}
break;
@ -980,8 +876,6 @@ void ppu_writeReg(byte id, byte val)
PPU_Reg_V = (val >> 3) & 0x01;
PPU_Reg_H = (val >> 2) & 0x01;
PPU_Reg_VT = (PPU_Reg_VT & 0x07) | ((val & 0x03) << 3);
IF_N_KEY
printf("2006/1[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
}
else
{
@ -989,9 +883,6 @@ void ppu_writeReg(byte id, byte val)
PPU_Reg_VT = (PPU_Reg_VT & 0x18) | ((val >> 5) & 0x07);
PPU_Reg_HT = val & 0x1F;
IF_N_KEY
printf("2006/2[%04X]: fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",val,PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
ppu_updateCounters();
}
@ -1009,25 +900,7 @@ void ppu_writeReg(byte id, byte val)
+===============+===============================================+
*/
//if ( (PPU_Reg_Counter&0xFF00) == 0x3F00)
//{
// printf("fv:%01X v:%01X h:%01X vt:%01X ht:%01X fh:%01X\n",PPU_Reg_FV,PPU_Reg_V,PPU_Reg_H,PPU_Reg_VT,PPU_Reg_HT,PPU_Reg_FH);
// printf("will write ppu: counter:%04X pa:%02X%02X v:%02X\n",
// PPU_Reg_Counter, (PPU_Reg_Counter>>8) & 0x3F, PPU_Reg_Counter & 0xFF, val);
// }
ppu_writeMemory((PPU_Reg_Counter>>8) & 0x3F, PPU_Reg_Counter & 0xFF, val);
IF_N_KEY
{
ppu_dumpPalette(0, 241);
ppu_dumpPattern(280, 150);
ppu_dumpNameTable(256,0);
blit(Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
}
PPU_Reg_Counter += ppu_addrIncrement;
break;
@ -1042,6 +915,5 @@ void ppu_fillSprRamDMA(byte value)
{
ppu_mem_spritesTable[(ppu_mem_sptrTablePtr + i)&0xFF] = *(ptr+i);
}
//memcpy(ppu_mem_spritesTable, ptr, 0xFF);
ppu_updateSpriteScanlineTable();
}

View File

@ -15,9 +15,11 @@
#include <stdio.h>
#include <stdlib.h>
#include <os_dependent.h>
#define __TINES_PPU_INTERNAL__
#include <ppu.h>
#include <ppu/ppu.h>
#include <ppu/ppu.memory.h>
#include <types.h>
@ -120,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]));
}
}
@ -155,7 +157,7 @@ void ppu_writeMemory(byte page, byte addr, byte value)
{
/* Here we will cheat with the palette miroring, since we didn't write
as often as we read the palette, we will mirror here */
//printf("%s palette: color %02X new value : %02d (0x%02X%02X)\n", ((addr&0x10)< 0x10) ? "Bgnd" : "Sprt", addr&0x1F, value & 0x3F, page, addr);
//console_printf(Console_Default, "%s palette: color %02X new value : %02d (0x%02X%02X)\n", ((addr&0x10)< 0x10) ? "Bgnd" : "Sprt", addr&0x1F, value & 0x3F, page, addr);
if ((addr & 0xEF) == 0x00)
{
ppu_memoryPages[0x3F][0x00] = value;

View File

@ -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
}
@ -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];
@ -836,13 +836,13 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
XScroll = ppu.TimedHScroll[y];
/*YScroll += ppu.TimedVScroll[y];*/
/* printf("Y:%d -_- ", YScroll);
/* console_printf(Console_Default, "Y:%d -_- ", YScroll);
if (ppu.TimedVScroll[y] != 0)
{
YScroll = ppu.TimedVScroll[y];
printf("Y:%d", YScroll);
console_printf(Console_Default, "Y:%d", YScroll);
}
printf("\n");*/
console_printf(Console_Default, "\n");*/
for (x = 0; x < 256; x++)
{
/* Calculer la couleur du point */
@ -1068,7 +1068,7 @@ NoDraw:
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));
//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);
@ -1138,7 +1138,7 @@ void WritePPUReg(byte RegID, byte val)
switch (RegID)
{
default:/* For not writeable reg */
printf("WritePPU error\n");
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;

View File

@ -249,7 +249,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;
@ -290,7 +290,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
}
@ -827,7 +827,7 @@ unsigned char XScroll, YScroll;
ppu_displayNameTables();
if (ppu.ControlRegister2.s.Colour != 0)
printf("ppu.ColorEmphasis : %d\n", ppu.ControlRegister2.s.Colour);
console_printf(Console_Default, "ppu.ColorEmphasis : %d\n", ppu.ControlRegister2.s.Colour);
for (i = 0; i < 249; i++)
@ -851,7 +851,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);
YScroll = ppu.TmpVScroll;
@ -865,7 +865,7 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
5432 10
*/
if ((y == IRQScanHit)||(y == IRQScanHit + 1))
printf("%s: IRQ Hit : bf Reg2: 0x%04X\n", __func__, ppu.VRAMAddrReg2.W);
console_printf(Console_Default, "%s: IRQ Hit : bf Reg2: 0x%04X\n", __func__, ppu.VRAMAddrReg2.W);
#define PPU_SSCAN_MASK 0x041F
@ -880,10 +880,10 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
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]);
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)
printf("%s: IRQ Hit + 1: Reg2: 0x%04X TmpPtr:0x%04X \n", __func__, ppu.VRAMAddrReg2.W, ppu.TimedTmpPtr[y]);
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++)
@ -1194,7 +1194,7 @@ void WritePPUReg(byte RegID, byte val)
switch (RegID)
{
default:/* For not writeable reg */
printf("WritePPU error\n");
console_printf(Console_Default, "WritePPU error\n");
break;
case 0: /* Control Register 1 */
ppu.ControlRegister1.b = val;
@ -1226,7 +1226,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 */
@ -1243,15 +1243,15 @@ t:0000 1100 0000 0000 = d:0000 0011
t:0000 0000 0001 1111=d:1111 1000
x=d:00000111
*/
//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);
ppu.VRAMAddrMode = 1;
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
ppu.HScroll = val & 0x7;
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//printf("%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
//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
{
@ -1266,25 +1266,25 @@ x=d:00000111
t:0000 0011 1110 0000=d:1111 1000
t:0111 0000 0000 0000=d:0000 0111
*/
//printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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)
//printf("2002: TmpVScroll == %d \n", ppu.TmpVScroll);
//console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
//printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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;
case 6: /* VRAM Address register 2 */
if (ppu.VRAMAddrMode == 0)
{
//printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
ppu.VRAMAddrMode = 1;
/*
2006 first write:
@ -1292,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));
//printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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
{
//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);
ppu.VRAMAddrMode = 0;
/*
2006 second write:
@ -1307,8 +1307,8 @@ v=t
*/
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//printf("%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
//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;

View File

@ -231,7 +231,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;
@ -272,7 +272,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
}
@ -806,7 +806,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++)
@ -830,7 +830,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];
@ -846,14 +846,14 @@ v:0000 0100 0001 1111=t:0000 0100 0001 1111
5432 10
*/
//if (y == 142)
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
// 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;
//if (y == 142)
// printf("______________142 Ptr:0x%04X ____ 0x%04X\n", ppu.TimedTmpPtr[y], ppu.VRAMAddrReg2.W);
// 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;
@ -1145,7 +1145,7 @@ void WritePPUReg(byte RegID, byte val)
switch (RegID)
{
default:/* For not writeable reg */
printf("WritePPU error\n");
console_printf(Console_Default, "WritePPU error\n");
break;
case 0: /* Control Register 1 */
ppu.ControlRegister1.b = val;
@ -1177,7 +1177,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 */
@ -1194,15 +1194,15 @@ t:0000 1100 0000 0000 = d:0000 0011
t:0000 0000 0001 1111=d:1111 1000
x=d:00000111
*/
//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);
ppu.VRAMAddrMode = 1;
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFFE0) | ((val & 0xF8) >> 3));
ppu.HScroll = val & 0x7;
//printf("2005[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//printf("%d -> 2005 w1: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
//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
{
@ -1217,25 +1217,25 @@ x=d:00000111
t:0000 0011 1110 0000=d:1111 1000
t:0111 0000 0000 0000=d:0000 0111
*/
//printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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)
//printf("2002: TmpVScroll == %d \n", ppu.TmpVScroll);
//console_printf(Console_Default, "2002: TmpVScroll == %d \n", ppu.TmpVScroll);
//printf("2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2005[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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;
case 6: /* VRAM Address register 2 */
if (ppu.VRAMAddrMode == 0)
{
//printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
ppu.VRAMAddrMode = 1;
/*
2006 first write:
@ -1243,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;
//printf("2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//console_printf(Console_Default, "2006[1st][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//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
{
//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);
ppu.VRAMAddrMode = 0;
/*
2006 second write:
@ -1258,8 +1258,8 @@ v=t
*/
ppu.TmpVRamPtr = ((ppu.TmpVRamPtr & 0xFF00) | (val & 0x00FF));
ppu.VRAMAddrReg2.W = ppu.TmpVRamPtr;
//printf("2006[2nd][%d]: 0x%02X [0x%04X]\n", ScanLine, val, ppu.TmpVRamPtr);
//printf("%d -> 2006 w2: 0x%04X (val: 0x%02X)\n", ScanLine, ppu.TmpVRamPtr, val);
//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;

View File

@ -38,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++;
@ -49,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