diff --git a/GimliDS.nds b/GimliDS.nds index 1ceea93..7e10ab4 100644 Binary files a/GimliDS.nds and b/GimliDS.nds differ diff --git a/Makefile b/Makefile index bdbb8de..cdf3afe 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ include $(DEVKITARM)/ds_rules export TARGET := GimliDS export TOPDIR := $(CURDIR) -export VERSION := 1.2 +export VERSION := 1.2a ICON := -b $(CURDIR)/C64_icon.bmp "GimliDS $(VERSION);wavemotion-dave;https://github.com/wavemotion-dave/GimliDS" diff --git a/arm9/Makefile b/arm9/Makefile index bb37a29..14577d6 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -26,12 +26,12 @@ BACKGRD := gfx_data #--------------------------------------------------------------------------------- ARCH := -marm -mthumb-interwork -CFLAGS := -g -O3 -flto -Wall -Wformat=0 -Wno-sequence-point -Wno-delete-non-virtual-dtor -Wno-pointer-arith -Wno-register -Wno-narrowing -march=armv5te -mtune=arm946e-s -fomit-frame-pointer -ffast-math $(ARCH) -falign-functions=4 -frename-registers -finline-functions $(ARCH) +CFLAGS := -O3 -flto -Wall -Wformat=0 -Wno-sequence-point -Wno-delete-non-virtual-dtor -Wno-pointer-arith -Wno-register -Wno-narrowing -march=armv5te -mtune=arm946e-s -fomit-frame-pointer -ffast-math $(ARCH) -falign-functions=4 -frename-registers -finline-functions $(ARCH) CFLAGS += $(INCLUDE) -DARM9 -D__NDS__=1 -DPRECISE_CPU_CYCLES=1 -DGLOBAL_VARS=1 CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -ASFLAGS := -g $(ARCH) -march=armv5te -mtune=arm946e-s +ASFLAGS := $(ARCH) -march=armv5te -mtune=arm946e-s LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) diff --git a/arm9/gfx_data/intro.png b/arm9/gfx_data/intro.png index 103760a..768d077 100644 Binary files a/arm9/gfx_data/intro.png and b/arm9/gfx_data/intro.png differ diff --git a/arm9/gfx_data/keyboard.png b/arm9/gfx_data/keyboard.png index 1c2fd04..b5eb78d 100644 Binary files a/arm9/gfx_data/keyboard.png and b/arm9/gfx_data/keyboard.png differ diff --git a/arm9/gfx_data/mainmenu_bg.png b/arm9/gfx_data/mainmenu_bg.png index 762cb1b..4458265 100644 Binary files a/arm9/gfx_data/mainmenu_bg.png and b/arm9/gfx_data/mainmenu_bg.png differ diff --git a/arm9/source/C64.cpp b/arm9/source/C64.cpp index 641236d..1c76184 100644 --- a/arm9/source/C64.cpp +++ b/arm9/source/C64.cpp @@ -212,9 +212,9 @@ void C64::Reset(void) if (myConfig.reuType) TheREU->Reset(); bTurboWarp = 0; + } - /* * NMI C64 */ @@ -256,7 +256,6 @@ void C64::LoadPRG(char *filename) * preferences, ThePrefs still holds the previous ones. * The emulation must be in the paused state! */ - void C64::NewPrefs(Prefs *prefs) { PatchKernal(prefs->FastReset, prefs->TrueDrive); diff --git a/arm9/source/C64.h b/arm9/source/C64.h index 9daad79..76767e6 100644 --- a/arm9/source/C64.h +++ b/arm9/source/C64.h @@ -93,6 +93,7 @@ public: void InsertCart(char *filename); void RemoveCart(void); void LoadPRG(char *filename); + void SetBrightness(void); uint8 *RAM, *Basic, *Kernal, *Char, *Color; // C64 uint8 *RAM1541, *ROM1541; // 1541 diff --git a/arm9/source/Display.cpp b/arm9/source/Display.cpp index d59a629..7f2ec6b 100644 --- a/arm9/source/Display.cpp +++ b/arm9/source/Display.cpp @@ -63,6 +63,7 @@ uint8_t palette_blue[16] = { 0x00, 0xff, 0x38, 0xc8, 0x97, 0x4d, 0x9b, 0x71, 0x29, 0x00, 0x71, 0x4a, 0x7b, 0x9f, 0xeb, 0xb2 }; +static uint16 dimDampen = 0; u8 last_drive_access_type = 0; void floppy_soundfx(u8 type) @@ -252,6 +253,7 @@ C64Display::~C64Display() void C64Display::NewPrefs(Prefs *prefs) { floppy_sound_counter = 50; // One seconds of no floppy sound... + dimDampen = 0; } u8 JITTER[] __attribute__((section(".dtcm"))) = {0, 64, 128}; @@ -259,7 +261,22 @@ s16 temp_offset __attribute__((section(".dtcm"))) = 0; u16 slide_dampen __attribute__((section(".dtcm"))) = 0; u16 DSIvBlanks __attribute__((section(".dtcm"))) = 0; -ITCM_CODE void vblankIntr(void) +int8 currentBrightness = 0; +const int8 brightness[] = {0, -6, -12, -15}; + +__attribute__ ((noinline)) void HandleBrightness(void) +{ + if (currentBrightness == 0) setBrightness(2, currentBrightness); + if (++dimDampen > ((currentBrightness == 0) ? 400 : 15)) + { + if (currentBrightness < brightness[myGlobalConfig.keyboardDim]) currentBrightness++; else currentBrightness--; + setBrightness(2, currentBrightness); // Subscreen Brightness + dimDampen = 0; + } +} + + +ITCM_CODE void vblankDS(void) { DSIvBlanks++; int cxBG = ((s16)myConfig.offsetX << 8); @@ -298,6 +315,11 @@ ITCM_CODE void vblankIntr(void) } floppy_sound_counter--; } + + if (currentBrightness != brightness[myGlobalConfig.keyboardDim]) + { + HandleBrightness(); + } } // Toggle full 320x256 @@ -385,7 +407,7 @@ int init_graphics(void) REG_BG3PD = ydyBG; SetYtrigger(190); //trigger 2 lines before vsync - irqSet(IRQ_VBLANK, vblankIntr); + irqSet(IRQ_VBLANK, vblankDS); irqEnable(IRQ_VBLANK); return TRUE; @@ -640,6 +662,7 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst else if ((m_tpActive == false) && (keysCurrent() & KEY_TOUCH)) { + currentBrightness = 0; touchRead(&m_tp); m_tpActive = true; diff --git a/arm9/source/Display.h b/arm9/source/Display.h index b911c97..043e764 100644 --- a/arm9/source/Display.h +++ b/arm9/source/Display.h @@ -70,6 +70,7 @@ public: // Exported functions extern long ShowRequester(const char *str, const char *button1, const char *button2 = NULL); extern u8 issue_commodore_key; +extern int8 currentBrightness; extern void toggle_zoom(void); #endif diff --git a/arm9/source/VIC.cpp b/arm9/source/VIC.cpp index 17810c6..3ba42c8 100644 --- a/arm9/source/VIC.cpp +++ b/arm9/source/VIC.cpp @@ -941,7 +941,7 @@ __attribute__ ((noinline)) ITCM_CODE void MOS6569::el_mc_text(uint8 *p, uint8 * } -__attribute__ ((noinline)) ITCM_CODE void MOS6569::el_std_bitmap(uint8 *p, uint8 *q, uint8 *r) +void MOS6569::el_std_bitmap(uint8 *p, uint8 *q, uint8 *r) { uint32 *lp = (uint32 *)p; uint8 *mp = matrix_line; diff --git a/arm9/source/diskmenu.cpp b/arm9/source/diskmenu.cpp index 987d1a3..f899f0f 100644 --- a/arm9/source/diskmenu.cpp +++ b/arm9/source/diskmenu.cpp @@ -27,6 +27,7 @@ #include #include #include "diskmenu.h" +#include "Display.h" #include "mainmenu.h" #include "keyboard.h" #include "mainmenu_bg.h" @@ -208,7 +209,10 @@ u8 gimliDSLoadFile(u8 bCartOnly) } // Show the menu... - while ((keysCurrent() & (KEY_TOUCH | KEY_START | KEY_SELECT | KEY_A | KEY_B))!=0); + while ((keysCurrent() & (KEY_TOUCH | KEY_START | KEY_SELECT | KEY_A | KEY_B))!=0) + { + currentBrightness = 0; + } gimliDSFindFiles(bCartOnly); @@ -237,6 +241,7 @@ u8 gimliDSLoadFile(u8 bCartOnly) // ----------------------------------------------------- while (!bDone) { + currentBrightness = 0; if (keysCurrent() & KEY_UP) { if (!ucHaut) @@ -643,6 +648,7 @@ u8 DisketteMenu(C64 *the_c64) u8 bExitMenu = false; while (true) { + currentBrightness = 0; nds_key = keysCurrent(); if (nds_key) { @@ -825,6 +831,7 @@ u8 CartMenu(C64 *the_c64) u8 bExitMenu = false; while (true) { + currentBrightness = 0; nds_key = keysCurrent(); if (nds_key) { diff --git a/arm9/source/mainmenu.cpp b/arm9/source/mainmenu.cpp index 44aedda..a409a2b 100644 --- a/arm9/source/mainmenu.cpp +++ b/arm9/source/mainmenu.cpp @@ -31,12 +31,19 @@ #include "mainmenu.h" #include "mainmenu_bg.h" #include "Prefs.h" +#include "Display.h" extern C64 *TheC64; extern int bg0b, bg1b; static u16 nds_key; +extern char strBuf[]; +u32 file_crc = 0x00000000; +u8 option_table = 0; extern void BottomScreenMainMenu(void); +// Used with myConfig.cpuCycles and myConfig.badCycles +s16 CycleDeltas[] = {0,1,2,3,4,5,6,7,8,9,-9,-8,-7,-6,-5,-4,-3,-2,-1}; + // ---------------------------------------------------------------------- // The Disk Menu can be called up directly from the keyboard graphic // and allows the user to rewind the tape, swap in a new tape, etc. @@ -47,7 +54,9 @@ extern void BottomScreenMainMenu(void); #define MENU_ACTION_SAVE_STATE 2 // Save State #define MENU_ACTION_LOAD_STATE 3 // Load State #define MENU_ACTION_CONFIG 4 // Configure Game -#define MENU_ACTION_QUIT_EMU 5 // Exit Emulator +#define MENU_ACTION_GLOBAL_CONFIG 5 // Global Config +#define MENU_ACTION_LCD_SWAP 6 // Swap upper/lower LCD +#define MENU_ACTION_QUIT_EMU 7 // Exit Emulator #define MENU_ACTION_SKIP 99 // Skip this MENU choice typedef struct @@ -60,7 +69,7 @@ typedef struct { char *title; u8 start_row; - MenuItem_t menulist[15]; + MenuItem_t menulist[12]; } MainMenu_t; MainMenu_t main_menu = @@ -70,6 +79,8 @@ MainMenu_t main_menu = {(char *)" CONFIG GAME ", MENU_ACTION_CONFIG}, {(char *)" SAVE STATE ", MENU_ACTION_SAVE_STATE}, {(char *)" LOAD STATE ", MENU_ACTION_LOAD_STATE}, + {(char *)" GLOBAL CONFIG ", MENU_ACTION_GLOBAL_CONFIG}, + {(char *)" LCD SWAP ", MENU_ACTION_LCD_SWAP}, {(char *)" RESET C64 ", MENU_ACTION_RESET_EMU}, {(char *)" QUIT GIMLIDS", MENU_ACTION_QUIT_EMU}, {(char *)" EXIT MENU ", MENU_ACTION_EXIT}, @@ -137,6 +148,7 @@ u8 MainMenu(C64 *the_c64) u8 bExitMenu = false; while (true) { + currentBrightness = 0; nds_key = keysCurrent(); if (nds_key) { @@ -178,6 +190,7 @@ u8 MainMenu(C64 *the_c64) break; case MENU_ACTION_CONFIG: + option_table = 0; if (file_crc != 0x00000000) { u8 last_trueDrive = myConfig.trueDrive; @@ -202,6 +215,18 @@ u8 MainMenu(C64 *the_c64) } break; + case MENU_ACTION_LCD_SWAP: + lcdSwap(); + WAITVBL;WAITVBL; + bExitMenu = true; + break; + + case MENU_ACTION_GLOBAL_CONFIG: + option_table = 1; + GimliDSGameOptions(); + bExitMenu = true; + break; + case MENU_ACTION_SAVE_STATE: { check_and_make_sav_directory(); @@ -287,7 +312,9 @@ u8 MainMenu(C64 *the_c64) } -// zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +// =================== +// CONFIGURATION AREA +// =================== #define CRC32_POLY 0x04C11DB7 @@ -341,13 +368,31 @@ u32 getCRC32(u8 *buf, int size) return ~crc; } -extern char strBuf[]; -u32 file_crc = 0x00000000; -u8 option_table=0; - struct Config_t AllConfigs[MAX_CONFIGS]; struct Config_t myConfig __attribute((aligned(4))) __attribute__((section(".dtcm"))); +struct GlobalConfig_t myGlobalConfig; +void SetDefaultGlobalConfig(void) +{ + myGlobalConfig.defaultB = KEY_MAP_SPACE; + myGlobalConfig.defaultX = KEY_MAP_JOY_UP; + myGlobalConfig.defaultY = KEY_MAP_RETURN; + myGlobalConfig.defaultDiskSFX = 1; + myGlobalConfig.defaultPoundKey = 0; + myGlobalConfig.defaultJoyPort = 1; + myGlobalConfig.keyboardDim = 0; + myGlobalConfig.reserved0 = 0; + myGlobalConfig.reserved1 = 0; + myGlobalConfig.reserved2 = 0; + myGlobalConfig.reserved3 = 0; + myGlobalConfig.reserved4 = 0; + myGlobalConfig.reserved5 = 0; + myGlobalConfig.reserved6 = 0; + myGlobalConfig.reserved7 = 0; + myGlobalConfig.reserved8 = 0; + myGlobalConfig.reserved9 = 0; + myGlobalConfig.reserved10 = 1; +} void SetDefaultGameConfig(void) { @@ -359,19 +404,20 @@ void SetDefaultGameConfig(void) myConfig.key_map[3] = KEY_MAP_JOY_RIGHT;// D-Pad Right myConfig.key_map[4] = KEY_MAP_JOY_FIRE; // A = Fire Button - myConfig.key_map[5] = KEY_MAP_SPACE; // B = SPACE key - myConfig.key_map[6] = KEY_MAP_JOY_UP; // X = Joy Up - myConfig.key_map[7] = KEY_MAP_RETURN; // Y = RETURN key + myConfig.key_map[5] = myGlobalConfig.defaultB; // B = Use Global - def is SPACE key + myConfig.key_map[6] = myGlobalConfig.defaultX; // X = Use Global - def is Joy Up + myConfig.key_map[7] = myGlobalConfig.defaultY; // Y = Use Global - def is RETURN key myConfig.key_map[8] = KEY_MAP_SPACE; // Spare 1 myConfig.key_map[9] = KEY_MAP_SPACE; // Spare 2 + myConfig.diskSFX = myGlobalConfig.defaultDiskSFX; // Disk sound effects on + myConfig.joyPort = myGlobalConfig.defaultJoyPort; // Default to Joy2 (it's a toss-up but more than half use port 2) + myConfig.poundKey = myGlobalConfig.defaultPoundKey; // Default is Pound Key! + myConfig.trueDrive = 0; // Fast 1541 emulation by default myConfig.jitter = 1; // Medium level of jitter - myConfig.diskSFX = 1; // Disk sound effects on - myConfig.joyPort = 0; // Default to Joy1 (it's a toss-up but feels more natural) myConfig.joyMode = 0; // Default is normal joypad / dpad - myConfig.poundKey = 0; // Default is Pound Key! myConfig.reuType = 0; // No REU by default myConfig.reserved4 = 0; myConfig.reserved5 = 0; @@ -387,8 +433,6 @@ void SetDefaultGameConfig(void) myConfig.scaleY = 200; // Scale the 200 pixels of C64 display to the DS 200 (yes, there is only 192 so this will cut... use PAN UP/DN) } -s16 CycleDeltas[] = {0,1,2,3,4,5,6,7,8,9,-9,-8,-7,-6,-5,-4,-3,-2,-1}; // Used with myConfig.cpuCycles and myConfig.badCycles - // ---------------------------------------------------------------------- // Read file twice and ensure we get the same CRC... if not, do it again // until we get a clean read. Return the filesize to the caller... @@ -483,8 +527,9 @@ void SaveConfig(bool bShow) if (fp != NULL) { u16 ver = CONFIG_VERSION; - fwrite(&ver, sizeof(ver), 1, fp); // Write the config version - fwrite(&AllConfigs, sizeof(AllConfigs), 1, fp); // Write the array of all configurations + fwrite(&ver, sizeof(ver), 1, fp); // Write the config version + fwrite(&myGlobalConfig, sizeof(myGlobalConfig), 1, fp); // Write the global configuration + fwrite(&AllConfigs, sizeof(AllConfigs), 1, fp); // Write the array of all configurations fclose(fp); } else DSPrint(4,3,0, (char*)"ERROR SAVING CONFIG FILE"); @@ -509,10 +554,25 @@ void LoadConfig(void) u16 ver = 0x0000; if (ReadFileCarefully((char *)"/data/GimliDS.DAT", (u8*)&ver, sizeof(ver), 0)) // Read Global Config { - ReadFileCarefully((char *)"/data/GimliDS.DAT", (u8*)&AllConfigs, sizeof(AllConfigs), sizeof(ver)); // Read the full game array of configs - + if (ver == 0x0006) // One time upgrade - add global config and double the size of the AllConfigs[] array + { + memset(&myGlobalConfig, 0x00, sizeof(myGlobalConfig)); + SetDefaultGlobalConfig(); + memset(&AllConfigs, 0x00, sizeof(AllConfigs)); + ver = CONFIG_VERSION; + ReadFileCarefully((char *)"/data/GimliDS.DAT", (u8*)&AllConfigs, sizeof(AllConfigs)/2, sizeof(ver)); // Read the full game array of configs + SaveConfig(false); + } + else + { + ReadFileCarefully((char *)"/data/GimliDS.DAT", (u8*)&myGlobalConfig, sizeof(myGlobalConfig), sizeof(ver)); // Read the global config + ReadFileCarefully((char *)"/data/GimliDS.DAT", (u8*)&AllConfigs, sizeof(AllConfigs), sizeof(myGlobalConfig)); // Read the full game array of configs + } + if (ver != CONFIG_VERSION) { + memset(&myGlobalConfig, 0x00, sizeof(myGlobalConfig)); + SetDefaultGlobalConfig(); memset(&AllConfigs, 0x00, sizeof(AllConfigs)); SetDefaultGameConfig(); SaveConfig(FALSE); @@ -520,6 +580,8 @@ void LoadConfig(void) } else // Not found... init the entire database... { + memset(&myGlobalConfig, 0x00, sizeof(myGlobalConfig)); + SetDefaultGlobalConfig(); memset(&AllConfigs, 0x00, sizeof(AllConfigs)); SetDefaultGameConfig(); SaveConfig(FALSE); @@ -574,7 +636,7 @@ struct options_t "PAN-UP 16", "PAN-UP 24", "PAN-DOWN 16", "PAN-DOWN 24", "ZOOM TOGGLE" -const struct options_t Option_Table[1][20] = +const struct options_t Option_Table[2][20] = { // Game Specific Configuration { @@ -598,8 +660,21 @@ const struct options_t Option_Table[1][20] = {"X BUTTON", {KEY_MAP_OPTIONS}, &myConfig.key_map[6], 65}, {"Y BUTTON", {KEY_MAP_OPTIONS}, &myConfig.key_map[7], 65}, - {NULL, {"", ""}, NULL, 1}, - } + {NULL, {"", ""}, NULL, 1} + }, + // Global Configuration + { + {"DEF JOY PORT", {"PORT 1", "PORT 2"}, &myGlobalConfig.defaultJoyPort, 2}, + {"DEF DSK SFX", {"SFX OFF", "SFX ON"}, &myGlobalConfig.defaultDiskSFX, 2}, + {"DEF PND KEY", {"POUND", "LEFT ARROW", "UP ARROW", "C= COMMODORE"}, &myGlobalConfig.defaultPoundKey, 4}, + {"KEYBD BRIGHT", {"MAX BRIGHT", "DIM", "DIMMER", "DIMMEST"}, &myGlobalConfig.keyboardDim, 4}, + + {"DEF KEY B", {KEY_MAP_OPTIONS}, &myGlobalConfig.defaultB, 65}, + {"DEF KEY X", {KEY_MAP_OPTIONS}, &myGlobalConfig.defaultX, 65}, + {"DEF KEY Y", {KEY_MAP_OPTIONS}, &myGlobalConfig.defaultY, 65}, + + {NULL, {"", ""}, NULL, 1} + } }; @@ -643,16 +718,16 @@ void GimliDSGameOptions(void) int keys_pressed; int last_keys_pressed = 999; - option_table = 0; - idx=display_options_list(true); optionHighlighted = 0; while (keysCurrent() != 0) { + currentBrightness = 0; WAITVBL; } while (!bDone) { + currentBrightness = 0; keys_pressed = keysCurrent(); if (keys_pressed != last_keys_pressed) { @@ -701,7 +776,7 @@ void GimliDSGameOptions(void) } swiWaitForVBlank(); } - + // Give a third of a second time delay... for (int i=0; i<20; i++) { diff --git a/arm9/source/mainmenu.h b/arm9/source/mainmenu.h index 3312b2c..ca2798e 100644 --- a/arm9/source/mainmenu.h +++ b/arm9/source/mainmenu.h @@ -1,6 +1,6 @@ -#define MAX_CONFIGS 960 -#define CONFIG_VERSION 0x0006 +#define MAX_CONFIGS 1920 +#define CONFIG_VERSION 0x0007 extern s16 CycleDeltas[]; @@ -28,7 +28,30 @@ struct __attribute__((__packed__)) Config_t s16 scaleY; }; -extern struct Config_t myConfig; +struct __attribute__((__packed__)) GlobalConfig_t +{ + u8 defaultX; + u8 defaultY; + u8 defaultB; + u8 defaultDiskSFX; + u8 defaultJoyPort; + u8 defaultPoundKey; + u8 keyboardDim; + u8 reserved0; + u8 reserved1; + u8 reserved2; + u8 reserved3; + u8 reserved4; + u8 reserved5; + u8 reserved6; + u8 reserved7; + u8 reserved8; + u8 reserved9; + u8 reserved10; +}; + +extern struct Config_t myConfig; +extern struct GlobalConfig_t myGlobalConfig; #define KEY_MAP_JOY_FIRE 0 #define KEY_MAP_JOY_UP 1