MCUME/MCUME_teensy/teensynofrendo/nofrendo.c

395 wiersze
9.2 KiB
C

/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program is free software; you can redistribute it and/or
** modify it under the terms of version 2 of the GNU Library General
** Public License as published by the Free Software Foundation.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Library General Public License for more details. To obtain a
** copy of the GNU Library General Public License, write to the Free
** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nofrendo.c
**
** Entry point of program
** Note: all architectures should call these functions
** $Id: nofrendo.c,v 1.3 2001/04/27 14:37:11 neil Exp $
*/
#include <stdio.h>
#include <stdlib.h>
#include "noftypes.h"
#include "nofrendo.h"
#include "event.h"
#include "nofconfig.h"
#include "log.h"
#include "osd.h"
#include "vid_drv.h"
/* emulated system includes */
#include "nes.h"
/* our global machine structure */
static struct
{
char *filename, *nextfilename;
system_t type, nexttype;
union
{
nes_t *nes;
} machine;
int refresh_rate;
bool quit;
} console;
/* our happy little timer ISR */
volatile int nofrendo_ticks = 0;
static void timer_isr(void)
{
nofrendo_ticks++;
}
static void timer_isr_end(void) {} /* code marker for djgpp */
static void shutdown_everything(void)
{
if (console.filename)
{
free(console.filename);
console.filename = NULL;
}
if (console.nextfilename)
{
free(console.nextfilename);
console.nextfilename = NULL;
}
//config.close(); JMH
osd_shutdown();
vid_shutdown();
log_shutdown();
}
/* End the current context */
void main_eject(void)
{
switch (console.type)
{
case system_nes:
nes_poweroff();
nes_destroy(&(console.machine.nes));
break;
default:
break;
}
if (NULL != console.filename)
{
free(console.filename);
console.filename = NULL;
}
console.type = system_unknown;
}
/* Act on the user's quit requests */
void main_quit(void)
{
console.quit = true;
main_eject();
/* if there's a pending filename / system, clear */
if (NULL != console.nextfilename)
{
free(console.nextfilename);
console.nextfilename = NULL;
}
console.nexttype = system_unknown;
}
/* brute force system autodetection */
static system_t detect_systemtype(const char *filename)
{
if (NULL == filename)
return system_unknown;
if (0 == nes_isourfile(filename))
return system_nes;
/* can't figure out what this thing is */
return system_unknown;
}
static int install_timer(int hertz)
{
return osd_installtimer(hertz, (void *) timer_isr,
(int) timer_isr_end - (int) timer_isr,
(void *) &nofrendo_ticks,
sizeof(nofrendo_ticks));
}
/* This assumes there is no current context */
static int internal_insert(const char *filename, system_t type)
{
/* autodetect system type? */
if (system_autodetect == type)
type = detect_systemtype(filename);
console.filename = strdup(filename);
console.type = type;
/* set up the event system for this system type */
event_set_system(type);
switch (console.type)
{
case system_nes:
console.machine.nes = nes_create();
if (NULL == console.machine.nes)
{
log_printf("Failed to create NES instance.\n");
return -1;
}
if (nes_insertcart(console.filename, console.machine.nes))
return -1;
vid_setmode(NES_SCREEN_WIDTH, NES_VISIBLE_HEIGHT);
if (install_timer(NES_REFRESH_RATE))
return -1;
nes_emulate();
break;
case system_unknown:
default:
log_printf("system type unknown, playing nofrendo NES intro.\n");
if (NULL != console.filename)
free(console.filename);
/* oooh, recursion */
return internal_insert(filename, system_nes);
}
return 0;
}
/* This tells main_loop to load this next image */
void main_insert(const char *filename, system_t type)
{
console.nextfilename = strdup(filename);
console.nexttype = type;
main_eject();
}
int nofrendo_main(int argc, char *argv[])
{
/* initialize our system structure */
console.filename = NULL;
console.nextfilename = NULL;
console.type = system_unknown;
console.nexttype = system_unknown;
console.refresh_rate = 0;
console.quit = false;
if (log_init())
return -1;
event_init();
return osd_main(argc, argv);
}
/* This is the final leg of main() */
int main_loop(const char *filename, system_t type)
{
vidinfo_t video;
/* register shutdown, in case of assertions, etc. */
// atexit(shutdown_everything);
//if (config.open()) // JMH
// return -1;
if (osd_init())
return -1;
osd_getvideoinfo(&video);
if (vid_init(video.default_width, video.default_height, video.driver))
return -1;
//log printf("vid_init done\n");
console.nextfilename = strdup(filename);
console.nexttype = type;
// while (false == console.quit)
// {
//emu_printf("internal_insert in loop\n");
if (internal_insert(console.nextfilename, console.nexttype))
return 1;
// }
return 0;
}
/*
** $Log: nofrendo.c,v $
** Revision 1.3 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.2 2001/04/27 11:10:08 neil
** compile
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.48 2000/11/27 12:47:08 matt
** free them strings
**
** Revision 1.47 2000/11/25 20:26:05 matt
** removed fds "system"
**
** Revision 1.46 2000/11/25 01:51:53 matt
** bool stinks sometimes
**
** Revision 1.45 2000/11/20 13:22:12 matt
** standardized timer ISR, added nofrendo_ticks
**
** Revision 1.44 2000/11/05 22:53:13 matt
** only one video driver per system, please
**
** Revision 1.43 2000/11/01 14:15:35 matt
** multi-system event system, or whatever
**
** Revision 1.42 2000/10/28 15:16:24 matt
** removed nsf_init
**
** Revision 1.41 2000/10/27 12:58:44 matt
** gui_init can now fail
**
** Revision 1.40 2000/10/26 22:48:57 matt
** prelim NSF support
**
** Revision 1.39 2000/10/25 13:42:02 matt
** strdup - giddyap!
**
** Revision 1.38 2000/10/25 01:23:08 matt
** basic system autodetection
**
** Revision 1.37 2000/10/23 17:50:47 matt
** adding fds support
**
** Revision 1.36 2000/10/23 15:52:04 matt
** better system handling
**
** Revision 1.35 2000/10/21 19:25:59 matt
** many more cleanups
**
** Revision 1.34 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.33 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.32 2000/09/15 04:58:06 matt
** simplifying and optimizing APU core
**
** Revision 1.31 2000/09/10 23:19:14 matt
** i'm a sloppy coder
**
** Revision 1.30 2000/09/07 01:30:57 matt
** nes6502_init deprecated
**
** Revision 1.29 2000/08/16 03:17:49 matt
** bpb
**
** Revision 1.28 2000/08/16 02:58:19 matt
** changed video interface a wee bit
**
** Revision 1.27 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.26 2000/07/30 04:31:26 matt
** automagic loading of the nofrendo intro
**
** Revision 1.25 2000/07/27 01:16:36 matt
** sorted out the video problems
**
** Revision 1.24 2000/07/26 21:54:53 neil
** eject has to clear the nextfilename and nextsystem
**
** Revision 1.23 2000/07/26 21:36:13 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.22 2000/07/25 02:21:36 matt
** safer xxx_destroy calls
**
** Revision 1.21 2000/07/23 16:46:47 matt
** fixed crash in win32 by reodering shutdown calls
**
** Revision 1.20 2000/07/23 15:18:23 matt
** removed unistd.h from includes
**
** Revision 1.19 2000/07/23 00:48:15 neil
** Win32 SDL
**
** Revision 1.18 2000/07/21 13:42:06 neil
** get_options removed, as it should be handled by osd_main
**
** Revision 1.17 2000/07/21 04:53:48 matt
** moved palette calls out of nofrendo.c and into ppu_create
**
** Revision 1.16 2000/07/21 02:40:43 neil
** more main fixes
**
** Revision 1.15 2000/07/21 02:09:07 neil
** new main structure?
**
** Revision 1.14 2000/07/20 17:05:12 neil
** Moved osd_init before setup_video
**
** Revision 1.13 2000/07/11 15:01:05 matt
** moved config.close() into registered atexit() routine
**
** Revision 1.12 2000/07/11 13:35:38 bsittler
** Changed the config API, implemented config file "nofrendo.cfg". The
** GGI drivers use the group [GGI]. Visual= and Mode= keys are understood.
**
** Revision 1.11 2000/07/11 04:32:21 matt
** less magic number nastiness for screen dimensions
**
** Revision 1.10 2000/07/10 03:04:15 matt
** removed scanlines, backbuffer from custom blit
**
** Revision 1.9 2000/07/07 04:39:54 matt
** removed garbage dpp shite
**
** Revision 1.8 2000/07/06 16:48:25 matt
** new video driver
**
** Revision 1.7 2000/07/05 17:26:16 neil
** Moved the externs in nofrendo.c to osd.h
**
** Revision 1.6 2000/06/26 04:55:44 matt
** cleaned up main()
**
** Revision 1.5 2000/06/20 20:41:21 matt
** moved <stdlib.h> include to top (duh)
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/