From e0a34d4066dca72d718ea6a463930b52524808d4 Mon Sep 17 00:00:00 2001 From: "simon.kagstrom" Date: Wed, 31 Dec 2008 16:20:47 +0000 Subject: [PATCH] All changes so far --- FreeMono.ttf | Bin 0 -> 244556 bytes Makefile | 137 ++++++++++++ Src/C64.cpp | 11 +- Src/C64.h | 28 ++- Src/C64_SDL.i | 508 ++++++++++++++++++++++++++++++++++++++++++++ Src/Display.h | 7 +- Src/Display_SDL.i | 52 ++++- Src/Makefile.bak | 48 +---- Src/Prefs.cpp | 29 +++ Src/Prefs.h | 4 + Src/SID.cpp | 19 +- Src/char_to_kc.c | 101 +++++++++ Src/main.cpp | 11 + Src/main.h | 21 ++ Src/main_wii.i | 109 ++++++++++ Src/menu.c | 436 +++++++++++++++++++++++++++++++++++++ Src/menu.h | 60 ++++++ Src/sysconfig.h.Wii | 152 +++++++++++++ 18 files changed, 1682 insertions(+), 51 deletions(-) create mode 100644 FreeMono.ttf create mode 100644 Makefile create mode 100644 Src/C64_SDL.i create mode 100644 Src/char_to_kc.c create mode 100644 Src/main_wii.i create mode 100644 Src/menu.c create mode 100644 Src/menu.h create mode 100644 Src/sysconfig.h.Wii diff --git a/FreeMono.ttf b/FreeMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..09a9a2d1de0dad0c84e77c4d1877fe9fd6ae1525 GIT binary patch literal 244556 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") +endif + +include $(DEVKITPPC)/wii_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := frodo +BUILD := build +SOURCES := Src +DATA := data +INCLUDES := + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) -I$(DEVKITPRO)/SDL/include -U__unix +CXXFLAGS = $(CFLAGS) + +LDFLAGS = -L$(DEVKITPRO)/SDL/lib -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lSDL_ttf -lSDL_mixer -lSDL_image -ljpeg -lz -lSDL -lfreetype -lfat -lwiiuse -lbte -logc -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := +CPPFILES := Display.cpp main.cpp Prefs.cpp SID.cpp REU.cpp IEC.cpp 1541fs.cpp \ + 1541d64.cpp 1541t64.cpp 1541job.o SAM.cpp C64.cpp CPUC64.cpp VIC.cpp \ + CIA.cpp CPU1541.cpp +sFILES := +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES), -iquote $(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +run: + wiiload $(TARGET).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .jpg extension +#--------------------------------------------------------------------------------- +%.jpg.o : %.jpg +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/Src/C64.cpp b/Src/C64.cpp index b29dee4..4bec466 100644 --- a/Src/C64.cpp +++ b/Src/C64.cpp @@ -18,7 +18,7 @@ #include "Display.h" #include "Prefs.h" -#if defined(__unix) && !defined(__svgalib__) +#if defined(__unix) && !defined(__svgalib__) && !defined(HAVE_SDL) #include "CmdPipe.h" #endif @@ -697,8 +697,8 @@ bool C64::LoadSnapshot(char *filename) #include "C64_Amiga.i" #endif -#ifdef __unix -#include "C64_x.i" +#ifdef HAVE_SDL +#include "C64_SDL.i" #endif #ifdef __mac__ @@ -712,3 +712,8 @@ bool C64::LoadSnapshot(char *filename) #ifdef __riscos__ #include "C64_Acorn.i" #endif + +#ifdef GEKKO +#include "C64_wii.i" +#endif + diff --git a/Src/C64.h b/Src/C64.h index 83d8d16..5cf23de 100644 --- a/Src/C64.h +++ b/Src/C64.h @@ -7,6 +7,12 @@ #ifndef _C64_H #define _C64_H +#if defined(HAVE_SDL) +/* SDL menu */ +#include "menu.h" +#include +#endif + #ifdef __BEOS__ #include #include @@ -90,6 +96,9 @@ public: #ifdef FRODO_SC uint32 CycleCounter; #endif + void enter_menu() { + this->have_a_break = true; + } private: void c64_ctor1(void); @@ -135,11 +144,28 @@ private: bool game_open, port_allocated; // Flags: gameport.device opened, game port allocated #endif +#ifdef GEKKO + double speed_index; + int joystick_key_binding[4]; /* A, Plus, Minus, 1 */ +#endif + #ifdef __unix int joyfd[2]; // File descriptors for joysticks double speed_index; public: - CmdPipe *gui; +#endif +#ifdef HAVE_SDL + menu_t main_menu; + TTF_Font *menu_font; + const char *base_dir; + + bool fake_key_sequence; + int fake_key_type; + int fake_key_index; + int fake_key_keytime; + + void select_disc(); + void bind_key(); #endif #ifdef WIN32 diff --git a/Src/C64_SDL.i b/Src/C64_SDL.i new file mode 100644 index 0000000..c5e4af2 --- /dev/null +++ b/Src/C64_SDL.i @@ -0,0 +1,508 @@ +/* + * C64_x.i - Put the pieces together, X specific stuff + * + * Frodo (C) 1994-1997,2002 Christian Bauer + * Unix stuff by Bernd Schmidt/Lutz Vieweg + */ + +#include "main.h" + +#include +#include + + +static struct timeval tv_start; +static char *main_menu_messages[] = { + "Insert disc/tape", /* 0 */ + "Load disc/tape", /* 1 */ + "Reset C64", /* 2 */ + "Bind key to joystick",/* 3 */ + "Joystick port (kbd)", /* 4 */ + "^|1|2", + "Swap joysticks", /* 6 */ + " ", + "Quit", /* 8 */ + NULL, +}; + +static char *bind_key_messages[] = { + "Bind to A", /* 0 */ + "Bind to Plus", /* 1 */ + "Bind to Minus", /* 2 */ + "Bind to 1", /* 3 */ + NULL, +}; + +/* + * Constructor, system-dependent things + */ +void C64::c64_ctor1(void) +{ + // Initialize joystick variables + joyfd[0] = joyfd[1] = -1; + joy_minx = joy_miny = 32767; + joy_maxx = joy_maxy = -32768; + + this->base_dir = "."; + + this->fake_key_sequence = false; + this->fake_key_index = 0; + this->fake_key_keytime = 5; + this->fake_key_type = 0; + + this->menu_font = TTF_OpenFont("FreeMono.ttf", 20); + if (!this->menu_font) + { + fprintf(stderr, "Unable to open font: %s\n", TTF_GetError() ); + exit(1); + } + menu_init(&this->main_menu, this->menu_font, main_menu_messages, + 0, 0, DISPLAY_X, DISPLAY_Y); +} + +void C64::c64_ctor2(void) +{ + gettimeofday(&tv_start, NULL); +} + + +/* + * Destructor, system-dependent things + */ + +void C64::c64_dtor(void) +{ + menu_fini(&this->main_menu); +} + +void C64::select_disc() +{ + DIR *d = opendir(this->base_dir); + char **file_list; + int cur = 0; + struct dirent *de; + int cnt = 16; + menu_t select_disc_menu; + + if (!d) + return; + + file_list = (char**)malloc(cnt * sizeof(char*)); + file_list[cur++] = strdup("None"); + file_list[cur++] = strdup(".."); + file_list[cur] = NULL; + + for (de = readdir(d); + de; + de = readdir(d)) + { + /* FIXME! Add directories */ + if (strstr(de->d_name, ".d64") || + strstr(de->d_name, ".t64")) + { + char *p; + + p = strdup(de->d_name); + file_list[cur++] = p; + file_list[cur] = NULL; + if (cur > cnt - 1) + { + cnt = cnt + 32; + file_list = (char**)realloc(file_list, cnt); + if (!file_list) + return; + } + } + } + closedir(d); + + menu_init(&select_disc_menu, this->menu_font, file_list, + 0, 0, DISPLAY_X, DISPLAY_Y); + int opt = menu_select(screen, &select_disc_menu, ~0, NULL); + if (opt >= 0) + { + char *name = file_list[opt]; + + Prefs *np = Frodo::reload_prefs(); + if (strcmp(file_list[opt], "None") == 0) + { + strcpy(np->DrivePath[0], "\0"); + } + else + { + strncpy(np->DrivePath[0], name, 255); + if (strstr(name, ".d64")) + np->DriveType[0] = DRVTYPE_D64; + else + np->DriveType[0] = DRVTYPE_T64; + } + NewPrefs(np); + ThePrefs = *np; + } + menu_fini(&select_disc_menu); + + /* Cleanup everything */ + for ( int i = 0; i < cur; i++ ) + free(file_list[i]); + free(file_list); +} + +#define MATRIX(a,b) (((a) << 3) | (b)) + +void C64::bind_key() +{ + menu_t bind_key_menu; + menu_t key_menu; + char *keys[] = { "space", "Run/Stop", "return", "F1", "F3", "F5", "F7", + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", + "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "X", "Y", "Z", + NULL }; + int kcs[] = { MATRIX(7, 4), MATRIX(7, 7), MATRIX(0, 1), /* space,R/S, return */ + MATRIX(0, 4), MATRIX(0, 5), MATRIX(0, 6), MATRIX(0, 3), MATRIX(4, 3), MATRIX(7, 0), + MATRIX(7, 3), MATRIX(1, 0), MATRIX(1, 3), MATRIX(2, 0), MATRIX(2, 3), MATRIX(3, 0), + MATRIX(3, 3), MATRIX(4, 0), MATRIX(1, 2), MATRIX(3, 4), MATRIX(2, 4), MATRIX(2, 2), + MATRIX(1, 6), MATRIX(2, 5), MATRIX(3, 2), MATRIX(3, 5), MATRIX(4, 1), MATRIX(4, 2), + MATRIX(4, 5), MATRIX(5, 2), MATRIX(4, 4), MATRIX(4, 7), MATRIX(4, 6), MATRIX(5, 1), + MATRIX(7, 6), MATRIX(2, 1), MATRIX(1, 5), MATRIX(2, 6), MATRIX(3, 6), MATRIX(3, 7), + MATRIX(1, 1), MATRIX(2, 7), MATRIX(3, 1), MATRIX(1, 4) }; + + menu_init(&bind_key_menu, this->menu_font, bind_key_messages, + 0, 0, DISPLAY_X, DISPLAY_Y); + menu_init(&key_menu, this->menu_font, keys, + 0, 0, DISPLAY_X, DISPLAY_Y); + int opt = menu_select(screen, &bind_key_menu, ~0, NULL); + if (opt >= 0) + { + int key = menu_select(screen, &key_menu, ~0, NULL); + +#if defined(GEKKO) + this->joystick_key_binding[opt] = kcs[key]; +#endif + } + menu_fini(&bind_key_menu); + menu_fini(&key_menu); +} + +/* + * Start main emulation thread + */ + +void C64::Run(void) +{ + // Reset chips + TheCPU->Reset(); + TheSID->Reset(); + TheCIA1->Reset(); + TheCIA2->Reset(); + TheCPU1541->Reset(); + + // Patch kernal IEC routines + orig_kernal_1d84 = Kernal[0x1d84]; + orig_kernal_1d85 = Kernal[0x1d85]; + PatchKernal(ThePrefs.FastReset, ThePrefs.Emul1541Proc); + + quit_thyself = false; + thread_func(); +} + +/* From dreamcast port */ +static const char *auto_seq[4] = +{ + "\nLOAD \"*\",8,1\nRUN\n", + "\nLOAD \"*\",9,1\nRUN\n", + "\nLOAD \"*\",10,1\nRUN\n", + "\nLOAD \"*\",11,1\nRUN\n", +}; +extern "C" int get_kc_from_char(char c_in, int *shifted); + +/* + * Vertical blank: Poll keyboard and joysticks, update window + */ + +void C64::VBlank(bool draw_frame) +{ + // Poll keyboard + TheDisplay->PollKeyboard(TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey); + if (TheDisplay->quit_requested) + quit_thyself = true; + + if (this->fake_key_sequence) + { + int shifted; + int kc = get_kc_from_char(auto_seq[this->fake_key_type][this->fake_key_index], &shifted); + + TheDisplay->FakeKeyPress(kc, shifted, TheCIA1->KeyMatrix, + TheCIA1->RevMatrix, &joykey); + + this->fake_key_keytime --; + if (this->fake_key_keytime == 0) + { + this->fake_key_keytime = 1; + this->fake_key_index ++; + + if (auto_seq[this->fake_key_type][this->fake_key_index] == '\0') + { + this->fake_key_sequence = false; + this->fake_key_index = 0; + this->fake_key_keytime = 5; + } + } + } + // Poll joysticks + TheCIA1->Joystick1 = poll_joystick(0); + TheCIA1->Joystick2 = poll_joystick(1); + + if (ThePrefs.JoystickSwap) { + uint8 tmp = TheCIA1->Joystick1; + TheCIA1->Joystick1 = TheCIA1->Joystick2; + TheCIA1->Joystick2 = tmp; + } + + // Joystick keyboard emulation + if (TheDisplay->NumLock()) + TheCIA1->Joystick1 &= joykey; + else + TheCIA1->Joystick2 &= joykey; + + // Count TOD clocks + TheCIA1->CountTOD(); + TheCIA2->CountTOD(); + + // Update window if needed + if (draw_frame) { + TheDisplay->Update(); + + // Calculate time between VBlanks, display speedometer + struct timeval tv; + gettimeofday(&tv, NULL); + if ((tv.tv_usec -= tv_start.tv_usec) < 0) { + tv.tv_usec += 1000000; + tv.tv_sec -= 1; + } + tv.tv_sec -= tv_start.tv_sec; + double elapsed_time = (double)tv.tv_sec * 1000000 + tv.tv_usec; + speed_index = 20000 / (elapsed_time + 1) * ThePrefs.SkipFrames * 100; + + // Limit speed to 100% if desired + if ((speed_index > 100) && ThePrefs.LimitSpeed) { + usleep((unsigned long)(ThePrefs.SkipFrames * 20000 - elapsed_time)); + speed_index = 100; + } + + gettimeofday(&tv_start, NULL); + + TheDisplay->Speedometer((int)speed_index); + } +} + + +/* + * Open/close joystick drivers given old and new state of + * joystick preferences + */ + +void C64::open_close_joysticks(bool oldjoy1, bool oldjoy2, bool newjoy1, bool newjoy2) +{ +#ifdef HAVE_LINUX_JOYSTICK_H + if (oldjoy1 != newjoy1) { + joy_minx = joy_miny = 32767; // Reset calibration + joy_maxx = joy_maxy = -32768; + if (newjoy1) { + joyfd[0] = open("/dev/js0", O_RDONLY); + if (joyfd[0] < 0) + fprintf(stderr, "Couldn't open joystick 1\n"); + } else { + close(joyfd[0]); + joyfd[0] = -1; + } + } + + if (oldjoy2 != newjoy2) { + joy_minx = joy_miny = 32767; // Reset calibration + joy_maxx = joy_maxy = -32768; + if (newjoy2) { + joyfd[1] = open("/dev/js1", O_RDONLY); + if (joyfd[1] < 0) + fprintf(stderr, "Couldn't open joystick 2\n"); + } else { + close(joyfd[1]); + joyfd[1] = -1; + } + } +#endif +} + + +/* + * Poll joystick port, return CIA mask + */ + +uint8 C64::poll_joystick(int port) +{ +#ifdef GEKKO + Uint32 held = WPAD_ButtonsHeld(port); + uint8 j = 0xff; + + if (held & WPAD_BUTTON_LEFT) + j &= 0xfb; // Left + if (held & WPAD_BUTTON_RIGHT) + j &= 0xf7; // Right + if (held & WPAD_BUTTON_UP) + j &= 0xfe; // Up + if (held & WPAD_BUTTON_DOWN) + j &= 0xfd; // Down + if (held & WPAD_BUTTON_2) + j &= 0xef; // Button + if (held & WPAD_BUTTON_HOME) + this->enter_menu(); + if ( (held & WPAD_BUTTON_A) && this->joystick_key_binding[0]) + TheDisplay->FakeKeyPress(this->joystick_key_binding[0], + shifted, TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey); + if ( (held & WPAD_BUTTON_PLUS) && this->joystick_key_binding[1]) + TheDisplay->FakeKeyPress(this->joystick_key_binding[1], + shifted, TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey); + if ( (held & WPAD_BUTTON_MINUS) && this->joystick_key_binding[2]) + TheDisplay->FakeKeyPress(this->joystick_key_binding[2], + shifted, TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey); + if ( (held & WPAD_BUTTON_1) && this->joystick_key_binding[1]) + TheDisplay->FakeKeyPress(this->joystick_key_binding[1], + shifted, TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &joykey); + + + return j; +#endif +#ifdef HAVE_LINUX_JOYSTICK_H + JS_DATA_TYPE js; + uint8 j = 0xff; + + if (joyfd[port] >= 0) { + if (read(joyfd[port], &js, JS_RETURN) == JS_RETURN) { + if (js.x > joy_maxx) + joy_maxx = js.x; + if (js.x < joy_minx) + joy_minx = js.x; + if (js.y > joy_maxy) + joy_maxy = js.y; + if (js.y < joy_miny) + joy_miny = js.y; + + if (joy_maxx-joy_minx < 100 || joy_maxy-joy_miny < 100) + return 0xff; + + if (js.x < (joy_minx + (joy_maxx-joy_minx)/3)) + j &= 0xfb; // Left + else if (js.x > (joy_minx + 2*(joy_maxx-joy_minx)/3)) + j &= 0xf7; // Right + + if (js.y < (joy_miny + (joy_maxy-joy_miny)/3)) + j &= 0xfe; // Up + else if (js.y > (joy_miny + 2*(joy_maxy-joy_miny)/3)) + j &= 0xfd; // Down + + if (js.buttons & 1) + j &= 0xef; // Button + } + } + return j; +#else + return 0xff; +#endif +} + + +/* + * The emulation's main loop + */ + +void C64::thread_func(void) +{ + int linecnt = 0; + +#ifdef FRODO_SC + while (!quit_thyself) { + + // The order of calls is important here + if (TheVIC->EmulateCycle()) + TheSID->EmulateLine(); + TheCIA1->CheckIRQs(); + TheCIA2->CheckIRQs(); + TheCIA1->EmulateCycle(); + TheCIA2->EmulateCycle(); + TheCPU->EmulateCycle(); + + if (ThePrefs.Emul1541Proc) { + TheCPU1541->CountVIATimers(1); + if (!TheCPU1541->Idle) + TheCPU1541->EmulateCycle(); + } + CycleCounter++; +#else + while (!quit_thyself) { + + // The order of calls is important here + int cycles = TheVIC->EmulateLine(); + TheSID->EmulateLine(); +#if !PRECISE_CIA_CYCLES + TheCIA1->EmulateLine(ThePrefs.CIACycles); + TheCIA2->EmulateLine(ThePrefs.CIACycles); +#endif + + if (ThePrefs.Emul1541Proc) { + int cycles_1541 = ThePrefs.FloppyCycles; + TheCPU1541->CountVIATimers(cycles_1541); + + if (!TheCPU1541->Idle) { + // 1541 processor active, alternately execute + // 6502 and 6510 instructions until both have + // used up their cycles + while (cycles >= 0 || cycles_1541 >= 0) + if (cycles > cycles_1541) + cycles -= TheCPU->EmulateLine(1); + else + cycles_1541 -= TheCPU1541->EmulateLine(1); + } else + TheCPU->EmulateLine(cycles); + } else + // 1541 processor disabled, only emulate 6510 + TheCPU->EmulateLine(cycles); +#endif + linecnt++; + if (this->have_a_break) { + int submenus[1]; + int opt = menu_select(screen, &this->main_menu, ~0, submenus); + + switch(opt) + { + case 0: /* Insert disc/tape */ + this->select_disc(); + break; + case 1: /* Load disc/tape */ + this->fake_key_sequence = true; + break; + case 2: /* Reset */ + Reset(); + break; + case 3: /* Bind keys to joystick */ + this->bind_key(); + break; + case 4: /* Joystick port */ + break; + case 6: /* Swap joysticks */ + { + uint8 tmp = TheCIA1->Joystick1; + TheCIA1->Joystick1 = TheCIA1->Joystick2; + TheCIA1->Joystick2 = tmp; + } break; + case 8: /* Quit */ + quit_thyself = true; + break; + case -1: + default: + break; + } + this->have_a_break = false; + + } + } +} diff --git a/Src/Display.h b/Src/Display.h index 4a3c228..230d374 100644 --- a/Src/Display.h +++ b/Src/Display.h @@ -17,6 +17,7 @@ #ifdef HAVE_SDL struct SDL_Surface; +extern SDL_Surface *screen; #endif #ifdef WIN32 @@ -58,6 +59,10 @@ public: void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick, uint8 *joystick2); #else void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); +#endif +#if defined(HAVE_SDL) + void FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix, + uint8 *CIA_rev_matrix, uint8 *joystick); #endif bool NumLock(void); void InitColors(uint8 *colors); @@ -79,7 +84,7 @@ public: Joy_Keys JoystickKeys[2]; // it's easier making the joystick keys public #endif -#ifdef __unix +#if defined(__unix) || defined(GEKKO) bool quit_requested; #endif diff --git a/Src/Display_SDL.i b/Src/Display_SDL.i index 217b880..8379ae7 100644 --- a/Src/Display_SDL.i +++ b/Src/Display_SDL.i @@ -13,15 +13,17 @@ // Display surface -static SDL_Surface *screen = NULL; +SDL_Surface *screen = NULL; // Keyboard static bool num_locked = false; +#if defined(DO_ERROR_BLINK) // For LED error blinking static C64Display *c64_disp; static struct sigaction pulse_sa; static itimerval pulse_tv; +#endif // Colors for speedometer/drive LEDs enum { @@ -45,7 +47,7 @@ enum { 3 V U H B 8 G Y 7 4 N O K M 0 J I 9 5 , @ : . - L P + - 6 / ^ = SHR HOM ; * £ + 6 / ^ = SHR HOM ; * � 7 R/S Q C= SPC 2 CTL <- 1 */ @@ -63,6 +65,11 @@ int init_graphics(void) fprintf(stderr, "Couldn't initialize SDL (%s)\n", SDL_GetError()); return 0; } + if (TTF_Init() < 0) + { + fprintf(stderr, "Unable to init TTF: %s\n", TTF_GetError() ); + return 0; + } // Open window SDL_WM_SetCaption(VERSION_STRING, "Frodo"); @@ -85,6 +92,7 @@ C64Display::C64Display(C64 *the_c64) : TheC64(the_c64) for (int i=0; i<4; i++) led_state[i] = old_led_state[i] = LED_OFF; +#if defined(DO_ERROR_BLINK) // Start timer for LED error blinking c64_disp = this; pulse_sa.sa_handler = (void (*)(int))pulse_handler; @@ -96,6 +104,7 @@ C64Display::C64Display(C64 *the_c64) : TheC64(the_c64) pulse_tv.it_value.tv_sec = 0; pulse_tv.it_value.tv_usec = 400000; setitimer(ITIMER_REAL, &pulse_tv, NULL); +#endif } @@ -106,6 +115,7 @@ C64Display::C64Display(C64 *the_c64) : TheC64(the_c64) C64Display::~C64Display() { SDL_Quit(); + TTF_Quit(); } @@ -213,6 +223,7 @@ void C64Display::draw_string(SDL_Surface *s, int x, int y, const char *str, uint * LED error blink */ +#if defined(DO_ERROR_BLINK) void C64Display::pulse_handler(...) { for (int i=0; i<4; i++) @@ -225,6 +236,7 @@ void C64Display::pulse_handler(...) break; } } +#endif /* @@ -262,6 +274,38 @@ int C64Display::BitmapXMod(void) return screen->pitch; } +void C64Display::FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix, + uint8 *CIA_rev_matrix, uint8 *joystick) +{ + // Clear matrices + for (int i = 0; i < 8; i ++) + { + CIA_key_matrix[i] = 0xFF; + CIA_rev_matrix[i] = 0xFF; + } + + if (shift) + { + CIA_key_matrix[6] &= 0xef; + CIA_rev_matrix[4] &= 0xbf; + } + + if (kc != -1) + { + int c64_byte, c64_bit, shifted; + c64_byte = kc >> 3; + c64_bit = kc & 7; + shifted = kc & 128; + c64_byte &= 7; + if (shifted) + { + CIA_key_matrix[6] &= 0xef; + CIA_rev_matrix[4] &= 0xbf; + } + CIA_key_matrix[c64_byte] &= ~(1 << c64_bit); + CIA_rev_matrix[c64_bit] &= ~(1 << c64_byte); + } +} /* * Poll the keyboard @@ -426,6 +470,10 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst TheC64->Reset(); break; + case SDLK_HOME: // Home: Pause and enter menu + TheC64->enter_menu(); + break; + case SDLK_NUMLOCK: num_locked = true; break; diff --git a/Src/Makefile.bak b/Src/Makefile.bak index 7992fdd..00f2d8e 100644 --- a/Src/Makefile.bak +++ b/Src/Makefile.bak @@ -7,8 +7,8 @@ REVISION = 1 CXX = g++ -LIBS = -L/usr/lib -Wl,-rpath,/usr/lib -lSDL -lpthread -CFLAGS = -O2 -g -fomit-frame-pointer -Wall -Wno-unused -Wno-format -I/usr/include/SDL -D_REENTRANT -DHAVE_SDL -fno-strength-reduce -DREGPARAM="__attribute__((regparm(3)))" -I./ -DFRODO_HPUX_REV=0 -DKBD_LANG=0 +LIBS = -L/usr/lib -lSDL -lSDL_ttf +CFLAGS = -O2 -g -fomit-frame-pointer -Wall -Wno-unused -Wno-format -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -DHAVE_SDL -fno-strength-reduce -DREGPARAM="__attribute__((regparm(3)))" -I./ -DFRODO_HPUX_REV=0 -DKBD_LANG=0 INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -23,7 +23,7 @@ sysconfdir = ${prefix}/etc ## Files OBJS = main.o Display.o Prefs.o SID.o REU.o IEC.o 1541fs.o \ - 1541d64.o 1541t64.o 1541job.o SAM.o CmdPipe.o + 1541d64.o 1541t64.o 1541job.o SAM.o menu.o CmdPipe.o SLOBJS = $(OBJS) C64.o CPUC64.o VIC.o CIA.o CPU1541.o PCOBJS = $(OBJS) C64_PC.o CPUC64_PC.o VIC.o CIA.o CPU1541_PC.o PCFLAGS = -DPRECISE_CPU_CYCLES=1 -DPRECISE_CIA_CYCLES=1 -DPC_IS_POINTER=0 @@ -67,7 +67,7 @@ depend dep: .cpp.s: $(CC) $(INCLUDES) $(CFLAGS) $(EXTRAFLAGS) -o $@ -S $*.cpp -g0 -C64_PC.o: C64.cpp C64.h C64_x.i CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h +C64_PC.o: C64.cpp C64.h C64_SDL.i CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h $(CC) $(INCLUDES) $(CFLAGS) $(PCFLAGS) -o $@ -c $*.cpp CPUC64_PC.o: CPUC64.cpp CPUC64.h CPU_emulline.i C64.h VIC.h SID.h CIA.h REU.h IEC.h Display.h Version.h @@ -76,7 +76,7 @@ CPUC64_PC.o: CPUC64.cpp CPUC64.h CPU_emulline.i C64.h VIC.h SID.h CIA.h REU.h IE CPU1541_PC.o: CPU1541.cpp CPU1541.h CPU_emulline.i 1541job.h C64.h CIA.h Display.h $(CC) $(INCLUDES) $(CFLAGS) $(PCFLAGS) -o $@ -c $*.cpp -C64_SC.o: C64_SC.cpp C64.h C64_x.i CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h +C64_SC.o: C64_SC.cpp C64.h C64_SDL.i CmdPipe.h CPUC64.h CPU1541.h VIC.h SID.h CIA.h REU.h IEC.h 1541job.h Display.h Prefs.h $(CC) $(INCLUDES) $(CFLAGS) $(SCFLAGS) -o $@ -c $*.cpp CPUC64_SC.o: CPUC64_SC.cpp CPUC64.h CPU_emulcycle.i CPU_common.h C64.h VIC.h SID.h CIA.h REU.h IEC.h Display.h Version.h @@ -93,41 +93,3 @@ CIA_SC.o: CIA_SC.cpp CIA.h CPUC64.h CPU1541.h VIC.h Prefs.h #------------------------------------------------------------------------- # DO NOT DELETE THIS LINE -- make depend depends on it. - -main.o: sysdeps.h sysconfig.h main.h C64.h Display.h Prefs.h SAM.h -Display.o: sysdeps.h sysconfig.h Display.h main.h Prefs.h -Prefs.o: sysdeps.h sysconfig.h Prefs.h Display.h C64.h main.h -SID.o: sysdeps.h sysconfig.h SID.h Prefs.h -REU.o: sysdeps.h sysconfig.h REU.h CPUC64.h C64.h Prefs.h -IEC.o: sysdeps.h sysconfig.h IEC.h 1541fs.h 1541d64.h 1541t64.h Prefs.h -IEC.o: Display.h -1541fs.o: sysdeps.h sysconfig.h 1541fs.h IEC.h main.h Prefs.h -1541d64.o: sysdeps.h sysconfig.h 1541d64.h IEC.h Prefs.h -1541t64.o: sysdeps.h sysconfig.h 1541t64.h IEC.h Prefs.h -1541job.o: sysdeps.h sysconfig.h 1541job.h CPU1541.h CIA.h Prefs.h C64.h -SAM.o: sysdeps.h sysconfig.h SAM.h C64.h CPUC64.h CPU1541.h CIA.h Prefs.h -SAM.o: VIC.h SID.h -CmdPipe.o: CmdPipe.h -C64.o: sysdeps.h sysconfig.h C64.h CPUC64.h CPU1541.h CIA.h Prefs.h VIC.h -C64.o: SID.h REU.h IEC.h 1541job.h Display.h -C64_PC.o: C64.cpp sysdeps.h sysconfig.h C64.h CPUC64.h CPU1541.h CIA.h -C64_PC.o: Prefs.h VIC.h SID.h REU.h IEC.h 1541job.h Display.h -C64_SC.o: C64.cpp sysdeps.h sysconfig.h C64.h CPUC64.h CPU1541.h CIA.h -C64_SC.o: Prefs.h VIC.h SID.h REU.h IEC.h 1541job.h Display.h -CPUC64.o: sysdeps.h sysconfig.h CPUC64.h C64.h VIC.h SID.h CIA.h Prefs.h -CPUC64.o: REU.h IEC.h Display.h Version.h CPU_emulline.i -CPUC64_PC.o: CPUC64.cpp sysdeps.h sysconfig.h CPUC64.h C64.h VIC.h SID.h -CPUC64_PC.o: CIA.h Prefs.h REU.h IEC.h Display.h Version.h CPU_emulline.i -CPUC64_SC.o: sysdeps.h sysconfig.h CPUC64.h C64.h CPU_common.h VIC.h SID.h -CPUC64_SC.o: CIA.h Prefs.h REU.h IEC.h Display.h Version.h CPU_emulcycle.i -VIC.o: sysdeps.h sysconfig.h VIC.h C64.h CPUC64.h Display.h Prefs.h -VIC_SC.o: sysdeps.h sysconfig.h VIC.h C64.h CPUC64.h Display.h Prefs.h -CIA.o: sysdeps.h sysconfig.h CIA.h Prefs.h CPUC64.h C64.h CPU1541.h VIC.h -CIA_SC.o: sysdeps.h sysconfig.h CIA.h Prefs.h CPUC64.h C64.h CPU1541.h VIC.h -CPU1541.o: sysdeps.h sysconfig.h CPU1541.h CIA.h Prefs.h C64.h 1541job.h -CPU1541.o: Display.h CPU_emulline.i -CPU1541_PC.o: CPU1541.cpp sysdeps.h sysconfig.h CPU1541.h CIA.h Prefs.h C64.h -CPU1541_PC.o: 1541job.h Display.h CPU_emulline.i -CPU1541_SC.o: sysdeps.h sysconfig.h CPU1541.h CIA.h Prefs.h C64.h -CPU1541_SC.o: CPU_common.h 1541job.h Display.h CPU_emulcycle.i -CPU_common.o: sysdeps.h sysconfig.h CPU_common.h diff --git a/Src/Prefs.cpp b/Src/Prefs.cpp index 229d8ba..b7b55b5 100644 --- a/Src/Prefs.cpp +++ b/Src/Prefs.cpp @@ -72,6 +72,13 @@ Prefs::Prefs() AlwaysCopy = false; SystemKeys = true; ShowLEDs = true; + +#ifdef GEKKO + this->JoystickKeyBinding[0] = 0; + this->JoystickKeyBinding[1] = 0; + this->JoystickKeyBinding[2] = 0; + this->JoystickKeyBinding[3] = 0; +#endif } @@ -126,6 +133,12 @@ bool Prefs::operator==(const Prefs &rhs) const && AlwaysCopy == rhs.AlwaysCopy && SystemKeys == rhs.SystemKeys && ShowLEDs == rhs.ShowLEDs +#ifdef GEKKO + && this->JoystickKeyBinding[0] == rhs.JoystickKeybinding[0] + && this->JoystickKeyBinding[1] == rhs.JoystickKeybinding[1] + && this->JoystickKeyBinding[2] == rhs.JoystickKeybinding[2] + && this->JoystickKeyBinding[3] == rhs.JoystickKeybinding[3] +#endif ); } @@ -290,6 +303,16 @@ void Prefs::Load(char *filename) SystemKeys = !strcmp(value, "TRUE"); else if (!strcmp(keyword, "ShowLEDs")) ShowLEDs = !strcmp(value, "TRUE"); +#if defined(GEKKO) + else if (!strcmp(keyword, "JoystickKeyBinding0")) + JoystickKeyBinding[0] = atoi(value); + else if (!strcmp(keyword, "JoystickKeyBinding1")) + JoystickKeyBinding[1] = atoi(value); + else if (!strcmp(keyword, "JoystickKeyBinding2")) + JoystickKeyBinding[2] = atoi(value); + else if (!strcmp(keyword, "JoystickKeyBinding3")) + JoystickKeyBinding[3] = atoi(value); +#endif } } fclose(file); @@ -386,6 +409,12 @@ bool Prefs::Save(char *filename) fprintf(file, "AlwaysCopy = %s\n", AlwaysCopy ? "TRUE" : "FALSE"); fprintf(file, "SystemKeys = %s\n", SystemKeys ? "TRUE" : "FALSE"); fprintf(file, "ShowLEDs = %s\n", ShowLEDs ? "TRUE" : "FALSE"); +#if defined(GEKKO) + fprintf(file, "JoystickKeyBinding0 = %d\n", JoystickKeyBinding[0]); + fprintf(file, "JoystickKeyBinding1 = %d\n", JoystickKeyBinding[1]); + fprintf(file, "JoystickKeyBinding2 = %d\n", JoystickKeyBinding[2]); + fprintf(file, "JoystickKeyBinding3 = %d\n", JoystickKeyBinding[3]); +#endif fclose(file); ThePrefsOnDisk = *this; return true; diff --git a/Src/Prefs.h b/Src/Prefs.h index 296a838..a5f8064 100644 --- a/Src/Prefs.h +++ b/Src/Prefs.h @@ -114,6 +114,10 @@ private: static char *edit_prefs_name; static HWND hDlg; #endif + +#ifdef GEKKO + int JoystickKeyBinding[4]; +#endif }; diff --git a/Src/SID.cpp b/Src/SID.cpp index a9c3a45..1c87c9e 100644 --- a/Src/SID.cpp +++ b/Src/SID.cpp @@ -64,6 +64,10 @@ class DigitalPlayer; #define ldSINTAB 9 // size of sinus table (0 to 90 degrees) #endif +#if defined(HAVE_SDL) +#include +#endif + #ifdef USE_FIXPOINT_MATHS #include "FixPoint.i" @@ -428,7 +432,14 @@ private: int play_buf; // Number of buffer currently playing #endif -#ifdef __linux__ +#ifdef HAVE_SDL + void fill_audio(Uint8 *stream, int len); + static void fill_audio_helper(void *udata, Uint8 *stream, int len); + + SDL_AudioSpec spec; +#endif + +#if defined(__linux__) || defined(HAVE_SDL) int devfd, sndbufsize, buffer_rate; int16 *sound_buffer; #endif @@ -1351,6 +1362,9 @@ void DigitalRenderer::calc_buffer(int16 *buf, long count) #elif defined(AMIGA) #include "SID_Amiga.i" +#elif defined(HAVE_SDL) +#include "SID_SDL.i" + #elif defined(__linux__) #include "SID_linux.i" @@ -1369,6 +1383,9 @@ void DigitalRenderer::calc_buffer(int16 *buf, long count) #elif defined(__riscos__) #include "SID_Acorn.i" +#elif defined(GEKKO) +#include "SID_wii.i" + #else // No sound void DigitalRenderer::init_sound(void) {ready = false;} DigitalRenderer::~DigitalRenderer() {} diff --git a/Src/char_to_kc.c b/Src/char_to_kc.c new file mode 100644 index 0000000..cf8c2d8 --- /dev/null +++ b/Src/char_to_kc.c @@ -0,0 +1,101 @@ +/********************************************************************* + * + * Copyright (C) 2008, Simon Kagstrom + * + * Filename: char_to_kc.c + * Author: Simon Kagstrom + * Description: Convert chars to keycodes + * + * $Id:$ + * + ********************************************************************/ +#include + +#define MATRIX(a,b) (((a) << 3) | (b)) + +#define SHIFT (1<<7) + +static uint8_t char_to_kc[] = +{ + /* Some shifted stuff */ + ['\"'] = MATRIX(7, 3) | SHIFT, + + /* CUD */ + /* F5 */ + /* F3 */ + /* F1 */ + /* F7 */ + ['\n'] = MATRIX(0, 1), + ['\008'] = MATRIX(0, 0), + + ['E'] = MATRIX(1, 6), + ['S'] = MATRIX(1, 5), + ['Z'] = MATRIX(1, 4), + ['4'] = MATRIX(1, 3), + ['A'] = MATRIX(1, 2), + ['W'] = MATRIX(1, 1), + ['3'] = MATRIX(1, 0), + + ['X'] = MATRIX(2, 7), + ['T'] = MATRIX(2, 6), + ['F'] = MATRIX(2, 5), + ['C'] = MATRIX(2, 4), + ['6'] = MATRIX(2, 3), + ['D'] = MATRIX(2, 2), + ['R'] = MATRIX(2, 1), + ['5'] = MATRIX(2, 0), + + ['V'] = MATRIX(3, 7), + ['U'] = MATRIX(3, 6), + ['H'] = MATRIX(3, 5), + ['B'] = MATRIX(3, 4), + ['8'] = MATRIX(3, 3), + ['G'] = MATRIX(3, 2), + ['Y'] = MATRIX(3, 1), + ['7'] = MATRIX(3, 0), + + ['N'] = MATRIX(4, 7), + ['O'] = MATRIX(4, 6), + ['K'] = MATRIX(4, 5), + ['M'] = MATRIX(4, 4), + ['0'] = MATRIX(4, 3), + ['J'] = MATRIX(4, 2), + ['I'] = MATRIX(4, 1), + ['9'] = MATRIX(4, 0), + + [','] = MATRIX(5, 7), + ['@'] = MATRIX(5, 6), + [':'] = MATRIX(5, 5), + ['.'] = MATRIX(5, 4), + ['-'] = MATRIX(5, 3), + ['L'] = MATRIX(5, 2), + ['P'] = MATRIX(5, 1), + ['+'] = MATRIX(5, 0), + + ['/'] = MATRIX(6, 7), + ['^'] = MATRIX(6, 6), + ['='] = MATRIX(6, 5), + /* SHR */ + /* HOM */ + [';'] = MATRIX(6, 2), + ['*'] = MATRIX(6, 1), + /* ?? */ + + /* R/S */ + ['Q'] = MATRIX(7, 6), + /* C= */ + [' '] = MATRIX(7, 4), + ['2'] = MATRIX(7, 3), + /* CTL */ + /* <- */ + ['1'] = MATRIX(7, 0), +}; + +int get_kc_from_char(char c_in, int *shifted) +{ + char c = char_to_kc[(int)c_in]; + int out = c & (~SHIFT); + + *shifted = c & SHIFT; + return out; +} diff --git a/Src/main.cpp b/Src/main.cpp index 8ea529e..f6dcddc 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -23,6 +23,12 @@ char AppDirPath[1024]; // Path of application directory #define KERNAL_ROM_FILE "FrodoRsrc:Kernal_ROM" #define CHAR_ROM_FILE "FrodoRsrc:Char_ROM" #define FLOPPY_ROM_FILE "FrodoRsrc:1541_ROM" +#elif GEKKO +#define WII_FRODO_BASE_PATH "/apps/frodo/" +#define BASIC_ROM_FILE WII_FRODO_BASE_PATH"Basic_ROM" +#define KERNAL_ROM_FILE WII_FRODO_BASE_PATH"Kernal_ROM" +#define CHAR_ROM_FILE WII_FRODO_BASE_PATH"Char_ROM" +#define FLOPPY_ROM_FILE WII_FRODO_BASE_PATH"1541_ROM" #else #define BASIC_ROM_FILE "Basic ROM" #define KERNAL_ROM_FILE "Kernal ROM" @@ -120,3 +126,8 @@ bool Frodo::load_rom_files(void) #ifdef __PSXOS__ #include "main_PSX.i" #endif + +#ifdef GEKKO +#include "main_wii.i" +#endif + diff --git a/Src/main.h b/Src/main.h index 43940dd..8cf23c6 100644 --- a/Src/main.h +++ b/Src/main.h @@ -248,4 +248,25 @@ extern Frodo *be_app; // Pointer to Frodo object #endif +#ifdef GEKKO + +class Prefs; + +class Frodo { +public: + Frodo(); + void ArgvReceived(int argc, char **argv); + void ReadyToRun(void); + static Prefs *reload_prefs(void); + + C64 *TheC64; + +private: + bool load_rom_files(void); + + static char prefs_path[256]; // Pathname of current preferences file +}; + +#endif + #endif diff --git a/Src/main_wii.i b/Src/main_wii.i new file mode 100644 index 0000000..cd05bef --- /dev/null +++ b/Src/main_wii.i @@ -0,0 +1,109 @@ +/* + * main_wii.i - Main program, Wii specific stuff + * + * Frodo (C) 1994-1997,2002 Christian Bauer + */ + +#include "Version.h" + +#include +#include +#include + +extern int init_graphics(void); + + +// Global variables +char Frodo::prefs_path[256] = ""; + + +/* + * Create application object and start it + */ + +extern "C" int main(int argc, char **argv) +{ + Frodo *the_app; + + timeval tv; + gettimeofday(&tv, NULL); + srand(tv.tv_usec); + + printf("%s by Christian Bauer\n", VERSION_STRING); + if (!init_graphics()) + { + fprintf(stderr, "Could not initialize graphics\n"); + return 0; + } + fflush(stdout); + + fatInitDefault(); + if (WPAD_Init() != WPAD_ERR_NONE) + { + fprintf(stderr, "Failed initializing controllers\n"); + return 0; + } + + the_app = new Frodo(); + the_app->ArgvReceived(argc, argv); + the_app->ReadyToRun(); + delete the_app; + + return 0; +} + + +/* + * Constructor: Initialize member variables + */ + +Frodo::Frodo() +{ + TheC64 = NULL; +} + + +/* + * Process command line arguments + */ + +void Frodo::ArgvReceived(int argc, char **argv) +{ + if (argc == 2) + strncpy(prefs_path, argv[1], 255); +} + + +/* + * Arguments processed, run emulation + */ + +void Frodo::ReadyToRun(void) +{ + getcwd(AppDirPath, 256); + + // Load preferences + if (!prefs_path[0]) { + char *home = getenv("HOME"); + if (home != NULL && strlen(home) < 240) { + strncpy(prefs_path, home, 200); + strcat(prefs_path, "/"); + } + strcat(prefs_path, ".frodorc"); + } + ThePrefs.Load(prefs_path); + + // Create and start C64 + TheC64 = new C64; + if (load_rom_files()) + TheC64->Run(); + delete TheC64; +} + + +Prefs *Frodo::reload_prefs(void) +{ + static Prefs newprefs; + newprefs.Load(prefs_path); + return &newprefs; +} diff --git a/Src/menu.c b/Src/menu.c new file mode 100644 index 0000000..a00ef5f --- /dev/null +++ b/Src/menu.c @@ -0,0 +1,436 @@ +/********************************************************************* + * + * Copyright (C) 2004,2008, Simon Kagstrom + * + * Filename: menu.c + * Author: Simon Kagstrom + * Description: Code for menus (originally for Mophun) + * + * $Id$ + * + ********************************************************************/ +#include +#include + +#if defined(GEKKO) +# include +#endif + +#include "menu.h" + +#define KEY_UP 1 +#define KEY_DOWN 2 +#define KEY_LEFT 4 +#define KEY_RIGHT 8 +#define KEY_SELECT 16 +#define KEY_ESCAPE 32 +#define KEY_PAGEDOWN 64 +#define KEY_PAGEUP 128 + +#define IS_SUBMENU(p_msg) ( (p_msg)[0] == '^' ) + +static submenu_t *find_submenu(menu_t *p_menu, int index) +{ + int i; + + for (i=0; in_submenus; i++) + { + if (p_menu->p_submenus[i].index == index) + return &p_menu->p_submenus[i]; + } + + return NULL; +} + +static void print_font(SDL_Surface *screen, TTF_Font *font, int r, int g, int b, + int x, int y, char *msg) +{ + SDL_Surface *font_surf; + SDL_Rect dst = {x, y, 0, 0}; + SDL_Color color = {r, g, b}; + char buf[255]; + int i; + + memset(buf, 0, sizeof(buf)); + strncpy(buf, msg, 254); + + /* Fixup multi-menu option look */ + for (i = 0; i < strlen(buf) ; i++) + { + if (buf[i] == '^' || buf[i] == '|') + buf[i] = ' '; + } + + font_surf = TTF_RenderText_Solid(font, buf, + color); + if (!font_surf) + { + fprintf(stderr, "%s\n", TTF_GetError()); + exit(1); + } + + SDL_BlitSurface(font_surf, NULL, screen, &dst); + + SDL_FreeSurface(font_surf); +} + + +static void menu_draw(SDL_Surface *screen, menu_t *p_menu) +{ + int x_start = p_menu->x1 + (p_menu->x2 - p_menu->x1) / 2 - p_menu->text_w / 2; + int y_start = p_menu->y1 + (p_menu->y2 - p_menu->y1) / 2 - p_menu->text_h / 2; + int font_height = TTF_FontHeight(p_menu->p_font); + int line_height = (font_height + font_height / 4); + int cur_y = p_menu->cur_sel * line_height; + int entries_visible = p_menu->y2 / line_height; + int i; + + if ( p_menu->n_entries * line_height > p_menu->y2 ) + y_start = p_menu->y1; + if ( p_menu->cur_sel - p_menu->start_entry_visible > entries_visible ) + p_menu->start_entry_visible += p_menu->cur_sel - entries_visible; + else if ( p_menu->cur_sel < p_menu->start_entry_visible ) + p_menu->start_entry_visible = p_menu->cur_sel; + + for (i = p_menu->start_entry_visible; i < p_menu->n_entries; i++) + { + char *msg = p_menu->pp_msgs[i]; + int y = (i - p_menu->start_entry_visible) * line_height; + + if ((p_menu->available_options & (1<p_font, 128,128,128, x_start, + y_start + y, msg); + else if (p_menu->cur_sel == i) /* Selected - color */ + print_font(screen, p_menu->p_font, 255,255,0, x_start, + y_start + y, msg); + else /* Otherwise white */ + print_font(screen, p_menu->p_font, 255,255,255, x_start, + y_start + y, msg); + if (IS_SUBMENU(msg)) + { + submenu_t *p_submenu = find_submenu(p_menu, i); + int n_pipe = 0; + int n; + + for (n=0; msg[n] != '\0'; n++) + { + /* Underline the selected entry */ + if (msg[n] == '|') + { + int16_t n_chars; + + for (n_chars = 1; msg[n+n_chars] && msg[n+n_chars] != '|'; n_chars++); + + n_pipe++; + if (p_submenu->sel == n_pipe-1) + { + SDL_Rect r; + int w; + int h; + + if (TTF_SizeText(p_menu->p_font, "X", &w, &h) < 0) + { + fprintf(stderr, "%s\n", TTF_GetError()); + exit(1); + } + + r = (SDL_Rect) { x_start + (n+1) * w-1, + y_start + (i+1 - p_menu->start_entry_visible) * ((h + h/4)-1), + (n_chars - 1) * w, + 2 }; + SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 0, 255, 0)); + break; + } + } + } + } + } +} + +static void select_next(menu_t *p_menu, int dx, int dy) +{ + int next; + + p_menu->cur_sel = (p_menu->cur_sel + dy) < 0 ? p_menu->n_entries - 1 : + (p_menu->cur_sel + dy) % p_menu->n_entries; + next = (p_menu->cur_sel + dy + 1) < 0 ? p_menu->n_entries - 1 : + (p_menu->cur_sel + dy + 1) % p_menu->n_entries; + + if (p_menu->pp_msgs[p_menu->cur_sel][0] == ' ' || + ( (p_menu->available_options & (1<cur_sel)) == 0) || + IS_SUBMENU(p_menu->pp_msgs[p_menu->cur_sel]) ) + select_next(p_menu, dx, dy); + /* If the next is a submenu */ + if (dx != 0 && + IS_SUBMENU(p_menu->pp_msgs[next])) + { + submenu_t *p_submenu = find_submenu(p_menu, next); + + p_submenu->sel = (p_submenu->sel + dx) < 0 ? p_submenu->n_entries - 1 : + (p_submenu->sel + dx) % p_submenu->n_entries; + } +} + +static int is_submenu_title(menu_t *p_menu, int n) +{ + if (n+1 >= p_menu->n_entries) + return 0; + else + return IS_SUBMENU(p_menu->pp_msgs[n+1]); +} + + +void menu_init(menu_t *p_menu, TTF_Font *p_font, char **pp_msgs, + int16_t x1, int16_t y1, int16_t x2, int16_t y2) +{ + int i; + int j; + + memset(p_menu, 0, sizeof(menu_t)); + + p_menu->pp_msgs = pp_msgs; + p_menu->p_font = p_font; + p_menu->x1 = x1; + p_menu->y1 = y1; + p_menu->x2 = x2; + p_menu->y2 = y2; + + p_menu->text_w = 0; + p_menu->n_submenus = 0; + + for (p_menu->n_entries = 0; p_menu->pp_msgs[p_menu->n_entries]; p_menu->n_entries++) + { + int text_w_font; + + /* Is this a submenu? */ + if (IS_SUBMENU(p_menu->pp_msgs[p_menu->n_entries])) + { + p_menu->n_submenus++; + continue; /* Length of submenus is unimportant */ + } + + if (TTF_SizeText(p_font, p_menu->pp_msgs[p_menu->n_entries], &text_w_font, NULL) != 0) + { + fprintf(stderr, "%s\n", TTF_GetError()); + exit(1); + } + if (text_w_font > p_menu->text_w) + p_menu->text_w = text_w_font; + } + if ( !(p_menu->p_submenus = malloc(sizeof(submenu_t) * p_menu->n_submenus)) ) + { + perror("malloc failed!\n"); + exit(1); + } + + j=0; + for (i=0; in_submenus; i++) + { + + for (; j < p_menu->n_entries; j++) + { + if (IS_SUBMENU(p_menu->pp_msgs[j])) + { + int n; + + p_menu->p_submenus[i].index = j; + p_menu->p_submenus[i].sel = 0; + p_menu->p_submenus[i].n_entries = 0; + for (n=0; p_menu->pp_msgs[j][n] != '\0'; n++) + { + if (p_menu->pp_msgs[j][n] == '|') + p_menu->p_submenus[i].n_entries++; + } + } + } + } + p_menu->text_h = p_menu->n_entries * (TTF_FontHeight(p_font) + TTF_FontHeight(p_font) / 4); +} + +void menu_fini(menu_t *p_menu) +{ + free(p_menu->p_submenus); +} + + +static uint32_t wait_key_press(void) +{ + SDL_Event ev; + uint32_t keys = 0; + + while (1) + { +#if defined(GEKKO) + Uint32 remote_keys; + + WPAD_ScanPads(); + remote_keys = WPAD_ButtonsDown(WPAD_CHAN_0) | WPAD_ButtonsDown(WPAD_CHAN_1); + + if (remote_keys & WPAD_BUTTON_DOWN) + keys |= KEY_DOWN; + if (remote_keys & WPAD_BUTTON_UP) + keys |= KEY_UP; + if (remote_keys & WPAD_BUTTON_LEFT) + keys |= KEY_LEFT; + if (remote_keys & WPAD_BUTTON_RIGHT) + keys |= KEY_RIGHT; + if (remote_keys & WPAD_BUTTON_PLUS) + keys |= KEY_PAGEUP; + if (remote_keys & WPAD_BUTTON_MINUS) + keys |= KEY_PAGEDOWN; + if (remote_keys & (WPAD_BUTTON_A | WPAD_BUTTON_1) ) + keys |= KEY_SELECT; + if (remote_keys & (WPAD_BUTTON_1 | WPAD_BUTTON_HOME) ) + keys |= KEY_ESCAPE; +#endif + if (SDL_PollEvent(&ev)) + { + switch(ev.type) + { + case SDL_KEYDOWN: + switch (ev.key.keysym.sym) + { + case SDLK_UP: + keys |= KEY_UP; + break; + case SDLK_DOWN: + keys |= KEY_DOWN; + break; + case SDLK_LEFT: + keys |= KEY_LEFT; + break; + case SDLK_RIGHT: + keys |= KEY_RIGHT; + break; + case SDLK_PAGEDOWN: + keys |= KEY_PAGEDOWN; + break; + case SDLK_PAGEUP: + keys |= KEY_PAGEUP; + break; + case SDLK_RETURN: + case SDLK_SPACE: + keys |= KEY_SELECT; + break; + case SDLK_ESCAPE: + keys |= KEY_ESCAPE; + break; + default: + break; + } + break; + case SDL_QUIT: + exit(0); + break; + default: + break; + } + break; + } + SDL_Delay(10); + } + + return keys; +} + + +int menu_select(SDL_Surface *screen, menu_t *p_menu, + uint32_t available_options, int *p_submenus) +{ + p_menu->available_options = available_options; + + while(1) + { + uint32_t keys; + + SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0)); + + menu_draw(screen, p_menu); + SDL_Flip(screen); + + keys = wait_key_press(); + + if (keys & KEY_UP) + select_next(p_menu, 0, -1); + else if (keys & KEY_DOWN) + select_next(p_menu, 0, 1); + else if (keys & KEY_LEFT) + select_next(p_menu, -1, 0); + else if (keys & KEY_RIGHT) + select_next(p_menu, 1, 0); + else if (keys & KEY_ESCAPE) + return -1; + else if (keys & KEY_SELECT) + { + int ret = p_menu->cur_sel; + int i; + + if (!is_submenu_title(p_menu, ret)) + { + for (i=0; in_submenus; i++) + p_submenus[i] = p_menu->p_submenus[i].sel; + p_menu->cur_sel = 0; + + return ret; + } + } + } + + return -1; +} + +#if defined(TEST_MENU) +char *main_menu[] = { + "Insert disc", + "Reset C64", + "Joystick port", + "^|1|2", + " ", + "Quit", + NULL, +}; + +int main(int argc, char *argv[]) +{ + SDL_Surface *screen; + TTF_Font *font; + const SDL_VideoInfo *info; + int submenus[1] = {0}; + int selected; + menu_t menu; + + if (SDL_Init( SDL_INIT_EVERYTHING ) < 0) + { + fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError() ); + exit(1); + } + if (TTF_Init() < 0) + { + fprintf(stderr, "Unable to init TTF: %s\n", TTF_GetError() ); + exit(1); + } + + atexit(SDL_Quit); + atexit(TTF_Quit); + font = TTF_OpenFont("FreeMono.ttf", 20); + if (!font) + { + fprintf(stderr, "Unable to open font: %s\n", TTF_GetError() ); + exit(1); + } + + info = SDL_GetVideoInfo(); + /* Open a 640x480 display with the optimal color depth */ + screen = SDL_SetVideoMode(640, 480, info->vfmt->BitsPerPixel, + info->hw_available ? SDL_HWSURFACE : SDL_SWSURFACE); + menu_init(&menu, font, main_menu, 640 / 3, 480 / 3, 400, 400); + + selected = menu_select(screen, &menu, ~0, submenus); + printf("Selected: %d:%d\n", + selected, submenus[0]); + + menu_fini(&menu); + + return 0; +} +#endif diff --git a/Src/menu.h b/Src/menu.h new file mode 100644 index 0000000..1d54fb4 --- /dev/null +++ b/Src/menu.h @@ -0,0 +1,60 @@ +/********************************************************************* + * + * Copyright (C) 2004, 2008, Simon Kagstrom + * + * Filename: menu.h + * Author: Simon Kagstrom + * Description: + * + * $Id$ + * + ********************************************************************/ +#ifndef __MENU_H__ +#define __MENU_H__ + +#include +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +typedef struct +{ + int n_entries; + int index; + int sel; +} submenu_t; + + +typedef struct +{ + char **pp_msgs; + TTF_Font *p_font; + int x1,y1; + int x2,y2; + int text_w; + int text_h; + uint32_t available_options; + + int n_submenus; + submenu_t *p_submenus; + + int cur_sel; /* Main selection */ + int start_entry_visible; + int n_entries; +} menu_t; + +void menu_init(menu_t *p_menu, TTF_Font *p_font, char **pp_msgs, + int16_t x1, int16_t y1, int16_t x2, int16_t y2); +void menu_fini(menu_t *p_menu); + +int menu_select(SDL_Surface *screen, menu_t *p_menu, + uint32_t available_options, int *p_submenus); + +#if defined(__cplusplus) +}; +#endif /* __cplusplus */ + +#endif /* !__MENU_H__ */ diff --git a/Src/sysconfig.h.Wii b/Src/sysconfig.h.Wii new file mode 100644 index 0000000..2bb8dfa --- /dev/null +++ b/Src/sysconfig.h.Wii @@ -0,0 +1,152 @@ +/* Src/sysconfig.h for Wii */ + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define if your struct stat has st_blocks. */ +#define HAVE_ST_BLOCKS 1 + +/* Define if utime(file, NULL) sets file's timestamp to the present. */ +#define HAVE_UTIME_NULL 1 + +/* Define as __inline if that's what the C compiler calls it. */ +/* #undef inline */ + +/* Define to `int' if doesn't define. */ +/* #undef mode_t */ + +/* Define to `long' if doesn't define. */ +/* #undef off_t */ + +/* Define to `int' if doesn't define. */ +/* #undef pid_t */ + +/* Define if you need to in order for stat and other things to work. */ +#define _POSIX_SOURCE 1 + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define if your declares struct tm. */ +/* #undef TM_IN_SYS_TIME */ + +/* The number of bytes in a char. */ +#define SIZEOF_CHAR 1 + +/* The number of bytes in a int. */ +#define SIZEOF_INT 4 + +/* The number of bytes in a long. */ +#define SIZEOF_LONG 4 + +/* The number of bytes in a long long. */ +#define SIZEOF_LONG_LONG 8 + +/* The number of bytes in a short. */ +#define SIZEOF_SHORT 2 + +/* Define if you have the gettimeofday function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define if you have SDL. */ +#define HAVE_SDL 1 + +/* Define if you have the mkdir function. */ +#define HAVE_MKDIR 1 + +/* Define if you have the rmdir function. */ +#define HAVE_RMDIR 1 + +/* Define if you have the select function. */ +#define HAVE_SELECT 1 + +/* Define if you have the sigaction function. */ +/*#define HAVE_SIGACTION 1*/ + +/* Define if you have the statfs function. */ +/* #undef HAVE_STATFS */ + +/* Define if you have the strerror function. */ +#define HAVE_STRERROR 1 + +/* Define if you have the strstr function. */ +#define HAVE_STRSTR 1 + +/* Define if you have the usleep function. */ +/* #undef HAVE_USLEEP */ + +/* Define if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_LINUX_JOYSTICK_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_NCURSES_H */ + +/* Define if you have the header file. */ +#define HAVE_NDIR_H 1 + +/* Define if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_STRINGS_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_DIR_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_MOUNT_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_SELECT_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_STATFS_H */ + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_STATVFS_H */ + +/* Define if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_SYS_VFS_H */ + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have the header file. */ +#define HAVE_UTIME_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_VALUES_H */