Compare commits

...

19 commits
1.34 ... master

Author SHA1 Message Date
Nebuleon Fumika
f3dab3957c Release 1.36. 2013-06-16 02:28:00 -04:00
Nebuleon Fumika
010c211443 Remove the reference to splitting the cheat database into two folders. 2013-06-16 02:22:27 -04:00
Nebuleon Fumika
72db4b9ec1 Don't crash on extensionless files. Helps GitHub issue #37 some more. Taken from DS2Compress. 2013-06-16 02:04:08 -04:00
Nebuleon Fumika
a1d1e01e11 Dynamically allocate memory for the file selector to store the name pointers into. Also dramatically simplify the file selector's name management code. This has many effects:
* It allows the file selector to handle directories of more than 511 files and a parent directory entry. (Fixes GitHub issue #37).
* It allows the file selector to sort directories along with files, which is a more common use case (game folders that contain ROM hacks, plus single game files, are sorted by name as the user expects).
* The file selector now reports progress while loading a large directory.
* The screenshot slideshow function now shows an existing dedicated message, "No screenshots found", instead of crashing when the screenshot directory contains no screenshots.

Add Quicksort code from GameYob. See <https://github.com/Nebuleon/GameYob/commit/afbeeba>.

* Faster sorting in the common case where a directory's natural order is already sorted, using the isSorted function.
* Use the median-of-three algorithm first described by Robert Sedgewick to select the pivot. Causes less recursion in many cases.
* Associates file names with their is-directory flag, keeping both in sync.
2013-06-15 23:40:29 -04:00
Nebuleon Fumika
4252250fe7 Prevent a file handle leak when previewing saved states in the row of Load cells. 2013-06-10 22:23:34 -04:00
Nebuleon Fumika
5e5d5dcaa1 L+R takes a screenshot of the Touch Screen in the menu. Taken from TempGBA commit b4a68a9ad710cd37fec0c0f604218f5a34d10fc7. 2013-05-25 12:58:14 -04:00
Nebuleon Fumika
1329a31267 Release 1.35. 2013-05-23 20:09:21 -04:00
Nebuleon Fumika
3f501f9c90 Add support for custom main menu active/inactive, message text and background colors. Fill in default values for the purple skin in uicolors.txt. 2013-05-23 20:07:48 -04:00
kukuasir
5edf465c07 Complete the Simplified Chinese block and rewrite some unclear messages for Chinese speakers. Taken from TempGBA commit 657856afdc0639c446665aa71eeb3003c0bb81ad. 2013-05-21 22:11:16 -04:00
Nebuleon Fumika
3e412a93c5 Complete the Dutch, German, Portuguese (Brazil) and Spanish localisations, aligning some messages to columns for option screens. Taken from TempGBA commit 0b4252dc2f1d6a5c7445ffd6f265e59df277ceef.
* Dutch: Add missing messages. Fix a typo in global button mappings. Thanks to Aeter for this part.
* German: Add missing messages. Thanks to SignZ for this part.
* Portuguese: Add missing messages. Thanks to Diego Liberal for this part.
* Spanish: Add missing messages. Thanks to Boriar for this part.
2013-05-20 18:46:27 -04:00
Nebuleon Fumika
48eb438a24 Fix a bug whereby quick saved states would have a screenshot of "Saving state...". 2013-05-20 17:22:38 -04:00
Nebuleon Fumika
4b5a5a15d7 Add an option to put the game on the Lower Screen.
* Before entering the menu, copy the game screen to the Upper Screen if it's on the Lower Screen.
* Now, the frame that's shown in the menu doesn't appear to be the previous frame for a fraction of a second anymore.
2013-05-20 03:17:02 -04:00
Nebuleon Fumika
41c50b372e CATSFC/system/gui/uicolors.txt: Theme support for active and inactive item text colors. 2013-05-20 00:46:43 -04:00
Nebuleon Fumika
22aa56d2ed Put the most recently played file at the top. This does not introduce an incompatibility with older preference files. 2013-05-20 00:34:33 -04:00
Nebuleon Fumika
fbe8c3fc96 sdk-modifications: Fix totally broken short-file-name (SFN) alias support which caused computers to report duplicate SFNs in directories, as well as corrupted file names and breakage with files that have no extension. 2013-05-17 23:12:43 -04:00
Nebuleon Fumika
6b370ce35b Fix a GUI bug whereby an incorrect item is considered touched in file selectors. 2013-04-28 10:03:00 -04:00
rickvdwetering
0e68b604c6 Update language.msg
Fixed minor Dutch translation errors.
2013-04-16 16:37:27 +03:00
Nebuleon Fumika
53d2f1f6cd Add the year to the date displayed in a saved state's screenshot.
Based on TempGBA commit 0adaf3c332453679cc0a2feee9e87d5a4dc3c771.
2013-04-09 23:14:04 -04:00
Hyura
700a1535d6 Brazilian Portuguese block: Correct typing errors and add missing accents. Imported from TempGBA commit d55e30a2cc4943e74a2d2505c9823dc222e220a3. 2013-04-03 18:15:40 -04:00
12 changed files with 1159 additions and 979 deletions

View file

@ -0,0 +1,6 @@
Background: #000000
InactiveItem: #461F99
ActiveItem: #FFFFFF
MessageText: #461F99
InactiveMain: #FFFFFF
ActiveMain: #FFFFFF

View file

@ -48,6 +48,10 @@ Tools
Options
#MSG_MAIN_MENU_EXIT
Exit
#MSG_FILE_MENU_LOADING_LIST
Loading...
#MSG_FILE_MENU_SORTING_LIST
Sorting...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
Fluidity %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
@ -60,6 +64,8 @@ Aspect ratio %s
Fast-forward %s
#FMT_VIDEO_FRAME_SKIPPING
Frame skipping %s
#FMT_VIDEO_GAME_SCREEN
Game screen %s
#FMT_AUDIO_SOUND
Sound %s
#FMT_AUDIO_RETRO_SOUND
@ -164,6 +170,10 @@ New game
[9] Show 1 in 10 frames
#MSG_VIDEO_FRAME_SKIPPING_10
[10] Show 1 in 11 frames
#MSG_VIDEO_GAME_SCREEN_TOP
Upper Screen
#MSG_VIDEO_GAME_SCREEN_BOTTOM
Lower Screen
#MSG_GENERAL_OFF
Off
#MSG_GENERAL_ON
@ -259,6 +269,10 @@ STARTCHINESESIM
综合设置
#MSG_MAIN_MENU_EXIT
退出模拟器
#MSG_FILE_MENU_LOADING_LIST
装载...
#MSG_FILE_MENU_SORTING_LIST
列表进行排序...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
流畅度 %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
@ -271,6 +285,8 @@ STARTCHINESESIM
游戏快进 %s
#FMT_VIDEO_FRAME_SKIPPING
跳帧方式 %s
#FMT_VIDEO_GAME_SCREEN
游戏屏幕 %s
#FMT_AUDIO_SOUND
声音开关 %s
#FMT_AUDIO_RETRO_SOUND
@ -290,11 +306,11 @@ Retro sound %s
#MSG_TOOLS_GLOBAL_HOTKEY_GENERAL
全局热键
#MSG_TOOLS_GAME_HOTKEY_GENERAL
游戏专用覆盖性热键
特定游戏热键
#FMT_OPTIONS_LANGUAGE
语言 %s
语言 %s
#FMT_OPTIONS_CPU_FREQUENCY
CPU主频 %s
CPU 主频 %s
#MSG_OPTIONS_CPU_FREQUENCY_0
[0] 240 MHz
#MSG_OPTIONS_CPU_FREQUENCY_1
@ -308,7 +324,7 @@ CPU主频 %s
#MSG_OPTIONS_CPU_FREQUENCY_5
[5] 396 MHz
#MSG_OPTIONS_CARD_CAPACITY
卡容量
容量
#MSG_OPTIONS_RESET
缺省设置
#MSG_OPTIONS_VERSION
@ -330,7 +346,7 @@ CPU主频 %s
#MSG_HOTKEY_FULL_SCREEN_TOGGLE
全屏开关
#MSG_PROGRESS_HOTKEY_WAITING_FOR_KEYS
按下你想要设置为这个效果的按钮
按下你想要设置的热键组合。
#MSG_HOTKEY_DELETE_WITH_A
*A 清除
#MSG_HOTKEY_CANCEL_WITH_B
@ -375,6 +391,10 @@ CPU主频 %s
[9] 显示 1/10
#MSG_VIDEO_FRAME_SKIPPING_10
[10] 显示 1/11
#MSG_VIDEO_GAME_SCREEN_TOP
上屏
#MSG_VIDEO_GAME_SCREEN_BOTTOM
下屏
#MSG_GENERAL_OFF
#MSG_GENERAL_ON
@ -392,23 +412,23 @@ CPU主频 %s
#MSG_CHEAT_ELEMENT_NOT_LOADED
<没有加载>
#MSG_SAVESTATE_FULL
当前存档槽已有存档文件,覆盖有存档吗?
当前存档槽已有存档文件,覆盖有存档吗?
#MSG_PROGRESS_SAVED_STATE_CREATING
正在写入...
#MSG_PROGRESS_SAVED_STATE_CREATION_FAILED
写入存档失败!
存档写入失败!
#MSG_PROGRESS_SAVED_STATE_CREATION_SUCCEEDED
写入存档成功!
存档写入成功!
#MSG_TOP_SCREEN_NO_SAVED_STATE_IN_SLOT
没有游戏截图
#MSG_PROGRESS_SAVED_STATE_CORRUPTED
存档文件找不到或者损坏!
存档文件不存在或者已损坏!
#MSG_PROGRESS_SAVED_STATE_LOADING
正在加载...
#MSG_PROGRESS_SAVED_STATE_LOAD_FAILED
加载存档失败
存档加载失败
#MSG_PROGRESS_SAVED_STATE_LOAD_SUCCEEDED
加载存档成功
存档加载成功
#MSG_SAVED_STATE_DELETE_ALL
删除当前游戏的所有存档
#FMT_SAVED_STATE_DELETE_ONE
@ -432,20 +452,20 @@ CPU主频 %s
#MSG_PAUSE_SLIDE
已暂停
#MSG_SCREENSHOT_SLIDESHOW_KEYS
*u 加快播放\n
*d 减慢播放\n
*l 上一帧\n
*r 下一帧\n
*A 暂停\n
*B 返回菜单
*u 加快播放\n
*d 减慢播放\n
*l 上一帧 \n
*r 下一帧 \n
*A 暂停 \n
*B 返回菜单
#MSG_PROGRESS_LOADING_GAME
正在装载游戏...
#MSG_EMULATOR_NAME
SFC模拟器
SFC 模拟器
#MSG_WORD_EMULATOR_VERSION
版本
#MSG_DIALOG_RESET
确定将 SFC模拟器恢复为出厂设置吗?
确定将 SFC 模拟器恢复为出厂设置吗?
#MSG_PROGRESS_RESETTING
正在设置,请稍候...
@ -470,6 +490,10 @@ Outils
Options
#MSG_MAIN_MENU_EXIT
Quitter
#MSG_FILE_MENU_LOADING_LIST
Chargement...
#MSG_FILE_MENU_SORTING_LIST
Tri...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
Fluidité %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
@ -482,6 +506,8 @@ Format d'image %s
Avance rapide %s
#FMT_VIDEO_FRAME_SKIPPING
Omission d'images %s
#FMT_VIDEO_GAME_SCREEN
Écran de jeu %s
#FMT_AUDIO_SOUND
Son %s
#FMT_AUDIO_RETRO_SOUND
@ -586,6 +612,10 @@ Nouveau jeu
[9] Montrer 1 image sur 10
#MSG_VIDEO_FRAME_SKIPPING_10
[10] Montrer 1 image sur 11
#MSG_VIDEO_GAME_SCREEN_TOP
Écran supérieur
#MSG_VIDEO_GAME_SCREEN_BOTTOM
Écran inférieur
#MSG_GENERAL_OFF
Hors fonction
#MSG_GENERAL_ON
@ -682,6 +712,10 @@ Tools
Optionen
#MSG_MAIN_MENU_EXIT
Beenden
#MSG_FILE_MENU_LOADING_LIST
Laden...
#MSG_FILE_MENU_SORTING_LIST
Sortieren...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
Flüssigkeit %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
@ -694,6 +728,8 @@ Bildformat %s
Schnellvorlauf %s
#FMT_VIDEO_FRAME_SKIPPING
Frames übersp. %s
#FMT_VIDEO_GAME_SCREEN
Bildschirm %s
#FMT_AUDIO_SOUND
Ton %s
#FMT_AUDIO_RETRO_SOUND
@ -798,6 +834,10 @@ Neues Spiel
[9] Zeige 1 von 10 Frames
#MSG_VIDEO_FRAME_SKIPPING_10
[10] Zeige 1 von 11 Frames
#MSG_VIDEO_GAME_SCREEN_TOP
Oberer Bildschirm
#MSG_VIDEO_GAME_SCREEN_BOTTOM
Unterer Bildschirm
#MSG_GENERAL_OFF
Aus
#MSG_GENERAL_ON
@ -894,6 +934,10 @@ Hulpmiddelen
Opties
#MSG_MAIN_MENU_EXIT
Afsluiten
#MSG_FILE_MENU_LOADING_LIST
Laden...
#MSG_FILE_MENU_SORTING_LIST
Sorteren...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
Fluïditeit %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
@ -906,6 +950,8 @@ Beeldverhouding %s
Vooruitspoelen %s
#FMT_VIDEO_FRAME_SKIPPING
Beeld overslaan %s
#FMT_VIDEO_GAME_SCREEN
Spelscherm %s
#FMT_AUDIO_SOUND
Geluid %s
#FMT_AUDIO_RETRO_SOUND
@ -945,7 +991,7 @@ CPU frequentie %s
#MSG_OPTIONS_CARD_CAPACITY
Kaartcapaciteit
#MSG_OPTIONS_RESET
Herstel standaard instellingen
Herstel standaardinstellingen
#MSG_OPTIONS_VERSION
Versie-informatie
#MSG_SCREENSHOT_CREATE
@ -965,7 +1011,7 @@ Sla spelstaat 1 op
#MSG_HOTKEY_FULL_SCREEN_TOGGLE
Schakel naar volledig scherm
#MSG_PROGRESS_HOTKEY_WAITING_FOR_KEYS
Druk op de gewenste knoppencombinatie.
Druk op de gewenste toetsencombinatie.
#MSG_HOTKEY_DELETE_WITH_A
*A Wissen
#MSG_HOTKEY_CANCEL_WITH_B
@ -1010,6 +1056,10 @@ Nieuw spel
[9] 1 uit 10 beelden tonen
#MSG_VIDEO_FRAME_SKIPPING_10
[10] 1 uit 11 beelden tonen
#MSG_VIDEO_GAME_SCREEN_TOP
Bovenste scherm
#MSG_VIDEO_GAME_SCREEN_BOTTOM
Onderste scherm
#MSG_GENERAL_OFF
Uit
#MSG_GENERAL_ON
@ -1037,7 +1087,7 @@ Opslaan geslaagd!
#MSG_TOP_SCREEN_NO_SAVED_STATE_IN_SLOT
Geen spelstaat in slot.
#MSG_PROGRESS_SAVED_STATE_CORRUPTED
State niet gevonden of corrupt.
Staat niet gevonden of corrupt.
#MSG_PROGRESS_SAVED_STATE_LOADING
Laden...
#MSG_PROGRESS_SAVED_STATE_LOAD_FAILED
@ -1080,7 +1130,7 @@ CATSFC SNES emulator
#MSG_WORD_EMULATOR_VERSION
Versie
#MSG_DIALOG_RESET
Alle standaard instellingen herstellen?
Alle standaardinstellingen herstellen?
#MSG_PROGRESS_RESETTING
Even geduld A.U.B.
@ -1106,6 +1156,10 @@ Herramientas
Opciones
#MSG_MAIN_MENU_EXIT
Salir
#MSG_FILE_MENU_LOADING_LIST
Cargando...
#MSG_FILE_MENU_SORTING_LIST
Ordenando...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
Fluidez %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
@ -1118,6 +1172,8 @@ Modo de pantalla %s
Modo avance rápido %s
#FMT_VIDEO_FRAME_SKIPPING
Salto de fotogramas %s
#FMT_VIDEO_GAME_SCREEN
Pantalla de juego %s
#FMT_AUDIO_SOUND
Sonido %s
#FMT_AUDIO_RETRO_SOUND
@ -1222,6 +1278,10 @@ Nuevo juego
[9] Mostrar 1/10
#MSG_VIDEO_FRAME_SKIPPING_10
[10] Mostrar 1/11
#MSG_VIDEO_GAME_SCREEN_TOP
Pantalla superior
#MSG_VIDEO_GAME_SCREEN_BOTTOM
Pantalla inferior
#MSG_GENERAL_OFF
Apagado
#MSG_GENERAL_ON
@ -1317,6 +1377,10 @@ Strumenti
Opzioni
#MSG_MAIN_MENU_EXIT
Uscita
#MSG_FILE_MENU_LOADING_LIST
Caricando...
#MSG_FILE_MENU_SORTING_LIST
Ordinamento...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
Fluidità %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
@ -1329,6 +1393,8 @@ Modalità video %s
Avanzamento rapido %s
#FMT_VIDEO_FRAME_SKIPPING
Salto fotogrammi %s
#FMT_VIDEO_GAME_SCREEN
Game screen %s
#FMT_AUDIO_SOUND
Audio %s
#FMT_AUDIO_RETRO_SOUND
@ -1433,6 +1499,10 @@ Nuovo gioco
[9] Mostra 1 su 10 fotogrammi
#MSG_VIDEO_FRAME_SKIPPING_10
[10] Mostra 1 su 11 fotogrammi
#MSG_VIDEO_GAME_SCREEN_TOP
Upper Screen
#MSG_VIDEO_GAME_SCREEN_BOTTOM
Lower Screen
#MSG_GENERAL_OFF
Disabilita
#MSG_GENERAL_ON
@ -1528,22 +1598,28 @@ Ferramentas
Opções
#MSG_MAIN_MENU_EXIT
Sair
#MSG_FILE_MENU_LOADING_LIST
Carregando...
#MSG_FILE_MENU_SORTING_LIST
Classificando...
#FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE
Fluidez %s
Fluidez %s
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO
Preferir vídeo fluído
#MSG_VIDEO_AUDIO_FLUIDITY_PREFER_AUDIO
Preferir áudio fluído
#FMT_VIDEO_ASPECT_RATIO
Proporção %s
Proporção %s
#FMT_VIDEO_FAST_FORWARD
Avanço de quadro %s
#FMT_VIDEO_FRAME_SKIPPING
Pulo de quadros %s
Pulo de quadros %s
#FMT_VIDEO_GAME_SCREEN
Tela de jogo %s
#FMT_AUDIO_SOUND
Som %s
Som %s
#FMT_AUDIO_RETRO_SOUND
Som retrô %s
Som retrô %s
#FMT_SAVED_STATE_CREATE
Criar estado %d
#FMT_SAVED_STATE_LOAD
@ -1557,9 +1633,9 @@ Carregar arquivo de trapaça
#MSG_TOOLS_SCREENSHOT_GENERAL
Foto...
#MSG_TOOLS_GLOBAL_HOTKEY_GENERAL
Atalhos de tecla globais...
Atalhos de botões globais...
#MSG_TOOLS_GAME_HOTKEY_GENERAL
Atalhos de tecla do jogo atual...
Atalhos de botões do jogo atual...
#FMT_OPTIONS_LANGUAGE
Idioma %s
#FMT_OPTIONS_CPU_FREQUENCY
@ -1577,9 +1653,9 @@ Frequência da CPU %s
#MSG_OPTIONS_CPU_FREQUENCY_5
[5] 396 MHz
#MSG_OPTIONS_CARD_CAPACITY
Capacidade do SD
Capacidade do cartão SD
#MSG_OPTIONS_RESET
Restaurar configurações padrão
Restaurar configuração padrão
#MSG_OPTIONS_VERSION
Informações desta versão
#MSG_SCREENSHOT_CREATE
@ -1619,7 +1695,7 @@ Novo jogo
#MSG_VIDEO_ASPECT_RATIO_3
[3] Meio, pixels exatos
#MSG_VIDEO_ASPECT_RATIO_4
[4] Toda a tela, alisado
[4] Toda a tela, suavizado
#MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC
[-] Variar conforme o jogo
#MSG_VIDEO_FRAME_SKIPPING_0
@ -1644,6 +1720,10 @@ Novo jogo
[9] Mostrar 1 em 10 frames
#MSG_VIDEO_FRAME_SKIPPING_10
[10] Mostrar 1 em 11 frames
#MSG_VIDEO_GAME_SCREEN_TOP
Tela superior
#MSG_VIDEO_GAME_SCREEN_BOTTOM
Tela inferior
#MSG_GENERAL_OFF
Desligado
#MSG_GENERAL_ON
@ -1661,7 +1741,7 @@ Nenhum jogo carregado no momento
#MSG_CHEAT_ELEMENT_NOT_LOADED
<Nada carregado aqui>
#MSG_SAVESTATE_FULL
O slot atual contem um estado. Deseja sobrescrevê-lo?
O slot atual contém um estado. Deseja sobrescrevê-lo?
#MSG_PROGRESS_SAVED_STATE_CREATING
Salvando estado...
#MSG_PROGRESS_SAVED_STATE_CREATION_FAILED
@ -1671,7 +1751,7 @@ OK!
#MSG_TOP_SCREEN_NO_SAVED_STATE_IN_SLOT
Nenhum estado salvo aqui
#MSG_PROGRESS_SAVED_STATE_CORRUPTED
O arquivo de estado deste jogo não foi encontrado ou está corrupto.
O arquivo de estado deste jogo não foi encontrado ou está corrompido.
#MSG_PROGRESS_SAVED_STATE_LOADING
Carregando...
#MSG_PROGRESS_SAVED_STATE_LOAD_FAILED
@ -1679,7 +1759,7 @@ Falhou!
#MSG_PROGRESS_SAVED_STATE_LOAD_SUCCEEDED
OK!
#MSG_SAVED_STATE_DELETE_ALL
Delete todos os estads salvos
Delete todos os estados salvos
#FMT_SAVED_STATE_DELETE_ONE
Delete o estado salvo %d
#MSG_DIALOG_SAVE_STATE_DELETE_ALL
@ -1704,7 +1784,7 @@ Pausar...
*u Acelerar\n
*d Desacelerar\n
*l Foto anterior\n
*r Proxima foto\n
*r Próxima foto\n
*A Pausar\n
*B Voltar ao menu
#MSG_PROGRESS_LOADING_GAME

View file

@ -1,4 +1,4 @@
CATSFC version 1.34, 2013-03-30
CATSFC version 1.36, 2013-06-16
A Super Nintendo emulator for the Supercard DSTWO.
@ -38,11 +38,6 @@ old format used in Mightymo's BSNES Cheat Code Pack.
4. Open your storage card's CATSFC folder, then descend into gamecht.
5. Drag the cheat code files from the zip archive to the card's gamecht
folder.
6. In the card's gamecht directory, create two folders. Name the first one
*a-m* and the second one *n-z*. Drag the cheat files from the games whose
name starts with A to M into *a-m* and the rest into *n-z*.
This is because the directory display does not handle more than 512 files.
To add cheats to the menu in a game, first load the game, then use the Cheats
menu's "Load a cheat file" option.

View file

@ -135,7 +135,7 @@ bool _FAT_directory_isValidLfn (const char* name) {
return true;
}
bool _FAT_directory_isValidAlias (const char* name) {
return false;//disables this function to preserve file name casing
//return false;//disables this function to preserve file name casing
u32 i;
u32 nameLength;
@ -159,7 +159,7 @@ bool _FAT_directory_isValidAlias (const char* name) {
// Make sure the name doesn't contain any control codes
//if name isn't all capitals, then it is not a valid short name
for (i = 0; i < nameLength; i++) {
if (name[i] < 0x5A && name[i]!=0x20) {
if (name[i] > 0x5A && name[i]!= 0x20) {
return false;
}
}
@ -756,7 +756,37 @@ static bool _FAT_directory_entryExists (PARTITION* partition, const char* name,
return false;
}
//a fix for checking if a short file name is already in use.
static bool _FAT_directory_entryExistsSFN (PARTITION* partition, const char* name, u32 dirCluster) {
DIR_ENTRY tempEntry;
bool foundFile;
char alias[MAX_ALIAS_LENGTH];
u32 dirnameLength;
dirnameLength = strnlen(name, MAX_FILENAME_LENGTH);
if (dirnameLength >= MAX_FILENAME_LENGTH) {
return false;
}
// Make sure the entry doesn't already exist
foundFile = _FAT_directory_getFirstEntry (partition, &tempEntry, dirCluster);
while (foundFile) { // It hasn't already found the file
if(!strcasecmp(name, tempEntry.d_name))
return true;
// Check if the alias matches
_FAT_directory_entryGetAlias (tempEntry.entryData, alias);
if ((dirnameLength == strnlen(alias, MAX_ALIAS_LENGTH))
&& (strcasecmp(alias, name) == 0)) {
return true;
}
foundFile = _FAT_directory_getNextEntry (partition, &tempEntry);
}
return false;
}
bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, u32 dirCluster) {
u32 entrySize;
@ -833,7 +863,7 @@ bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, u32 dirClu
++ j;
}
// Short filename
strupr (entry->d_name);
strupr (entry->entryData);
}else {
// Long filename needed
//memset( entry->unicodeFilename, 0, 512 );
@ -883,7 +913,7 @@ bool _FAT_directory_addEntry (PARTITION* partition, DIR_ENTRY* entry, u32 dirClu
i++;
alias[6] = '0' + ((i / 10) % 10); // 10's digit
alias[7] = '0' + (i % 10); // 1's digit
} while (_FAT_directory_entryExists (partition, alias, dirCluster) && (i < 100));
} while (_FAT_directory_entryExistsSFN (partition, alias, dirCluster) && (i < 100));
if (i == 100) {
// Couldn't get a tail number
return false;

View file

@ -49,9 +49,10 @@
#define BYTES_PER_READ 512
#ifndef NULL
#define NULL 0
#endif
// MODIFICATION START [Neb]
// In libfat by Chishm, some types are #define'd here. In the DS2 SDK,
// these types are defined by another header.
#include "ds2_types.h"
#ifndef bool
#define bool int
@ -65,21 +66,7 @@
#define true 1
#endif
#ifndef u8
#define u8 unsigned char
#endif
#ifndef u16
#define u16 unsigned short
#endif
#ifndef u32
#define u32 unsigned long
#endif
#ifndef s32
#define s32 long
#endif
// MODIFICATION END [Neb]
struct _reent
{

View file

@ -56,10 +56,10 @@ static uint16 SevenToSixScanlineResize (uint16 TopColour, uint16 BottomColour, u
;
}
void NDSSFCDrawFrameAntialiased ()
void NDSSFCDrawFrameAntialiased (void* screen_addr)
{
uint16 X, Y;
uint16 *SrcTop = (uint16 *) GFX.Screen, *SrcBottom = SrcTop + 256, *Dest = (uint16 *) up_screen_addr;
uint16 *SrcTop = (uint16 *) GFX.Screen, *SrcBottom = SrcTop + 256, *Dest = (uint16 *) screen_addr;
for (Y = 0; Y < 224; Y += 7)
{

View file

@ -106,6 +106,13 @@ struct gui_iconlist gui_icon_list[]= {
/* 34 */ {"sbutto", 76, 16, NULL}
};
u16 COLOR_BG = COLOR16( 0, 0, 0);
u16 COLOR_INACTIVE_ITEM = COLOR16( 0, 0, 0);
u16 COLOR_ACTIVE_ITEM = COLOR16(31, 31, 31);
u16 COLOR_MSSG = COLOR16( 0, 0, 0);
u16 COLOR_INACTIVE_MAIN = COLOR16(31, 31, 31);
u16 COLOR_ACTIVE_MAIN = COLOR16(31, 31, 31);
/*
* Drawing string aroud center
@ -621,6 +628,7 @@ void draw_hscroll_over(u32 index)
/*
* Drawing dialog
*/
/*
void draw_dialog(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey)
{
drawboxfill(screen_addr, sx + 5, sy + 5, ex + 5, ey + 5, COLOR_DIALOG_SHADOW);
@ -647,6 +655,7 @@ void draw_dialog(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey)
drawboxfill(screen_addr, sx, sy, ex, ey, COLOR_DIALOG);
}
*/
/*
* Draw yes or no dialog
@ -1098,6 +1107,62 @@ int icon_init(u32 language_id)
return ret;
}
int color_init()
{
char path[MAX_PATH];
char current_line[256];
sprintf(path, "%s/%s/%s", main_path, GUI_SOURCE_PATH, "uicolors.txt");
FILE* fp = fopen(path, "r");
if (fp != NULL)
{
while(fgets(current_line, 256, fp))
{
char* colon = strchr(current_line, ':');
if (colon)
{
*colon = '\0';
u16* color = NULL;
if (strcasecmp(current_line, "Background") == 0)
color = &COLOR_BG;
else if (strcasecmp(current_line, "ActiveItem") == 0)
color = &COLOR_ACTIVE_ITEM;
else if (strcasecmp(current_line, "InactiveItem") == 0)
color = &COLOR_INACTIVE_ITEM;
else if (strcasecmp(current_line, "MessageText") == 0)
color = &COLOR_MSSG;
else if (strcasecmp(current_line, "ActiveMain") == 0)
color = &COLOR_ACTIVE_MAIN;
else if (strcasecmp(current_line, "InactiveMain") == 0)
color = &COLOR_INACTIVE_MAIN;
if (color != NULL)
{
char* end = strchr(colon + 1, '\0') - 1;
while (*end && (*end == '\r' || *end == '\n'))
*end-- = '\0';
char* ptr = colon + 1;
while (*ptr && *ptr == ' ')
ptr++;
u32 color32;
u8 r, g, b;
if (strlen(ptr) == 7 && *ptr == '#')
{
color32 = strtol(ptr + 1, NULL, 16);
r = (color32 >> 16) & 0xFF;
g = (color32 >> 8) & 0xFF;
b = color32 & 0xFF;
*color = COLOR16(r >> 3, g >> 3, b >> 3);
}
}
}
}
fclose(fp);
return 0;
}
else
return 1;
}
/*************************************************************/
void show_icon(void* screen, struct gui_iconlist* icon, u32 x, u32 y)
{

View file

@ -61,27 +61,25 @@
#define COLOR_TRANS COLOR16(31, 31, 63)
#define COLOR_WHITE COLOR16(31, 31, 31)
#define COLOR_BLACK COLOR16( 0, 0, 0)
#define COLOR_TEXT COLOR16(31, 31, 31)
#define COLOR_PROGRESS_TEXT COLOR16( 0, 0, 0)
#define COLOR_PROGRESS_BAR COLOR16(15, 15, 15)
#define COLOR_ERROR COLOR16(31, 0, 0)
#define COLOR_BG COLOR16(2, 4, 10)
#define COLOR_BG32 COLOR32(2*8, 4*8, 10*8)
#define COLOR_ROM_INFO COLOR16(22, 18, 26)
#define COLOR_ACTIVE_ITEM COLOR16(31, 31, 31)
#define COLOR_INACTIVE_ITEM COLOR16(11, 7, 19)
#define COLOR_HELP_TEXT COLOR16(16, 20, 24)
#define COLOR_DIALOG COLOR16(31, 31, 31)
#define COLOR_DIALOG_SHADOW COLOR16( 0, 2, 8)
#define COLOR_FRAME COLOR16( 0, 0, 0)
#define COLOR_YESNO_TEXT COLOR16( 0, 0, 0)
#define COLOR_GREEN COLOR16( 0, 31, 0 )
#define COLOR_GREEN1 COLOR16( 0, 24, 0 )
#define COLOR_GREEN2 COLOR16( 0, 18, 0 )
#define COLOR_GREEN3 COLOR16( 0, 12, 0 )
#define COLOR_GREEN4 COLOR16( 0, 6, 0 )
#define COLOR_RED COLOR16( 31, 0, 0 )
#define COLOR_MSSG COLOR16( 16, 8, 29)
//#define COLOR_TEXT COLOR16(31, 31, 31)
//#define COLOR_PROGRESS_TEXT COLOR16( 0, 0, 0)
//#define COLOR_PROGRESS_BAR COLOR16(15, 15, 15)
//#define COLOR_ERROR COLOR16(31, 0, 0)
//#define COLOR_BG COLOR16(2, 4, 10)
//#define COLOR_BG32 COLOR32(2*8, 4*8, 10*8)
//#define COLOR_ROM_INFO COLOR16(22, 18, 26)
//#define COLOR_HELP_TEXT COLOR16(16, 20, 24)
//#define COLOR_DIALOG COLOR16(31, 31, 31)
//#define COLOR_DIALOG_SHADOW COLOR16( 0, 2, 8)
//#define COLOR_FRAME COLOR16( 0, 0, 0)
//#define COLOR_YESNO_TEXT COLOR16( 0, 0, 0)
//#define COLOR_GREEN COLOR16( 0, 31, 0 )
//#define COLOR_GREEN1 COLOR16( 0, 24, 0 )
//#define COLOR_GREEN2 COLOR16( 0, 18, 0 )
//#define COLOR_GREEN3 COLOR16( 0, 12, 0 )
//#define COLOR_GREEN4 COLOR16( 0, 6, 0 )
//#define COLOR_RED COLOR16( 31, 0, 0 )
//#define COLOR_MSSG COLOR16( 16, 8, 29)
/******************************************************************************
*
******************************************************************************/
@ -89,6 +87,13 @@
extern "C" {
#endif
extern u16 COLOR_BG;
extern u16 COLOR_INACTIVE_ITEM;
extern u16 COLOR_ACTIVE_ITEM;
extern u16 COLOR_MSSG;
extern u16 COLOR_INACTIVE_MAIN;
extern u16 COLOR_ACTIVE_MAIN;
struct background{
char bgname[128];
char bgbuffer[256*192*2];
@ -180,6 +185,7 @@ extern void msg_screen_clear(void);
extern void msg_set_text_color(u32 color);
extern int icon_init(u32 language_id);
extern int color_init(void);
extern int gui_change_icon(u32 language_id);
extern int show_background(void *screen, char *bgname);
extern void show_icon(void* screen, struct gui_iconlist *icon, u32 x, u32 y);

View file

@ -140,22 +140,29 @@ bool8 S9xInitUpdate ()
}
extern void NDSSFCDrawFrameAntialiased();
extern void NDSSFCDrawFrameAntialiased(void* screen_addr);
bool8 S9xDeinitUpdate (int Width, int Height, bool8 /*sixteen_bit*/)
{
void* screen_addr = emu_config.BottomScreenGame
? down_screen_addr
: up_screen_addr;
SCREEN_ID screen_num = emu_config.BottomScreenGame
? DOWN_SCREEN
: UP_SCREEN;
switch(game_config.graphic)
{
//Up
case 1:
#ifdef DS2_DMA
__dcache_writeback_all();
ds2_DMAcopy_32Byte(1 /* channel: graphics */, up_screen_addr, GFX.Screen + 256 * 32 * 2, 256 * 192 * 2);
ds2_DMAcopy_32Byte(1 /* channel: graphics */, screen_addr, GFX.Screen + 256 * 32 * 2, 256 * 192 * 2);
ds2_DMA_wait(1);
ds2_DMA_stop(1);
#else
memcpy(up_screen_addr, GFX.Screen+256*32*2, 256*192*2);
memcpy(screen_addr, GFX.Screen+256*32*2, 256*192*2);
#endif
break;
@ -163,11 +170,11 @@ bool8 S9xDeinitUpdate (int Width, int Height, bool8 /*sixteen_bit*/)
case 2:
#ifdef DS2_DMA
__dcache_writeback_all();
ds2_DMAcopy_32Byte(1 /* channel: graphics */, up_screen_addr, GFX.Screen, 256 * 192 * 2);
ds2_DMAcopy_32Byte(1 /* channel: graphics */, screen_addr, GFX.Screen, 256 * 192 * 2);
ds2_DMA_wait(1);
ds2_DMA_stop(1);
#else
memcpy(up_screen_addr, GFX.Screen, 256*192*2);
memcpy(screen_addr, GFX.Screen, 256*192*2);
#endif
break;
@ -175,16 +182,16 @@ bool8 S9xDeinitUpdate (int Width, int Height, bool8 /*sixteen_bit*/)
case 3:
#ifdef DS2_DMA
__dcache_writeback_all();
ds2_DMAcopy_32Byte(1 /* channel: graphics */, up_screen_addr, GFX.Screen + 256 * 16 * 2, 256 * 192 * 2);
ds2_DMAcopy_32Byte(1 /* channel: graphics */, screen_addr, GFX.Screen + 256 * 16 * 2, 256 * 192 * 2);
ds2_DMA_wait(1);
ds2_DMA_stop(1);
#else
memcpy(up_screen_addr, GFX.Screen+256*16*2, 256*192*2);
memcpy(screen_addr, GFX.Screen+256*16*2, 256*192*2);
#endif
break;
case 4:
NDSSFCDrawFrameAntialiased ();
NDSSFCDrawFrameAntialiased (screen_addr);
break;
@ -197,7 +204,7 @@ bool8 S9xDeinitUpdate (int Width, int Height, bool8 /*sixteen_bit*/)
register unsigned int m;
src = GFX.Screen;
dst = (unsigned char*)up_screen_addr;
dst = (unsigned char*)screen_addr;
for(m = 0; m < 32; m++)
{
#ifdef DS2_DMA
@ -214,7 +221,7 @@ bool8 S9xDeinitUpdate (int Width, int Height, bool8 /*sixteen_bit*/)
break;
}
ds2_flipScreen(UP_SCREEN, UP_SCREEN_UPDATE_METHOD);
ds2_flipScreen(screen_num, UP_SCREEN_UPDATE_METHOD);
// A problem with update method 1 (wait, double buffer) means that, after
// about 15 minutes of play time, the screen starts to half-redraw every
// frame. With update method 0, this is mitigated. (Method 2 is too slow.)
@ -648,7 +655,19 @@ int sfc_main (int argc, char **argv)
S9xSetSoundMute (TRUE);
unsigned short screen[256*192];
copy_screen((void*)screen, up_screen_addr, 0, 0, 256, 192);
if (FirstInvocation) {
memset(screen, 0, sizeof(screen));
}
else {
S9xDeinitUpdate(256, 224, TRUE);
void* screen_addr = emu_config.BottomScreenGame
? down_screen_addr
: up_screen_addr;
copy_screen((void*)screen, screen_addr, 0, 0, 256, 192);
}
menu(screen, FirstInvocation);
FirstInvocation = FALSE;
game_disableAudio();
@ -1262,10 +1281,13 @@ uint32 S9xReadJoypad (int which1)
mdelay(1);
} while (inputdata.key & KEY_LID);
ds2_wakeup();
// Before starting to emulate again, turn off the lower
// screen's backlight.
// Before starting to emulate again, turn on only the
// game screen's backlight.
SCREEN_ID screen_num = emu_config.BottomScreenGame
? DOWN_SCREEN
: UP_SCREEN;
mdelay(100); // needed to avoid ds2_setBacklight crashing
ds2_setBacklight(2);
ds2_setBacklight(3 - screen_num);
GameFrequencyCPU();
}

File diff suppressed because it is too large Load diff

View file

@ -86,7 +86,8 @@ struct _EMU_CONFIG
u32 HotkeyQuickLoadState;
u32 HotkeyQuickSaveState;
u32 HotkeyToggleFullScreen;
u32 Reserved[58];
u32 BottomScreenGame;
u32 Reserved[57];
};
struct _GAME_CONFIG

View file

@ -31,12 +31,17 @@ enum MSG
MSG_MAIN_MENU_TOOLS,
MSG_MAIN_MENU_OPTIONS,
MSG_MAIN_MENU_EXIT,
MSG_FILE_MENU_LOADING_LIST,
MSG_FILE_MENU_SORTING_LIST,
FMT_VIDEO_AUDIO_FLUIDITY_PREFERENCE,
MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO,
MSG_VIDEO_AUDIO_FLUIDITY_PREFER_AUDIO,
FMT_VIDEO_ASPECT_RATIO,
FMT_VIDEO_FAST_FORWARD,
FMT_VIDEO_FRAME_SKIPPING,
FMT_VIDEO_GAME_SCREEN,
FMT_AUDIO_SOUND,
FMT_AUDIO_RETRO_SOUND,
FMT_SAVED_STATE_CREATE,
@ -92,6 +97,9 @@ enum MSG
MSG_VIDEO_FRAME_SKIPPING_9,
MSG_VIDEO_FRAME_SKIPPING_10,
MSG_VIDEO_GAME_SCREEN_TOP,
MSG_VIDEO_GAME_SCREEN_BOTTOM,
MSG_GENERAL_OFF,
MSG_GENERAL_ON,