* Changed WBFS stuff to C++ classes

* Fixed bug in http.c (where realloc *might* choose another address, thanks Dr. Clipper)
* Added support to /wbfs/Game Title [GAMEID].wbfs files (thanks oggzee)
* Fixed bug in cfg_cleanup when switching partitions
* Added BGM class again (for playing background music, requested by dimok)
* Added settings for background music again
* Fixed bug in MEM2 class (returning an invalid handle when no memory could be allocated, thanks to dimok)
* Updated DIP module to OpenDIP (report bugs with this one if you've found them, but report them here: http://github.com/spacemanspiff/odip-plugin)
* Added initial code for cios 222 rev5 (THIS DOES NOT WORK YET! DON'T FILE BUGS ON THIS ONE!)
* Added fatffs module by Hermes and Waninkoko (THIS DOES NOT WORK YET! DON'T FILE BUGS ON THIS ONE!)
* Fixed bug in Settings, which resulted in a crash when the partition was changed.
* Added caching for gamelist entries, so switching between different screens/sort options/display modes should be faster
* Changed defines in ehc_module, in order to prevent clashes with new defines in rev5
This commit is contained in:
e.bovendeur 2010-02-14 23:22:52 +00:00
parent 1a3eb7be08
commit e8f5ab07bd
83 changed files with 6653 additions and 1759 deletions

View File

@ -2,8 +2,8 @@
<app version="1">
<name> USB Loader GX</name>
<coder>USB Loader GX Team</coder>
<version>1.0 r910</version>
<release_date>201002091456</release_date>
<version>1.0 r911</version>
<release_date>201002141632</release_date>
<short_description>Loads games from USB-devices</short_description>
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: David Jelinek (djelinek@hotmail.com) \n"
"Language-Team: r823 - last version on http://djelinek.sweb.cz/_USBLoderGX/czech.lang \n"
@ -188,9 +188,6 @@ msgstr "Zpet do Wii nabídky"
msgid "Backgroundmusic"
msgstr "Hudba na pozadí"
msgid "Backgroundmusic Path changed."
msgstr "Cesta pro hudbu na pozadí zmenena"
msgid "Big thanks to:"
msgstr "Velké díky pro:"
@ -221,6 +218,9 @@ msgstr "Nelze smazat:"
msgid "Cancel"
msgstr "Zrušit"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Kanály"
@ -756,6 +756,12 @@ msgstr "Zamcení konzole"
msgid "Locked"
msgstr "Zamceno"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Zvuková smyčka"
@ -777,6 +783,9 @@ msgstr "Nejspíše má velikost, která není delitelná 4."
msgid "Mount DVD drive"
msgstr "Pripojit DVD mechaniku"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Hlasitost hudby"
@ -924,6 +933,18 @@ msgstr "Vyberte ze seznamu"
msgid "Play Count"
msgstr "Spušteno"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Cekejte prosím..."
@ -942,6 +963,9 @@ msgstr "Publikoval "
msgid "Quick Boot"
msgstr "Rychlé zavedení"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Nacítám WAD data... Ok!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Prejmenovat hru na WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Vynulovat cítac spuštení"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Restartuji..."
@ -1014,9 +1044,6 @@ msgstr "Zárí"
msgid "Set Search-Filter"
msgstr "Nastavit vyhledávací filtr"
msgid "Set as backgroundmusic?"
msgstr "Nastavit jako hudbu na pozadí?"
msgid "Settings"
msgstr "Nastavení"
@ -1348,6 +1375,12 @@ msgstr "z "
msgid "seconds left"
msgstr "sekund zbývá"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Cesta pro hudbu na pozadí zmenena"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Nastavit jako hudbu na pozadí?"
#~ msgid "The file is not a .wad"
#~ msgstr "Soubor není typu WAD"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: dorf[dk]\n"
"Language-Team: dorf[dk]\n"
@ -188,9 +188,6 @@ msgstr "Tilbage til HBC"
msgid "Backgroundmusic"
msgstr "Baggrundsmusik"
msgid "Backgroundmusic Path changed."
msgstr "Sti til baggrundsmusik ændret"
msgid "Big thanks to:"
msgstr "En stor tak til:"
@ -221,6 +218,9 @@ msgstr "Kan ikke slettes:"
msgid "Cancel"
msgstr "Annullér"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Kanaler"
@ -756,6 +756,12 @@ msgstr "Lås konsol"
msgid "Locked"
msgstr "Låst"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Afspil lyd i løkke"
@ -777,6 +783,9 @@ msgstr "Sandsynligvis har det dimensioner, der ikke er delelige med fire."
msgid "Mount DVD drive"
msgstr "Mount DVD-drev"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Lydstyrke"
@ -924,6 +933,18 @@ msgstr "Vælg fra en liste"
msgid "Play Count"
msgstr "Spiltæller"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Vent venligst..."
@ -942,6 +963,9 @@ msgstr "Udgivet af"
msgid "Quick Boot"
msgstr "Hurtig opstart"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Læser WAD-data... Ok!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Omdøb spil på WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Nulstil spiltæller"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Genstarter..."
@ -1014,9 +1044,6 @@ msgstr ""
msgid "Set Search-Filter"
msgstr "Søgefilter"
msgid "Set as backgroundmusic?"
msgstr "Indstil som baggrundsmusik?"
msgid "Settings"
msgstr "Indstillinger"
@ -1348,6 +1375,12 @@ msgstr "af"
msgid "seconds left"
msgstr "sekunder tilbage"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Sti til baggrundsmusik ændret"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Indstil som baggrundsmusik?"
#~ msgid "The file is not a .wad"
#~ msgstr "Filen er ikke en .WAD"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:22+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: glowy\n"
"Language-Team: tj_cool, glowy\n"
@ -188,9 +188,6 @@ msgstr "Terug naar Wii Menu"
msgid "Backgroundmusic"
msgstr "Achtergrondmuziek"
msgid "Backgroundmusic Path changed."
msgstr "Locatie achtergrondmuziek gewijzigd."
msgid "Big thanks to:"
msgstr "Grote dank aan:"
@ -221,6 +218,9 @@ msgstr "Kan niet verwijderen:"
msgid "Cancel"
msgstr "Annuleren"
msgid "Change Play Path"
msgstr "Verander afspeel locatie"
msgid "Channels"
msgstr "Kanalen"
@ -756,6 +756,12 @@ msgstr "Console vergrendelen"
msgid "Locked"
msgstr "Vergrendeld"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Geluid herhalen"
@ -777,6 +783,9 @@ msgstr "Waarschijnlijk zijn de afmetingen niet deelbaar door 4."
msgid "Mount DVD drive"
msgstr "DVD Laden"
msgid "Music Loop Mode"
msgstr "Muziek Herhaal Mode"
msgid "Music Volume"
msgstr "Muziekvolume"
@ -924,6 +933,18 @@ msgstr "Kiezen van lijst"
msgid "Play Count"
msgstr "Gespeeld"
msgid "Play Next"
msgstr "Speel Volgende"
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr "Speel Vorige"
msgid "Playing Music:"
msgstr "Speelt nu:"
msgid "Please wait..."
msgstr "Even geduld..."
@ -942,6 +963,9 @@ msgstr "Uitgegeven door"
msgid "Quick Boot"
msgstr "Snelle start"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "WAD data lezen... Ok!"
@ -960,9 +984,15 @@ msgstr "Verwijder update"
msgid "Rename Game on WBFS"
msgstr "Spel hernoemen op WBFS"
msgid "Reset BG Music"
msgstr "Reset achtergrond muziek"
msgid "Reset Playcounter"
msgstr "Speeltellers resetten"
msgid "Reset to standard BGM?"
msgstr "Reset naar standaard achtergrond muziek?"
msgid "Restarting..."
msgstr "Herstarten..."
@ -1014,9 +1044,6 @@ msgstr "Sep"
msgid "Set Search-Filter"
msgstr "Zoekfilter instellen"
msgid "Set as backgroundmusic?"
msgstr "Instellen als achtergrondmuziek?"
msgid "Settings"
msgstr "Instellingen"
@ -1348,6 +1375,12 @@ msgstr "van"
msgid "seconds left"
msgstr "seconden over"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Locatie achtergrondmuziek gewijzigd."
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Instellen als achtergrondmuziek?"
#~ msgid "The file is not a .wad"
#~ msgstr "Dit is geen .wad bestand"
@ -1357,30 +1390,9 @@ msgstr "seconden over"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "Je gebruikt het NTFS bestandssysteem. Door mogelijke schrijffouten naar een NTFS partitie, is een spel installeren niet mogelijk."
#~ msgid "Change Play Path"
#~ msgstr "Verander afspeel locatie"
#~ msgid "Music Loop Mode"
#~ msgstr "Muziek Herhaal Mode"
#~ msgid "Partition Format Menu"
#~ msgstr "Partitie Formatteer Menu"
#~ msgid "Play Next"
#~ msgstr "Speel Volgende"
#~ msgid "Play Previous"
#~ msgstr "Speel Vorige"
#~ msgid "Playing Music:"
#~ msgstr "Speelt nu:"
#~ msgid "Reset BG Music"
#~ msgstr "Reset achtergrond muziek"
#~ msgid "Reset to standard BGM?"
#~ msgstr "Reset naar standaard achtergrond muziek?"
#~ msgid "Unlock the app first."
#~ msgstr "Geef app eerst vrij."

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -188,9 +188,6 @@ msgstr ""
msgid "Backgroundmusic"
msgstr ""
msgid "Backgroundmusic Path changed."
msgstr ""
msgid "Big thanks to:"
msgstr ""
@ -221,6 +218,9 @@ msgstr ""
msgid "Cancel"
msgstr ""
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr ""
@ -756,6 +756,12 @@ msgstr ""
msgid "Locked"
msgstr ""
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr ""
@ -777,6 +783,9 @@ msgstr ""
msgid "Mount DVD drive"
msgstr ""
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr ""
@ -924,6 +933,18 @@ msgstr ""
msgid "Play Count"
msgstr ""
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr ""
@ -942,6 +963,9 @@ msgstr ""
msgid "Quick Boot"
msgstr ""
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr ""
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr ""
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr ""
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr ""
@ -1014,9 +1044,6 @@ msgstr ""
msgid "Set Search-Filter"
msgstr ""
msgid "Set as backgroundmusic?"
msgstr ""
msgid "Settings"
msgstr ""

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: c64rmx\n"
"Language-Team: \n"
@ -188,9 +188,6 @@ msgstr "Takaisin Wii Menuun"
msgid "Backgroundmusic"
msgstr "Taustamusiikki"
msgid "Backgroundmusic Path changed."
msgstr "Taustamusiikin polku muutettu"
msgid "Big thanks to:"
msgstr "Isot kiitokset:"
@ -221,6 +218,9 @@ msgstr "Ei voida poistaa:"
msgid "Cancel"
msgstr "Peruuta"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr ""
@ -756,6 +756,12 @@ msgstr "Lukitse konsoli"
msgid "Locked"
msgstr "Lukittu"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr ""
@ -777,6 +783,9 @@ msgstr "Todennäköisesti sisältää ulottuvuuksia jotka eivät ole jaollisia n
msgid "Mount DVD drive"
msgstr ""
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Voimakkuus"
@ -924,6 +933,18 @@ msgstr "Valitse listasta"
msgid "Play Count"
msgstr "Pelauksen määrä"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr ""
@ -942,6 +963,9 @@ msgstr "Julkaisu:"
msgid "Quick Boot"
msgstr ""
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Luetaan WAD:ia... Ok!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Uudelleennimeä peli"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Resetoi pelauksen määrä"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Boottaa..."
@ -1014,9 +1044,6 @@ msgstr "syys"
msgid "Set Search-Filter"
msgstr ""
msgid "Set as backgroundmusic?"
msgstr "Aseta taustamusiikiksi?"
msgid "Settings"
msgstr "Asetukset"
@ -1348,6 +1375,12 @@ msgstr "josta"
msgid "seconds left"
msgstr "sekuntia jäljellä"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Taustamusiikin polku muutettu"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Aseta taustamusiikiksi?"
#~ msgid "The file is not a .wad"
#~ msgstr "Tiedosto ei ole .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Kin8\n"
"Language-Team: Badablek, Amour, ikya & Kin8\n"
@ -188,9 +188,6 @@ msgstr "Retour Menu Wii"
msgid "Backgroundmusic"
msgstr "Fond sonore"
msgid "Backgroundmusic Path changed."
msgstr "Dossier fond sonore modifié."
msgid "Big thanks to:"
msgstr "Grand merci à:"
@ -221,6 +218,9 @@ msgstr "Impossible de supprimer:"
msgid "Cancel"
msgstr "Annuler"
msgid "Change Play Path"
msgstr "Changer Dossier"
msgid "Channels"
msgstr "Chaînes"
@ -756,6 +756,12 @@ msgstr "Verrouiller la console"
msgid "Locked"
msgstr "Clic pour déverrouiller"
msgid "Loop Directory"
msgstr "Répéter Dossier"
msgid "Loop Music"
msgstr "Répéter Musique"
msgid "Loop Sound"
msgstr "Son en boucle"
@ -777,6 +783,9 @@ msgstr "Il est fort probable que les dimensions ne soient pas des multiples de 4
msgid "Mount DVD drive"
msgstr "Lancer DVD"
msgid "Music Loop Mode"
msgstr "Mode Boucle Musique"
msgid "Music Volume"
msgstr "Volume Musique"
@ -924,6 +933,18 @@ msgstr "Sélectionner"
msgid "Play Count"
msgstr "Utilisation"
msgid "Play Next"
msgstr "Jouer Suiv."
msgid "Play Once"
msgstr "Jouer 1 fois"
msgid "Play Previous"
msgstr "Jouer Précéd."
msgid "Playing Music:"
msgstr "Musique Actuelle:"
msgid "Please wait..."
msgstr "Veuillez patienter..."
@ -942,6 +963,9 @@ msgstr "Publié par"
msgid "Quick Boot"
msgstr "Démarrage rapide"
msgid "Random Directory Music"
msgstr "Aléatoire"
msgid "Reading WAD data... Ok!"
msgstr "Lecture données WAD... OK!"
@ -960,9 +984,15 @@ msgstr "Supprimer Mise à Jour"
msgid "Rename Game on WBFS"
msgstr "Renommer un jeu"
msgid "Reset BG Music"
msgstr "Reset"
msgid "Reset Playcounter"
msgstr "Reset Utilisation du Jeu"
msgid "Reset to standard BGM?"
msgstr "Restaurer fond sonore standard ?"
msgid "Restarting..."
msgstr "Redémarrage..."
@ -1014,9 +1044,6 @@ msgstr ""
msgid "Set Search-Filter"
msgstr "Filtre de Recherche"
msgid "Set as backgroundmusic?"
msgstr "Utiliser comme fond sonore ?"
msgid "Settings"
msgstr "Paramètres"
@ -1348,48 +1375,21 @@ msgstr "sur"
msgid "seconds left"
msgstr "secondes restantes"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Dossier fond sonore modifié."
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Utiliser comme fond sonore ?"
#~ msgid "Install not possible"
#~ msgstr "Installation impossible"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "Le système de fichier NTFS est utilisé. En raison à de possibles erreurs d'écriture sur une partition de NTFS, l'installation d'un jeu est impossible."
#~ msgid "Change Play Path"
#~ msgstr "Changer Dossier"
#~ msgid "Loop Directory"
#~ msgstr "Répéter Dossier"
#~ msgid "Loop Music"
#~ msgstr "Répéter Musique"
#~ msgid "Music Loop Mode"
#~ msgstr "Mode Boucle Musique"
#~ msgid "Partition Format Menu"
#~ msgstr "Menu Formatage Partition"
#~ msgid "Play Next"
#~ msgstr "Jouer Suiv."
#~ msgid "Play Once"
#~ msgstr "Jouer 1 fois"
#~ msgid "Play Previous"
#~ msgstr "Jouer Précéd."
#~ msgid "Playing Music:"
#~ msgstr "Musique Actuelle:"
#~ msgid "Random Directory Music"
#~ msgstr "Aléatoire"
#~ msgid "Reset BG Music"
#~ msgstr "Reset"
#~ msgid "Reset to standard BGM?"
#~ msgstr "Restaurer fond sonore standard ?"
#~ msgid "Unlock the app first."
#~ msgstr "Déverrouillage nécessaire."

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-09 16:02+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: ZEN.13\n"
"Language-Team: Snoozer, wishmasterf, Bertilax, ZEN.13\n"
@ -188,9 +188,6 @@ msgstr "Wii Menü"
msgid "Backgroundmusic"
msgstr "Hintergrundmusik"
msgid "Backgroundmusic Path changed."
msgstr "Pfad geändert"
msgid "Big thanks to:"
msgstr "Großen Dank an:"
@ -221,6 +218,9 @@ msgstr "Löschen fehlgeschlagen:"
msgid "Cancel"
msgstr "Abbrechen"
msgid "Change Play Path"
msgstr "Pfad ändern"
msgid "Channels"
msgstr "Kanäle"
@ -756,6 +756,12 @@ msgstr "Konsole sperren"
msgid "Locked"
msgstr "gesperrt"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Schleife"
@ -777,6 +783,9 @@ msgstr "Höchstwahrscheinlich sind Breite und Höhe keine Vielfachen von 4."
msgid "Mount DVD drive"
msgstr "Spiel starten"
msgid "Music Loop Mode"
msgstr "Wiederholungsmodus"
msgid "Music Volume"
msgstr "Musik Lautstärke"
@ -924,6 +933,18 @@ msgstr "Wähle aus Liste"
msgid "Play Count"
msgstr "Spielzähler"
msgid "Play Next"
msgstr "Nächster Titel"
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr "Vorheriger Titel"
msgid "Playing Music:"
msgstr "Aktuelle Musik:"
msgid "Please wait..."
msgstr "Bitte warten..."
@ -942,6 +963,9 @@ msgstr "Veröffentlicht von"
msgid "Quick Boot"
msgstr "Schnelles Laden"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Lese WAD Daten... OK!"
@ -960,9 +984,15 @@ msgstr "Update entfernen"
msgid "Rename Game on WBFS"
msgstr "Spiel umbenennen"
msgid "Reset BG Music"
msgstr "Musik zurücksetzen"
msgid "Reset Playcounter"
msgstr "Spielzähler zurücksetzen"
msgid "Reset to standard BGM?"
msgstr "Auf Standard-Hintergrundmusik zurücksetzen?"
msgid "Restarting..."
msgstr "Damit die neue Version benutzt werden kann, muss der Loader neu gestartet werden."
@ -1014,9 +1044,6 @@ msgstr "September"
msgid "Set Search-Filter"
msgstr "Suche"
msgid "Set as backgroundmusic?"
msgstr "Als Hintergrundmusik verwenden?"
msgid "Settings"
msgstr "Einstellungen"
@ -1348,6 +1375,12 @@ msgstr "von"
msgid "seconds left"
msgstr "Sekunden verbleiben"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Pfad geändert"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Als Hintergrundmusik verwenden?"
#~ msgid "The file is not a .wad"
#~ msgstr "Die Datei ist keine .wad"
@ -1357,30 +1390,9 @@ msgstr "Sekunden verbleiben"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "Du benutzt das NTFS Dateisystem. Wegen möglicher Schreibfehler auf einer NTFS Partition, ist das Installieren eines Spiels nicht möglich."
#~ msgid "Change Play Path"
#~ msgstr "Pfad ändern"
#~ msgid "Music Loop Mode"
#~ msgstr "Wiederholungsmodus"
#~ msgid "Partition Format Menu"
#~ msgstr "Partitionen Formatierungs-Menü"
#~ msgid "Play Next"
#~ msgstr "Nächster Titel"
#~ msgid "Play Previous"
#~ msgstr "Vorheriger Titel"
#~ msgid "Playing Music:"
#~ msgstr "Aktuelle Musik:"
#~ msgid "Reset BG Music"
#~ msgstr "Musik zurücksetzen"
#~ msgid "Reset to standard BGM?"
#~ msgstr "Auf Standard-Hintergrundmusik zurücksetzen?"
#~ msgid "Unlock the app first."
#~ msgstr "Entsperre zuerst den Loader."

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-12-29 11:05+0100\n"
"Last-Translator: Springdale\n"
"Language-Team: Tusk, Springdale\n"
@ -188,9 +188,6 @@ msgstr "Visszatérés a Wii Menübe"
msgid "Backgroundmusic"
msgstr "Háttérzene"
msgid "Backgroundmusic Path changed."
msgstr "Háttérzene útvonala megváltozott."
msgid "Big thanks to:"
msgstr "Köszönet:"
@ -221,6 +218,9 @@ msgstr "Nem törölhetõ"
msgid "Cancel"
msgstr "Mégse"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Csatornák"
@ -756,6 +756,12 @@ msgstr "Konzol Lezárása"
msgid "Locked"
msgstr "Lezárva"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Folyamatos hang"
@ -777,6 +783,9 @@ msgstr "Vélhetõen méretei nem oszhatók 4-gyel."
msgid "Mount DVD drive"
msgstr "DVD meghajtó felcsatolása"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Zene Hangerõ"
@ -924,6 +933,18 @@ msgstr "Válassz a listából"
msgid "Play Count"
msgstr "Indítások"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Kérlek várj..."
@ -942,6 +963,9 @@ msgstr "Kiadta"
msgid "Quick Boot"
msgstr "Gyors Boot"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "WAD adat olvasás... Ok!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "WBFS játék átnevezése"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Elindítások nullázása"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Újraindítás..."
@ -1014,9 +1044,6 @@ msgstr "Szep"
msgid "Set Search-Filter"
msgstr "Keresés"
msgid "Set as backgroundmusic?"
msgstr "Beállítod háttérzenének?"
msgid "Settings"
msgstr "Beállítások"
@ -1348,6 +1375,12 @@ msgstr "./"
msgid "seconds left"
msgstr "hátralévõ másodperc"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Háttérzene útvonala megváltozott."
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Beállítod háttérzenének?"
#~ msgid "The file is not a .wad"
#~ msgstr "A fájl nem .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Cambo \n"
"Language-Team: FoxeJoe, Cambo\n"
@ -188,9 +188,6 @@ msgstr "Torna al Menu Wii"
msgid "Backgroundmusic"
msgstr "Musica Sottofondo"
msgid "Backgroundmusic Path changed."
msgstr "Percorso Musica modificato"
msgid "Big thanks to:"
msgstr "Grazie mille a:"
@ -221,6 +218,9 @@ msgstr "Impossibile eliminare:"
msgid "Cancel"
msgstr "Annulla"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Canali"
@ -756,6 +756,12 @@ msgstr "Blocco Console"
msgid "Locked"
msgstr "Bloccato"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Suono Ripetuto"
@ -777,6 +783,9 @@ msgstr "Molto probabilmente le dimensioni non sono divisibili per 4."
msgid "Mount DVD drive"
msgstr "Avvia DVD"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Volume"
@ -924,6 +933,18 @@ msgstr "Seleziona da un elenco"
msgid "Play Count"
msgstr "Giocati"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Attendere prego..."
@ -942,6 +963,9 @@ msgstr "Pubblicato da"
msgid "Quick Boot"
msgstr "Avvio Veloce"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Sto leggendo i dati del WAD... Ok!"
@ -960,9 +984,15 @@ msgstr "Rimuovi aggiornamento"
msgid "Rename Game on WBFS"
msgstr "Rinomina Gioco su WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Azzera contatore"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Premere OK per riavviare..."
@ -1014,9 +1044,6 @@ msgstr "settembre"
msgid "Set Search-Filter"
msgstr "Cerca Gioco"
msgid "Set as backgroundmusic?"
msgstr "Imposto come Musica Sottofondo?"
msgid "Settings"
msgstr "Impostazioni"
@ -1348,6 +1375,12 @@ msgstr "di"
msgid "seconds left"
msgstr "secondi mancanti"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Percorso Musica modificato"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Imposto come Musica Sottofondo?"
#~ msgid "The file is not a .wad"
#~ msgstr "Non è un file .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: hosigumayuugi\n"
"Language-Team: hosigumayuugi\n"
@ -188,9 +188,6 @@ msgstr "Wiiメニューへ"
msgid "Backgroundmusic"
msgstr "BGM"
msgid "Backgroundmusic Path changed."
msgstr "BGMのパスを変更しました"
msgid "Big thanks to:"
msgstr "協力:"
@ -221,6 +218,9 @@ msgstr "削除できません"
msgid "Cancel"
msgstr "キャンセル"
msgid "Change Play Path"
msgstr "プレイパスを変更"
msgid "Channels"
msgstr "チャンネル"
@ -756,6 +756,12 @@ msgstr "GXをロック"
msgid "Locked"
msgstr "ロックされています"
msgid "Loop Directory"
msgstr "フォルダ内でループ"
msgid "Loop Music"
msgstr "ループさせる"
msgid "Loop Sound"
msgstr "ループさせる"
@ -777,6 +783,9 @@ msgstr "4で割り切れない寸法があります"
msgid "Mount DVD drive"
msgstr "DVDを起動"
msgid "Music Loop Mode"
msgstr "ループ機能"
msgid "Music Volume"
msgstr "BGMの音量"
@ -924,6 +933,18 @@ msgstr "リストから選択"
msgid "Play Count"
msgstr "プレイ回数"
msgid "Play Next"
msgstr "次へ"
msgid "Play Once"
msgstr "一度だけ再生"
msgid "Play Previous"
msgstr "前へ"
msgid "Playing Music:"
msgstr "再生中"
msgid "Please wait..."
msgstr "しばらくお待ちください"
@ -942,6 +963,9 @@ msgstr "発売元:"
msgid "Quick Boot"
msgstr "ワンボタン起動"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "WADデータの読み込み...成功!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "WBFS内のゲーム名を変更"
msgid "Reset BG Music"
msgstr "BGMをリセット"
msgid "Reset Playcounter"
msgstr "プレイ回数をリセット"
msgid "Reset to standard BGM?"
msgstr "BGMを初期状態に戻しますか?"
msgid "Restarting..."
msgstr "再起動します"
@ -1014,9 +1044,6 @@ msgstr "9月"
msgid "Set Search-Filter"
msgstr "検索"
msgid "Set as backgroundmusic?"
msgstr "BGMに設定しますか"
msgid "Settings"
msgstr "設定"
@ -1348,6 +1375,12 @@ msgstr "中"
msgid "seconds left"
msgstr "秒で完了"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "BGMのパスを変更しました"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "BGMに設定しますか"
#~ msgid "The file is not a .wad"
#~ msgstr "WADファイルではありません"
@ -1357,39 +1390,9 @@ msgstr "秒で完了"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "NTFS領域にインストール中にエラーが発生するとインストールに失敗します"
#~ msgid "Change Play Path"
#~ msgstr "プレイパスを変更"
#~ msgid "Loop Directory"
#~ msgstr "フォルダ内でループ"
#~ msgid "Loop Music"
#~ msgstr "ループさせる"
#~ msgid "Music Loop Mode"
#~ msgstr "ループ機能"
#~ msgid "Partition Format Menu"
#~ msgstr "初期化メニュー"
#~ msgid "Play Next"
#~ msgstr "次へ"
#~ msgid "Play Once"
#~ msgstr "一度だけ再生"
#~ msgid "Play Previous"
#~ msgstr "前へ"
#~ msgid "Playing Music:"
#~ msgstr "再生中"
#~ msgid "Reset BG Music"
#~ msgstr "BGMをリセット"
#~ msgid "Reset to standard BGM?"
#~ msgstr "BGMを初期状態に戻しますか?"
#~ msgid "Unlock the app first."
#~ msgstr "先にロックを解除してください"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: nextos@korea.com\n"
"Language-Team: \n"
@ -188,9 +188,6 @@ msgstr "Wii 메뉴로 놀아가기"
msgid "Backgroundmusic"
msgstr "배경음악"
msgid "Backgroundmusic Path changed."
msgstr "배경음악 경로 변경됨."
msgid "Big thanks to:"
msgstr "감사 :"
@ -221,6 +218,9 @@ msgstr "삭제할 수 없습니다:"
msgid "Cancel"
msgstr "취소"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr ""
@ -756,6 +756,12 @@ msgstr "콘솔 잠금"
msgid "Locked"
msgstr "잠김"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr ""
@ -777,6 +783,9 @@ msgstr "대부분 이미지는 4로 나누어져야 되요."
msgid "Mount DVD drive"
msgstr ""
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "음량"
@ -924,6 +933,18 @@ msgstr "리스트로 부터 고르기"
msgid "Play Count"
msgstr "실행 횟수"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr ""
@ -942,6 +963,9 @@ msgstr "출판자"
msgid "Quick Boot"
msgstr "게임 바로실행"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "WAD 데이터 읽기... 성공!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "WBFS에서 게임 이름 변경"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "실행횟수 리셋"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "재시작..."
@ -1014,9 +1044,6 @@ msgstr "9월"
msgid "Set Search-Filter"
msgstr ""
msgid "Set as backgroundmusic?"
msgstr "벼경음악 설정?"
msgid "Settings"
msgstr "설정"
@ -1348,6 +1375,12 @@ msgstr "중"
msgid "seconds left"
msgstr "초 남았습니다"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "배경음악 경로 변경됨."
#~ msgid "Set as backgroundmusic?"
#~ msgstr "벼경음악 설정?"
#~ msgid "The file is not a .wad"
#~ msgstr "화일이 .wad 아님"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: raschi\n"
"Language-Team: raschi\n"
@ -188,9 +188,6 @@ msgstr "Wii meny"
msgid "Backgroundmusic"
msgstr "Bakgrunnsmusikk"
msgid "Backgroundmusic Path changed."
msgstr "Bakgrunnsmusikk sti endret"
msgid "Big thanks to:"
msgstr "Stor takk til:"
@ -221,6 +218,9 @@ msgstr "Kan ikke slette:"
msgid "Cancel"
msgstr "Avbryt"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Kanaler"
@ -756,6 +756,12 @@ msgstr "Lås konsoll"
msgid "Locked"
msgstr "Låst"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr ""
@ -777,6 +783,9 @@ msgstr "Sannsynligvis har bildet dimensjoner som ikke kan deles med 4."
msgid "Mount DVD drive"
msgstr "Last DVD stasjon"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Musikk volum"
@ -924,6 +933,18 @@ msgstr "Velg fra liste"
msgid "Play Count"
msgstr "Ganger spilt"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Vennligst vent..."
@ -942,6 +963,9 @@ msgstr "Publisert av"
msgid "Quick Boot"
msgstr "Hurtig start"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Leser WAD data... OK!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Gi nytt navn til spill på WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Nullstill teller"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Starter på nytt..."
@ -1014,9 +1044,6 @@ msgstr "Sep"
msgid "Set Search-Filter"
msgstr "Angi søkefilter"
msgid "Set as backgroundmusic?"
msgstr "Bruk som bakgrunnsmusikk?"
msgid "Settings"
msgstr "Innstillinger"
@ -1348,6 +1375,12 @@ msgstr "av"
msgid "seconds left"
msgstr "sekunder gjenstår"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Bakgrunnsmusikk sti endret"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Bruk som bakgrunnsmusikk?"
#~ msgid "The file is not a .wad"
#~ msgstr "Denne filen er ikke en .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: ziom666 (zadania_prog@vp.pl)\n"
"Language-Team: \n"
@ -188,9 +188,6 @@ msgstr "Powrit do Wii Menu"
msgid "Backgroundmusic"
msgstr "Muzyka w tle"
msgid "Backgroundmusic Path changed."
msgstr "Sciezka do muzyki w tle zmieniona"
msgid "Big thanks to:"
msgstr "Podziekowania dla"
@ -221,6 +218,9 @@ msgstr "Nie mozna usunac"
msgid "Cancel"
msgstr "Anuluj"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Kanaly"
@ -756,6 +756,12 @@ msgstr "Zablokuj konsole"
msgid "Locked"
msgstr "Zablokowano"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Zapetl dzwieki"
@ -777,6 +783,9 @@ msgstr "Prawdopodobnie rozdzielczosc nie jest podzielna przez 4"
msgid "Mount DVD drive"
msgstr "Uruchom naped DVD"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Poziom glosnosci"
@ -924,6 +933,18 @@ msgstr "Wybierz z listy"
msgid "Play Count"
msgstr "Licznik"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Prosze czekac..."
@ -942,6 +963,9 @@ msgstr ""
msgid "Quick Boot"
msgstr "Szybkie ladowanie"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Odczyt danych WAD...Ok!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Zmien tytul gry na WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Zrestartuj licznik"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Restartowanie..."
@ -1014,9 +1044,6 @@ msgstr "Wrzesien"
msgid "Set Search-Filter"
msgstr "Ustaw filtr wyszukiwania"
msgid "Set as backgroundmusic?"
msgstr "Ustawic jako muzyke w tle?"
msgid "Settings"
msgstr "Ustawienia"
@ -1348,6 +1375,12 @@ msgstr "z"
msgid "seconds left"
msgstr "sekund pozostalo"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Sciezka do muzyki w tle zmieniona"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Ustawic jako muzyke w tle?"
#~ msgid "The file is not a .wad"
#~ msgstr "To nie plik .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-23 18:52+0200\n"
"Last-Translator: boto12\n"
"Language-Team: boto12\n"
@ -188,9 +188,6 @@ msgstr "Menu do Wii"
msgid "Backgroundmusic"
msgstr "Música de fundo"
msgid "Backgroundmusic Path changed."
msgstr "Pasta Música Fundo modificada"
msgid "Big thanks to:"
msgstr "Agradecimentos:"
@ -221,6 +218,9 @@ msgstr "Não foi possível apagar:"
msgid "Cancel"
msgstr "Cancelar"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Canais"
@ -756,6 +756,12 @@ msgstr "Bloquear Configurações"
msgid "Locked"
msgstr "Bloqueado"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr ""
@ -777,6 +783,9 @@ msgstr "Provável que o tamanho não seja divisível por 4."
msgid "Mount DVD drive"
msgstr "Carregar leitor DVD"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Volume da Música"
@ -924,6 +933,18 @@ msgstr "Escolher da lista"
msgid "Play Count"
msgstr "Vezes jogadas"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Por favor aguarde..."
@ -942,6 +963,9 @@ msgstr "Publicado por"
msgid "Quick Boot"
msgstr "Inicialização Rápida"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Lendo dados do WAD... Ok!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Alterar nome do jogo na partição WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Limpar Contagem"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "O Wii irá reiniciar"
@ -1014,9 +1044,6 @@ msgstr "Set"
msgid "Set Search-Filter"
msgstr "Usar filtro de busca"
msgid "Set as backgroundmusic?"
msgstr "Definir como música de fundo?"
msgid "Settings"
msgstr "Configurações"
@ -1348,6 +1375,12 @@ msgstr "de"
msgid "seconds left"
msgstr "segundos restantes"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Pasta Música Fundo modificada"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Definir como música de fundo?"
#~ msgid "The file is not a .wad"
#~ msgstr "O arquivo não é um .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2010-02-01 18:10-0000\n"
"Last-Translator: Sky8000\n"
"Language-Team: Sky8000 <sky8000@hotmail.com>\n"
@ -188,9 +188,6 @@ msgstr "Menu da Wii"
msgid "Backgroundmusic"
msgstr "Música de fundo"
msgid "Backgroundmusic Path changed."
msgstr "Pasta Música Fundo alterada"
msgid "Big thanks to:"
msgstr "Agradecimentos:"
@ -221,6 +218,9 @@ msgstr "Não foi possível apagar:"
msgid "Cancel"
msgstr "Cancelar"
msgid "Change Play Path"
msgstr "Alterar Pasta de Músicas"
msgid "Channels"
msgstr "Canais"
@ -756,6 +756,12 @@ msgstr "Bloquear Configurações"
msgid "Locked"
msgstr "Bloqueado"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Repetir Sons"
@ -777,6 +783,9 @@ msgstr "O mais provável é que o tamanho não seja divisível por 4."
msgid "Mount DVD drive"
msgstr "Montar Unidade de DVD"
msgid "Music Loop Mode"
msgstr "Modo de Repetição"
msgid "Music Volume"
msgstr "Volume Música"
@ -924,6 +933,18 @@ msgstr "Escolher da lista"
msgid "Play Count"
msgstr "Vezes jogadas"
msgid "Play Next"
msgstr "Próxima"
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr "Anterior"
msgid "Playing Music:"
msgstr "Reproduzindo:"
msgid "Please wait..."
msgstr "Por favor aguarde..."
@ -942,6 +963,9 @@ msgstr "Publicado por"
msgid "Quick Boot"
msgstr "Arranque Rápido"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Lendo dados do WAD... Ok!"
@ -960,9 +984,15 @@ msgstr "Remover actualização"
msgid "Rename Game on WBFS"
msgstr "Alterar nome do jogo (WBFS)"
msgid "Reset BG Music"
msgstr "Repor Música de Fundo"
msgid "Reset Playcounter"
msgstr "Limpar Contagem"
msgid "Reset to standard BGM?"
msgstr "Repor Musica de Fundo predefinida?"
msgid "Restarting..."
msgstr "A Wii irá reiniciar"
@ -1014,9 +1044,6 @@ msgstr "Set"
msgid "Set Search-Filter"
msgstr "Filtro de pesquisa"
msgid "Set as backgroundmusic?"
msgstr "Definir como música de fundo?"
msgid "Settings"
msgstr "Configurações"
@ -1348,6 +1375,12 @@ msgstr "de"
msgid "seconds left"
msgstr "segundos restantes"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Pasta Música Fundo alterada"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Definir como música de fundo?"
#~ msgid "The file is not a .wad"
#~ msgstr "O ficheiro não é um .wad"
@ -1357,30 +1390,9 @@ msgstr "segundos restantes"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "Está a utilizar um sistema de ficheiros NTFS. Devido à possibilidade de ocorrerem erros na gravação não será possível instalar jogos."
#~ msgid "Change Play Path"
#~ msgstr "Alterar Pasta de Músicas"
#~ msgid "Music Loop Mode"
#~ msgstr "Modo de Repetição"
#~ msgid "Partition Format Menu"
#~ msgstr "Menu de Formatação de Partição"
#~ msgid "Play Next"
#~ msgstr "Próxima"
#~ msgid "Play Previous"
#~ msgstr "Anterior"
#~ msgid "Playing Music:"
#~ msgstr "Reproduzindo:"
#~ msgid "Reset BG Music"
#~ msgstr "Repor Música de Fundo"
#~ msgid "Reset to standard BGM?"
#~ msgstr "Repor Musica de Fundo predefinida?"
#~ msgid "Unlock the app first."
#~ msgstr "Desbloquear aplicação primeiro."

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: nikolai_ca\n"
"Language-Team: Kir, alendit, nikolai_ca\n"
@ -188,9 +188,6 @@ msgstr "Вернуться в меню Wii"
msgid "Backgroundmusic"
msgstr "Фоновая музыка"
msgid "Backgroundmusic Path changed."
msgstr "Путь к фоновой музыке изменен."
msgid "Big thanks to:"
msgstr "Большое спасибо:"
@ -221,6 +218,9 @@ msgstr "Невозможно удалить:"
msgid "Cancel"
msgstr "Отмена"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Каналы"
@ -756,6 +756,12 @@ msgstr "Заблокировать консоль"
msgid "Locked"
msgstr "Заблокировано"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Зациклить звут"
@ -777,6 +783,9 @@ msgstr "Размеры картинки не делятся на 4. Поздра
msgid "Mount DVD drive"
msgstr "Монтировать DVD"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Громкость"
@ -924,6 +933,18 @@ msgstr "Выберите из списка"
msgid "Play Count"
msgstr "Запущено раз"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Пожалуйста подождите..."
@ -942,6 +963,9 @@ msgstr "Опубликовано: "
msgid "Quick Boot"
msgstr "Быстрая загрузка"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Чтение данных WAD... ОК!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Переименовать игры в WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Сбросить счетчик запусков"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Перезапускаю..."
@ -1014,9 +1044,6 @@ msgstr "Сен"
msgid "Set Search-Filter"
msgstr "Установить фильтр для поиска"
msgid "Set as backgroundmusic?"
msgstr "установить как фоновую музыку"
msgid "Settings"
msgstr "Установки"
@ -1348,6 +1375,12 @@ msgstr "из"
msgid "seconds left"
msgstr "секунд осталось"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Путь к фоновой музыке изменен."
#~ msgid "Set as backgroundmusic?"
#~ msgstr "установить как фоновую музыку"
#~ msgid "The file is not a .wad"
#~ msgstr "Это не файл .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: knife.hu kavid\n"
"Language-Team: kavid\n"
@ -188,9 +188,6 @@ msgstr "返回 Wii 系统菜单"
msgid "Backgroundmusic"
msgstr "背景音乐"
msgid "Backgroundmusic Path changed."
msgstr "背景音乐路径已变更"
msgid "Big thanks to:"
msgstr "非常感谢:"
@ -221,6 +218,9 @@ msgstr "无法删除:"
msgid "Cancel"
msgstr "取消"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "频道"
@ -756,6 +756,12 @@ msgstr "锁定控制台"
msgid "Locked"
msgstr "已锁定"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr ""
@ -777,6 +783,9 @@ msgstr "图片格式错误,可能它的尺寸不是 4 的倍数."
msgid "Mount DVD drive"
msgstr "挂载DVD光驱"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "音量"
@ -924,6 +933,18 @@ msgstr "从列表中选取"
msgid "Play Count"
msgstr "游戏计数"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "请等待..."
@ -942,6 +963,9 @@ msgstr "发行"
msgid "Quick Boot"
msgstr "快速启动"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "读取 WAD 数据... 完成!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "改变 WBFS (硬盘)上的游戏名称"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "重置游戏计数"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "重启中..."
@ -1014,9 +1044,6 @@ msgstr "九月"
msgid "Set Search-Filter"
msgstr "设置搜索过滤器"
msgid "Set as backgroundmusic?"
msgstr "设置成背景音乐?"
msgid "Settings"
msgstr "设置"
@ -1348,6 +1375,12 @@ msgstr "的"
msgid "seconds left"
msgstr "剩余秒数"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "背景音乐路径已变更"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "设置成背景音乐?"
#~ msgid "The file is not a .wad"
#~ msgstr "这不是一个 WAD 文件"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: SirPalax\n"
"Language-Team: Penn, SirPalax\n"
@ -188,9 +188,6 @@ msgstr "Volver a Menú Wii"
msgid "Backgroundmusic"
msgstr "Música de fondo"
msgid "Backgroundmusic Path changed."
msgstr "Ruta de Música de fondo cambiada"
msgid "Big thanks to:"
msgstr "Gracias a:"
@ -221,6 +218,9 @@ msgstr "No se eliminó:"
msgid "Cancel"
msgstr "Cancelar"
msgid "Change Play Path"
msgstr "Cambiar Ruta"
msgid "Channels"
msgstr "Canales"
@ -756,6 +756,12 @@ msgstr "Bloquear consola"
msgid "Locked"
msgstr "Bloqueada"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Bucle de sonido"
@ -777,6 +783,9 @@ msgstr "Probablemente, las dimensiones no sean múltiplo de 4."
msgid "Mount DVD drive"
msgstr "Montar unidad DVD"
msgid "Music Loop Mode"
msgstr "Modo Bucle Musical"
msgid "Music Volume"
msgstr "Volumen de la Música"
@ -924,6 +933,18 @@ msgstr "Elegir de una lista"
msgid "Play Count"
msgstr "Partidas"
msgid "Play Next"
msgstr "Oír Siguiente"
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr "Oír Anterior"
msgid "Playing Music:"
msgstr "Reproducción Musical:"
msgid "Please wait..."
msgstr "Por favor, espera..."
@ -942,6 +963,9 @@ msgstr "Publicado por"
msgid "Quick Boot"
msgstr "Inicio Rápido"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Leyendo datos del WAD... ¡Correcto!"
@ -960,9 +984,15 @@ msgstr "Quitar actualización"
msgid "Rename Game on WBFS"
msgstr "Renombrar juego en WBFS"
msgid "Reset BG Music"
msgstr "Reiniciar Música de Fondo"
msgid "Reset Playcounter"
msgstr "Reiniciar Partidas"
msgid "Reset to standard BGM?"
msgstr "¿Poner la Música por defecto?"
msgid "Restarting..."
msgstr "Reiniciando..."
@ -1014,9 +1044,6 @@ msgstr ""
msgid "Set Search-Filter"
msgstr "Usar filtro de búsqueda"
msgid "Set as backgroundmusic?"
msgstr "¿Poner como música de fondo?"
msgid "Settings"
msgstr "Configuración"
@ -1348,6 +1375,12 @@ msgstr "de"
msgid "seconds left"
msgstr "segundos restantes"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Ruta de Música de fondo cambiada"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "¿Poner como música de fondo?"
#~ msgid "The file is not a .wad"
#~ msgstr "El archivo no es un .wad"
@ -1357,30 +1390,9 @@ msgstr "segundos restantes"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "Estás utilizando un sistema de archivos NTFS. Debido a posibles errores de escritura en la partición NTFS, la instalación del juego es imposible."
#~ msgid "Change Play Path"
#~ msgstr "Cambiar Ruta"
#~ msgid "Music Loop Mode"
#~ msgstr "Modo Bucle Musical"
#~ msgid "Partition Format Menu"
#~ msgstr "Menú Formatear Partición"
#~ msgid "Play Next"
#~ msgstr "Oír Siguiente"
#~ msgid "Play Previous"
#~ msgstr "Oír Anterior"
#~ msgid "Playing Music:"
#~ msgstr "Reproducción Musical:"
#~ msgid "Reset BG Music"
#~ msgstr "Reiniciar Música de Fondo"
#~ msgid "Reset to standard BGM?"
#~ msgstr "¿Poner la Música por defecto?"
#~ msgid "Unlock the app first."
#~ msgstr "Desbloquea primero la aplicación."

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2010-01-19 17:39+0200\n"
"Last-Translator: Katsurou\n"
"Language-Team: Katsurou, pirateX\n"
@ -188,9 +188,6 @@ msgstr "Tillbaka till Wii-menyn"
msgid "Backgroundmusic"
msgstr "Bakgrundsmusik"
msgid "Backgroundmusic Path changed."
msgstr "Sökväg till bakgrundsmusik ändrad."
msgid "Big thanks to:"
msgstr "Stort tack till:"
@ -221,6 +218,9 @@ msgstr "Kunde inte radera:"
msgid "Cancel"
msgstr "Avbryt"
msgid "Change Play Path"
msgstr "Ändra spel sökväg"
msgid "Channels"
msgstr "Kannaler"
@ -756,6 +756,12 @@ msgstr "Lås konsol"
msgid "Locked"
msgstr "Låst"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Loopa ljudet"
@ -777,6 +783,9 @@ msgstr "Troligtvis har den mått som inte är jämnt dividerade med 4."
msgid "Mount DVD drive"
msgstr "Montera DVD läsare"
msgid "Music Loop Mode"
msgstr "Musik Återuppspelningsläge"
msgid "Music Volume"
msgstr "Volym"
@ -924,6 +933,18 @@ msgstr "Välj från en lista"
msgid "Play Count"
msgstr "Spelat"
msgid "Play Next"
msgstr "Spela nästa"
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr "Spela förgående"
msgid "Playing Music:"
msgstr "Spela musik:"
msgid "Please wait..."
msgstr "Vänligen vänta..."
@ -942,6 +963,9 @@ msgstr "Publicerat av"
msgid "Quick Boot"
msgstr "Snabbstart"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Läser WAD data... Ok!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "Döp om spel på WBFS"
msgid "Reset BG Music"
msgstr "återställ BG musik"
msgid "Reset Playcounter"
msgstr "Återställ spelat-räknaren"
msgid "Reset to standard BGM?"
msgstr "Återställ till standard BGM?"
msgid "Restarting..."
msgstr "Startar om..."
@ -1014,9 +1044,6 @@ msgstr ""
msgid "Set Search-Filter"
msgstr "Ställ in sök-filter"
msgid "Set as backgroundmusic?"
msgstr "Ställ in som bakgrundsmusik?"
msgid "Settings"
msgstr "Inställningar"
@ -1348,6 +1375,12 @@ msgstr "av"
msgid "seconds left"
msgstr "sekunder kvar"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Sökväg till bakgrundsmusik ändrad."
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Ställ in som bakgrundsmusik?"
#~ msgid "The file is not a .wad"
#~ msgstr "Filen är inte en .wad"
@ -1357,30 +1390,9 @@ msgstr "sekunder kvar"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "Du använder NTFS filsystem. Pågrund av möjliga skriv fel till en NTFS partition, så är det inte möjligt att installera spel."
#~ msgid "Change Play Path"
#~ msgstr "Ändra spel sökväg"
#~ msgid "Music Loop Mode"
#~ msgstr "Musik Återuppspelningsläge"
#~ msgid "Partition Format Menu"
#~ msgstr "Partitions formaterings meny"
#~ msgid "Play Next"
#~ msgstr "Spela nästa"
#~ msgid "Play Previous"
#~ msgstr "Spela förgående"
#~ msgid "Playing Music:"
#~ msgstr "Spela musik:"
#~ msgid "Reset BG Music"
#~ msgstr "återställ BG musik"
#~ msgid "Reset to standard BGM?"
#~ msgstr "Återställ till standard BGM?"
#~ msgid "Unlock the app first."
#~ msgstr "Lås upp appen först."

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Miller Liang\n"
"Language-Team: kyogc, Miller\n"
@ -188,9 +188,6 @@ msgstr "返回 Wii 系統目錄"
msgid "Backgroundmusic"
msgstr "背景音樂"
msgid "Backgroundmusic Path changed."
msgstr "背景音樂路徑"
msgid "Big thanks to:"
msgstr "非常感謝:"
@ -221,6 +218,9 @@ msgstr "無法刪除:"
msgid "Cancel"
msgstr "取消"
msgid "Change Play Path"
msgstr "變更路徑"
msgid "Channels"
msgstr "頻道"
@ -756,6 +756,12 @@ msgstr "鎖定控制台"
msgid "Locked"
msgstr "已鎖定"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "重複音樂"
@ -777,6 +783,9 @@ msgstr "圖片格式錯誤,可能它的尺寸不是 4 的倍數."
msgid "Mount DVD drive"
msgstr "掛載DVD光碟"
msgid "Music Loop Mode"
msgstr "音樂循環模式"
msgid "Music Volume"
msgstr "音量"
@ -924,6 +933,18 @@ msgstr "從列表中選取"
msgid "Play Count"
msgstr "執行次數"
msgid "Play Next"
msgstr "執行下一個"
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr "執行上一個"
msgid "Playing Music:"
msgstr "播放音樂"
msgid "Please wait..."
msgstr "請稍候..."
@ -942,6 +963,9 @@ msgstr "發布者"
msgid "Quick Boot"
msgstr "快速啟動"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "讀取 WAD 數據... 完成!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "變更WBFS上的遊戲名稱"
msgid "Reset BG Music"
msgstr "重置 BG 音樂"
msgid "Reset Playcounter"
msgstr "重置執行次數"
msgid "Reset to standard BGM?"
msgstr "重置回標準 BG 音樂"
msgid "Restarting..."
msgstr "正在重新啟動"
@ -1014,9 +1044,6 @@ msgstr "九月"
msgid "Set Search-Filter"
msgstr "關鍵字篩選"
msgid "Set as backgroundmusic?"
msgstr "設定背景音樂"
msgid "Settings"
msgstr "設定"
@ -1348,6 +1375,12 @@ msgstr "的"
msgid "seconds left"
msgstr "剩餘秒數"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "背景音樂路徑"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "設定背景音樂"
#~ msgid "The file is not a .wad"
#~ msgstr "這不是一個 WAD 文件"
@ -1357,30 +1390,9 @@ msgstr "剩餘秒數"
#~ msgid "You are using NTFS filesystem. Due to possible write errors to a NTFS partition, installing a game is not possible."
#~ msgstr "您正在使用 NTFS 文件系統。由於可能一個錯誤寫入到一個 NTFS 分區,這時候是無法安裝遊戲的。"
#~ msgid "Change Play Path"
#~ msgstr "變更路徑"
#~ msgid "Music Loop Mode"
#~ msgstr "音樂循環模式"
#~ msgid "Partition Format Menu"
#~ msgstr "磁區格式化"
#~ msgid "Play Next"
#~ msgstr "執行下一個"
#~ msgid "Play Previous"
#~ msgstr "執行上一個"
#~ msgid "Playing Music:"
#~ msgstr "播放音樂"
#~ msgid "Reset BG Music"
#~ msgstr "重置 BG 音樂"
#~ msgid "Reset to standard BGM?"
#~ msgstr "重置回標準 BG 音樂"
#~ msgid "Unlock the app first."
#~ msgstr "請先將此應用程式解鎖"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: Nitro_subzero \n"
"Language-Team: Nitro_subzero\n"
@ -188,9 +188,6 @@ msgstr "กลับไป เมนู Wii"
msgid "Backgroundmusic"
msgstr "ดนตรีเบื้องหลัง"
msgid "Backgroundmusic Path changed."
msgstr "เปลี่ยนที่เก็บ ดนตรีเบื้องหลัง"
msgid "Big thanks to:"
msgstr "ขอขอบคุณ:"
@ -221,6 +218,9 @@ msgstr "ไม่สามารถลบได้:"
msgid "Cancel"
msgstr "ยกเลิก"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "แชนแนล"
@ -756,6 +756,12 @@ msgstr "ล๊อค Console"
msgid "Locked"
msgstr "ล๊อค"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "เล่นเสียงซ้ำ"
@ -777,6 +783,9 @@ msgstr "ดูเหมือนว่าขนาดจะหารด้วย
msgid "Mount DVD drive"
msgstr "เชื่อม DVD ไดร์ฟ"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "ความดังเสียงเพลง"
@ -924,6 +933,18 @@ msgstr "เลือกจากรายการ"
msgid "Play Count"
msgstr "จำนวนที่เล่น"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "รอสักครู่"
@ -942,6 +963,9 @@ msgstr "เผยแพร่โดย"
msgid "Quick Boot"
msgstr "บูตแบบเร็ว"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "อ่านข้อมูล WAD... สำเร็จ!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "เปลี่ยนชื่อเกมส์บน WBFS"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "เคลียร์การนับจำนวนที่เล่น"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "รีสตารท์..."
@ -1014,9 +1044,6 @@ msgstr "กย."
msgid "Set Search-Filter"
msgstr "กำหนดเงื่อนไขการค้นหา"
msgid "Set as backgroundmusic?"
msgstr "เลือกเป็น Background music?"
msgid "Settings"
msgstr "กำหนดค่า"
@ -1348,6 +1375,12 @@ msgstr "จาก"
msgid "seconds left"
msgstr "วินาทีที่เหลือ"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "เปลี่ยนที่เก็บ ดนตรีเบื้องหลัง"
#~ msgid "Set as backgroundmusic?"
#~ msgstr "เลือกเป็น Background music?"
#~ msgid "The file is not a .wad"
#~ msgstr "ไม่ใช่ไฟล์ .wad"

View File

@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: USB Loader GX\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-02-05 14:13+0100\n"
"POT-Creation-Date: 2010-02-15 00:12+0100\n"
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
"Last-Translator: omercigingelini\n"
"Language-Team: omercigingelini\n"
@ -188,9 +188,6 @@ msgstr "Wii Menüye dönüş"
msgid "Backgroundmusic"
msgstr "Arkaplan müziği"
msgid "Backgroundmusic Path changed."
msgstr "Arkaplan müzik Yolu değişti."
msgid "Big thanks to:"
msgstr "Teşekkürler:"
@ -221,6 +218,9 @@ msgstr "Silinemiyor"
msgid "Cancel"
msgstr "Iptal"
msgid "Change Play Path"
msgstr ""
msgid "Channels"
msgstr "Kanallar"
@ -756,6 +756,12 @@ msgstr "Konsolu Kilitle"
msgid "Locked"
msgstr "Kilitlendi"
msgid "Loop Directory"
msgstr ""
msgid "Loop Music"
msgstr ""
msgid "Loop Sound"
msgstr "Döngüdeki Ses"
@ -777,6 +783,9 @@ msgstr "Muhtemelen 4 ile tam bölünemeyen boyutları var."
msgid "Mount DVD drive"
msgstr "DVD sürücüsü bağla"
msgid "Music Loop Mode"
msgstr ""
msgid "Music Volume"
msgstr "Ses Seviyesi"
@ -924,6 +933,18 @@ msgstr "Listeden seç"
msgid "Play Count"
msgstr "Oynama Sayısı"
msgid "Play Next"
msgstr ""
msgid "Play Once"
msgstr ""
msgid "Play Previous"
msgstr ""
msgid "Playing Music:"
msgstr ""
msgid "Please wait..."
msgstr "Lütfen bekleyin.."
@ -942,6 +963,9 @@ msgstr "Yayıncı"
msgid "Quick Boot"
msgstr "Hızlı Başlatma"
msgid "Random Directory Music"
msgstr ""
msgid "Reading WAD data... Ok!"
msgstr "Wad verisi okunuyor..OK!"
@ -960,9 +984,15 @@ msgstr ""
msgid "Rename Game on WBFS"
msgstr "WBFS'deki oyunu yeniden isimlendir"
msgid "Reset BG Music"
msgstr ""
msgid "Reset Playcounter"
msgstr "Sayacı sıfırla"
msgid "Reset to standard BGM?"
msgstr ""
msgid "Restarting..."
msgstr "Yeniden başlatılıyor"
@ -1014,9 +1044,6 @@ msgstr "Eyl"
msgid "Set Search-Filter"
msgstr "Arama Filtresi Ayarla"
msgid "Set as backgroundmusic?"
msgstr "Arkaplan müziği olarak ayarla?"
msgid "Settings"
msgstr "Ayarlar"
@ -1348,6 +1375,12 @@ msgstr "./"
msgid "seconds left"
msgstr "saniye kaldı"
#~ msgid "Backgroundmusic Path changed."
#~ msgstr "Arkaplan müzik Yolu değişti."
#~ msgid "Set as backgroundmusic?"
#~ msgstr "Arkaplan müziği olarak ayarla?"
#~ msgid "The file is not a .wad"
#~ msgstr "Bu dosya .wad değil"

View File

@ -25,13 +25,13 @@ SOURCES := source \
source/unzip \
source/language \
source/mload \
source/ramdisk \
source/patches \
source/usbloader \
source/xml \
source/network \
source/settings \
source/prompts \
source/ramdisk \
source/wad \
source/banner \
source/cheats \
@ -40,9 +40,16 @@ SOURCES := source \
source/menu \
source/libfat \
source/memory \
source/libntfs
source/libntfs \
source/usbloader/wbfs \
# source/libhfs+ \
# source/libhfs+/hfscommon/BTree \
# source/libhfs+/hfscommon/Catalog \
# source/libhfs+/hfscommon/Misc \
# source/libhfs+/hfscommon/Unicode
DATA := data
INCLUDES := source
#source/libhfs+/hfscommon/headers
#---------------------------------------------------------------------------------
# options for code generation

Binary file not shown.

BIN
data/ehcmodule_frag_v4.bin Normal file

Binary file not shown.

BIN
data/ehcmodule_frag_v5.bin Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
<pd><ViewState><e p="gui\source\mload" x="false"></e><e p="gui\source\settings" x="true"></e><e p="gui\source\images" x="false"></e><e p="gui\source\libfat" x="false"></e><e p="gui\source\prompts" x="false"></e><e p="gui\source\banner" x="false"></e><e p="gui\source\cheats" x="false"></e><e p="gui\source\libntfs" x="false"></e><e p="gui\source\network" x="false"></e><e p="gui\source\fonts" x="false"></e><e p="gui\source\menu" x="false"></e><e p="gui\source\ramdisk" x="false"></e><e p="gui\source\sounds" x="false"></e><e p="gui\source\wad" x="false"></e><e p="gui" x="true"></e><e p="gui\source\homebrewboot" x="false"></e><e p="gui\source\language" x="false"></e><e p="gui\source" x="true"></e><e p="gui\source\libwbfs" x="false"></e><e p="gui\source\libwiigui" x="false"></e><e p="gui\source\patches" x="false"></e><e p="gui\source\themes" x="false"></e><e p="gui\source\memory" x="false"></e><e p="gui\source\unzip" x="false"></e><e p="gui\source\usbloader" x="true"></e><e p="gui\source\xml" x="false"></e></ViewState></pd>
<pd><ViewState><e p="gui\source\libhfs+" x="false"></e><e p="gui\source\mload" x="false"></e><e p="gui\source\settings" x="false"></e><e p="gui\source\images" x="false"></e><e p="gui\source\libfat" x="false"></e><e p="gui\source\prompts" x="false"></e><e p="gui\source\banner" x="false"></e><e p="gui\source\cheats" x="false"></e><e p="gui\source\libntfs" x="false"></e><e p="gui\source\network" x="true"></e><e p="gui\source\fonts" x="false"></e><e p="gui\source\menu" x="false"></e><e p="gui\source\ramdisk" x="false"></e><e p="gui\source\regex" x="false"></e><e p="gui\source\sounds" x="false"></e><e p="gui\source\wad" x="false"></e><e p="gui" x="true"></e><e p="gui\source\homebrewboot" x="false"></e><e p="gui\source\language" x="false"></e><e p="gui\source" x="true"></e><e p="gui\source\libwbfs" x="false"></e><e p="gui\source\libwiigui" x="false"></e><e p="gui\source\patches" x="false"></e><e p="gui\source\themes" x="false"></e><e p="gui\source\memory" x="false"></e><e p="gui\source\unzip" x="false"></e><e p="gui\source\usbloader" x="false"></e><e p="gui\source\xml" x="false"></e></ViewState></pd>

View File

@ -19,6 +19,7 @@
#include "homebrewboot/BootHomebrew.h"
#include "network/networkops.h"
#include "menu.h"
#include "menu/menus.h"
#include "filelist.h"
#include "sys.h"
#include "network/http.h"
@ -33,8 +34,6 @@ extern void ResumeGui();
extern void HaltGui();
/*** Extern variables ***/
extern GuiWindow * mainWindow;
extern GuiSound * bgMusic;
extern GuiImage * bgImg;
extern u32 infilesize;
extern u32 uncfilesize;

View File

@ -139,12 +139,6 @@ extern const char *ntfsGetVolumeName (const char *name);
*/
extern bool ntfsSetVolumeName (const char *name, const char *volumeName);
#ifdef __cplusplus
}
#endif
#endif /* _LIBNTFS_H */
/*
typedef struct _FileInfo FileInfo;
@ -160,3 +154,8 @@ struct _FileInfo
typedef int (*_ntfs_frag_append_t)(void *ff, u32 offset, u32 sector, u32 count);
int _NTFS_get_fragments (const char *path, _ntfs_frag_append_t append_fragment, void *callback_data);
#ifdef __cplusplus
}
#endif
#endif /* _LIBNTFS_H */

View File

@ -11,6 +11,11 @@
extern "C" {
#endif /* __cplusplus */
enum {
WBFS_DEVICE_USB = 1, /* USB device */
WBFS_DEVICE_SDHC /* SDHC device */
};
typedef u32 be32_t;
typedef u16 be16_t;

View File

@ -154,27 +154,32 @@ static void do_files(wiidisc_t*d)
partition_read(d,apl_offset, apl_header, 0x20,0);
apl_size = 0x20 + _be32(apl_header + 0x14) + _be32(apl_header + 0x18);
// fake read dol and partition
partition_read(d,apl_offset, 0, apl_size,1);
if (apl_size)
partition_read(d,apl_offset, 0, apl_size,1);
partition_read(d,dol_offset, 0, (fst_offset - dol_offset)<<2,1);
fst = wbfs_ioalloc(fst_size);
if (fst == 0)
wbfs_fatal("malloc fst");
partition_read(d,fst_offset, fst, fst_size,0);
n_files = _be32(fst + 8);
if (fst_size) {
fst = wbfs_ioalloc(fst_size);
if (fst == 0)
wbfs_fatal("malloc fst");
partition_read(d,fst_offset, fst, fst_size,0);
n_files = _be32(fst + 8);
if (d->extract_pathname && *d->extract_pathname == 0) {
// if empty pathname requested return fst
d->extracted_buffer = fst;
d->extracted_size = fst_size;
d->extract_pathname = NULL;
// skip do_fst if only fst requested
n_files = 0;
if (d->extract_pathname && *d->extract_pathname == 0) {
// if empty pathname requested return fst
d->extracted_buffer = fst;
d->extracted_size = fst_size;
d->extract_pathname = NULL;
// skip do_fst if only fst requested
n_files = 0;
}
if (12*n_files <= fst_size ) {
if (n_files > 1)
do_fst(d,fst, (char *)fst + 12*n_files, 0);
}
}
if (n_files > 1)
do_fst(d,fst, (char *)fst + 12*n_files, 0);
wbfs_iofree(b);
wbfs_iofree(apl_header);
if (fst != d->extracted_buffer)

View File

@ -0,0 +1,250 @@
/****************************************************************************
* SettingsPrompts
* USB Loader GX 2009
*
* Backgroundmusic
***************************************************************************/
#include <sys/dir.h>
#include "gui_bgm.h"
#include "menu.h"
GuiBGM::GuiBGM(const u8 *s, int l, int v)
:GuiSound(s, l, v)
{
loop = 0;
loopMode = ONCE;
currentPath = NULL;
currentPlaying = 0;
//shouldn't be needed but
//fixes some kind of weird bug in ogg system
GuiSound::Load(s, l, v);
}
GuiBGM::~GuiBGM()
{
if(currentPath)
delete [] currentPath;
ClearList();
};
void GuiBGM::SetLoop(bool l)
{
}
void GuiBGM::SetLoop(int l)
{
loop = false;
loopMode = ONCE;
if(l == LOOP)
{
loop = true;
}
else
loopMode = l;
}
bool GuiBGM::Load(const char *path)
{
if(!path)
{
LoadStandard();
return false;
}
if(strcmp(path, "") == 0)
{
LoadStandard();
return false;
}
if(!GuiSound::Load(path))
{
LoadStandard();
return false;
}
return ParsePath(path);
}
bool GuiBGM::LoadStandard()
{
ClearList();
if(currentPath)
{
delete [] currentPath;
currentPath = NULL;
}
strcpy(Settings.ogg_path, "");
bool ret = GuiSound::Load(bg_music_ogg, bg_music_ogg_size, true);
if(ret)
Play();
return ret;
}
bool GuiBGM::ParsePath(const char * folderpath)
{
ClearList();
if(currentPath)
delete [] currentPath;
currentPath = new char[strlen(folderpath)+1];
sprintf(currentPath, "%s", folderpath);
char * isdirpath = strrchr(folderpath, '.');
if(isdirpath)
{
char * pathptr = strrchr(currentPath, '/');
if(pathptr)
{
pathptr++;
pathptr[0] = 0;
}
}
char * LoadedFilename = strrchr(folderpath, '/')+1;
char filename[1024];
struct stat st;
DIR_ITER * dir = diropen(currentPath);
if (dir == NULL)
{
LoadStandard();
return false;
}
u32 counter = 0;
while (dirnext(dir,filename,&st) == 0)
{
char * fileext = strrchr(filename, '.');
if(fileext)
{
if(strcasecmp(fileext, ".mp3") == 0 || strcasecmp(fileext, ".ogg") == 0
|| strcasecmp(fileext, ".wav") == 0)
{
AddEntrie(filename);
if(strcmp(LoadedFilename, filename) == 0)
currentPlaying = counter;
counter++;
}
}
}
dirclose(dir);
snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s", folderpath);
return true;
}
void GuiBGM::AddEntrie(const char * filename)
{
if(!filename)
return;
char * NewEntrie = new char[strlen(filename)+1];
sprintf(NewEntrie, "%s", filename);
PlayList.push_back(NewEntrie);
}
void GuiBGM::ClearList()
{
for(u32 i = 0; i < PlayList.size(); i++)
{
if(PlayList.at(i) != NULL)
{
delete [] PlayList.at(i);
PlayList.at(i) = NULL;
}
}
PlayList.clear();
}
bool GuiBGM::PlayNext()
{
if(!currentPath)
return false;
currentPlaying++;
if(currentPlaying >= (int) PlayList.size())
currentPlaying = 0;
snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s%s", currentPath, PlayList.at(currentPlaying));
if(!GuiSound::Load(Settings.ogg_path))
return false;
Play();
return true;
}
bool GuiBGM::PlayPrevious()
{
if(!currentPath)
return false;
currentPlaying--;
if(currentPlaying < 0)
currentPlaying = PlayList.size()-1;
snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s%s", currentPath, PlayList.at(currentPlaying));
if(!GuiSound::Load(Settings.ogg_path))
return false;
Play();
return true;
}
bool GuiBGM::PlayRandom()
{
if(!currentPath)
return false;
srand (time(NULL));
currentPlaying = rand() % PlayList.size();
//just in case
if(currentPlaying < 0)
currentPlaying = PlayList.size()-1;
else if(currentPlaying >= (int) PlayList.size())
currentPlaying = 0;
snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s%s", currentPath, PlayList.at(currentPlaying));
if(!GuiSound::Load(Settings.ogg_path))
return false;
Play();
return true;
}
void GuiBGM::UpdateState()
{
if(!IsPlaying())
{
if(loopMode == DIR_LOOP)
{
PlayNext();
}
else if(loopMode == RANDOM_BGM)
{
PlayRandom();
}
}
}

View File

@ -0,0 +1,45 @@
/****************************************************************************
* SettingsPrompts
* USB Loader GX 2009
*
* Backgroundmusic
***************************************************************************/
#ifndef _BGM_H_
#define _BGM_H_
#include "libwiigui/gui.h"
enum
{
ONCE = 0,
LOOP,
RANDOM_BGM,
DIR_LOOP
};
class GuiBGM : public GuiSound
{
public:
GuiBGM(const u8 *s, int l, int v);
~GuiBGM();
bool Load(const char *path);
bool LoadStandard();
bool ParsePath(const char * folderpath);
bool PlayNext();
bool PlayPrevious();
bool PlayRandom();
void SetLoop(bool l);
void SetLoop(int l);
void UpdateState();
protected:
void AddEntrie(const char * filename);
void ClearList();
int currentPlaying;
int loopMode;
char * currentPath;
std::vector<char *> PlayList;
};
#endif

View File

@ -31,6 +31,7 @@ extern "C"
#include "settings/cfg.h"
#include "language/gettext.h"
#include "mload/mload.h"
#include "mload/mload_modules.h"
#include "FreeTypeGX.h"
#include "video.h"
#include "audio.h"
@ -255,7 +256,7 @@ main(int argc, char *argv[])
ios249rev = getIOSrev(0x00000001000000f9ll);
//if we don't like either of the cIOS then scram
if (!(ios222rev==4 || (ios249rev>=9 && ios249rev<65280)))
if (!(ios222rev==4 || ios222rev==5 || (ios249rev>=9 && ios249rev<65280)))
{
InitTextVideo();
printf("\x1b[2J");
@ -409,11 +410,11 @@ main(int argc, char *argv[])
if ((Settings.cios == ios222 && IOS_GetVersion() != 222) ||
(Settings.cios == ios223 && IOS_GetVersion() != 223))
{
printf("\n\tReloading IOS to config setting (%d)...", ios222 ? 222 : 223);
printf("\n\tReloading IOS to config setting (%d)...", Settings.cios == ios222 ? 222 : 223);
SDCard_deInit(); // unmount SD for reloading IOS
USBDevice_deInit(); // unmount USB for reloading IOS
USBStorage_Deinit();
ret = IOS_ReloadIOSsafe(ios222 ? 222 : 223);
ret = IOS_ReloadIOSsafe(Settings.cios == ios222 ? 222 : 223);
printf("%d", ret);
SDCard_Init();
load_ehc_module();

View File

@ -154,6 +154,9 @@ void *CMEM2Alloc::reallocate(void *p, unsigned int s)
s = (s - 1) / sizeof (SBlock) + 1;
{
LockMutex lock(m_mutex);
if (i + s + 1 >= m_endAddress)
return 0;
// Last block
if (i->next == 0 && i + s + 1 < m_endAddress)
{

View File

@ -15,6 +15,7 @@
#include "prompts/ProgressWindow.h"
#include "menu/menus.h"
#include "mload/mload.h"
#include "mload/mload_modules.h"
#include "network/networkops.h"
#include "patches/patchcode.h"
#include "settings/Settings.h"
@ -39,7 +40,7 @@ GuiWindow * mainWindow = NULL;
GuiImageData * pointer[4];
GuiImage * bgImg = NULL;
GuiImageData * background = NULL;
GuiSound * bgMusic = NULL;
GuiBGM * bgMusic = NULL;
GuiSound *btnClick2 = NULL;
struct discHdr *dvdheader = NULL;
@ -131,6 +132,8 @@ static void * UpdateGUI (void *arg) {
for (int i=0; i < 4; i++)
mainWindow->Update(&userInput[i]);
if(bgMusic)
bgMusic->UpdateState();
} else {
for (int a = 5; a < 255; a += 10) {
@ -280,20 +283,17 @@ int MainMenu(int menu) {
if (strcmp(headlessID,"")==0)
ResumeGui();
bgMusic = new GuiSound(bg_music_ogg, bg_music_ogg_size, Settings.volume);
bgMusic->SetLoop(1); //loop music
// startup music
if (strcmp("", Settings.oggload_path) && strcmp("notset", Settings.ogg_path)) {
bgMusic->Load(Settings.ogg_path);
}
bgMusic = new GuiBGM(bg_music_ogg, bg_music_ogg_size, Settings.volume);
bgMusic->SetLoop(Settings.musicloopmode); //loop music
bgMusic->Load(Settings.ogg_path);
bgMusic->Play();
while (currentMenu != MENU_EXIT) {
bgMusic->SetVolume(Settings.volume);
gprintf("Current menu: %d\n", currentMenu);
switch (currentMenu) {
case MENU_CHECK:
currentMenu = MenuCheck();
break;
case MENU_FORMAT:
@ -516,7 +516,7 @@ int MainMenu(int menu) {
gprintf("%d\n", ret);
if (reloadblock == on && Sys_IsHermes()) {
patch_cios_data();
enable_ES_ioctlv_vector();
if (load_from_fs == PART_FS_WBFS) {
mload_close();
}

View File

@ -65,7 +65,7 @@ int MenuCheck() {
if (Settings.partition != -1 && partitions.num > Settings.partition) {
PartInfo pinfo = partitions.pinfo[Settings.partition];
if (WBFS_OpenPart(pinfo.part_fs, pinfo.index, partitions.pentry[Settings.partition].sector, partitions.pentry[Settings.partition].size, (char *) &game_partition) == 0)
if (!WBFS_OpenPart(pinfo.part_fs, pinfo.index, partitions.pentry[Settings.partition].sector, partitions.pentry[Settings.partition].size, (char *) &game_partition))
{
ret2 = 0;
load_from_fs = pinfo.part_fs;

View File

@ -89,7 +89,7 @@ int MenuDiscList() {
char theTime[80]="";
time_t lastrawtime=0;
if (mountMethod != 3 && load_from_fs != PART_FS_FAT) {
if (mountMethod != 3 && WBFS_ShowFreeSpace()) {
WBFS_DiskSpace(&used, &freespace);
}

View File

@ -2,6 +2,7 @@
#define _MENUS_H
#include "libwiigui/gui.h"
#include "libwiigui/gui_bgm.h"
#include "language/gettext.h"
#include "prompts/PromptWindows.h"
#include "menu.h"
@ -12,7 +13,7 @@
extern void ResumeGui();
extern void HaltGui();
extern GuiWindow * mainWindow;
extern GuiSound * bgMusic;
extern GuiBGM * bgMusic;
extern u8 shutdown;
extern u8 reset;

View File

@ -1,122 +1,374 @@
#define size_dip_plugin 3224
#define size_dip_plugin 5920
unsigned char dip_plugin[3224] __attribute__((aligned (32)))={
19, 119, 228, 85, 18, 52, 0, 1, 32, 34, 205, 172, 32, 32, 13, 57, 32, 32, 8, 197, 32, 32, 8, 153, 32, 32, 91, 129, 32,
32, 0, 73, 32, 32, 40, 117, 32, 32, 54, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 119, 233,
160, 19, 119, 233, 117, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 71, 120, 234, 0, 2, 23, 70, 192,
71, 120, 234, 0, 2, 39, 70, 192, 71, 120, 234, 0, 2, 55, 70, 192, 71, 120, 234, 0, 2, 47, 70, 192, 71, 120, 234, 0,
2, 21, 70, 192, 71, 120, 234, 0, 2, 7, 70, 192, 71, 120, 234, 0, 2, 45, 70, 192, 71, 120, 234, 0, 2, 41, 70, 192, 71,
120, 234, 0, 2, 49, 181, 0, 75, 7, 176, 137, 147, 0, 70, 104, 35, 0, 33, 0, 34, 0, 147, 1, 147, 2, 240, 0, 252, 157,
176, 9, 188, 2, 71, 8, 70, 192, 227, 0, 0, 0, 181, 16, 28, 3, 34, 32, 28, 12, 72, 13, 28, 25, 247, 255, 255, 210, 33,
32, 72, 11, 247, 255, 255, 202, 73, 10, 34, 1, 104, 11, 66, 19, 209, 253, 34, 32, 28, 32, 73, 6, 247, 255, 255, 196,
28, 32, 33, 32, 247, 255, 255, 188, 75, 4, 104, 24, 188, 16, 188, 2, 71, 8, 70, 192, 13, 0, 96, 0, 13, 0, 96, 28, 13,
0, 96, 32, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 10, 203, 70, 154, 75, 20, 176, 137, 37, 0, 28, 7, 28,
14, 70, 145, 70, 108, 70, 155, 70, 168, 70, 91, 96, 35, 70, 67, 96, 99, 96, 163, 70, 83, 96, 227, 28, 56, 70, 75, 28,
49, 97, 35, 247, 255, 255, 162, 70, 104, 28, 57, 28, 50, 240, 0, 252, 78, 53, 1, 40, 0, 209, 8, 176, 9, 188, 60, 70,
144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 45, 15, 217, 223, 231, 243, 208, 0, 0, 0, 181, 112, 176, 136,
75, 8, 28, 6, 28, 13, 70, 108, 147, 0, 96, 97, 146, 2, 247, 255, 255, 129, 28, 49, 28, 42, 70, 104, 240, 0, 252, 45,
176, 8, 188, 112, 188, 2, 71, 8, 168, 0, 0, 0, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240, 176, 143, 144, 4,
145, 3, 146, 2, 41, 0, 209, 0, 224, 126, 10, 82, 70, 145, 35, 128, 34, 0, 1, 27, 70, 147, 34, 255, 147, 1, 3, 210, 171,
6, 146, 0, 70, 152, 224, 7, 154, 3, 68, 179, 69, 90, 217, 62, 154, 5, 24, 179, 10, 219, 68, 153, 154, 3, 70, 91, 26,
214, 70, 74, 2, 83, 154, 2, 66, 154, 216, 87, 35, 0, 147, 5, 36, 0, 159, 4, 34, 128, 68, 95, 28, 56, 28, 49, 1, 18,
240, 0, 248, 103, 44, 0, 209, 47, 40, 0, 208, 45, 155, 0, 28, 6, 66, 152, 217, 1, 38, 255, 3, 246, 10, 242, 70, 146,
36, 0, 75, 43, 70, 66, 96, 19, 35, 0, 96, 83, 96, 147, 70, 83, 96, 211, 70, 75, 97, 19, 28, 56, 28, 49, 247, 255, 255,
38, 70, 64, 28, 57, 28, 50, 240, 0, 251, 210, 52, 1, 28, 5, 40, 0, 208, 192, 44, 15, 217, 230, 45, 0, 208, 188, 176,
15, 28, 40, 188, 60, 70, 144, 70, 153, 70, 162, 70, 171, 188, 240, 188, 2, 71, 8, 154, 5, 25, 147, 154, 1, 66, 147,
217, 1, 155, 5, 26, 214, 32, 128, 1, 0, 33, 32, 247, 255, 254, 251, 28, 4, 40, 0, 208, 18, 33, 128, 1, 9, 70, 74, 247,
255, 255, 59, 28, 5, 40, 0, 208, 15, 28, 32, 247, 255, 254, 217, 231, 216, 26, 211, 0, 155, 28, 28, 147, 5, 30, 99,
65, 156, 231, 163, 37, 1, 66, 109, 231, 208, 37, 0, 231, 206, 154, 5, 28, 56, 24, 161, 28, 50, 247, 255, 254, 214, 28,
56, 28, 49, 247, 255, 254, 206, 231, 228, 70, 192, 208, 0, 0, 0, 181, 48, 28, 13, 28, 20, 6, 195, 209, 18, 75, 15, 66,
152, 217, 19, 33, 0, 75, 14, 24, 194, 75, 14, 66, 154, 216, 1, 75, 13, 26, 25, 66, 161, 211, 5, 28, 8, 66, 169, 216,
10, 30, 99, 67, 152, 224, 0, 32, 0, 188, 48, 188, 2, 71, 8, 35, 192, 4, 91, 26, 25, 231, 232, 28, 40, 30, 99, 67, 152,
231, 244, 1, 127, 255, 255, 240, 0, 0, 0, 3, 97, 127, 255, 19, 97, 128, 0, 71, 112, 70, 192, 181, 48, 28, 4, 72, 15,
28, 13, 104, 131, 104, 193, 176, 129, 24, 91, 24, 154, 105, 3, 43, 0, 209, 15, 104, 67, 43, 0, 209, 7, 28, 32, 28, 41,
247, 255, 255, 13, 176, 1, 188, 48, 188, 2, 71, 8, 28, 32, 28, 41, 247, 255, 255, 27, 231, 246, 28, 32, 28, 41, 240,
0, 249, 246, 231, 241, 70, 192, 19, 119, 240, 0, 181, 240, 79, 27, 35, 1, 28, 4, 96, 59, 176, 129, 33, 32, 247, 255,
254, 127, 104, 227, 43, 8, 208, 8, 28, 32, 240, 0, 250, 246, 35, 0, 96, 59, 176, 1, 188, 240, 188, 2, 71, 8, 105, 163,
37, 197, 104, 24, 104, 89, 247, 255, 254, 109, 105, 163, 1, 173, 104, 27, 28, 40, 33, 8, 104, 92, 104, 30, 247, 255,
254, 100, 75, 10, 4, 36, 64, 30, 67, 52, 78, 9, 96, 44, 28, 40, 33, 4, 96, 52, 247, 255, 254, 73, 28, 48, 33, 4, 247,
255, 254, 69, 35, 0, 96, 59, 32, 0, 231, 217, 70, 192, 19, 119, 240, 40, 0, 0, 255, 255, 0, 0, 49, 136, 181, 16, 73,
20, 28, 4, 104, 139, 104, 202, 24, 154, 105, 11, 43, 0, 209, 18, 104, 75, 43, 0, 209, 11, 33, 32, 247, 255, 254, 175,
40, 0, 219, 3, 105, 162, 75, 12, 66, 154, 208, 10, 188, 16, 188, 2, 71, 8, 33, 32, 247, 255, 254, 185, 231, 242, 33,
32, 240, 0, 249, 149, 231, 238, 75, 6, 34, 1, 112, 26, 120, 91, 43, 0, 209, 238, 247, 255, 254, 10, 231, 235, 70, 192,
19, 119, 240, 0, 93, 28, 158, 163, 32, 34, 205, 172, 181, 240, 70, 87, 70, 70, 180, 192, 28, 6, 120, 0, 176, 129, 28,
15, 70, 144, 40, 224, 208, 24, 77, 145, 35, 0, 98, 43, 28, 3, 59, 112, 43, 143, 217, 13, 28, 48, 28, 57, 70, 66, 240,
0, 250, 180, 28, 4, 176, 1, 28, 32, 188, 12, 70, 144, 70, 154, 188, 240, 188, 2, 71, 8, 74, 135, 0, 155, 88, 211, 70,
159, 77, 132, 106, 43, 43, 0, 209, 2, 105, 43, 43, 0, 208, 230, 28, 56, 33, 0, 70, 66, 240, 0, 249, 10, 106, 43, 96,
59, 28, 56, 70, 65, 247, 255, 253, 212, 36, 0, 231, 223, 104, 107, 43, 0, 209, 2, 105, 43, 43, 0, 208, 211, 36, 0, 231,
215, 104, 107, 43, 0, 209, 2, 105, 43, 43, 0, 208, 203, 28, 56, 33, 0, 70, 66, 240, 0, 248, 239, 28, 56, 70, 65, 247,
255, 253, 187, 36, 0, 231, 198, 104, 115, 36, 0, 96, 171, 231, 194, 104, 171, 231, 217, 104, 115, 36, 0, 96, 43, 231,
188, 104, 43, 231, 211, 104, 115, 97, 43, 43, 0, 208, 6, 28, 40, 28, 49, 48, 24, 49, 8, 34, 6, 247, 255, 253, 166, 105,
115, 36, 0, 97, 107, 231, 171, 105, 43, 231, 194, 104, 114, 35, 36, 84, 234, 36, 0, 231, 164, 104, 235, 104, 172, 70,
154, 105, 43, 43, 0, 209, 0, 224, 170, 32, 0, 34, 0, 70, 83, 67, 35, 209, 2, 42, 0, 209, 0, 224, 142, 28, 3, 30, 90,
65, 147, 96, 107, 28, 56, 70, 65, 247, 255, 255, 70, 28, 4, 231, 139, 35, 1, 34, 37, 84, 171, 104, 43, 43, 0, 209, 0,
224, 132, 104, 113, 104, 178, 28, 56, 247, 255, 254, 214, 28, 4, 34, 0, 35, 37, 84, 234, 44, 0, 208, 0, 231, 120, 28,
56, 70, 65, 247, 255, 254, 201, 231, 115, 104, 115, 72, 70, 64, 24, 247, 255, 253, 139, 28, 4, 231, 108, 76, 68, 33,
64, 28, 32, 247, 255, 253, 106, 34, 0, 28, 33, 224, 3, 50, 1, 42, 64, 209, 0, 231, 90, 92, 163, 43, 0, 208, 248, 34,
64, 28, 56, 247, 255, 253, 80, 28, 56, 33, 64, 247, 255, 253, 72, 36, 0, 231, 83, 35, 36, 92, 234, 42, 0, 208, 0, 231,
116, 84, 234, 35, 37, 84, 234, 105, 43, 96, 42, 96, 106, 96, 170, 96, 234, 98, 42, 70, 154, 43, 0, 209, 0, 231, 59,
105, 108, 247, 255, 253, 73, 70, 80, 28, 41, 28, 34, 56, 1, 49, 24, 240, 0, 248, 206, 28, 4, 231, 53, 104, 113, 104,
178, 40, 208, 208, 59, 28, 56, 247, 255, 254, 133, 28, 4, 40, 0, 208, 0, 231, 42, 35, 37, 92, 235, 43, 0, 208, 0, 231,
37, 231, 171, 105, 43, 43, 0, 209, 0, 231, 26, 35, 2, 231, 55, 104, 107, 43, 0, 209, 3, 105, 43, 43, 0, 209, 0, 231,
17, 104, 115, 104, 178, 7, 155, 67, 19, 74, 24, 36, 0, 64, 19, 96, 235, 231, 14, 104, 107, 43, 0, 208, 17, 75, 21, 36,
160, 98, 43, 2, 36, 231, 6, 105, 43, 43, 0, 208, 0, 231, 108, 96, 106, 36, 0, 230, 255, 28, 48, 70, 66, 240, 0, 249,
175, 28, 4, 231, 122, 105, 43, 43, 0, 209, 234, 230, 239, 2, 201, 2, 82, 231, 192, 70, 66, 28, 48, 240, 0, 249, 162,
28, 2, 30, 83, 65, 154, 231, 78, 70, 192, 19, 119, 240, 0, 19, 119, 234, 32, 127, 255, 255, 255, 19, 119, 233, 160,
255, 255, 128, 0, 0, 5, 49, 0, 181, 240, 70, 87, 70, 78, 70, 69, 180, 224, 70, 128, 28, 14, 70, 148, 42, 0, 208, 51,
33, 3, 28, 2, 64, 10, 35, 4, 26, 155, 28, 24, 64, 8, 69, 96, 216, 49, 40, 0, 208, 49, 36, 0, 70, 67, 85, 30, 52, 1,
66, 160, 216, 250, 69, 132, 208, 32, 70, 99, 26, 27, 8, 159, 70, 153, 0, 187, 70, 154, 43, 0, 208, 17, 4, 51, 6, 50,
2, 49, 67, 26, 67, 10, 28, 21, 70, 67, 67, 53, 24, 26, 33, 0, 0, 139, 49, 1, 80, 213, 66, 185, 211, 250, 68, 84, 69,
209, 208, 6, 70, 67, 25, 24, 52, 1, 112, 6, 48, 1, 69, 164, 216, 250, 188, 28, 70, 144, 70, 153, 70, 162, 188, 240,
188, 1, 71, 0, 70, 96, 231, 203, 36, 0, 231, 211, 70, 192, 181, 112, 76, 17, 28, 6, 104, 32, 176, 130, 28, 13, 98, 2,
97, 6, 100, 1, 97, 65, 33, 68, 247, 255, 252, 121, 28, 48, 28, 41, 247, 255, 252, 117, 75, 10, 34, 2, 104, 24, 104,
35, 73, 9, 147, 0, 35, 1, 247, 255, 252, 128, 28, 41, 28, 4, 28, 48, 247, 255, 252, 119, 176, 2, 28, 32, 188, 112, 188,
2, 71, 8, 19, 119, 240, 44, 19, 119, 240, 48, 87, 70, 83, 2, 181, 240, 176, 133, 28, 4, 28, 15, 146, 3, 40, 2, 216,
75, 77, 47, 104, 43, 43, 0, 208, 74, 78, 46, 104, 48, 40, 0, 219, 1, 247, 255, 252, 71, 74, 44, 0, 163, 88, 152, 33,
1, 247, 255, 252, 81, 96, 48, 40, 0, 219, 66, 104, 48, 40, 0, 219, 49, 104, 40, 28, 57, 34, 6, 48, 32, 247, 255, 252,
61, 104, 40, 169, 3, 34, 4, 48, 64, 247, 255, 252, 55, 104, 42, 36, 4, 28, 19, 51, 32, 96, 19, 104, 42, 35, 6, 96, 83,
104, 42, 33, 68, 28, 19, 51, 64, 96, 147, 104, 43, 96, 220, 104, 40, 247, 255, 252, 33, 104, 43, 104, 48, 34, 2, 147,
0, 73, 22, 35, 0, 247, 255, 252, 45, 104, 42, 28, 19, 51, 32, 96, 19, 104, 43, 96, 92, 104, 42, 28, 19, 51, 64, 96,
147, 104, 43, 96, 220, 176, 5, 188, 240, 188, 2, 71, 8, 32, 1, 66, 64, 231, 248, 75, 11, 78, 8, 96, 43, 35, 1, 66, 91,
96, 51, 231, 179, 44, 0, 209, 186, 72, 8, 33, 1, 247, 255, 252, 5, 96, 48, 231, 180, 70, 192, 19, 119, 240, 44, 19,
119, 240, 48, 19, 119, 236, 140, 87, 70, 83, 1, 19, 119, 240, 64, 19, 119, 236, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 233, 45, 64, 128, 229, 159, 113, 80, 229, 151, 112, 0, 235, 0, 0, 45, 232, 189, 64, 128, 225, 47, 255, 30, 233, 45,
64, 128, 229, 159, 113, 60, 229, 151, 112, 0, 235, 0, 0, 39, 232, 189, 64, 128, 225, 47, 255, 30, 233, 45, 64, 128,
229, 159, 113, 40, 229, 151, 112, 0, 235, 0, 0, 33, 232, 189, 64, 128, 225, 47, 255, 30, 233, 45, 64, 128, 229, 159,
113, 20, 229, 151, 112, 0, 235, 0, 0, 27, 232, 189, 64, 128, 225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 113, 0, 229,
151, 112, 0, 235, 0, 0, 21, 232, 189, 64, 128, 225, 47, 255, 30, 233, 45, 64, 128, 229, 159, 112, 236, 229, 151, 112,
0, 235, 0, 0, 15, 232, 189, 64, 128, 225, 47, 255, 30, 230, 0, 8, 16, 225, 47, 255, 30, 230, 0, 7, 240, 225, 47, 255,
30, 230, 0, 3, 144, 225, 47, 255, 30, 230, 0, 3, 176, 225, 47, 255, 30, 230, 0, 3, 208, 225, 47, 255, 30, 230, 0, 3,
240, 225, 47, 255, 30, 230, 0, 4, 80, 225, 47, 255, 30, 225, 47, 255, 23, 239, 0, 0, 204, 225, 47, 255, 30, 180, 124,
181, 0, 247, 255, 252, 254, 188, 2, 188, 124, 71, 8, 181, 112, 176, 136, 104, 133, 28, 1, 75, 34, 71, 24, 70, 192, 70,
192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 70, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 114, 28, 1, 32, 4, 223, 171, 71, 16, 181, 240, 70, 95, 70, 86, 70, 77, 70, 68, 180, 240,
75, 8, 104, 27, 71, 24, 19, 119, 224, 16, 19, 119, 224, 20, 19, 119, 224, 24, 19, 119, 224, 28, 19, 119, 224, 32, 19,
119, 224, 36, 32, 16, 0, 213, 19, 119, 224, 12, 70, 192, 70, 192, 19, 119, 229, 58, 19, 119, 229, 108, 19, 119, 228,
120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120,
19, 119, 228, 202, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19,
119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119,
228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 230, 58, 19, 119, 228, 120, 19, 119, 229, 220, 19, 119, 228,
120, 19, 119, 228, 120, 19, 119, 230, 24, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120,
19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19,
119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119,
228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 230,
102, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 230, 24, 19, 119, 228, 120, 19, 119, 228, 120,
19, 119, 228, 196, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19,
119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119,
228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228,
120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120,
19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19,
119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119,
230, 24, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228,
120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 230, 70, 19, 119, 229, 170, 19, 119, 228, 120, 19, 119, 228, 120,
19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 158, 19, 119, 228, 120, 19, 119, 228, 120, 19,
119, 228, 120, 19, 119, 228, 212, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119,
228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228,
120, 19, 119, 228, 246, 19, 119, 228, 254, 19, 119, 229, 2, 19, 119, 229, 10, 19, 119, 229, 14, 19, 119, 229, 44, 19,
119, 229, 48, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119,
228, 120, 19, 119, 228, 120, 19, 119, 228, 120, 19, 119, 229, 156, 47, 100, 101, 118, 47, 117, 115, 98, 47, 101, 104,
99, 0, 0, 0, 0, 47, 100, 101, 118, 47, 117, 115, 98, 50, 0, 0, 0, 47, 100, 101, 118, 47, 115, 100, 105, 111, 47, 115,
100, 104, 99, 0, 0, 19, 119, 236, 112, 19, 119, 236, 124, 19, 119, 236, 96
unsigned char dip_plugin[5920] __attribute__((aligned (32)))={
0x13, 0x77, 0xe6, 0x11, 0x12, 0x34, 0x00, 0x01, 0x20, 0x22, 0xdd, 0xac, 0x20, 0x20, 0x10, 0x11,
0x20, 0x20, 0x0b, 0x9d, 0x20, 0x20, 0x0b, 0x71, 0x20, 0x20, 0x5d, 0xc1, 0x20, 0x20, 0x00, 0x49,
0x20, 0x20, 0x2b, 0x4d, 0x20, 0x20, 0x39, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x77, 0xf6, 0x20, 0x13, 0x77, 0xef, 0xe0,
0x13, 0x77, 0xed, 0xd5, 0x13, 0x77, 0xf7, 0x20, 0x00, 0x00, 0x08, 0xa0, 0xe1, 0xa0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x71, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x73,
0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x83, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x69,
0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x79, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x5b,
0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x6b, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x5b,
0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x89, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x5b,
0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x79, 0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x55,
0x46, 0xc0, 0x47, 0x78, 0xea, 0x00, 0x03, 0x4f, 0xb5, 0x10, 0x1c, 0x03, 0x22, 0x20, 0x1c, 0x0c,
0x48, 0x0d, 0x1c, 0x19, 0xf7, 0xff, 0xff, 0xec, 0x48, 0x0b, 0x21, 0x20, 0xf7, 0xff, 0xff, 0xd4,
0x4a, 0x0a, 0x23, 0x01, 0x68, 0x11, 0x42, 0x19, 0xd1, 0xfc, 0x22, 0x20, 0x1c, 0x20, 0x49, 0x06,
0xf7, 0xff, 0xff, 0xde, 0x1c, 0x20, 0x21, 0x20, 0xf7, 0xff, 0xff, 0xc6, 0x4b, 0x04, 0x68, 0x18,
0xbc, 0x10, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x0d, 0x00, 0x60, 0x00, 0x0d, 0x00, 0x60, 0x1c,
0x0d, 0x00, 0x60, 0x20, 0xb5, 0x70, 0xb0, 0x88, 0x4b, 0x08, 0x1c, 0x06, 0x1c, 0x0d, 0x46, 0x6c,
0x93, 0x00, 0x60, 0x61, 0x92, 0x02, 0xf7, 0xff, 0xff, 0xcb, 0x1c, 0x31, 0x1c, 0x2a, 0x46, 0x68,
0xf0, 0x00, 0xfe, 0xe8, 0xb0, 0x08, 0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0xa8, 0x00, 0x00, 0x00,
0xb5, 0xf0, 0xb0, 0x8b, 0x0a, 0xcb, 0x1c, 0x07, 0x1c, 0x0d, 0x92, 0x01, 0x93, 0x00, 0x26, 0x00,
0xac, 0x02, 0x4b, 0x0d, 0x1c, 0x38, 0x60, 0x23, 0x23, 0x00, 0x60, 0x63, 0x60, 0xa3, 0x9b, 0x00,
0x1c, 0x29, 0x60, 0xe3, 0x9b, 0x01, 0x36, 0x01, 0x61, 0x23, 0xf7, 0xff, 0xff, 0xa9, 0x1c, 0x20,
0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x00, 0xfe, 0xc6, 0x2e, 0x1f, 0xdc, 0x01, 0x28, 0x00, 0xd1, 0xe8,
0xb0, 0x0b, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0xd0, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0xb0, 0x89,
0x90, 0x05, 0x91, 0x06, 0x92, 0x07, 0x29, 0x00, 0xd0, 0x79, 0x23, 0x80, 0x0a, 0x52, 0x01, 0x1b,
0x92, 0x02, 0x26, 0x00, 0x93, 0x04, 0xe0, 0x6f, 0x9a, 0x06, 0x1b, 0x94, 0x9a, 0x02, 0x02, 0x53,
0x9a, 0x07, 0x42, 0x9a, 0xd8, 0x01, 0x23, 0x00, 0xe0, 0x02, 0x9a, 0x07, 0x1a, 0xd3, 0x00, 0x9b,
0x93, 0x01, 0x9b, 0x05, 0x22, 0x1f, 0x19, 0x9f, 0x42, 0x17, 0xd1, 0x1c, 0x4b, 0x33, 0x42, 0x9f,
0xd9, 0x01, 0x23, 0x00, 0xe0, 0x02, 0x23, 0xc0, 0x04, 0x5b, 0x1b, 0xdb, 0x4a, 0x30, 0x18, 0xb9,
0x4a, 0x30, 0x42, 0x91, 0xd8, 0x01, 0x4b, 0x30, 0x1b, 0xdb, 0x4a, 0x30, 0x42, 0x93, 0xd8, 0x01,
0x23, 0x00, 0xe0, 0x02, 0x42, 0xa3, 0xd9, 0x00, 0x1c, 0x23, 0x4a, 0x2c, 0x43, 0x93, 0xd0, 0x02,
0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x2a, 0x9a, 0x01, 0x19, 0x13, 0x9a, 0x04, 0x42, 0x93, 0xd9, 0x01,
0x9b, 0x01, 0x1a, 0xd4, 0x20, 0x80, 0x01, 0x00, 0x21, 0x20, 0xf7, 0xff, 0xff, 0x31, 0x90, 0x03,
0x28, 0x00, 0xd1, 0x02, 0x25, 0x01, 0x42, 0x6d, 0xe0, 0x32, 0x21, 0x80, 0x98, 0x03, 0x01, 0x09,
0x9a, 0x02, 0xf7, 0xff, 0xff, 0x85, 0x1c, 0x05, 0x28, 0x00, 0xd1, 0x0b, 0x9a, 0x03, 0x9b, 0x01,
0x1c, 0x38, 0x18, 0xd1, 0x1c, 0x22, 0xf7, 0xff, 0xff, 0x33, 0x9a, 0x05, 0x1c, 0x21, 0x19, 0x90,
0xf7, 0xff, 0xff, 0x1a, 0x98, 0x03, 0xf7, 0xff, 0xff, 0x0b, 0xe0, 0x0c, 0x1c, 0x1c, 0x4b, 0x14,
0x42, 0x9c, 0xd9, 0x01, 0x24, 0xff, 0x03, 0xe4, 0x9b, 0x05, 0x1c, 0x21, 0x19, 0x98, 0x9a, 0x02,
0xf7, 0xff, 0xff, 0x66, 0x1c, 0x05, 0x2d, 0x00, 0xd1, 0x0a, 0x9a, 0x01, 0x9b, 0x02, 0x19, 0x36,
0x18, 0xa4, 0x0a, 0xe4, 0x19, 0x1b, 0x93, 0x02, 0x9a, 0x06, 0x42, 0x96, 0xd3, 0x8c, 0x25, 0x00,
0xb0, 0x09, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x01, 0x7f, 0xff, 0xff,
0xf0, 0x00, 0x00, 0x00, 0x03, 0x61, 0x7f, 0xff, 0x13, 0x61, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff,
0x00, 0x7f, 0x7f, 0xff, 0xb5, 0x00, 0x4b, 0x07, 0xb0, 0x89, 0x93, 0x00, 0x46, 0x68, 0x23, 0x00,
0x21, 0x00, 0x22, 0x00, 0x93, 0x01, 0x93, 0x02, 0xf0, 0x00, 0xfe, 0x1c, 0xb0, 0x09, 0xbc, 0x02,
0x47, 0x08, 0x46, 0xc0, 0xe3, 0x00, 0x00, 0x00, 0xb5, 0xf8, 0x4e, 0x26, 0x27, 0x01, 0x1c, 0x04,
0x60, 0x37, 0x21, 0x20, 0xf7, 0xff, 0xfe, 0xec, 0x7b, 0x22, 0x7b, 0x63, 0x06, 0x12, 0x04, 0x1b,
0x43, 0x13, 0x7b, 0xa2, 0x02, 0x12, 0x43, 0x13, 0x7b, 0xe2, 0x43, 0x13, 0x2b, 0x08, 0xd1, 0x30,
0x7e, 0x22, 0x7e, 0x63, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7e, 0xa2, 0x25, 0xc5, 0x02, 0x12,
0x43, 0x13, 0x7e, 0xe2, 0x01, 0xad, 0x43, 0x13, 0x68, 0x18, 0x68, 0x59, 0xf7, 0xff, 0xfe, 0xd0,
0x7e, 0x22, 0x7e, 0x63, 0x06, 0x12, 0x04, 0x1b, 0x43, 0x13, 0x7e, 0xa2, 0x1c, 0x28, 0x02, 0x12,
0x43, 0x13, 0x7e, 0xe2, 0x21, 0x08, 0x43, 0x13, 0x68, 0x1b, 0x68, 0x5c, 0xf7, 0xff, 0xfe, 0xc0,
0x04, 0x24, 0x43, 0x27, 0x4c, 0x0c, 0x60, 0x2f, 0x1c, 0x28, 0x21, 0x04, 0x60, 0x27, 0xf7, 0xff,
0xfe, 0x9b, 0x1c, 0x20, 0x21, 0x04, 0xf7, 0xff, 0xfe, 0x97, 0x23, 0x00, 0x60, 0x33, 0x20, 0x00,
0xe0, 0x04, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0x3d, 0x23, 0x00, 0x60, 0x33, 0xbc, 0xf8, 0xbc, 0x02,
0x47, 0x08, 0x46, 0xc0, 0x13, 0x77, 0xf7, 0x20, 0x00, 0x00, 0x31, 0x88, 0xb5, 0x10, 0x4b, 0x09,
0x69, 0x1c, 0x2c, 0x00, 0xd0, 0x02, 0xf0, 0x00, 0xfb, 0xe3, 0xe0, 0x07, 0x68, 0x5b, 0x2b, 0x00,
0xd0, 0x02, 0xf7, 0xff, 0xfe, 0xfb, 0xe0, 0x01, 0xf7, 0xff, 0xfe, 0xbc, 0xbc, 0x10, 0xbc, 0x02,
0x47, 0x08, 0x46, 0xc0, 0x13, 0x77, 0xf7, 0x28, 0xb5, 0xf0, 0xb0, 0x85, 0x4b, 0x80, 0x90, 0x02,
0x91, 0x03, 0x68, 0xdd, 0x68, 0x99, 0x18, 0x6d, 0x18, 0xad, 0x95, 0x00, 0x69, 0x1b, 0x2b, 0x00,
0xd0, 0x13, 0x4b, 0x7c, 0x68, 0x1b, 0x2b, 0x00, 0xdd, 0x00, 0xe0, 0xe8, 0x4b, 0x7a, 0x68, 0x19,
0x29, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x6f, 0x4b, 0x77, 0x22, 0x00, 0x60, 0x1a,
0x23, 0x01, 0x4a, 0x76, 0x42, 0x5b, 0x60, 0x13, 0xe0, 0xd9, 0x4b, 0x74, 0x4a, 0x74, 0x68, 0x1b,
0x42, 0x93, 0xd1, 0x00, 0xe0, 0xa5, 0x2b, 0x00, 0xda, 0x00, 0xe0, 0xa2, 0x4c, 0x6e, 0x68, 0x23,
0x2b, 0x00, 0xd1, 0x06, 0x21, 0x80, 0x20, 0x00, 0x01, 0x89, 0x22, 0x20, 0xf7, 0xff, 0xfe, 0x44,
0x60, 0x20, 0x20, 0x80, 0x01, 0x00, 0x21, 0x20, 0xf7, 0xff, 0xfe, 0x32, 0x1c, 0x04, 0x28, 0x00,
0xd1, 0x03, 0x23, 0x01, 0x4a, 0x65, 0x42, 0x5b, 0x60, 0x13, 0x4e, 0x64, 0x68, 0x33, 0x2b, 0x00,
0xda, 0x02, 0x21, 0x00, 0x91, 0x01, 0xe0, 0x26, 0x1c, 0x35, 0x27, 0x00, 0x68, 0x32, 0x21, 0x80,
0x1c, 0x13, 0x33, 0x10, 0x02, 0x5b, 0x02, 0x52, 0x1c, 0x20, 0x01, 0x09, 0x93, 0x01, 0xf7, 0xff,
0xff, 0x95, 0x28, 0x00, 0xda, 0x03, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x33, 0xe0, 0x13, 0x78, 0x23,
0x2b, 0x43, 0xd1, 0x08, 0x78, 0x63, 0x2b, 0x49, 0xd1, 0x05, 0x78, 0xa3, 0x2b, 0x53, 0xd1, 0x02,
0x78, 0xe3, 0x2b, 0x4f, 0xd0, 0x07, 0x68, 0x2b, 0x2b, 0x00, 0xd0, 0x01, 0x60, 0x2f, 0xe7, 0xdd,
0x23, 0x01, 0x42, 0x5b, 0x60, 0x2b, 0x4e, 0x4d, 0x68, 0x33, 0x2b, 0x00, 0xdb, 0x54, 0x4b, 0x4a,
0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x50, 0x79, 0x62, 0x79, 0xa3, 0x02, 0x12, 0x04, 0x1b, 0x18, 0xd2,
0x79, 0x23, 0x48, 0x48, 0x18, 0xd2, 0x79, 0xe3, 0x21, 0x00, 0x06, 0x1b, 0x18, 0xd2, 0x4b, 0x46,
0x08, 0x92, 0x60, 0x1a, 0x22, 0x80, 0x01, 0x12, 0xf0, 0x00, 0xfa, 0x50, 0x27, 0x08, 0x25, 0x00,
0x4a, 0x42, 0x42, 0x17, 0xd1, 0x11, 0x4b, 0x42, 0x42, 0x9d, 0xdd, 0x0e, 0x68, 0x33, 0x12, 0xfa,
0x18, 0xd2, 0x21, 0x80, 0x02, 0x52, 0x1c, 0x20, 0x01, 0x09, 0xf7, 0xff, 0xff, 0x4f, 0x28, 0x00,
0xda, 0x03, 0x23, 0x01, 0x42, 0x5b, 0x60, 0x33, 0xe0, 0x20, 0x20, 0x07, 0x40, 0x28, 0xd1, 0x05,
0x4b, 0x31, 0x10, 0xea, 0x68, 0x1b, 0x99, 0x01, 0x00, 0x92, 0x50, 0xd1, 0x4b, 0x33, 0x40, 0x3b,
0x5c, 0xe3, 0x2b, 0x00, 0xd0, 0x0c, 0x4a, 0x2f, 0x21, 0x01, 0x10, 0xeb, 0x40, 0x81, 0x1c, 0x08,
0x5c, 0xd1, 0x43, 0x01, 0x54, 0xd1, 0x4b, 0x2c, 0x9a, 0x01, 0x68, 0x1b, 0x18, 0xd2, 0x92, 0x01,
0x23, 0x80, 0x35, 0x01, 0x01, 0xdb, 0x37, 0x01, 0x42, 0x9d, 0xd1, 0xc9, 0x4b, 0x23, 0x68, 0x1a,
0x2a, 0x00, 0xdb, 0x01, 0x4a, 0x22, 0x60, 0x1a, 0x2c, 0x00, 0xd0, 0x02, 0x1c, 0x20, 0xf7, 0xff,
0xfd, 0x97, 0x4b, 0x1e, 0x4c, 0x1c, 0x68, 0x1a, 0x4b, 0x1d, 0x42, 0x9a, 0xd1, 0x1e, 0x4b, 0x1e,
0x98, 0x00, 0x68, 0x1d, 0x1c, 0x29, 0xf0, 0x00, 0xfc, 0xf3, 0x68, 0x23, 0x08, 0xc1, 0x24, 0x07,
0x00, 0x8a, 0x58, 0xd2, 0x40, 0x20, 0x23, 0x00, 0x4e, 0x16, 0x24, 0x01, 0xe0, 0x05, 0x5c, 0x77,
0x41, 0x1f, 0x42, 0x27, 0xd0, 0x00, 0x19, 0x52, 0x33, 0x01, 0x42, 0x83, 0xd3, 0xf7, 0x9b, 0x00,
0x3d, 0x01, 0x40, 0x1d, 0x19, 0x52, 0x98, 0x02, 0x99, 0x03, 0xe0, 0x0b, 0x68, 0x21, 0x29, 0x00,
0xd0, 0x02, 0x20, 0x00, 0xf7, 0xff, 0xfd, 0x90, 0x4b, 0x07, 0x22, 0x00, 0x60, 0x1a, 0x98, 0x02,
0x99, 0x03, 0x9a, 0x00, 0xf7, 0xff, 0xfe, 0xea, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08,
0x13, 0x77, 0xf7, 0x28, 0x13, 0x77, 0xf7, 0xa0, 0x13, 0x77, 0xf7, 0x24, 0x13, 0x77, 0xf6, 0x04,
0x7f, 0xff, 0xff, 0xff, 0x13, 0x77, 0xf7, 0xc0, 0x13, 0x77, 0xf7, 0x50, 0x00, 0x00, 0x07, 0xff,
0x00, 0x00, 0x07, 0xf7, 0xb5, 0x70, 0x22, 0x00, 0x21, 0x20, 0x1c, 0x04, 0xf7, 0xff, 0xfe, 0xe4,
0x69, 0xa2, 0x4b, 0x09, 0x1c, 0x05, 0x42, 0x9a, 0xd1, 0x09, 0x4b, 0x08, 0x21, 0x01, 0x68, 0x1a,
0x70, 0x11, 0x68, 0x1b, 0x78, 0x5b, 0x2b, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xfd, 0x51, 0x1c, 0x28,
0xbc, 0x70, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0x5d, 0x1c, 0x9e, 0xa3, 0x13, 0x77, 0xe0, 0x08,
0xb5, 0xf0, 0xb0, 0x83, 0x92, 0x01, 0x4a, 0xb9, 0x1c, 0x05, 0x68, 0x13, 0x1c, 0x0c, 0x78, 0x06,
0x2b, 0x00, 0xd0, 0x0e, 0x4b, 0xb6, 0x4f, 0xb7, 0x68, 0x1a, 0x68, 0x38, 0x21, 0x00, 0xf0, 0x00,
0xf9, 0x95, 0x4a, 0xb3, 0x68, 0x38, 0x68, 0x11, 0xf7, 0xff, 0xfd, 0x26, 0x4a, 0xaf, 0x23, 0x00,
0x60, 0x13, 0x2e, 0xe0, 0xd0, 0x55, 0x4f, 0xb0, 0x23, 0x00, 0x62, 0x3b, 0x2e, 0xd0, 0xd1, 0x00,
0xe1, 0x6e, 0x2e, 0xd0, 0xd8, 0x26, 0x2e, 0x79, 0xd0, 0x62, 0x2e, 0x79, 0xd8, 0x0f, 0x2e, 0x15,
0xd1, 0x00, 0xe0, 0xb3, 0x2e, 0x15, 0xd8, 0x03, 0x2e, 0x13, 0xd2, 0x00, 0xe1, 0x6a, 0xe0, 0x8d,
0x2e, 0x70, 0xd1, 0x00, 0xe1, 0x00, 0x2e, 0x71, 0xd0, 0x00, 0xe1, 0x63, 0xe0, 0xe6, 0x2e, 0xa4,
0xd1, 0x00, 0xe0, 0xbf, 0x2e, 0xa4, 0xd8, 0x06, 0x2e, 0x8a, 0xd1, 0x00, 0xe1, 0x18, 0x2e, 0x8d,
0xd0, 0x00, 0xe1, 0x57, 0xe1, 0x4c, 0x2e, 0xa8, 0xd1, 0x00, 0xe1, 0x49, 0x2e, 0xab, 0xd0, 0x00,
0xe1, 0x50, 0xe0, 0x36, 0x2e, 0xf1, 0xd0, 0x50, 0x2e, 0xf1, 0xd8, 0x10, 0x2e, 0xe0, 0xd0, 0x20,
0x2e, 0xe0, 0xd8, 0x06, 0x2e, 0xd9, 0xd1, 0x00, 0xe0, 0x94, 0x2e, 0xda, 0xd0, 0x00, 0xe1, 0x41,
0xe0, 0xad, 0x2e, 0xe4, 0xd0, 0x31, 0x2e, 0xf0, 0xd0, 0x00, 0xe1, 0x3b, 0xe0, 0x3a, 0x2e, 0xf4,
0xd0, 0x47, 0x2e, 0xf4, 0xd8, 0x05, 0x2e, 0xf2, 0xd0, 0x3e, 0x2e, 0xf3, 0xd0, 0x00, 0xe1, 0x31,
0xe0, 0x3d, 0x2e, 0xf6, 0xd0, 0x4e, 0x2e, 0xf6, 0xd3, 0x4a, 0x2e, 0xff, 0xd0, 0x00, 0xe1, 0x29,
0xe0, 0x71, 0x4b, 0x85, 0x6a, 0x1a, 0x2a, 0x00, 0xd1, 0x03, 0x69, 0x1b, 0x2b, 0x00, 0xd1, 0x00,
0xe1, 0x20, 0x1c, 0x20, 0x21, 0x00, 0x9a, 0x01, 0xf0, 0x00, 0xf9, 0x28, 0x4b, 0x7e, 0x6a, 0x1b,
0xe0, 0x1c, 0x68, 0x7b, 0x2b, 0x00, 0xd0, 0x00, 0xe1, 0x1a, 0x4b, 0x7b, 0x69, 0x1b, 0xe0, 0x00,
0x69, 0x3b, 0x2b, 0x00, 0xd0, 0x00, 0xe1, 0x13, 0xe1, 0x0c, 0x68, 0x7b, 0x2b, 0x00, 0xd1, 0x03,
0x69, 0x3b, 0x2b, 0x00, 0xd1, 0x00, 0xe1, 0x05, 0x1c, 0x20, 0x21, 0x00, 0x9a, 0x01, 0xf0, 0x00,
0xf9, 0x0d, 0xe0, 0x04, 0x68, 0x6b, 0x60, 0xbb, 0xe1, 0x02, 0x68, 0xbb, 0x60, 0x23, 0x99, 0x01,
0x1c, 0x20, 0xf7, 0xff, 0xfc, 0x99, 0xe0, 0xfb, 0x68, 0x6b, 0x60, 0x3b, 0xe0, 0xf8, 0x68, 0x3b,
0xe7, 0xf4, 0x68, 0x6b, 0x61, 0x3b, 0x2b, 0x00, 0xd0, 0x06, 0x1c, 0x38, 0x1c, 0x29, 0x30, 0x18,
0x31, 0x08, 0x22, 0x06, 0xf7, 0xff, 0xfc, 0x9c, 0x69, 0x6a, 0x4b, 0x63, 0x61, 0x5a, 0xe0, 0xe7,
0x69, 0x3b, 0xe7, 0xe3, 0x79, 0x2b, 0x37, 0x05, 0x77, 0xfb, 0xe0, 0xe1, 0x2c, 0x00, 0xd1, 0x00,
0xe0, 0xde, 0x2e, 0x13, 0xd1, 0x0b, 0x69, 0x3b, 0x2b, 0x00, 0xd0, 0x0f, 0x4b, 0x5b, 0x68, 0x1b,
0x2b, 0x00, 0xd0, 0x07, 0xf0, 0x00, 0xf9, 0xb4, 0x28, 0x00, 0xd0, 0x0b, 0xe0, 0x0c, 0x69, 0x3b,
0x2b, 0x00, 0xd0, 0x03, 0x4b, 0x56, 0x68, 0x1b, 0x2b, 0x00, 0xda, 0x05, 0x4b, 0x55, 0x68, 0x1b,
0x07, 0xda, 0xd5, 0x01, 0x23, 0x00, 0xe7, 0xc1, 0x23, 0x02, 0xe7, 0xbf, 0x4b, 0x51, 0x22, 0x01,
0x68, 0x1b, 0x43, 0x93, 0xe7, 0xba, 0x68, 0x6b, 0x48, 0x4f, 0x1c, 0x21, 0x40, 0x18, 0xf7, 0xff,
0xfc, 0x73, 0xe0, 0xb6, 0x68, 0x7b, 0x2b, 0x00, 0xd1, 0x03, 0x69, 0x3b, 0x2b, 0x00, 0xd1, 0x00,
0xe0, 0xa8, 0x68, 0x6a, 0x68, 0xab, 0x07, 0x92, 0x43, 0x1a, 0x4b, 0x48, 0x40, 0x1a, 0x4b, 0x42,
0x60, 0xda, 0xe0, 0xa5, 0x68, 0x7b, 0x2b, 0x00, 0xd1, 0x03, 0x69, 0x3b, 0x2b, 0x00, 0xd1, 0x00,
0xe0, 0x98, 0x4a, 0x43, 0x4b, 0x3c, 0x20, 0xa0, 0x62, 0x1a, 0x02, 0x00, 0xe0, 0x99, 0x4e, 0x41,
0x21, 0x40, 0x1c, 0x30, 0xf7, 0xff, 0xfc, 0x4c, 0x1c, 0x33, 0x33, 0x40, 0xe0, 0x03, 0x36, 0x01,
0x42, 0x9e, 0xd1, 0x00, 0xe0, 0x86, 0x78, 0x32, 0x2a, 0x00, 0xd0, 0xf8, 0x49, 0x39, 0x1c, 0x20,
0x22, 0x40, 0xf7, 0xff, 0xfc, 0x35, 0x1c, 0x20, 0x21, 0x40, 0xe7, 0x82, 0x1d, 0xbb, 0x22, 0x01,
0x77, 0xda, 0x68, 0x3b, 0x2b, 0x00, 0xd1, 0x05, 0x1c, 0x28, 0x1c, 0x21, 0x9a, 0x01, 0xf0, 0x00,
0xfb, 0x51, 0xe0, 0x04, 0x68, 0x69, 0x68, 0xaa, 0x1c, 0x20, 0xf7, 0xff, 0xfd, 0x9d, 0x4b, 0x26,
0x22, 0x00, 0x33, 0x06, 0x77, 0xda, 0xe0, 0x6c, 0x69, 0x3b, 0x2b, 0x00, 0xd1, 0x06, 0x1c, 0x28,
0x1c, 0x21, 0x9a, 0x01, 0xf0, 0x00, 0xfb, 0x3e, 0x28, 0x00, 0xd1, 0x0e, 0x4b, 0x1e, 0x68, 0xda,
0x2a, 0x00, 0xd1, 0x09, 0x68, 0x9a, 0x2a, 0x00, 0xd1, 0x06, 0x69, 0x1a, 0x2a, 0x00, 0xd1, 0x03,
0x69, 0xa0, 0x49, 0x21, 0x42, 0x88, 0xd0, 0x09, 0x20, 0x00, 0x1e, 0x43, 0x41, 0x98, 0x4b, 0x16,
0x99, 0x01, 0x60, 0x58, 0x1c, 0x20, 0xf7, 0xff, 0xfe, 0x8d, 0xe0, 0x4a, 0x60, 0x5a, 0xe0, 0x47,
0x1d, 0x7b, 0x7f, 0xdb, 0x2b, 0x00, 0xd1, 0x43, 0x1d, 0xba, 0x77, 0xd3, 0x60, 0x3b, 0x60, 0x7b,
0x60, 0xbb, 0x60, 0xfb, 0x62, 0x3b, 0x69, 0x3b, 0x2b, 0x00, 0xd1, 0x04, 0x69, 0x7a, 0x4b, 0x13,
0x3a, 0x01, 0x60, 0x1a, 0xe0, 0x2e, 0xf7, 0xff, 0xfc, 0xe5, 0x69, 0x38, 0x1c, 0x39, 0x31, 0x18,
0x69, 0x7a, 0x38, 0x01, 0xf0, 0x00, 0xf8, 0x62, 0xe0, 0x2b, 0x46, 0xc0, 0x13, 0x77, 0xf6, 0x00,
0x13, 0x77, 0xe0, 0x48, 0x13, 0x77, 0xe0, 0x44, 0x13, 0x77, 0xf7, 0x28, 0x13, 0x77, 0xf7, 0xa4,
0x13, 0x77, 0xf6, 0x08, 0x0d, 0x00, 0x60, 0x04, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
0x00, 0x05, 0x31, 0x00, 0x13, 0x77, 0xef, 0xe0, 0x5d, 0x1c, 0x9e, 0xa3, 0x13, 0x77, 0xf6, 0x04,
0x68, 0xaa, 0x68, 0x69, 0x2e, 0xd0, 0xd1, 0x01, 0x02, 0x52, 0x02, 0xc9, 0x1c, 0x20, 0xf7, 0xff,
0xfd, 0x33, 0xe0, 0x06, 0x1c, 0x28, 0x1c, 0x21, 0x9a, 0x01, 0xf0, 0x00, 0xfa, 0xdb, 0xe0, 0x00,
0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0, 0xb5, 0xf0, 0x2a, 0x00,
0xd0, 0x29, 0x24, 0x03, 0x1c, 0x03, 0x40, 0x23, 0x27, 0x04, 0x1a, 0xfb, 0x06, 0x0e, 0x40, 0x23,
0x0e, 0x36, 0x1c, 0x05, 0x42, 0x93, 0xd9, 0x01, 0x1c, 0x13, 0xe0, 0x01, 0x2b, 0x00, 0xd0, 0x05,
0x1c, 0x1c, 0xe0, 0x01, 0x70, 0x2e, 0x35, 0x01, 0x3c, 0x01, 0xd2, 0xfb, 0x04, 0x0c, 0x06, 0x0d,
0x43, 0x25, 0x43, 0x0d, 0x02, 0x0c, 0x1c, 0x29, 0x43, 0x21, 0x18, 0xc4, 0xe0, 0x01, 0xc4, 0x02,
0x1c, 0x2b, 0x1d, 0x1d, 0x42, 0x95, 0xd9, 0xfa, 0x18, 0xc0, 0xe0, 0x01, 0x33, 0x01, 0x70, 0x06,
0x30, 0x01, 0x42, 0x93, 0xd3, 0xfa, 0xbc, 0xf0, 0xbc, 0x01, 0x47, 0x00, 0xb5, 0xf0, 0xb0, 0x85,
0x1c, 0x05, 0x1c, 0x0e, 0x28, 0x01, 0xd9, 0x02, 0x25, 0x01, 0x42, 0x6d, 0xe0, 0x89, 0x4b, 0x47,
0x92, 0x03, 0x68, 0x1a, 0x2a, 0x00, 0xd1, 0x02, 0x4a, 0x45, 0x60, 0x1a, 0xe0, 0x05, 0x4b, 0x45,
0x68, 0x18, 0x28, 0x00, 0xdb, 0x01, 0xf7, 0xff, 0xfb, 0x47, 0x4a, 0x42, 0x23, 0x01, 0x42, 0x5b,
0x60, 0x13, 0x4a, 0x41, 0x4b, 0x41, 0x21, 0x00, 0x60, 0x11, 0x60, 0x19, 0x78, 0x31, 0x29, 0x5f,
0xd1, 0x2b, 0x78, 0x71, 0x29, 0x44, 0xd1, 0x28, 0x78, 0xb1, 0x29, 0x45, 0xd1, 0x1e, 0x78, 0xf2,
0x2a, 0x56, 0xd1, 0x22, 0x22, 0x01, 0x60, 0x1a, 0x79, 0x32, 0x2a, 0x57, 0xd1, 0x01, 0x22, 0x02,
0x60, 0x1a, 0x4c, 0x37, 0x21, 0x80, 0x1c, 0x20, 0x00, 0x49, 0xf7, 0xff, 0xfb, 0x49, 0x1c, 0x20,
0x21, 0x00, 0xf7, 0xff, 0xfb, 0x39, 0x4b, 0x2f, 0x1c, 0x05, 0x60, 0x18, 0x28, 0x00, 0xdb, 0x01,
0x25, 0x00, 0xe0, 0x4e, 0x4b, 0x2d, 0x22, 0x00, 0x60, 0x1a, 0xe0, 0x4a, 0x29, 0x56, 0xd1, 0x04,
0x78, 0xf3, 0x2b, 0x44, 0xd1, 0x01, 0x23, 0x01, 0x60, 0x13, 0x4b, 0x2a, 0x00, 0xaa, 0x58, 0xd0,
0x21, 0x01, 0xf7, 0xff, 0xfb, 0x21, 0x4c, 0x23, 0x60, 0x20, 0x28, 0x00, 0xda, 0x06, 0x2d, 0x00,
0xd1, 0x04, 0x48, 0x25, 0x21, 0x01, 0xf7, 0xff, 0xfb, 0x17, 0x60, 0x20, 0x4f, 0x1d, 0x68, 0x3d,
0x2d, 0x00, 0xdb, 0x2e, 0x4c, 0x19, 0x1c, 0x31, 0x68, 0x20, 0x22, 0x06, 0x30, 0x20, 0xf7, 0xff,
0xfb, 0x0f, 0x68, 0x20, 0x22, 0x04, 0xa9, 0x03, 0x30, 0x3c, 0xf7, 0xff, 0xfb, 0x09, 0x68, 0x20,
0x26, 0x04, 0x1c, 0x03, 0x33, 0x20, 0x60, 0x03, 0x23, 0x06, 0x60, 0x43, 0x1c, 0x03, 0x33, 0x3c,
0x60, 0x83, 0x60, 0xc6, 0x21, 0x40, 0xf7, 0xff, 0xfa, 0xe7, 0x68, 0x23, 0x68, 0x38, 0x49, 0x13,
0x93, 0x00, 0x22, 0x02, 0x23, 0x00, 0xf7, 0xff, 0xfa, 0xe3, 0x1c, 0x05, 0x68, 0x20, 0x21, 0x40,
0x1c, 0x03, 0x33, 0x20, 0x60, 0x03, 0x33, 0x1c, 0x60, 0x46, 0x60, 0x83, 0x60, 0xc6, 0xf7, 0xff,
0xfa, 0xd3, 0xb0, 0x05, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x02, 0x47, 0x08, 0x13, 0x77, 0xf7, 0x54,
0x13, 0x77, 0xf7, 0x60, 0x13, 0x77, 0xf6, 0x08, 0x13, 0x77, 0xf7, 0xa4, 0x13, 0x77, 0xf7, 0xa0,
0x13, 0x77, 0xf6, 0x20, 0x13, 0x77, 0xf0, 0x48, 0x13, 0x77, 0xf0, 0x20, 0x57, 0x46, 0x53, 0x01,
0xb5, 0x00, 0x4b, 0x0b, 0xb0, 0x83, 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x0c, 0x4b, 0x09, 0x68, 0x18,
0x28, 0x00, 0xdb, 0x08, 0x4b, 0x08, 0x49, 0x09, 0x68, 0x1b, 0x22, 0x00, 0x93, 0x00, 0x23, 0x00,
0xf7, 0xff, 0xfa, 0xae, 0xe0, 0x00, 0x20, 0x01, 0xb0, 0x03, 0xbc, 0x02, 0x47, 0x08, 0x46, 0xc0,
0x13, 0x77, 0xf7, 0xa4, 0x13, 0x77, 0xf6, 0x08, 0x13, 0x77, 0xf7, 0x54, 0x57, 0x46, 0x53, 0x04,
0xb5, 0xf0, 0x4d, 0x94, 0xb0, 0x87, 0x68, 0x2b, 0x90, 0x03, 0x91, 0x02, 0x92, 0x04, 0x2b, 0x00,
0xda, 0x00, 0xe0, 0xf1, 0x4b, 0x90, 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x00, 0xe0, 0xef, 0x3b, 0x01,
0x2b, 0x01, 0xd9, 0x00, 0xe0, 0xaa, 0x4c, 0x8d, 0x68, 0x23, 0x2b, 0x00, 0xd1, 0x06, 0x21, 0x80,
0x20, 0x00, 0x01, 0x89, 0x22, 0x20, 0xf7, 0xff, 0xfa, 0x87, 0x60, 0x20, 0x20, 0x80, 0x01, 0x00,
0x21, 0x20, 0xf7, 0xff, 0xfa, 0x75, 0x1c, 0x04, 0x28, 0x00, 0xd1, 0x03, 0x23, 0x01, 0x4a, 0x82,
0x42, 0x5b, 0x60, 0x13, 0x4b, 0x80, 0x68, 0x1b, 0x2b, 0x00, 0xda, 0x01, 0x25, 0x00, 0xe0, 0x21,
0x4d, 0x7c, 0x21, 0x00, 0x68, 0x28, 0x22, 0x00, 0xf7, 0xff, 0xfa, 0x56, 0x28, 0x00, 0xdb, 0x13,
0x22, 0x80, 0x68, 0x28, 0x1c, 0x21, 0x01, 0x12, 0xf7, 0xff, 0xfa, 0x4a, 0x28, 0x00, 0xdb, 0x0b,
0x78, 0x23, 0x2b, 0x43, 0xd1, 0x08, 0x78, 0x63, 0x2b, 0x49, 0xd1, 0x05, 0x78, 0xa3, 0x2b, 0x53,
0xd1, 0x02, 0x78, 0xe3, 0x2b, 0x4f, 0xd0, 0x03, 0x23, 0x01, 0x4a, 0x6f, 0x42, 0x5b, 0x60, 0x13,
0x25, 0x80, 0x01, 0xad, 0x4a, 0x6c, 0x68, 0x13, 0x2b, 0x00, 0xdb, 0x62, 0x4b, 0x6b, 0x68, 0x1b,
0x2b, 0x00, 0xd0, 0x5e, 0x79, 0x62, 0x79, 0xa3, 0x02, 0x12, 0x04, 0x1b, 0x18, 0xd2, 0x79, 0x23,
0x48, 0x67, 0x18, 0xd2, 0x79, 0xe3, 0x21, 0x00, 0x06, 0x1b, 0x18, 0xd2, 0x4b, 0x65, 0x08, 0x92,
0x60, 0x1a, 0x22, 0x80, 0x01, 0x12, 0xf7, 0xff, 0xfe, 0x99, 0x27, 0x08, 0x26, 0x00, 0x4b, 0x62,
0x42, 0x1f, 0xd1, 0x21, 0x4a, 0x61, 0x42, 0x96, 0xdd, 0x1e, 0x4b, 0x5b, 0x68, 0x1a, 0x4b, 0x59,
0x2a, 0x02, 0xd1, 0x03, 0x12, 0xf9, 0x68, 0x18, 0x02, 0x49, 0xe0, 0x02, 0x49, 0x5c, 0x68, 0x18,
0x40, 0x39, 0x22, 0x00, 0xf7, 0xff, 0xfa, 0x08, 0x28, 0x00, 0xdb, 0x08, 0x4b, 0x51, 0x22, 0x80,
0x68, 0x18, 0x1c, 0x21, 0x01, 0x12, 0xf7, 0xff, 0xf9, 0xfb, 0x28, 0x00, 0xda, 0x04, 0x23, 0x01,
0x4a, 0x4d, 0x42, 0x5b, 0x60, 0x13, 0xe0, 0x1d, 0x20, 0x07, 0x40, 0x30, 0xd1, 0x04, 0x4b, 0x4b,
0x10, 0xf2, 0x68, 0x1b, 0x00, 0x92, 0x50, 0xd5, 0x4b, 0x4b, 0x40, 0x3b, 0x5c, 0xe3, 0x2b, 0x00,
0xd0, 0x0a, 0x4a, 0x47, 0x21, 0x01, 0x10, 0xf3, 0x40, 0x81, 0x1c, 0x08, 0x5c, 0xd1, 0x43, 0x01,
0x54, 0xd1, 0x4b, 0x44, 0x68, 0x1b, 0x18, 0xed, 0x23, 0x80, 0x36, 0x01, 0x01, 0xdb, 0x37, 0x01,
0x42, 0x9e, 0xd1, 0xbc, 0x4b, 0x3c, 0x68, 0x1a, 0x2a, 0x00, 0xdb, 0x02, 0x21, 0x04, 0x43, 0x0a,
0x60, 0x1a, 0x2c, 0x00, 0xd0, 0x02, 0x1c, 0x20, 0xf7, 0xff, 0xf9, 0xd2, 0x4b, 0x36, 0x4c, 0x37,
0x68, 0x1b, 0x93, 0x05, 0x2b, 0x03, 0xdd, 0x2e, 0x4b, 0x36, 0x98, 0x04, 0x68, 0x1d, 0x1c, 0x29,
0xf0, 0x00, 0xf9, 0x2e, 0x68, 0x23, 0x08, 0xc2, 0x24, 0x07, 0x00, 0x91, 0x58, 0xc9, 0x40, 0x20,
0x23, 0x00, 0x4e, 0x2f, 0x24, 0x01, 0xe0, 0x05, 0x5c, 0xb7, 0x41, 0x1f, 0x42, 0x27, 0xd0, 0x00,
0x19, 0x49, 0x33, 0x01, 0x42, 0x83, 0xd3, 0xf7, 0x9a, 0x04, 0x3d, 0x01, 0x40, 0x15, 0x9a, 0x05,
0x19, 0x49, 0x4b, 0x24, 0x07, 0x92, 0xd5, 0x01, 0x68, 0x18, 0xe0, 0x01, 0x68, 0x18, 0x00, 0x89,
0x22, 0x00, 0xf7, 0xff, 0xf9, 0xa1, 0x4b, 0x1f, 0x99, 0x03, 0x68, 0x18, 0x9a, 0x02, 0xf7, 0xff,
0xf9, 0x97, 0x24, 0x00, 0xe0, 0x31, 0x68, 0x21, 0x29, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xf7, 0xff,
0xf9, 0xbb, 0x4b, 0x1a, 0x22, 0x00, 0x60, 0x1a, 0x24, 0x01, 0x42, 0x64, 0xe0, 0x25, 0x4c, 0x1d,
0x9b, 0x04, 0x68, 0x20, 0x21, 0x40, 0x62, 0x03, 0x9a, 0x02, 0x63, 0xc2, 0x9b, 0x03, 0x61, 0x82,
0x61, 0x03, 0xf7, 0xff, 0xf9, 0x91, 0x98, 0x03, 0x99, 0x02, 0xf7, 0xff, 0xf9, 0x8d, 0x4b, 0x16,
0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x04, 0x68, 0x23, 0x68, 0x28, 0x49, 0x14, 0x93, 0x00, 0xe0, 0x03,
0x68, 0x23, 0x49, 0x13, 0x68, 0x28, 0x93, 0x00, 0x22, 0x02, 0x23, 0x01, 0xf7, 0xff, 0xf9, 0x80,
0x99, 0x02, 0x1c, 0x04, 0x98, 0x03, 0xf7, 0xff, 0xf9, 0x93, 0xb0, 0x07, 0x1c, 0x20, 0xbc, 0xf0,
0xbc, 0x02, 0x47, 0x08, 0x13, 0x77, 0xf6, 0x08, 0x13, 0x77, 0xf7, 0xa0, 0x13, 0x77, 0xf7, 0x24,
0x13, 0x77, 0xf7, 0xc0, 0x13, 0x77, 0xf7, 0x50, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x07, 0xf7,
0xff, 0xff, 0xf8, 0x00, 0x13, 0x77, 0xf7, 0x54, 0x13, 0x77, 0xf7, 0xa4, 0x57, 0x46, 0x53, 0x03,
0x57, 0x46, 0x53, 0x02, 0xb4, 0x7c, 0xb5, 0x00, 0xf7, 0xff, 0xfa, 0x7e, 0xbc, 0x02, 0xbc, 0x7c,
0x47, 0x08, 0xb5, 0x70, 0xb0, 0x88, 0x68, 0x85, 0x1c, 0x01, 0x4b, 0x01, 0x47, 0x18, 0x00, 0x00,
0x20, 0x10, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xe6, 0x00, 0x08, 0x10, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x07, 0xf0, 0xe1, 0x2f, 0xff, 0x1e,
0xe6, 0x00, 0x03, 0x30, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0x50, 0xe1, 0x2f, 0xff, 0x1e,
0xe6, 0x00, 0x03, 0x90, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0xb0, 0xe1, 0x2f, 0xff, 0x1e,
0xe6, 0x00, 0x03, 0xd0, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x03, 0xf0, 0xe1, 0x2f, 0xff, 0x1e,
0xe6, 0x00, 0x04, 0x10, 0xe1, 0x2f, 0xff, 0x1e, 0xe6, 0x00, 0x04, 0x50, 0xe1, 0x2f, 0xff, 0x1e,
0xef, 0x00, 0x00, 0xcc, 0xe1, 0x2f, 0xff, 0x1e, 0x46, 0x72, 0x1c, 0x01, 0x20, 0x04, 0xdf, 0xab,
0x47, 0x10, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0,
0xe9, 0x2d, 0x40, 0x80, 0xe5, 0x9f, 0x70, 0x9c, 0xe5, 0x97, 0x70, 0x00, 0xeb, 0x00, 0x00, 0x1f,
0xe8, 0xbd, 0x40, 0x80, 0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x40, 0x80, 0xe5, 0x9f, 0x70, 0x88,
0xe5, 0x97, 0x70, 0x00, 0xeb, 0x00, 0x00, 0x19, 0xe8, 0xbd, 0x40, 0x80, 0xe1, 0x2f, 0xff, 0x1e,
0xe9, 0x2d, 0x40, 0x80, 0xe5, 0x9f, 0x70, 0x74, 0xe5, 0x97, 0x70, 0x00, 0xeb, 0x00, 0x00, 0x13,
0xe8, 0xbd, 0x40, 0x80, 0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x40, 0x80, 0xe5, 0x9f, 0x70, 0x60,
0xe5, 0x97, 0x70, 0x00, 0xeb, 0x00, 0x00, 0x0d, 0xe8, 0xbd, 0x40, 0x80, 0xe1, 0x2f, 0xff, 0x1e,
0xe9, 0x2d, 0x40, 0x80, 0xe5, 0x9f, 0x70, 0x4c, 0xe5, 0x97, 0x70, 0x00, 0xeb, 0x00, 0x00, 0x07,
0xe8, 0xbd, 0x40, 0x80, 0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x40, 0x80, 0xe5, 0x9f, 0x70, 0x38,
0xe5, 0x97, 0x70, 0x00, 0xeb, 0x00, 0x00, 0x01, 0xe8, 0xbd, 0x40, 0x80, 0xe1, 0x2f, 0xff, 0x1e,
0xe1, 0x2f, 0xff, 0x17, 0xb5, 0xf0, 0x46, 0x5f, 0x46, 0x56, 0x46, 0x4d, 0x46, 0x44, 0xb4, 0xf0,
0x4b, 0x07, 0x68, 0x1b, 0x47, 0x18, 0x00, 0x00, 0x13, 0x77, 0xe0, 0x10, 0x13, 0x77, 0xe0, 0x14,
0x13, 0x77, 0xe0, 0x18, 0x13, 0x77, 0xe0, 0x1c, 0x13, 0x77, 0xe0, 0x20, 0x13, 0x77, 0xe0, 0x24,
0x13, 0x77, 0xe0, 0x0c, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0,
0x29, 0x00, 0xd0, 0x34, 0x23, 0x01, 0x22, 0x00, 0xb4, 0x10, 0x42, 0x88, 0xd3, 0x2c, 0x24, 0x01,
0x07, 0x24, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, 0x01, 0x09, 0x01, 0x1b, 0xe7, 0xf8,
0x00, 0xe4, 0x42, 0xa1, 0xd2, 0x04, 0x42, 0x81, 0xd2, 0x02, 0x00, 0x49, 0x00, 0x5b, 0xe7, 0xf8,
0x42, 0x88, 0xd3, 0x01, 0x1a, 0x40, 0x43, 0x1a, 0x08, 0x4c, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00,
0x08, 0x5c, 0x43, 0x22, 0x08, 0x8c, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0x9c, 0x43, 0x22,
0x08, 0xcc, 0x42, 0xa0, 0xd3, 0x02, 0x1b, 0x00, 0x08, 0xdc, 0x43, 0x22, 0x28, 0x00, 0xd0, 0x03,
0x09, 0x1b, 0xd0, 0x01, 0x09, 0x09, 0xe7, 0xe3, 0x1c, 0x10, 0xbc, 0x10, 0x47, 0x70, 0xb5, 0x02,
0xf0, 0x00, 0xf8, 0x0c, 0x20, 0x00, 0xbc, 0x06, 0x47, 0x10, 0x46, 0xc0, 0xb5, 0x03, 0xf7, 0xff,
0xff, 0xbf, 0xbc, 0x0e, 0x43, 0x42, 0x1a, 0x89, 0x47, 0x18, 0x46, 0xc0, 0x47, 0x70, 0x46, 0xc0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2f, 0x64, 0x65, 0x76, 0x2f, 0x75, 0x73, 0x62, 0x32, 0x00, 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x73,
0x64, 0x69, 0x6f, 0x2f, 0x73, 0x64, 0x68, 0x63, 0x00, 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x75, 0x73,
0x62, 0x2f, 0x65, 0x68, 0x63, 0x00, 0x00, 0x00, 0x13, 0x77, 0xf0, 0x20, 0x13, 0x77, 0xf0, 0x2a,
0x13, 0x77, 0xf0, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

View File

@ -1,3 +1,3 @@
#define size_dip_plugin 3224
#define size_dip_plugin 5920
extern unsigned char dip_plugin[3224];
extern unsigned char dip_plugin[5920];

2127
source/mload/fatffs_module.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
#define size_fatffs_module 58440
extern unsigned char fatffs_module[58440];

291
source/mload/fatffs_util.c Normal file
View File

@ -0,0 +1,291 @@
/*
From Custom IOS Module (FAT)
Copyright (C) 2009 Waninkoko.
Copyright (C) 2010 Hermes.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "fatffs_util.h"
#include <string.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <stdio.h>
#include <malloc.h>
extern u32 nand_mode;
s32 FAT_DeleteDir(const char *dirpath)
{
DIR_ITER *dir;
s32 ret;
/* Open directory */
dir = diropen(dirpath);
if (!dir)
return -1;
/* Read entries */
for (;;) {
char filename[256], newpath[256];
struct stat filestat;
/* Read entry */
if (dirnext(dir, filename, &filestat))
break;
/* Non valid entry */
if (filename[0]=='.')
continue;
/* Generate entry path */
strcpy(newpath, dirpath);
strcat(newpath, "/");
strcat(newpath, filename);
/* Delete directory contents */
if (filestat.st_mode & S_IFDIR)
FAT_DeleteDir(newpath);
/* Delete object */
ret = remove(newpath);
/* Error */
if (ret != 0)
break;
}
/* Close directory */
dirclose(dir);
return 0;
}
static int global_error=0;
static char temp_read_buffer[16384] ATTRIBUTE_ALIGN(32);
s32 _FFS_to_FAT_Copy(const char *ffsdirpath, const char *fatdirpath)
{
int n;
u32 blocks, ionodes;
int pos=0;
char *list;
s32 ret;
u32 ionodes_temp;
if(ISFS_GetUsage(ffsdirpath, &blocks, &ionodes)) {global_error=-1;return -1;}
list= memalign(32, ionodes*13);
if(!list) {global_error=-2;return -2;}
if(ISFS_ReadDir(ffsdirpath, list , &ionodes)) {free(list);global_error=-3;return -3;}
if(ionodes) mkdir(fatdirpath, S_IRWXO | S_IRWXG | S_IRWXU);
/* Read entries */
for (n=0;n<ionodes;n++) {
char * filename;
char newffspath[256], newfatpath[256];
/* Read entry */
filename=&list[pos];
pos+=strlen(&list[pos])+1;
/* Non valid entry */
if (filename[0]=='.')
continue;
/* Generate entry path */
strcpy(newffspath, ffsdirpath);
strcat(newffspath, "/");
strcat(newffspath, filename);
strcpy(newfatpath, fatdirpath);
strcat(newfatpath, "/");
strcat(newfatpath, filename);
ret=ISFS_ReadDir(newffspath, NULL, &ionodes_temp);
if(ret==0) // it is a directory
{
_FFS_to_FAT_Copy(newffspath, newfatpath);
if(global_error) {free(list);return global_error;}
}
else // copy the file
{
int fd;
FILE *fp;
fd=ISFS_Open(newffspath, ISFS_OPEN_READ);
if(fd<0)
{
global_error=-4;
free(list);return global_error;
}
else
{
int len;
fp=fopen(newfatpath,"w");
if(!fd) {ISFS_Close(fd);global_error=-5;free(list);return global_error;}
len= ISFS_Seek(fd, 0, 2);
//if(len<0) {ISFS_Close(fd);global_error=-6;free(list);return global_error;}
ISFS_Seek(fd, 0, 0);
while(len>0)
{
ret=len; if(len>16384) ret=16384;
if(ISFS_Read(fd, temp_read_buffer, ret)!=ret)
{
global_error=-7;
break;
}
if(fwrite(temp_read_buffer, 1, ret, fp)!=ret)
{
global_error=-8;
break;
}
len-=ret;
}
fclose(fp);
ISFS_Close(fd);
if(global_error) {free(list);return global_error;}
}
}
}
free(list);
return 0;
}
s32 FFS_to_FAT_Copy(const char *ffsdirpath, const char *fatdirpath)
{
u32 blocks, ionodes;
int ret;
char create_dir[256];
ISFS_Initialize();
ret=ISFS_GetUsage(ffsdirpath, &blocks, &ionodes);
if(ret==0)
{
int n=0;
// creating the path directory
strcpy(create_dir, fatdirpath);
while(create_dir[n]!=0 && create_dir[n]!='/') n++;
if(create_dir[n]=='/') n++;
while(create_dir[n]!=0)
{
if(create_dir[n]=='/')
{
create_dir[n]=0;
mkdir(create_dir, S_IRWXO | S_IRWXG | S_IRWXU);
create_dir[n]='/';
}
n++;
}
global_error=0;
// copy files
_FFS_to_FAT_Copy(ffsdirpath, fatdirpath);
ret=global_error=0;
}
else ret=-101;
ISFS_Deinitialize();
return ret;
}
static char temp_cad[512];
void create_FAT_FFS_Directory(struct discHdr *header)
{
char device[2][4]={
"sd:",
"ud:"
};
if(!header) return;
sprintf((char *) temp_cad,"%s/nand%c", &device[(nand_mode & 2)!=0][0], (nand_mode & 0xc) ? 49+((nand_mode>>2) & 3) : '\0');
sprintf((char *) temp_cad+32,"%2.2x%2.2x%2.2x%2.2x", header->id[0], header->id[1], header->id[2], header->id[3]);
sprintf((char *) temp_cad+64,"%s/title/00010000/%s", temp_cad, temp_cad+32);
sprintf((char *) temp_cad+128,"%s/title/00010004/%s", temp_cad, temp_cad+32);
sprintf((char *) temp_cad+256,"/title/00010000/%s", temp_cad+32);
sprintf((char *) temp_cad+384,"/title/00010004/%s", temp_cad+32);
}
int test_FAT_game(char * directory)
{
DIR_ITER * dir=NULL;
dir= diropen(directory);
if(dir) {dirclose(dir);return 1;}
return 0;
}
char *get_FAT_directory1(void)
{
return temp_cad+64;
}
char *get_FAT_directory2(void)
{
return temp_cad+128;
}
char *get_FFS_directory1(void)
{
return temp_cad+256;
}
char *get_FFS_directory2(void)
{
return temp_cad+384;
}

View File

@ -0,0 +1,24 @@
#ifndef _FAT_UTIL_
#define _FAT_UTIL_
#include <gctypes.h>
#include "usbloader/disc.h"
s32 FAT_DeleteDir(const char *dirpath);
s32 FFS_to_FAT_Copy(const char *ffsdirpath, const char *fatdirpath);
void create_FAT_FFS_Directory(struct discHdr *header);
int test_FAT_game(char * directory);
char *get_FAT_directory1(void);
char *get_FAT_directory2(void);
char *get_FFS_directory1(void);
char *get_FFS_directory2(void);
#endif

View File

@ -16,19 +16,20 @@
*/
#include "mload.h"
#include "ehcmodule_frag_bin.h"
#include "dip_plugin.h"
#include <malloc.h>
#include "gecko.h"
static const char mload_fs[] ATTRIBUTE_ALIGN(32) = "/dev/mload";
static u32 patch_datas[8] ATTRIBUTE_ALIGN(32);
//static u32 patch_datas[8] ATTRIBUTE_ALIGN(32);
static s32 mload_fd = -1;
static s32 hid = -1;
static data_elf my_data_elf;
static int thread_id = -1;
void *external_ehcmodule= NULL;
int size_external_ehcmodule=0;
//static data_elf my_data_elf;
//static int thread_id = -1;
//void *external_ehcmodule= NULL;
//int size_external_ehcmodule=0;
/*--------------------------------------------------------------------------------------------------------------*/
@ -483,37 +484,7 @@ return ret;
}
static u32 ios_36[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022DDAC, // dvd_read_controlling_data
0x20201010+1, // handle_di_cmd_reentry (thumb)
0x20200b9c+1, // ios_shared_alloc_aligned (thumb)
0x20200b70+1, // ios_shared_free (thumb)
0x20205dc0+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202b4c+1, // ios_doReadHashEncryptedState (thumb)
0x20203934+1, // ios_printf (thumb)
};
static u32 ios_38[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022cdac, // dvd_read_controlling_data
0x20200d38+1, // handle_di_cmd_reentry (thumb)
0x202008c4+1, // ios_shared_alloc_aligned (thumb)
0x20200898+1, // ios_shared_free (thumb)
0x20205b80+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202874+1, // ios_doReadHashEncryptedState (thumb)
0x2020365c+1, // ios_printf (thumb)
};
/*
int load_ehc_module()
{
int is_ios=0;
@ -549,7 +520,14 @@ int load_ehc_module()
if(!external_ehcmodule)
{
if(mload_init()<0) return -1;
mload_elf((void *) ehcmodule_frag_bin, &my_data_elf);
if (IOS_GetRevision() == 4) {
gprintf("Loading ehcmodule v4\n");
mload_elf((void *) ehcmodule_frag_v4_bin, &my_data_elf);
} else if (IOS_GetRevision() == 0) { // 0? Strange value for v5 ehcmodule
gprintf("Loading ehcmodule v5\n");
mload_elf((void *) ehcmodule_frag_v5_bin, &my_data_elf);
}
thread_id = mload_run_thread(my_data_elf.start, my_data_elf.stack, my_data_elf.size_stack, my_data_elf.prio);
if(thread_id < 0) return -1;
}
@ -579,7 +557,7 @@ int load_ehc_module()
{
// IOS 36
memcpy(ios_36, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_36, 4*10); // copy the adresses from the array
memcpy((void *) dip_plugin, ios_36, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
@ -594,7 +572,7 @@ int load_ehc_module()
// IOS 38
memcpy(ios_38, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_38, 4*10); // copy the adresses from the array
memcpy((void *) dip_plugin, ios_38, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
@ -610,12 +588,11 @@ int load_ehc_module()
return 0;
}
int patch_cios_data() {
patch_datas[0]=*((u32 *) (dip_plugin+16*4));
mload_set_ES_ioctlv_vector((void *) patch_datas[0]);
return 1;
}
*/

View File

@ -218,8 +218,6 @@ int mload_setb(const void * addr, u8 dat);
/*--------------------------------------------------------------------------------------------------------------*/
int load_ehc_module();
int patch_cios_data();
#ifdef __cplusplus

View File

@ -0,0 +1,489 @@
#include "mload_modules.h"
#include "ehcmodule_frag_v4_bin.h"
#include "ehcmodule_frag_v5_bin.h"
#include "gecko.h"
#define ALIGNED(x) __attribute__((aligned(x)))
/* Used for Hermes NAND emulation */
int global_mount;
int sd_ok=0;
int ud_ok=0;
static u32 ios_36[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022DDAC, // dvd_read_controlling_data
0x20201010+1, // handle_di_cmd_reentry (thumb)
0x20200b9c+1, // ios_shared_alloc_aligned (thumb)
0x20200b70+1, // ios_shared_free (thumb)
0x20205dc0+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202b4c+1, // ios_doReadHashEncryptedState (thumb)
0x20203934+1, // ios_printf (thumb)
};
static u32 ios_38[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022cdac, // dvd_read_controlling_data
0x20200d38+1, // handle_di_cmd_reentry (thumb)
0x202008c4+1, // ios_shared_alloc_aligned (thumb)
0x20200898+1, // ios_shared_free (thumb)
0x20205b80+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202874+1, // ios_doReadHashEncryptedState (thumb)
0x2020365c+1, // ios_printf (thumb)
};
static u32 ios_37[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022DD60, // dvd_read_controlling_data
0x20200F04+1, // handle_di_cmd_reentry (thumb)
0x2020096C+1, // ios_shared_alloc_aligned (thumb)
0x2020093C+1, // ios_shared_free (thumb)
0x20205E54+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202A70+1, // ios_doReadHashEncryptedState (thumb)
0x2020387C+1, // ios_printf (thumb)
};
static u32 ios_57[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022cd60, // dvd_read_controlling_data
0x20200f04+1, // handle_di_cmd_reentry (thumb)
0x2020096c+1, // ios_shared_alloc_aligned (thumb) // no usado
0x2020093C+1, // ios_shared_free (thumb) // no usado
0x20205EF0+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202944+1, // ios_doReadHashEncryptedState (thumb)
0x20203750+1, // ios_printf (thumb)
};
static u32 ios_60[16] ATTRIBUTE_ALIGN(32)=
{
0, // DI_EmulateCmd
0,
0x2022cd60, // dvd_read_controlling_data
0x20200f04+1, // handle_di_cmd_reentry (thumb)
0x2020096c+1, // ios_shared_alloc_aligned (thumb) // no usado
0x2020093C+1, // ios_shared_free (thumb) // no usado
0x20205e00+1, // ios_memcpy (thumb)
0x20200048+1, // ios_fatal_di_error (thumb)
0x20202944+1, // ios_doReadHashEncryptedState (thumb)
0x20203750+1, // ios_printf (thumb)
};
u32 patch_datas[8] ATTRIBUTE_ALIGN(32);
data_elf my_data_elf;
void *external_ehcmodule= NULL;
int size_external_ehcmodule=0;
static int my_thread_id=0;
int load_ehc_module()
{
int is_ios=0;
#if 0
FILE *fp;
// WARNING!!!: load external module suspended
if(sd_ok && !external_ehcmodule)
{
fp=fopen("sd:/apps/usbloader_gx/ehcmodule.elf","rb");
if(fp==NULL)
fp=fopen("sd:/apps/usbloadergx/ehcmodule.elf","rb");
if(fp!=0)
{
fseek(fp, 0, SEEK_END);
size_external_ehcmodule = ftell(fp);
external_ehcmodule= memalign(32, size_external_ehcmodule);
if(!external_ehcmodule)
{fclose(fp);}
else
{
fseek(fp, 0, SEEK_SET);
if(fread(external_ehcmodule,1, size_external_ehcmodule ,fp)!=size_external_ehcmodule)
{free(external_ehcmodule); external_ehcmodule=NULL;}
fclose(fp);
}
}
}
#endif
/*
if(mload_init()<0) return -1;
mload_elf((void *) logmodule, &my_data_elf);
my_thread_id= mload_run_thread(my_data_elf.start, my_data_elf.stack, my_data_elf.size_stack, my_data_elf.prio);
if(my_thread_id<0) return -1;
*/
if(!external_ehcmodule)
{
gprintf("before mload_init\n");
if(mload_init()<0) return -1;
gprintf("after mload_init\n");
if (IOS_GetRevision() == 4) {
gprintf("Loading ehcmodule v4\n");
mload_elf((void *) ehcmodule_frag_v4_bin, &my_data_elf);
} else if (IOS_GetRevision() == 65535) {
gprintf("Loading ehcmodule v5\n");
mload_elf((void *) ehcmodule_frag_v5_bin, &my_data_elf);
} else {
return -2;
}
// mload_elf((void *) ehcmodule, &my_data_elf);
gprintf("before mload_run_thread\n");
my_thread_id= mload_run_thread(my_data_elf.start, my_data_elf.stack, my_data_elf.size_stack, my_data_elf.prio);
if(my_thread_id<0) return -1;
//if(mload_module(ehcmodule, size_ehcmodule)<0) return -1;
}
else
{
//if(mload_module(external_ehcmodule, size_external_ehcmodule)<0) return -1;
if(mload_init()<0) return -1;
mload_elf((void *) external_ehcmodule, &my_data_elf);
my_thread_id= mload_run_thread(my_data_elf.start, my_data_elf.stack, my_data_elf.size_stack, my_data_elf.prio);
if(my_thread_id<0) return -1;
}
usleep(350*1000);
// Test for IOS
#if 0
mload_seek(0x20207c84, SEEK_SET);
mload_read(patch_datas, 32);
if(patch_datas[0]==0x6e657665 )
{
is_ios=38;
}
else
{
is_ios=36;
}
#endif
is_ios=mload_get_IOS_base();
switch(is_ios)
{
case 36:
memcpy(ios_36, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_36, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
// enables DIP plugin
mload_seek(0x20209040, SEEK_SET);
mload_write(ios_36, 4);
break;
case 37:
memcpy(ios_37, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_37, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
// enables DIP plugin
mload_seek(0x20209030, SEEK_SET);
mload_write(ios_37, 4);
break;
case 38:
memcpy(ios_38, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_38, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
// enables DIP plugin
mload_seek(0x20208030, SEEK_SET);
mload_write(ios_38, 4);
break;
case 57:
memcpy(ios_57, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_57, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
// enables DIP plugin
mload_seek(0x20208030, SEEK_SET);
mload_write(ios_57, 4);
break;
case 60:
memcpy(ios_60, dip_plugin, 4); // copy the entry_point
memcpy(dip_plugin, ios_60, 4*10); // copy the adresses from the array
mload_seek(0x1377E000, SEEK_SET); // copy dip_plugin in the starlet
mload_write(dip_plugin,size_dip_plugin);
// enables DIP plugin
mload_seek(0x20208030, SEEK_SET);
mload_write(ios_60, 4);
break;
}
mload_close();
return 0;
}
#define IOCTL_FAT_MOUNTSD 0xF0
#define IOCTL_FAT_UMOUNTSD 0xF1
#define IOCTL_FAT_MOUNTUSB 0xF2
#define IOCTL_FAT_UMOUNTUSB 0xF3
#define IOCTL_FFS_MODE 0x80
int load_fatffs_module(u8 *discid)
{
static char fs[] ATTRIBUTE_ALIGN(32) = "fat";
s32 hid = -1, fd = -1;
static char file_name[256] ALIGNED(0x20)="SD:";
int n;
char *p;
s32 ret;
p=&file_name[0];
if(mload_init()<0) return -1;
mload_elf((void *) fatffs_module, &my_data_elf);
my_thread_id= mload_run_thread(my_data_elf.start, my_data_elf.stack, my_data_elf.size_stack, my_data_elf.prio);
if(my_thread_id<0) return -1;
global_mount &=~0xc;
if(discid)
{
sd_ok=ud_ok=1;
/* Function get_fat_name not implemented, this should return the path to the save file */
// p=get_fat_name(discid);
p = NULL;
sd_ok=ud_ok=0;
if(!p) return -1;
global_mount &=~0xf;
// change 'ud:' by 'usb:'
if(p[0]=='U') {global_mount|=2;file_name[0]='U';file_name[1]='S';file_name[2]='B';memcpy(file_name+3, (void *)p+2, 253);}
else {global_mount|=1;memcpy(file_name, (void *) p, 256);}
// copy filename to dip_plugin filename area
mload_seek(*((u32 *) (dip_plugin+14*4)), SEEK_SET); // offset 14 (filename Address - 256 bytes)
mload_write(file_name, sizeof(file_name));
mload_close();
}
else
{
if((global_mount & 3)==0) return 0;
if(global_mount & 1) p[0]='s';
if(global_mount & 2) p[0]='u';
}
usleep(350*1000);
/* Create heap */
if (hid < 0) {
hid = iosCreateHeap(0x100);
if (hid < 0)
return -1;
}
/* Open USB device */
fd = IOS_Open(fs, 0);
if (fd < 0)
{
if(hid>=0)
{
iosDestroyHeap(hid);
hid=-1;
}
return -1;
}
n=30; // try 20 times
while(n>0)
{
if((global_mount & 10)==2) {ret=IOS_IoctlvFormat(hid, fd, IOCTL_FAT_MOUNTUSB, ":");if(ret==0) global_mount|=8;}
else {ret=IOS_IoctlvFormat(hid, fd, IOCTL_FAT_MOUNTSD, ":");if(ret==0) {global_mount|=4;}}
if((global_mount & 7)==3 && ret==0)
{ret=IOS_IoctlvFormat(hid, fd, IOCTL_FAT_MOUNTSD, ":");if(ret==0) global_mount|=4;}
if((global_mount & 3)==((global_mount>>2) & 3) && (global_mount & 3)) {ret=0;break;} else ret=-1;
//ret=IOS_IoctlvFormat(hid, fd, IOCTL_FAT_MOUNTSD, ":");
//if(ret==0) break;
usleep(500*1000);
n--;
}
if (fd >= 0) {
IOS_Close(fd);
fd = -1;
}
if(hid>=0)
{
iosDestroyHeap(hid);
hid=-1;
}
if(n==0) return -1;
return 0;
}
int enable_ffs(int mode)
{
static char fs[] ATTRIBUTE_ALIGN(32) = "fat";
s32 hid = -1, fd = -1;
s32 ret;
/* Create heap */
if (hid < 0) {
hid = iosCreateHeap(0x100);
if (hid < 0)
return -1;
}
/* Open USB device */
fd = IOS_Open(fs, 0);
if (fd < 0)
{
if(hid>=0)
{
iosDestroyHeap(hid);
hid=-1;
}
return -1;
}
ret=IOS_IoctlvFormat(hid, fd, IOCTL_FFS_MODE, "i:", mode);
if (fd >= 0) {
IOS_Close(fd);
fd = -1;
}
if(hid>=0)
{
iosDestroyHeap(hid);
hid=-1;
}
return ret;
}
void enable_ES_ioctlv_vector(void)
{
patch_datas[0]=*((u32 *) (dip_plugin+16*4));
mload_set_ES_ioctlv_vector((void *) patch_datas[0]);
}
void Set_DIP_BCA_Datas(u8 *bca_data)
{
// write in dip_plugin bca data area
mload_seek(*((u32 *) (dip_plugin+15*4)), SEEK_SET); // offset 15 (bca_data area)
mload_write(bca_data, 64);
mload_close();
}
u8 *search_for_ehcmodule_cfg(u8 *p, int size)
{
int n;
for(n=0;n<size;n++)
{
if(!memcmp((void *) &p[n],"EHC_CFG",8) && p[n+8]==0x12 && p[n+9]==0x34 && p[n+10]==0x00 && p[n+11]==0x01)
{
return &p[n];
}
}
return NULL;
}
void test_and_patch_for_port1()
{
// test for port 1
u8 * ehc_data = NULL;
if (IOS_GetRevision() == 4) {
ehc_data=search_for_ehcmodule_cfg((void *) ehcmodule_frag_v4_bin, ehcmodule_frag_v4_bin_size);
} else if (IOS_GetRevision() == 65535) {
ehc_data=search_for_ehcmodule_cfg((void *) ehcmodule_frag_v5_bin, ehcmodule_frag_v5_bin_size);
}
if(ehc_data)
{
ehc_data+=12;
use_port1=ehc_data[0];
}
if(use_port1)
// release port 0 and use port 1
{
u32 dat=0;
u32 addr;
// get EHCI base registers
mload_getw((void *) 0x0D040000, &addr);
addr&=0xff;
addr+=0x0D040000;
mload_getw((void *) (addr+0x44), &dat);
if((dat & 0x2001)==1) mload_setw((void *) (addr+0x44), 0x2000);
mload_getw((void *) (addr+0x48), &dat);
if((dat & 0x2000)==0x2000) mload_setw((void *) (addr+0x48), 0x1001);
}
}
//////////////////////////////////

View File

@ -0,0 +1,30 @@
#ifndef _MLOAD_MODULES_H_
#define _MLOAD_MODULES_H_
#include "dip_plugin.h"
#include "mload.h"
#include "fatffs_module.h"
#ifdef __cplusplus
extern "C" {
#endif
extern void *external_ehcmodule;
extern int size_external_ehcmodule;
extern int use_port1;
int load_ehc_module();
int load_fatffs_module(u8 *discid);
void enable_ES_ioctlv_vector(void);
void Set_DIP_BCA_Datas(u8 *bca_data);
void test_and_patch_for_port1();
int enable_ffs(int mode);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -121,7 +121,7 @@ struct block read_message(s32 connection) {
buffer.size = offset;
//Shrink the size of the buffer so the data fits exactly in it
realloc(buffer.data, buffer.size);
buffer.data = realloc(buffer.data, buffer.size);
return buffer;
}

View File

@ -451,6 +451,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*=
}
if (ExitBtn.GetState() == STATE_CLICKED) {
result = 0;
break;
}
else if (okBtn.GetState() == STATE_CLICKED) {

View File

@ -10,6 +10,7 @@
#include "libwiigui/gui.h"
#include "../xml/xml.h"
#include "menu.h"
#include "menu/menus.h"
#include "filelist.h"
#include "sys.h"
#include "wpad.h"
@ -22,8 +23,6 @@
/*** Extern variables ***/
extern GuiWindow * mainWindow;
extern GuiSound * bgMusic;
extern u8 shutdown;
extern u8 reset;
extern struct gameXMLinfo gameinfo;

View File

@ -13,6 +13,7 @@
#include "cheats/cheatmenu.h"
#include "fatmounter.h"
#include "menu.h"
#include "menu/menus.h"
#include "filelist.h"
#include "listfiles.h"
#include "sys.h"
@ -30,7 +31,7 @@ extern void titles_default();
/*** Extern variables ***/
extern GuiWindow * mainWindow;
extern GuiSound * bgMusic;
extern GuiBGM * bgMusic;
extern GuiImage * bgImg;
extern GuiImageData * pointer[4];
extern GuiImageData * background;
@ -1285,8 +1286,6 @@ int MenuSettings()
while (optionBrowser2.GetEffect() > 0) usleep(50);
char * oggfile;
bool firstRun = true;
while (!exit)
{
@ -1336,8 +1335,9 @@ int MenuSettings()
w.SetEffect(EFFECT_FADE, -20);
while (w.GetEffect()>0) usleep(50);
mainWindow->Remove(&w);
while (returnhere)
returnhere = MenuOGG();
returnhere = MenuBackgroundMusic();
HaltGui();
mainWindow->Append(&w);
w.SetEffect(EFFECT_FADE, 20);
@ -1346,13 +1346,15 @@ int MenuSettings()
} else
WindowPrompt(tr("No SD-Card inserted!"),tr("Insert an SD-Card to use this option."),tr("OK"));
}
if (!strcmp("notset", Settings.ogg_path))
options2.SetValue(Idx, "%s", tr("Standard"));
else
char * filename = strrchr(Settings.ogg_path, '/');
if(filename)
{
oggfile = strrchr(Settings.ogg_path, '/')+1;
options2.SetValue(Idx, "%s", oggfile);
filename += 1;
options2.SetValue(Idx, "%s", filename);
}
else
options2.SetValue(Idx, "%s", tr("Standard"));
}
if(ret == ++Idx || firstRun)
@ -1423,6 +1425,42 @@ int MenuSettings()
options2.SetValue(Idx,"%s", tr("OFF"));
}
if(ret == ++Idx || firstRun)
{
if(firstRun) options2.SetName(Idx, "%s",tr("Music Loop Mode"));
if(ret == Idx)
{
Settings.musicloopmode++;
if (Settings.musicloopmode > 3)
Settings.musicloopmode = 0;
bgMusic->SetLoop(Settings.musicloopmode);
}
if (Settings.musicloopmode == ONCE)
options2.SetValue(Idx, tr("Play Once"));
else if(Settings.musicloopmode == LOOP)
options2.SetValue(Idx, tr("Loop Music"));
else if(Settings.musicloopmode == DIR_LOOP)
options2.SetValue(Idx, tr("Loop Directory"));
else if(Settings.musicloopmode == RANDOM_BGM)
options2.SetValue(Idx, tr("Random Directory Music"));
}
if(ret == ++Idx || firstRun)
{
if(firstRun) options2.SetName(Idx, "%s",tr("Reset BG Music"));
if(ret == Idx)
{
int result = WindowPrompt(tr("Reset to standard BGM?"), 0, tr("Yes"), tr("No"));
if(result)
{
bgMusic->LoadStandard();
bgMusic->Play();
options2.SetValue(Idx, "%s", tr("Standard"));
}
}
options2.SetValue(Idx,tr(" "));
}
firstRun = false;
}
}
@ -2148,10 +2186,9 @@ int MenuSettings()
// if partition has changed, Reinitialize it
if (Settings.partition != settingspartitionold) {
WBFS_Close();
PartInfo pinfo = partitions.pinfo[Settings.partition];
partitionEntry pentry = partitions.pentry[Settings.partition];
WBFS_OpenPart(load_from_fs, pinfo.index, pentry.sector, pentry.size, (char *) &game_partition);
WBFS_OpenPart(pinfo.part_fs, pinfo.index, pentry.sector, pentry.size, (char *) &game_partition);
load_from_fs = pinfo.part_fs;
}

View File

@ -13,13 +13,11 @@
#include "main.h"
#include "fatmounter.h"
#include "filelist.h"
#include "prompts/filebrowser.h"
#include "sys.h"
#include "menu.h"
#include "menu/menus.h"
/*** Extern variables ***/
extern GuiWindow * mainWindow;
extern GuiSound * bgMusic;
extern u8 shutdown;
extern u8 reset;
@ -31,284 +29,58 @@ extern void HaltGui();
/****************************************************************************
* MenuOGG
***************************************************************************/
bool MenuOGG() {
int cnt = 0;
int ret = 0, choice = 0;
int scrollon, nothingchanged = 0;
bool returnhere = false;
bool MenuBackgroundMusic()
{
bool ret = false;
char entered[1024];
int result = -1;
snprintf(entered, sizeof(entered), "%s", Settings.ogg_path);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
if(!btnClick2) btnClick2=new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
char imgPath[100];
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
GuiImageData btnOutline(imgPath, button_dialogue_box_png);
snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path);
GuiImageData settingsbg(imgPath, settings_background_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiTrigger trigB;
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
GuiTrigger trigMinus;
trigMinus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0);
GuiTrigger trigPlus;
trigPlus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0);
char fullpath[150];
char shortpath[35];
int countoggs = GetAllDirFiles(Settings.oggload_path);
if (!strcmp("", Settings.oggload_path)) {
sprintf(shortpath, "%s", tr("Standard"));
} else {
sprintf(shortpath, "%s", Settings.oggload_path);
if(strcmp(entered, "") == 0)
{
sprintf(entered, "%s", bootDevice);
}
else
{
char * pathptr = strrchr(entered, '/');
if(pathptr)
{
pathptr++;
int choice = WindowPrompt(tr("Playing Music:"), pathptr, tr("Play Previous"), tr("Play Next"), tr("Change Play Path"), tr("Cancel"));
if(choice == 1)
{
return bgMusic->PlayPrevious();
}
else if(choice == 2)
{
return bgMusic->PlayNext();
}
else if(choice == 3)
{
pathptr[0] = 0;
}
else
return true;
}
else
sprintf(entered, "%s", bootDevice);
}
GuiText titleTxt(shortpath, 24, (GXColor) {0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
titleTxt.SetPosition(0,0);
GuiButton pathBtn(300, 50);
pathBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
pathBtn.SetPosition(0,28);
pathBtn.SetLabel(&titleTxt);
pathBtn.SetSoundOver(&btnSoundOver);
pathBtn.SetSoundClick(btnClick2);
pathBtn.SetTrigger(&trigA);
pathBtn.SetEffectGrow();
result = BrowseDevice(entered, sizeof(entered), FB_DEFAULT);
GuiImage oggmenubackground(&settingsbg);
oggmenubackground.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
oggmenubackground.SetPosition(0, 0);
GuiText backBtnTxt(tr("Back") , 22, THEME.prompttext);
backBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
GuiImage backBtnImg(&btnOutline);
if (Settings.wsprompt == yes) {
backBtnTxt.SetWidescreen(CFG.widescreen);
backBtnImg.SetWidescreen(CFG.widescreen);
}
GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
backBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
backBtn.SetPosition(-180, 400);
backBtn.SetLabel(&backBtnTxt);
backBtn.SetImage(&backBtnImg);
backBtn.SetSoundOver(&btnSoundOver);
backBtn.SetSoundClick(btnClick2);
backBtn.SetTrigger(&trigA);
backBtn.SetTrigger(&trigB);
backBtn.SetEffectGrow();
GuiText defaultBtnTxt(tr("Default") , 22, THEME.prompttext);
defaultBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
GuiImage defaultBtnImg(&btnOutline);
if (Settings.wsprompt == yes) {
defaultBtnTxt.SetWidescreen(CFG.widescreen);
defaultBtnImg.SetWidescreen(CFG.widescreen);
}
GuiButton defaultBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
defaultBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
defaultBtn.SetPosition(180, 400);
defaultBtn.SetLabel(&defaultBtnTxt);
defaultBtn.SetImage(&defaultBtnImg);
defaultBtn.SetSoundOver(&btnSoundOver);
defaultBtn.SetSoundClick(btnClick2);
defaultBtn.SetTrigger(&trigA);
defaultBtn.SetEffectGrow();
customOptionList options2(countoggs);
for (cnt = 0; cnt < countoggs; cnt++) {
options2.SetValue(cnt, "%s", GetFileName(cnt));
options2.SetName(cnt,"%i.", cnt+1);
if(result)
{
if (!bgMusic->Load(entered))
{
WindowPrompt(tr("Not supported format!"), tr("Loading standard music."), tr("OK"));
}
else
ret = true;
bgMusic->Play();
bgMusic->SetVolume(Settings.volume);
}
if (cnt < 9) {
scrollon = 0;
} else {
scrollon = 1;
}
GuiCustomOptionBrowser optionBrowser4(396, 280, &options2, CFG.theme_path, "bg_options_settings.png", bg_options_settings_png, scrollon, 10);
optionBrowser4.SetPosition(0, 90);
optionBrowser4.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
snprintf(imgPath, sizeof(imgPath), "%smp3_stop.png", CFG.theme_path);
GuiImageData stop(imgPath, mp3_stop_png);
snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", CFG.theme_path);
GuiImageData play(imgPath, startgame_arrow_right_png);
GuiImage playBtnImg(&play);
playBtnImg.SetWidescreen(CFG.widescreen);
GuiButton playBtn(play.GetWidth(), play.GetHeight());
playBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
playBtn.SetPosition(50, 400);
playBtn.SetImage(&playBtnImg);
playBtn.SetSoundOver(&btnSoundOver);
playBtn.SetSoundClick(btnClick2);
playBtn.SetTrigger(&trigA);
playBtn.SetTrigger(&trigPlus);
playBtn.SetEffectGrow();
GuiImage stopBtnImg(&stop);
stopBtnImg.SetWidescreen(CFG.widescreen);
GuiButton stopBtn(stop.GetWidth(), stop.GetHeight());
stopBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
stopBtn.SetPosition(-15, 400);
stopBtn.SetImage(&stopBtnImg);
stopBtn.SetSoundOver(&btnSoundOver);
stopBtn.SetSoundClick(btnClick2);
stopBtn.SetTrigger(&trigA);
stopBtn.SetTrigger(&trigMinus);
stopBtn.SetEffectGrow();
HaltGui();
GuiWindow w(screenwidth, screenheight);
w.Append(&oggmenubackground);
w.Append(&pathBtn);
w.Append(&backBtn);
w.Append(&playBtn);
w.Append(&stopBtn);
w.Append(&defaultBtn);
w.Append(&optionBrowser4);
mainWindow->Append(&w);
w.SetEffect(EFFECT_FADE, 20);
ResumeGui();
while (w.GetEffect()>0) usleep(50);
while (!returnhere) {
if (shutdown == 1)
Sys_Shutdown();
if (reset == 1)
Sys_Reboot();
if (backBtn.GetState() == STATE_CLICKED) {
if (nothingchanged == 1 && countoggs > 0) {
if (strcmp("", Settings.oggload_path) && strcmp("notset", Settings.ogg_path)) {
bgMusic->Load(Settings.ogg_path);
} else {
bgMusic->Load(bg_music_ogg, bg_music_ogg_size, true);
}
bgMusic->Play();
}
backBtn.ResetState();
break;
}
if (defaultBtn.GetState() == STATE_CLICKED) {
choice = WindowPrompt(tr("Loading standard music."),0,tr("OK"), tr("Cancel"));
if (choice == 1) {
sprintf(Settings.ogg_path, "notset");
bgMusic->Load(bg_music_ogg, bg_music_ogg_size, true);
bgMusic->Play();
bgMusic->SetVolume(Settings.volume);
cfg_save_global();
}
defaultBtn.ResetState();
if (countoggs > 0)
optionBrowser4.SetFocus(1);
}
if (pathBtn.GetState() == STATE_CLICKED) {
w.Remove(&optionBrowser4);
w.Remove(&backBtn);
w.Remove(&pathBtn);
w.Remove(&playBtn);
w.Remove(&stopBtn);
w.Remove(&defaultBtn);
char entered[43] = "";
strlcpy(entered, Settings.oggload_path, sizeof(entered));
int result = OnScreenKeyboard(entered,43,0);
w.Append(&optionBrowser4);
w.Append(&pathBtn);
w.Append(&backBtn);
w.Append(&playBtn);
w.Append(&stopBtn);
w.Append(&defaultBtn);
if ( result == 1 ) {
int len = (strlen(entered)-1);
if (entered[len] !='/')
strncat (entered, "/", 1);
strlcpy(Settings.oggload_path, entered, sizeof(Settings.oggload_path));
WindowPrompt(tr("Backgroundmusic Path changed."),0,tr("OK"));
if (isInserted(bootDevice)) {
if (!strcmp("", Settings.oggload_path)) {
sprintf(Settings.ogg_path, "notset");
bgMusic->Play();
}
cfg_save_global();
returnhere = true;
break;
} else {
WindowPrompt(tr("No SD-Card inserted!"), tr("Insert an SD-Card to save."), tr("OK"));
}
}
if (countoggs > 0) {
optionBrowser4.SetFocus(1);
}
pathBtn.ResetState();
}
ret = optionBrowser4.GetClickedOption();
if (ret>=0) {
choice = WindowPrompt(tr("Set as backgroundmusic?"),GetFileName(ret),tr("Yes"),tr("No"));
if (choice == 1) {
snprintf(fullpath,150,"%s%s",Settings.oggload_path,GetFileName(ret));
if (!bgMusic->Load(fullpath)) {
WindowPrompt(tr("Not supported format!"), tr("Loading standard music."), tr("OK"));
sprintf(Settings.ogg_path, "notset");
} else {
snprintf(Settings.ogg_path, sizeof(Settings.ogg_path), "%s", fullpath);
cfg_save_global();
bgMusic->SetVolume(Settings.volume);
nothingchanged = 0;
}
bgMusic->Play();
bgMusic->SetVolume(Settings.volume);
}
optionBrowser4.SetFocus(1);
}
if (playBtn.GetState() == STATE_CLICKED && countoggs > 0) {
if (countoggs > 0) {
ret = optionBrowser4.GetSelectedOption();
snprintf(fullpath, 150,"%s%s", Settings.oggload_path,GetFileName(ret));
if (!bgMusic->Load(fullpath)) {
WindowPrompt(tr("Not supported format!"), tr("Loading standard music."), tr("OK"));
}
bgMusic->Play();
bgMusic->SetVolume(Settings.volume);
nothingchanged = 1;
optionBrowser4.SetFocus(1);
}
playBtn.ResetState();
}
if (stopBtn.GetState() == STATE_CLICKED) {
if (countoggs > 0) {
bgMusic->Stop();
nothingchanged = 1;
optionBrowser4.SetFocus(1);
}
stopBtn.ResetState();
}
}
w.SetEffect(EFFECT_FADE, -20);
while (w.GetEffect()>0) usleep(50);
HaltGui();
mainWindow->Remove(&w);
ResumeGui();
return returnhere;
return ret;
}
/****************************************************************************

View File

@ -8,7 +8,7 @@
#ifndef _SETTINGSPROMPTS_H_
#define _SETTINGSPROMPTS_H_
bool MenuOGG();
bool MenuBackgroundMusic();
int MenuLanguageSelect();
#endif

View File

@ -201,8 +201,7 @@ void CFG_Default(int widescreen) { // -1 = non forced Mode
snprintf(Settings.BcaCodepath, sizeof(Settings.BcaCodepath), "%s/bca/", bootDevice);
snprintf(Settings.WipCodepath, sizeof(Settings.WipCodepath), "%s/wip/", bootDevice);
snprintf(Settings.dolpath, sizeof(Settings.dolpath), "%s/", bootDevice);
snprintf(Settings.oggload_path, sizeof(Settings.oggload_path), "%s/config/backgroundmusic/", bootDevice);
sprintf(Settings.ogg_path, "notset");
strcpy(Settings.ogg_path, "");
}
//always set Theme defaults
//all alignments are left top here
@ -358,6 +357,7 @@ void Global_Default(void) {
snprintf(Settings.db_language, sizeof(Settings.db_language), empty);
Settings.db_JPtoEN = 0;
Settings.screensaver = 3;
Settings.musicloopmode = 1;
Settings.partition = -1;
Settings.marknewtitles = 1;
Settings.FatInstallToDir = 0;
@ -579,10 +579,6 @@ void path_set(char *name, char *val) {
strlcpy(Settings.dolpath, val, sizeof(Settings.dolpath));
return;
}
if (strcmp(name, "oggload_path") == 0) {
strlcpy(Settings.oggload_path, val, sizeof(Settings.oggload_path));
return;
}
if (strcmp(name, "ogg_path") == 0) {
strlcpy(Settings.ogg_path, val, sizeof(Settings.ogg_path));
return;
@ -1111,6 +1107,12 @@ void global_cfg_set(char *name, char *val) {
Settings.screensaver = i;
}
return;
} else if (strcmp(name, "musicloopmode") == 0) {
int i;
if (sscanf(val, "%d", &i) == 1) {
Settings.musicloopmode = i;
}
return;
} else if (strcmp(name, "partition") == 0) {
int i;
if (sscanf(val, "%d", &i) == 1) {
@ -1364,7 +1366,6 @@ bool cfg_save_global() { // save global settings
fprintf(f, "titlestxt_path = %s\n ", Settings.titlestxt_path);
fprintf(f, "gamesound = %d\n ", Settings.gamesound);
fprintf(f, "dolpath = %s\n ", Settings.dolpath);
fprintf(f, "oggload_path = %s\n ", Settings.oggload_path);
fprintf(f, "ogg_path = %s\n ", Settings.ogg_path);
fprintf(f, "wiilight = %d\n ", Settings.wiilight);
fprintf(f, "gameDisplay = %d\n ", Settings.gameDisplay);
@ -1380,6 +1381,7 @@ bool cfg_save_global() { // save global settings
//fprintf(f, "db_language = %d\n ", Settings.language);
fprintf(f, "patchcountrystrings = %d\n ", Settings.patchcountrystrings);
fprintf(f, "screensaver = %d\n ", Settings.screensaver);
fprintf(f, "musicloopmode = %d\n ", Settings.musicloopmode);
fprintf(f, "error002 = %d\n ", Settings.error002);
fprintf(f, "autonetwork = %d\n ", Settings.autonetwork);
fprintf(f, "discart = %d\n ", Settings.discart);
@ -1890,6 +1892,7 @@ void CFG_Cleanup(void)
free(cfg_title);
cfg_title = NULL;
}
num_title = 0;
}

View File

@ -419,7 +419,8 @@ extern "C" {
u8 gameDisplay;
u8 patchcountrystrings;
u8 screensaver;
s8 partition;
u8 partition;
u8 musicloopmode;
short godmode;
char covers_path[100];
char covers2d_path[100];
@ -430,8 +431,7 @@ extern "C" {
char titlestxt_path[100];
char language_path[100];
char languagefiles_path[100];
char oggload_path[100];
char ogg_path[150];
char ogg_path[250];
char dolpath[150];
char update_path[150];
char homebrewapps_path[150];

View File

@ -7,7 +7,7 @@
#include "usbloader/disc.h"
#include "usbloader/wbfs.h"
#include "usbloader/partition_usbloader.h"
#include "mload/mload.h"
#include "mload/mload_modules.h"
#include "video.h"
#include "audio.h"
#include "menu.h"
@ -232,14 +232,14 @@ s32 IOS_ReloadIOSsafe(int ios)
if (ios222rev == -69)
ios222rev = getIOSrev(0x00000001000000dell);
if (ios222rev >= 0 && (ios222rev != 4 && ios222rev != 5))return -2;
if (ios222rev > 0 && (ios222rev != 4 && ios222rev != 5))return -2;
}
else if (ios==223)
{
if (ios223rev == -69)
ios223rev = getIOSrev(0x00000001000000dfll);
if (ios223rev >= 0 && (ios223rev != 4 && ios223rev != 5))return -2;
if (ios223rev > 0 && (ios223rev != 4 && ios223rev != 5))return -2;
}
else if (ios==249)
{

View File

@ -408,7 +408,7 @@ s32 Apploader_Run(entry_point *entry, u8 cheat, u8 videoSelected, u8 vipatch, u8
hooktype = 1;
memcpy((void*)0x80001800, (char*)0x80000000, 6); // For WiiRD
/*HOOKS STUFF - FISHEARS*/
printf("\n\tcode handler loaded");
gprintf("\n\tcode handler loaded");
}
for (;;) {

View File

@ -8,13 +8,10 @@
#include "libntfs/ntfs.h"
#include "libwbfs/libwbfs.h"
#include "wbfs.h"
#include "wbfs_fat.h"
#include "usbstorage.h"
#include "frag.h"
#include "utils.h"
int _FAT_get_fragments (const char *path, _frag_append_t append_fragment, void *callback_data);
FragList *frag_list = NULL;
void frag_init(FragList *ff, int maxnum)
@ -148,98 +145,7 @@ int frag_remap(FragList *ff, FragList *log, FragList *phy)
int get_frag_list(u8 *id)
{
char fname[1024];
char fname1[1024];
struct stat st;
FragList *fs = NULL;
FragList *fa = NULL;
FragList *fw = NULL;
int ret;
int i, j;
int is_wbfs = 0;
int ret_val = -1;
if (wbfs_part_fs == PART_FS_WBFS) return 0;
ret = WBFS_FAT_find_fname(id, fname, sizeof(fname));
if (!ret) return -1;
if (strcasecmp(strrchr(fname,'.'), ".wbfs") == 0) {
is_wbfs = 1;
}
fs = malloc(sizeof(FragList));
fa = malloc(sizeof(FragList));
fw = malloc(sizeof(FragList));
frag_init(fa, MAX_FRAG);
for (i=0; i<10; i++) {
frag_init(fs, MAX_FRAG);
if (i > 0) {
fname[strlen(fname)-1] = '0' + i;
if (stat(fname, &st) == -1) break;
}
strcpy(fname1, fname);
//printf("::*%s\n", strrchr(fname,'/'));
if (wbfs_part_fs == PART_FS_FAT) {
ret = _FAT_get_fragments(fname, &_frag_append, fs);
if (ret) {
printf("fat getf: %d\n", ret);
// don't return failure, let it fallback to old method
//ret_val = ret;
ret_val = 0;
goto out;
}
} else if (wbfs_part_fs == PART_FS_NTFS) {
ret = _NTFS_get_fragments(fname, &_frag_append, fs);
if (ret) {
printf("ntfs getf: %d\n", ret);
if (ret == -50 || ret == -500) {
printf("Too many fragments! %d\n", fs->num);
}
ret_val = ret;
goto out;
}
// offset to start of partition
for (j=0; j<fs->num; j++) {
fs->frag[j].sector += fs_ntfs_sec;
}
}
frag_concat(fa, fs);
}
frag_list = malloc(sizeof(FragList));
frag_init(frag_list, MAX_FRAG);
if (is_wbfs) {
// if wbfs file format, remap.
//printf("=====\n");
wbfs_disc_t *d = WBFS_OpenDisc(id);
if (!d) goto out;
frag_init(fw, MAX_FRAG);
ret = wbfs_get_fragments(d, &_frag_append, fw);
if (ret) goto out;
WBFS_CloseDisc(d);
// DEBUG: frag_list->num = MAX_FRAG-10; // stress test
ret = frag_remap(frag_list, fw, fa);
if (ret) goto out;
} else {
// .iso does not need remap just copy
//printf("fa:\n");
memcpy(frag_list, fa, sizeof(FragList));
}
ret_val = 0;
out:
if (ret_val) {
// error
SAFE_FREE(frag_list);
}
SAFE_FREE(fs);
SAFE_FREE(fa);
SAFE_FREE(fw);
return ret_val;
return WBFS_GetFragList(id);
}
int set_frag_list(u8 *id)
@ -248,7 +154,7 @@ int set_frag_list(u8 *id)
if (frag_list == NULL) {
if (wbfs_part_fs == PART_FS_FAT) {
// fall back to old fat method
printf("FAT: fallback to old method\n");
// printf("FAT: fallback to old method\n");
return 0;
}
// ntfs has no fallback, return error
@ -259,7 +165,7 @@ int set_frag_list(u8 *id)
int size = sizeof(Fragment) * (frag_list->num + 1);
int ret = USBStorage_WBFS_SetFragList(frag_list, size);
if (ret) {
printf("set_frag: %d\n", ret);
// printf("set_frag: %d\n", ret);
return ret;
}

View File

@ -8,6 +8,7 @@
#include "settings/newtitles.h"
#include "../prompts/TitleBrowser.h"
#include "prompts/PromptWindows.h"
#include "wad/wad.h"
#include "xml/xml.h"
@ -16,6 +17,8 @@
#include <vector>
#include <wchar.h>
#include "gecko.h"
#include "listfiles.h"
#define typei 0x00010001
@ -27,6 +30,9 @@ wchar_t *gameFilter=NULL;
wchar_t *gameFilterNextList=NULL;
wchar_t *gameFilterPrev=NULL;
struct discHdr * fullGameList = NULL;
s32 fullGameCnt = -1;
extern u8 mountMethod;
/****************************************************************************
@ -59,19 +65,12 @@ static inline int wcsnicmp(const wchar_t *s1, const wchar_t *s2, int len)
* EntryCmp
***************************************************************************/
s32 __Menu_EntryCmp(const void *a, const void *b)
{
struct discHdr *hdr1 = (struct discHdr *)a;
struct discHdr *hdr2 = (struct discHdr *)b;
/* Compare strings */
return stricmp(get_title(hdr1), get_title(hdr2));
}
s32 __Menu_EntryCmpCount(const void *a, const void *b) {
@ -87,8 +86,6 @@ s32 __Menu_EntryCmpCount(const void *a, const void *b) {
struct Game_NUM* game_num1 = CFG_get_game_num(hdr1->id);
struct Game_NUM* game_num2 = CFG_get_game_num(hdr2->id);
if (game_num1) count1 = game_num1->count;
if (game_num2) count2 = game_num2->count;
@ -119,52 +116,86 @@ s32 __Menu_EntryCmpFavorite(const void *a, const void *b) {
return ret;
}
void ResetGamelist()
{
if (fullGameList != NULL)
{
fullGameCnt = -1;
free(fullGameList);
fullGameList = NULL;
}
}
int GetFullHeaders(struct discHdr **headers, u32 *count)
{
if (fullGameList == NULL || fullGameCnt == -1)
{
gprintf("Retrieving gamelist from WBFS\n");
// Retrieve all stuff from WBFS
u32 cnt;
int ret = WBFS_GetCount(&cnt);
if (ret < 0)
return ret;
/* Buffer length */
u32 len = sizeof(struct discHdr) * cnt;
/* Allocate memory */
struct discHdr *buffer = (struct discHdr *)memalign(32, len);
if (!buffer)
return -1;
/* Clear buffer */
memset(buffer, 0, len);
/* Get header list */
ret = WBFS_GetHeaders(buffer, cnt, sizeof(struct discHdr));
if (ret < 0) {
if (buffer) free(buffer);
return ret;
}
fullGameList = buffer;
fullGameCnt = cnt;
}
else
gprintf("Retrieving gamelist from cache\n");
*count = fullGameCnt;
if (headers != NULL)
{
*headers = fullGameList;
}
return 0;
}
/****************************************************************************
* Get PrevFilter
***************************************************************************/
int __Menu_GetPrevFilter(int t, wchar_t* gameFilter, u32 gameFiltered, wchar_t **PgameFilterPrev)
{
std::vector<wchar_t *> nameList;
struct discHdr *buffer = NULL;
struct discHdr *buffer = NULL; // DO NOT FREE THIS BUFFER, IT'S A REFERENCE
u32 cnt, len, i;
s32 ret;
wchar_t *new_gameFilterPrev = wcsdup_new(gameFilter);
/* Get list length */
ret = WBFS_GetCount(&cnt);
if (ret < 0)
return ret;
/* Buffer length */
len = sizeof(struct discHdr) * cnt;
/* Allocate memory */
buffer = (struct discHdr *)memalign(32, len);
if (!buffer)
if (GetFullHeaders(&buffer, &cnt))
{
return -1;
/* Clear buffer */
memset(buffer, 0, len);
/* Get header list */
ret = WBFS_GetHeaders(buffer, cnt, sizeof(struct discHdr));
if (ret < 0) {
if (buffer) free(buffer);
return ret;
}
/* Fill nameList */
for (i = 0; i < cnt; i++)
{
struct discHdr *header = &buffer[i];
/* Register game */
NewTitles::Instance()->CheckGame(header->id);
/* Filter Favorite */
if (Settings.fave && t==0)
{
@ -194,11 +225,6 @@ int __Menu_GetPrevFilter(int t, wchar_t* gameFilter, u32 gameFiltered, wchar_t *
if(wname) nameList.push_back(wname);
}
NewTitles::Instance()->Save();
/* delete buffer */
if(buffer) free(buffer);
/* Find Prev-Filter */
len = wcslen(new_gameFilterPrev);
while(len)
@ -455,38 +481,23 @@ int buildTitleList(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *PgameC
}
/****************************************************************************
* Get Gamelist
***************************************************************************/
int __Menu_GetGameList(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *PgameCnt) {
struct discHdr *buffer = NULL;
struct discHdr *output = NULL;
u32 cnt, cnt2=0, len;
s32 ret;
u32 cnt, cnt2=0;
/* Get list length */
ret = WBFS_GetCount(&cnt);
if (ret < 0)
return ret;
if (GetFullHeaders(&buffer, &cnt))
{
return -1;
}
/* Buffer length */
len = sizeof(struct discHdr) * cnt;
/* Allocate memory */
buffer = (struct discHdr *)memalign(32, len);
if (!buffer)
return -1;
/* Clear buffer */
memset(buffer, 0, len);
/* Get header list */
ret = WBFS_GetHeaders(buffer, cnt, sizeof(struct discHdr));
if (ret < 0) {
if (buffer) free(buffer);
return ret;
}
int len = cnt * sizeof(struct discHdr);
output = (struct discHdr *) memalign(32, len);
memset(output, 0, len);
for (u32 i = 0; i < cnt; i++) {
struct discHdr *header = &buffer[i];
@ -501,11 +512,11 @@ int __Menu_GetGameList(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *Pg
continue;
}
//ignore uLoader cfg "iso". i was told it is "__CFG_" but not confirmed
if (header->id[0]=='_'&&header->id[1]=='_'&&
header->id[2]=='C'&&header->id[3]=='F'&&
header->id[4]=='G'&&header->id[5]=='_')
continue;
//ignore uLoader cfg "iso". i was told it is "__CFG_" but not confirmed
if (header->id[0]=='_'&&header->id[1]=='_'&&
header->id[2]=='C'&&header->id[3]=='F'&&
header->id[4]=='G'&&header->id[5]=='_')
continue;
if (Settings.parentalcontrol && !Settings.godmode && t==0) {
if (get_block(header) >= Settings.parentalcontrol)
@ -532,8 +543,7 @@ int __Menu_GetGameList(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *Pg
continue;
}
}
if(i != cnt2)
buffer[cnt2] = buffer[i];
output[cnt2] = buffer[i];
cnt2++;
}
NewTitles::Instance()->Save();
@ -541,21 +551,23 @@ int __Menu_GetGameList(int t, wchar_t* gameFilter, discHdr ** PgameList, u32 *Pg
if(cnt > cnt2)
{
cnt = cnt2;
buffer = (struct discHdr *)realloc(buffer, sizeof(struct discHdr) * cnt);
output = (struct discHdr *)realloc(output, sizeof(struct discHdr) * cnt);
}
if (!buffer)
if (!output)
return -1;
gprintf("After retrieval, gamecount: %d\n", cnt);
if (Settings.sort==pcount) {
qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmpCount);
qsort(output, cnt, sizeof(struct discHdr), __Menu_EntryCmpCount);
} else if (Settings.fave) {
qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmpFavorite);
qsort(output, cnt, sizeof(struct discHdr), __Menu_EntryCmpFavorite);
} else {
qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmp);
qsort(output, cnt, sizeof(struct discHdr), __Menu_EntryCmp);
}
/* Set values */
if(PgameList) *PgameList = buffer; else free(buffer);
if(PgameList) *PgameList = output; else free(output);
if(PgameCnt) *PgameCnt = cnt;
return 0;

View File

@ -29,5 +29,6 @@ extern wchar_t *gameFilterPrev;
int __Menu_GetEntries(int t=0, const wchar_t* Filter=NULL);
s32 __Menu_EntryCmpCount(const void *a, const void *b);
s32 __Menu_EntryCmp(const void *a, const void *b);
void ResetGamelist();
#endif

View File

@ -117,7 +117,7 @@ bool Device_WriteSectors(u32 device, u32 sector, u32 count, void *buffer)
return false;
}
s32 Partition_GetEntriesEx(u32 device, partitionEntry *outbuf, u32 *psect_size, int *num)
s32 Partition_GetEntriesEx(u32 device, partitionEntry *outbuf, u32 *psect_size, u8 *num)
{
static partitionTable table ATTRIBUTE_ALIGN(32);
partitionEntry *entry;
@ -260,7 +260,7 @@ int get_fs_type(void *buff)
{
char *buf = buff;
// WBFS
wbfs_head_t *head = (wbfs_head_t *)buf;
wbfs_head_t *head = (wbfs_head_t *)buff;
if (head->magic == wbfs_htonl(WBFS_MAGIC)) return FS_TYPE_WBFS;
// 55AA
if (buf[0x1FE] == 0x55 && buf[0x1FF] == 0xAA) {
@ -354,12 +354,12 @@ s32 Partition_GetList(u32 device, PartList *plist)
}
int Partition_FixEXT(u32 device, int part)
int Partition_FixEXT(u32 device, u8 part)
{
static partitionTable table ATTRIBUTE_ALIGN(32);
int ret;
if (part < 0 || part > 3) return -1;
if (part > 3) return -1;
// Read partition table
ret = Device_ReadSectors(device, 0, 1, &table);
if (!ret) return -1;

View File

@ -38,32 +38,32 @@ typedef struct {
typedef struct
{
int fs_type;
int part_fs;
int wbfs_i; // seq wbfs part index
int fat_i; // seq fat part index
int ntfs_i; // seq ntfs part index
int index;
u8 fs_type;
u8 part_fs;
u8 wbfs_i; // seq wbfs part index
u8 fat_i; // seq fat part index
u8 ntfs_i; // seq ntfs part index
u8 index;
} PartInfo;
typedef struct
{
int num;
u8 num;
u32 sector_size;
partitionEntry pentry[MAX_PARTITIONS_EX];
int wbfs_n;
int fat_n;
int ntfs_n;
u8 wbfs_n;
u8 fat_n;
u8 ntfs_n;
PartInfo pinfo[MAX_PARTITIONS_EX];
} PartList;
/* Prototypes */
s32 Partition_GetEntries(u32 device, partitionEntry *outbuf, u32 *outval);
s32 Partition_GetEntriesEx(u32 device, partitionEntry *outbuf, u32 *outval, int *num);
s32 Partition_GetEntriesEx(u32 device, partitionEntry *outbuf, u32 *outval, u8 *num);
bool Device_ReadSectors(u32 device, u32 sector, u32 count, void *buffer);
bool Device_WriteSectors(u32 device, u32 sector, u32 count, void *buffer);
s32 Partition_GetList(u32 device, PartList *plist);
int Partition_FixEXT(u32 device, int part);
int Partition_FixEXT(u32 device, u8 part);
bool part_is_extended(int type);
bool part_is_data(int type);

View File

@ -155,8 +155,8 @@ int split_read_sector(void *_fp,u32 lba,u32 count,void*buf)
split_error("error seeking in disc partition");
return 1;
}
//ret = fread(buf+i*512, 512ULL, chunk, f);
ret = read(fd, buf+i*512, chunk * 512);
void *ptr = ((u8 *)buf) + (i*512);
ret = read(fd, ptr, chunk * 512);
if (ret != chunk * 512) {
fprintf(stderr, "error reading %u %u [%u] %u = %u\n",
lba, count, i, chunk, ret);
@ -189,7 +189,8 @@ int split_write_sector(void *_fp,u32 lba,u32 count,void*buf)
}
//if (fwrite(buf+i*512, 512ULL, chunk, f) != chunk) {
//printf("write %d %p %d \n", fd, buf+i*512, chunk * 512);
ret = write(fd, buf+i*512, chunk * 512);
void *ptr = ((u8 *)buf) + (i*512);
ret = write(fd, ptr, chunk * 512);
//printf("write ret = %d \n", ret);
if (ret != chunk * 512) {
split_error("error writing disc");

View File

@ -1,3 +1,9 @@
#ifndef _SPLITS_H
#define _SPLITS_H
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_SPLIT 10
@ -30,6 +36,10 @@ void split_init(split_info_t *s, char *fname);
void split_set_size(split_info_t *s, u64 split_size, u64 total_size);
void split_close(split_info_t *s);
int split_open(split_info_t *s, char *fname);
int split_create(split_info_t *s, char *fname,
u64 split_size, u64 total_size, bool overwrite);
int split_create(split_info_t *s, char *fname, u64 split_size, u64 total_size, bool overwrite);
#ifdef __cplusplus
}
#endif
#endif //_SPLITS_H

View File

@ -45,9 +45,10 @@ distribution.
#define WBFS_BASE (('W'<<24)|('F'<<16)|('S'<<8))
#define USB_IOCTL_WBFS_OPEN_DISC (WBFS_BASE+0x1)
#define USB_IOCTL_WBFS_READ_DISC (WBFS_BASE+0x2)
#define USB_IOCTL_WBFS_READ_DEBUG (WBFS_BASE+0x3)
#define USB_IOCTL_WBFS_SET_DEVICE (WBFS_BASE+0x4)
#define USB_IOCTL_WBFS_SET_FRAGLIST (WBFS_BASE+0x5)
#define USB_IOCTL_WBFS_READ_DIRECT_DISC (WBFS_BASE+0x3)
#define USB_IOCTL_WBFS_STS_DISC (WBFS_BASE+0x4)
#define USB_IOCTL_WBFS_SET_DEVICE (WBFS_BASE+0x50)
#define USB_IOCTL_WBFS_SET_FRAGLIST (WBFS_BASE+0x51)
#define UMS_HEAPSIZE 0x1000
@ -267,22 +268,6 @@ s32 USBStorage_WBFS_Read(u32 woffset, u32 len, void *buffer)
}
s32 USBStorage_WBFS_ReadDebug(u32 off, u32 size, void *buffer)
{
s32 ret;
USBStorage_Init();
/* Device not opened */
if (fd < 0)
return fd;
/* Read data */
ret = IOS_IoctlvFormat(hid, fd, USB_IOCTL_WBFS_READ_DEBUG, "ii:d", off, size, buffer, size);
return ret;
}
s32 USBStorage_WBFS_SetDevice(int dev)
{
s32 ret;

View File

@ -14,7 +14,6 @@ extern "C" {
s32 USBStorage_WBFS_Open(char *buf_id);
s32 USBStorage_WBFS_Read(u32 woffset, u32 len, void *buffer);
s32 USBStorage_WBFS_ReadDebug(u32 off, u32 size, void *buffer);
s32 USBStorage_WBFS_SetDevice(int dev);
s32 USBStorage_WBFS_SetFragList(void *p, int size);

View File

@ -1,645 +0,0 @@
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
#include <ogcsys.h>
#include <errno.h>
#include "sdhc.h"
#include "usbstorage.h"
#include "utils.h"
#include "video.h"
#include "wdvd.h"
#include "wbfs.h"
#include "wbfs_fat.h"
#include "fatmounter.h"
#include "partition_usbloader.h"
#include "settings/cfg.h"
#include "libwbfs/libwbfs.h"
/* Constants */
#define MAX_NB_SECTORS 32
/* WBFS device */
s32 wbfsDev = WBFS_MIN_DEVICE;
// partition
int wbfs_part_fs = PART_FS_WBFS;
u32 wbfs_part_idx = 0;
u32 wbfs_part_lba = 0;
/* WBFS HDD */
wbfs_t *hdd = NULL;
/* WBFS callbacks */
static rw_sector_callback_t readCallback = NULL;
static rw_sector_callback_t writeCallback = NULL;
static s32 done = -1, total = -1;
/* Variables */
static u32 nb_sectors, sector_size;
void WBFS_Spinner(s32 x, s32 max) {
done = x;
total = max;
}
wbfs_disc_t* WBFS_OpenDisc(u8 *discid)
{
if (wbfs_part_fs) return WBFS_FAT_OpenDisc(discid);
/* No device open */
if (!hdd)
return NULL;
/* Open disc */
return wbfs_open_disc(hdd, discid);
}
void WBFS_CloseDisc(wbfs_disc_t *disc)
{
if (wbfs_part_fs) {
WBFS_FAT_CloseDisc(disc);
return;
}
/* No device open */
if (!hdd || !disc)
return;
/* Close disc */
wbfs_close_disc(disc);
}
void GetProgressValue(s32 * d, s32 * m) {
*d = done;
*m = total;
}
wbfs_t *GetHddInfo(void) {
return hdd;
}
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf) {
void *buffer = NULL;
u64 offset;
u32 mod, size;
s32 ret;
/* Calculate offset */
offset = ((u64)lba) << 2;
/* Calcualte sizes */
mod = len % 32;
size = len - mod;
/* Read aligned data */
if (size) {
ret = WDVD_UnencryptedRead(iobuf, size, offset);
if (ret < 0)
goto out;
}
/* Read non-aligned data */
if (mod) {
/* Allocate memory */
buffer = memalign(32, 0x20);
if (!buffer)
return -1;
/* Read data */
ret = WDVD_UnencryptedRead(buffer, 0x20, offset + size);
if (ret < 0)
goto out;
/* Copy data */
memcpy(iobuf + size, buffer, mod);
}
/* Success */
ret = 0;
out:
/* Free memory */
if (buffer)
free(buffer);
return ret;
}
s32 __WBFS_ReadUSB(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do reads */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Read sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* USB read */
ret = USBStorage_ReadSectors(lba + cnt, sectors, ptr);
if (ret < 0)
return ret;
/* Increment counter */
cnt += sectors;
}
return 0;
}
s32 __WBFS_WriteUSB(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do writes */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Write sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* USB write */
ret = USBStorage_WriteSectors(lba + cnt, sectors, ptr);
if (ret < 0)
return ret;
/* Increment counter */
cnt += sectors;
}
return 0;
}
s32 __WBFS_ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do reads */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Read sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* SDHC read */
ret = SDHC_ReadSectors(lba + cnt, sectors, ptr);
if (!ret)
return -1;
/* Increment counter */
cnt += sectors;
}
return 0;
}
s32 __WBFS_WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do writes */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Write sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* SDHC write */
ret = SDHC_WriteSectors(lba + cnt, sectors, ptr);
if (!ret)
return -1;
/* Increment counter */
cnt += sectors;
}
return 0;
}
s32 WBFS_Init(u32 device) {
s32 ret;
switch (device) {
case WBFS_DEVICE_USB:
/* Initialize USB storage */
ret = USBStorage_Init();
if (ret >= 0) {
/* Setup callbacks */
readCallback = __WBFS_ReadUSB;
writeCallback = __WBFS_WriteUSB;
/* Device info */
/* Get USB capacity */
nb_sectors = USBStorage_GetCapacity(&sector_size);
if (!nb_sectors)
return -1;
} else
return ret;
break;
case WBFS_DEVICE_SDHC:
/* Initialize SDHC */
ret = SDHC_Init();
if (ret) {
/* Setup callbacks */
readCallback = __WBFS_ReadSDHC;
writeCallback = __WBFS_WriteSDHC;
/* Device info */
nb_sectors = 0;
sector_size = SDHC_SECTOR_SIZE;
} else
return -1;
break;
}
return 0;
}
s32 WBFS_Open(void) {
/* Close hard disk */
if (hdd)
wbfs_close(hdd);
/* Open hard disk */
wbfs_part_fs = wbfs_part_idx = wbfs_part_lba = 0;
hdd = wbfs_open_hd(readCallback, writeCallback, NULL, sector_size, nb_sectors, 0);
if (!hdd)
return -1;
// Save the new sector size, so it will be used in read and write calls
sector_size = 1 << hdd->head->hd_sec_sz_s;
wbfs_part_idx = 1;
return 0;
}
s32 WBFS_OpenPart(u32 part_fs, u32 part_idx, u32 part_lba, u32 part_size, char *partition)
{
// close
WBFS_Close();
if (part_fs == PART_FS_FAT) {
if (wbfsDev == WBFS_DEVICE_USB && part_lba == fat_usb_sec) {
strcpy(wbfs_fs_drive, "USB:");
} else if (wbfsDev == WBFS_DEVICE_SDHC && part_lba == fat_sd_sec) {
strcpy(wbfs_fs_drive, "SD:");
} else {
if (WBFSDevice_Init(part_lba)) return -1;
strcpy(wbfs_fs_drive, "WBFS:");
}
} else if (part_fs == PART_FS_NTFS) {
int ret = MountNTFS(part_lba);
if (ret) return ret;
strcpy(wbfs_fs_drive, "NTFS:");
} else {
if (WBFS_OpenLBA(part_lba, part_size)) return -3;
}
// success
wbfs_part_fs = part_fs;
wbfs_part_idx = part_idx;
wbfs_part_lba = part_lba;
char *fs = "WBFS";
if (wbfs_part_fs == PART_FS_FAT) fs = "FAT";
if (wbfs_part_fs == PART_FS_NTFS) fs = "NTFS";
sprintf(partition, "%s%d", fs, wbfs_part_idx);
return 0;
}
s32 WBFS_OpenNamed(char *partition)
{
int i;
u32 part_fs = PART_FS_WBFS;
u32 part_idx = 0;
u32 part_lba = 0;
s32 ret = 0;
PartList plist;
// close
WBFS_Close();
// parse partition option
if (strncasecmp(partition, "WBFS", 4) == 0) {
i = atoi(partition+4);
if (i < 1 || i > 4) goto err;
part_fs = PART_FS_WBFS;
part_idx = i;
} else if (strncasecmp(partition, "FAT", 3) == 0) {
if (wbfsDev != WBFS_DEVICE_USB) goto err;
i = atoi(partition+3);
if (i < 1 || i > 9) goto err;
part_fs = PART_FS_FAT;
part_idx = i;
} else if (strncasecmp(partition, "NTFS", 4) == 0) {
i = atoi(partition+4);
if (i < 1 || i > 9) goto err;
part_fs = PART_FS_NTFS;
part_idx = i;
} else {
goto err;
}
// Get partition entries
ret = Partition_GetList(wbfsDev, &plist);
if (ret || plist.num == 0) return -1;
if (part_fs == PART_FS_WBFS) {
if (part_idx > plist.wbfs_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].wbfs_i == part_idx) break;
}
} else if (part_fs == PART_FS_FAT) {
if (part_idx > plist.fat_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].fat_i == part_idx) break;
}
} else if (part_fs == PART_FS_NTFS) {
if (part_idx > plist.ntfs_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].ntfs_i == part_idx) break;
}
}
if (i >= plist.num) goto err;
// set partition lba sector
part_lba = plist.pentry[i].sector;
if (WBFS_OpenPart(part_fs, part_idx, part_lba, plist.pentry[i].size, partition)) {
goto err;
}
// success
return 0;
err:
return -1;
}
s32 WBFS_OpenLBA(u32 lba, u32 size)
{
wbfs_t *part = NULL;
/* Open partition */
part = wbfs_open_partition(readCallback, writeCallback, NULL, sector_size, size, lba, 0);
if (!part) return -1;
/* Close current hard disk */
if (hdd) wbfs_close(hdd);
hdd = part;
return 0;
}
bool WBFS_Close(void)
{
/* Close hard disk */
if (hdd) {
wbfs_close(hdd);
hdd = NULL;
}
WBFSDevice_deInit();
wbfs_part_fs = 0;
wbfs_part_idx = 0;
wbfs_part_lba = 0;
wbfs_fs_drive[0] = '\0';
return 0;
}
bool WBFS_Mounted()
{
return (hdd != NULL);
}
bool WBFS_Selected()
{
if (wbfs_part_fs && wbfs_part_lba && *wbfs_fs_drive) return true;
return WBFS_Mounted();
}
s32 WBFS_Format(u32 lba, u32 size) {
wbfs_t *partition = NULL;
/* Reset partition */
partition = wbfs_open_partition(readCallback, writeCallback, NULL, sector_size, size, lba, 1);
if (!partition)
return -1;
/* Free memory */
wbfs_close(partition);
return 0;
}
s32 WBFS_GetCount(u32 *count) {
if (wbfs_part_fs) return WBFS_FAT_GetCount(count);
/* No device open */
if (!hdd)
return -1;
/* Get list length */
*count = wbfs_count_discs(hdd);
return 0;
}
s32 WBFS_GetHeaders(void *outbuf, u32 cnt, u32 len) {
if (wbfs_part_fs) return WBFS_FAT_GetHeaders(outbuf, cnt, len);
u32 idx, size;
s32 ret;
/* No device open */
if (!hdd)
return -1;
for (idx = 0; idx < cnt; idx++) {
u8 *ptr = ((u8 *)outbuf) + (idx * len);
/* Get header */
ret = wbfs_get_disc_info(hdd, idx, ptr, len, &size);
if (ret < 0)
return ret;
}
return 0;
}
s32 WBFS_CheckGame(u8 *discid) {
wbfs_disc_t *disc = NULL;
/* Try to open game disc */
disc = WBFS_OpenDisc(discid);
if (disc) {
/* Close disc */
WBFS_CloseDisc(disc);
return 1;
}
return 0;
}
s32 WBFS_AddGame(void) {
if (wbfs_part_fs) return WBFS_FAT_AddGame();
s32 ret;
/* No device open */
if (!hdd)
return -1;
/* Add game to device */
partition_selector_t part_sel;
int copy_1_1 = 0;
if (Settings.fullcopy) {
part_sel = ALL_PARTITIONS;
copy_1_1 = 1;
} else {
part_sel = Settings.partitions_to_install == install_game_only ? ONLY_GAME_PARTITION : ALL_PARTITIONS;
}
ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, WBFS_Spinner, part_sel, copy_1_1);
if (ret < 0)
return ret;
return 0;
}
s32 WBFS_RemoveGame(u8 *discid) {
if (wbfs_part_fs) return WBFS_FAT_RemoveGame(discid);
s32 ret;
/* No device open */
if (!hdd)
return -1;
/* Remove game from USB device */
ret = wbfs_rm_disc(hdd, discid);
if (ret < 0)
return ret;
return 0;
}
s32 WBFS_GameSize(u8 *discid, f32 *size) {
wbfs_disc_t *disc = NULL;
u32 sectors;
/* Open disc */
disc = WBFS_OpenDisc(discid);
if (!disc)
return -2;
/* Get game size in sectors */
sectors = wbfs_sector_used(disc->p, disc->header);
/* Copy value */
*size = (disc->p->wbfs_sec_sz / GB_SIZE) * sectors;
/* Close disc */
WBFS_CloseDisc(disc);
return 0;
}
s32 WBFS_DiskSpace(f32 *used, f32 *free) {
if (wbfs_part_fs) return WBFS_FAT_DiskSpace(used, free);
f32 ssize;
u32 cnt;
/* No device open */
if (!hdd)
return -1;
/* Count used blocks */
cnt = wbfs_count_usedblocks(hdd);
/* Sector size in GB */
ssize = hdd->wbfs_sec_sz / GB_SIZE;
/* Copy values */
*free = ssize * cnt;
*used = ssize * (hdd->n_wbfs_sec - cnt);
return 0;
}
s32 WBFS_RenameGame(u8 *discid, const void *newname)
{
if (wbfs_part_fs)
{
return WBFS_FAT_RenameGame(discid, newname);
}
s32 ret;
/* No USB device open */
if (!hdd)
return -1;
ret = wbfs_ren_disc(hdd, discid,(u8*)newname);
if (ret < 0)
return ret;
return 0;
}
s32 WBFS_ReIDGame(u8 *discid, const void *newID)
{
if (wbfs_part_fs)
{
return WBFS_FAT_ReIDGame(discid, newID);
}
s32 ret;
/* No USB device open */
if (!hdd)
return -1;
ret = wbfs_rID_disc(hdd, discid,(u8*)newID);
if (ret < 0)
return ret;
return 0;
}
f32 WBFS_EstimeGameSize(void) {
if (wbfs_part_fs) {
return WBFS_FAT_EstimateGameSize();
}
partition_selector_t part_sel = ONLY_GAME_PARTITION;
if (Settings.fullcopy) {
part_sel = ALL_PARTITIONS;
} else {
switch(Settings.partitions_to_install)
{
case install_game_only:
part_sel = ONLY_GAME_PARTITION;
break;
case install_all:
part_sel = ALL_PARTITIONS;
break;
case install_all_but_update:
part_sel = REMOVE_UPDATE_PARTITION;
break;
}
}
return wbfs_estimate_disc(hdd, __WBFS_ReadDVD, NULL, part_sel);
}

260
source/usbloader/wbfs.cpp Normal file
View File

@ -0,0 +1,260 @@
#include <ogcsys.h>
#include "wbfs.h"
#include "usbloader/wbfs/wbfs_base.h"
#include "usbloader/wbfs/wbfs_wbfs.h"
#include "usbloader/wbfs/wbfs_fat.h"
#include "usbloader/wbfs/wbfs_ntfs.h"
#include "usbloader/partition_usbloader.h"
#include "usbloader/getentries.h"
#include "gecko.h"
Wbfs *current = NULL;
/* WBFS device */
s32 wbfsDev = WBFS_MIN_DEVICE;
// partition
char wbfs_fs_drive[16];
int wbfs_part_fs = PART_FS_WBFS;
u32 wbfs_part_idx = 0;
u32 wbfs_part_lba = 0;
wbfs_disc_t* WBFS_OpenDisc(u8 *discid) {
return current->OpenDisc(discid);
}
void WBFS_CloseDisc(wbfs_disc_t *disc) {
current->CloseDisc(disc);
}
void GetProgressValue(s32 * d, s32 * m) {
current->GetProgressValue(d, m);
}
wbfs_t *GetHddInfo(void) {
return current->GetHddInfo();
}
s32 WBFS_Init(u32 device) {
return Wbfs::Init(device);
}
s32 WBFS_Open(void) {
WBFS_Close();
current = new Wbfs_Wbfs(WBFS_DEVICE_USB, 0, 0); // Fix me!
wbfs_part_fs = wbfs_part_idx = wbfs_part_lba = 0;
wbfs_part_idx = 1;
return current->Open();
}
s32 WBFS_OpenPart(u32 part_fs, u32 part_idx, u32 part_lba, u32 part_size, char *partition)
{
// close
WBFS_Close();
if (part_fs == PART_FS_FAT) {
current = new Wbfs_Fat(wbfsDev, part_lba, part_size);
strcpy(wbfs_fs_drive, "USB:");
gprintf("Created WBFS_Fat instance at lba: %d of size %d\n", part_lba, part_size);
} else if (part_fs == PART_FS_NTFS) {
current = new Wbfs_Ntfs(wbfsDev, part_lba, part_size);
strcpy(wbfs_fs_drive, "NTFS:");
gprintf("Created WBFS_Ntfs instance at lba: %d of size %d\n", part_lba, part_size);
} else {
current = new Wbfs_Wbfs(wbfsDev, part_lba, part_size);
gprintf("Created WBFS_Wbfs instance at lba: %d of size %d\n", part_lba, part_size);
}
if (current->Open())
{
delete current;
current = NULL;
return -1;
}
// success
wbfs_part_fs = part_fs;
wbfs_part_idx = part_idx;
wbfs_part_lba = part_lba;
const char *fs = "WBFS";
if (wbfs_part_fs == PART_FS_FAT) fs = "FAT";
if (wbfs_part_fs == PART_FS_NTFS) fs = "NTFS";
sprintf(partition, "%s%d", fs, wbfs_part_idx);
return 0;
}
s32 WBFS_OpenNamed(char *partition)
{
u32 i;
u32 part_fs = PART_FS_WBFS;
u32 part_idx = 0;
u32 part_lba = 0;
s32 ret = 0;
PartList plist;
// close
WBFS_Close();
// parse partition option
if (strncasecmp(partition, "WBFS", 4) == 0) {
i = atoi(partition+4);
if (i < 1 || i > 4) goto err;
part_fs = PART_FS_WBFS;
part_idx = i;
} else if (strncasecmp(partition, "FAT", 3) == 0) {
if (wbfsDev != WBFS_DEVICE_USB) goto err;
i = atoi(partition+3);
if (i < 1 || i > 9) goto err;
part_fs = PART_FS_FAT;
part_idx = i;
} else if (strncasecmp(partition, "NTFS", 4) == 0) {
i = atoi(partition+4);
if (i < 1 || i > 9) goto err;
part_fs = PART_FS_NTFS;
part_idx = i;
} else {
goto err;
}
// Get partition entries
ret = Partition_GetList(wbfsDev, &plist);
if (ret || plist.num == 0) return -1;
if (part_fs == PART_FS_WBFS) {
if (part_idx > plist.wbfs_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].wbfs_i == part_idx) break;
}
} else if (part_fs == PART_FS_FAT) {
if (part_idx > plist.fat_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].fat_i == part_idx) break;
}
} else if (part_fs == PART_FS_NTFS) {
if (part_idx > plist.ntfs_n) goto err;
for (i=0; i<plist.num; i++) {
if (plist.pinfo[i].ntfs_i == part_idx) break;
}
}
if (i >= plist.num) goto err;
// set partition lba sector
part_lba = plist.pentry[i].sector;
if (WBFS_OpenPart(part_fs, part_idx, part_lba, plist.pentry[i].size, partition)) {
goto err;
}
// success
return 0;
err:
return -1;
}
s32 WBFS_OpenLBA(u32 lba, u32 size)
{
Wbfs *part = new Wbfs_Wbfs(wbfsDev, lba, size);
if (part->Open() != 0)
{
delete part;
return -1;
}
WBFS_Close();
current = part;
return 0;
}
bool WBFS_Close(void)
{
if (current != NULL) {
current->Close();
delete current;
current = NULL;
}
wbfs_part_fs = 0;
wbfs_part_idx = 0;
wbfs_part_lba = 0;
wbfs_fs_drive[0] = '\0';
ResetGamelist();
return 0;
}
bool WBFS_Mounted()
{
return (current != NULL && current->Mounted());
}
s32 WBFS_Format(u32 lba, u32 size) {
return current->Format();
}
s32 WBFS_GetCount(u32 *count) {
return current->GetCount(count);
}
s32 WBFS_GetHeaders(struct discHdr *outbuf, u32 cnt, u32 len) {
return current->GetHeaders(outbuf, cnt, len);
}
s32 WBFS_CheckGame(u8 *discid) {
return current->CheckGame(discid);
}
s32 WBFS_AddGame(void) {
s32 retval = current->AddGame();
if (retval == 0) {
ResetGamelist();
}
return retval;
}
s32 WBFS_RemoveGame(u8 *discid) {
s32 retval = current->RemoveGame(discid);
if (retval == 0) {
ResetGamelist();
}
return retval;
}
s32 WBFS_GameSize(u8 *discid, f32 *size) {
return current->GameSize(discid, size);
}
s32 WBFS_DiskSpace(f32 *used, f32 *free) {
return current->DiskSpace(used, free);
}
s32 WBFS_RenameGame(u8 *discid, const void *newname) {
s32 retval = current->RenameGame(discid, newname);
if (retval == 0) {
ResetGamelist();
}
return retval;
}
s32 WBFS_ReIDGame(u8 *discid, const void *newID) {
s32 retval = current->ReIDGame(discid, newID);
if (retval == 0) {
ResetGamelist();
}
return retval;
}
f32 WBFS_EstimeGameSize(void) {
return current->EstimateGameSize();
}
int WBFS_GetFragList(u8 *id) {
return current->GetFragList(id);
}
bool WBFS_ShowFreeSpace(void) {
return current->ShowFreeSpace();
}

View File

@ -1,25 +1,21 @@
#ifndef _WBFS_H_
#define _WBFS_H_
#include "libwbfs/libwbfs.h"
#include "usbloader/disc.h"
#ifdef __cplusplus
extern "C" {
#endif
#include "libwbfs/libwbfs.h"
/* Device list */
enum {
WBFS_DEVICE_USB = 1, /* USB device */
WBFS_DEVICE_SDHC /* SDHC device */
};
/* Macros */
#define WBFS_MIN_DEVICE 1
#define WBFS_MAX_DEVICE 2
#define PART_FS_WBFS 0
#define PART_FS_FAT 1
#define PART_FS_NTFS 2
/* Macros */
#define WBFS_MIN_DEVICE 1
#define WBFS_MAX_DEVICE 2
extern s32 wbfsDev;
extern int wbfs_part_fs;
extern u32 wbfs_part_idx;
@ -32,20 +28,24 @@ extern "C" {
s32 WBFS_Open(void);
s32 WBFS_Format(u32, u32);
s32 WBFS_GetCount(u32 *);
s32 WBFS_GetHeaders(void *, u32, u32);
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf);
s32 WBFS_GetHeaders(struct discHdr *, u32, u32);
// s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf);
wbfs_t *GetHddInfo(void);
s32 WBFS_CheckGame(u8 *);
s32 WBFS_AddGame(void);
s32 WBFS_RemoveGame(u8 *);
s32 WBFS_GameSize(u8 *, f32 *);
bool WBFS_ShowFreeSpace(void);
s32 WBFS_DiskSpace(f32 *, f32 *);
s32 WBFS_RenameGame(u8 *, const void *);
s32 WBFS_ReIDGame(u8 *discid, const void *newID);
f32 WBFS_EstimeGameSize(void);
int WBFS_GetFragList(u8 *id);
/*
s32 __WBFS_ReadUSB(void *fp, u32 lba, u32 count, void *iobuf);
s32 __WBFS_WriteUSB(void *fp, u32 lba, u32 count, void *iobuf);
*/
s32 WBFS_OpenPart(u32 part_fat, u32 part_idx, u32 part_lba, u32 part_size, char *partition);
s32 WBFS_OpenNamed(char *partition);

View File

@ -0,0 +1,156 @@
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
#include <ogcsys.h>
#include <errno.h>
#include "usbloader/sdhc.h"
#include "usbloader/usbstorage.h"
#include "fatmounter.h"
#include "wbfs_base.h"
rw_sector_callback_t Wbfs::readCallback = NULL;
rw_sector_callback_t Wbfs::writeCallback = NULL;
s32 Wbfs::done = -1;
s32 Wbfs::total = -1;
u32 Wbfs::nb_sectors;
u32 Wbfs::sector_size;
Wbfs::Wbfs(u32 device, u32 lba, u32 size) : hdd(NULL)
{
this->device = device;
this->lba = lba;
this->size = size;
}
void Wbfs::GetProgressValue(s32 * d, s32 * m) {
*d = done;
*m = total;
}
s32 Wbfs::Init(u32 device)
{
s32 ret;
switch (device) {
case WBFS_DEVICE_USB:
/* Initialize USB storage */
ret = USBStorage_Init();
if (ret >= 0) {
/* Setup callbacks */
readCallback = __ReadUSB;
writeCallback = __WriteUSB;
/* Device info */
/* Get USB capacity */
nb_sectors = USBStorage_GetCapacity(&sector_size);
if (!nb_sectors)
return -1;
} else
return ret;
break;
case WBFS_DEVICE_SDHC:
/* Initialize SDHC */
ret = SDHC_Init();
if (ret) {
/* Setup callbacks */
readCallback = __ReadSDHC;
writeCallback = __WriteSDHC;
/* Device info */
nb_sectors = 0;
sector_size = SDHC_SECTOR_SIZE;
} else
return -1;
break;
}
return 0;
}
void Wbfs::Close()
{
if (hdd) {
wbfs_close(hdd);
hdd = NULL;
}
WBFSDevice_deInit();
}
// Default behavior: can't format
s32 Wbfs::Format()
{
return -1;
}
s32 Wbfs::CheckGame(u8 *discid)
{
wbfs_disc_t *disc = NULL;
/* Try to open game disc */
disc = OpenDisc(discid);
if (disc) {
/* Close disc */
CloseDisc(disc);
return 1;
}
return 0;
}
s32 Wbfs::GameSize(u8 *discid, f32 *size)
{
wbfs_disc_t *disc = NULL;
u32 sectors;
/* Open disc */
disc = OpenDisc(discid);
if (!disc)
return -2;
/* Get game size in sectors */
sectors = wbfs_sector_used(disc->p, disc->header);
/* Copy value */
*size = (disc->p->wbfs_sec_sz / GB_SIZE) * sectors;
/* Close disc */
CloseDisc(disc);
return 0;
}
void Wbfs::Spinner(s32 x, s32 max)
{
done = x;
total = max;
}
wbfs_t *Wbfs::GetHddInfo()
{
return hdd;
}
bool Wbfs::Mounted()
{
return hdd == NULL;
}
int Wbfs::GetFragList(u8 *id)
{
return 0;
}
int Wbfs::GetFragList(char *filename, _frag_append_t append_fragment, FragList *)
{
return 0;
}
bool Wbfs::ShowFreeSpace(void)
{
return true;
}

View File

@ -0,0 +1,64 @@
#ifndef _H
#define _H
#include "libwbfs/libwbfs.h"
#include "usbloader/utils.h"
#include "usbloader/frag.h"
class Wbfs
{
public:
Wbfs(u32, u32, u32);
void GetProgressValue(s32 * d, s32 * m);
static s32 Init(u32);
void Close();
s32 CheckGame(u8 *);
s32 GameSize(u8 *, f32 *);
wbfs_t *GetHddInfo(void);
bool Mounted();
virtual int GetFragList(u8 *id);
virtual int GetFragList(char *filename, _frag_append_t append_fragment, FragList *);
virtual bool ShowFreeSpace(void);
virtual s32 Open() = 0;
virtual wbfs_disc_t* OpenDisc(u8 *discid) = 0;
virtual void CloseDisc(wbfs_disc_t *disc) = 0;
virtual s32 Format();
virtual s32 GetCount(u32 *) = 0;
virtual s32 GetHeaders(struct discHdr *, u32, u32) = 0;
virtual s32 AddGame(void) = 0;
virtual s32 RemoveGame(u8 *) = 0;
virtual s32 DiskSpace(f32 *, f32 *) = 0;
virtual s32 RenameGame(u8 *, const void *) = 0;
virtual s32 ReIDGame(u8 *discid, const void *newID) = 0;
virtual f32 EstimateGameSize(void) = 0;
/*
static s32 OpenPart(u32 part_fat, u32 part_idx, u32 part_lba, u32 part_size, char *partition);
static s32 OpenNamed(char *partition);
static s32 OpenLBA(u32 lba, u32 size);
*/
protected:
static rw_sector_callback_t readCallback;
static rw_sector_callback_t writeCallback;
static s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf);
static void Spinner(s32 x, s32 max);
static u32 nb_sectors;
static u32 sector_size;
/* WBFS HDD */
wbfs_t *hdd;
u32 device, lba, size;
private:
static s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf);
static s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf);
static s32 __ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf);
static s32 __WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf);
static s32 total, done;
};
#endif //_H

View File

@ -0,0 +1,812 @@
// WBFS FAT by oggzee
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
#include <ogcsys.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/statvfs.h>
#include <ctype.h>
#include "settings/cfg.h"
#include "usbloader/disc.h"
#include "fatmounter.h"
#include "wbfs_fat.h"
#include "gecko.h"
#define MAX_FAT_PATH 1024
#define TITLE_LEN 64
using namespace std;
char Wbfs_Fat::wbfs_fs_drive[16];
char Wbfs_Fat::wbfs_fat_dir[16] = "/wbfs";
char Wbfs_Fat::invalid_path[] = "/\\:|<>?*\"'";
struct discHdr *Wbfs_Fat::fat_hdr_list = NULL;
u32 Wbfs_Fat::fat_hdr_count = 0;
extern "C"
{
int _FAT_get_fragments (const char *path, _frag_append_t append_fragment, void *callback_data);
extern FragList *frag_list;
}
u32 Wbfs_Fat::fat_sector_size = 512;
Wbfs_Fat::Wbfs_Fat(u32 device, u32 lba, u32 size) : Wbfs(device, lba, size)
{
}
s32 Wbfs_Fat::Open()
{
if (device == WBFS_DEVICE_USB && lba == fat_usb_sec) {
strcpy(wbfs_fs_drive, "USB:");
} else if (device == WBFS_DEVICE_SDHC && lba == fat_sd_sec) {
strcpy(wbfs_fs_drive, "SD:");
} else {
if (WBFSDevice_Init(lba)) return -1;
strcpy(wbfs_fs_drive, "WBFS:");
}
return 0;
}
wbfs_disc_t* Wbfs_Fat::OpenDisc(u8 *discid)
{
char fname[MAX_FAT_PATH];
// wbfs 'partition' file
if (!FindFilename(discid, fname, sizeof(fname)) ) return NULL;
if (strcasecmp(strrchr(fname,'.'), ".iso") == 0) {
// .iso file
// create a fake wbfs_disc
int fd;
fd = open(fname, O_RDONLY);
if (fd == -1) return NULL;
wbfs_disc_t *iso_file = (wbfs_disc_t *)calloc(sizeof(wbfs_disc_t),1);
if (iso_file == NULL) return NULL;
// mark with a special wbfs_part
wbfs_iso_file.wbfs_sec_sz = 512;
iso_file->p = &wbfs_iso_file;
iso_file->header = (wbfs_disc_info_t*)fd;
return iso_file;
}
wbfs_t *part = OpenPart(fname);
if (!part) return NULL;
return wbfs_open_disc(part, discid);
}
void Wbfs_Fat::CloseDisc(wbfs_disc_t* disc)
{
if (!disc) return;
wbfs_t *part = disc->p;
// is this really a .iso file?
if (part == &wbfs_iso_file) {
close((int)disc->header);
free(disc);
return;
}
wbfs_close_disc(disc);
ClosePart(part);
return;
}
s32 Wbfs_Fat::GetCount(u32 *count)
{
*count = 0;
GetHeadersCount();
if (fat_hdr_count && fat_hdr_list) {
// for compacter mem - move up as it will be freed later
int size = fat_hdr_count * sizeof(struct discHdr);
struct discHdr *buf = (struct discHdr *) malloc(size);
if (buf) {
memcpy(buf, fat_hdr_list, size);
SAFE_FREE(fat_hdr_list);
fat_hdr_list = buf;
}
}
*count = fat_hdr_count;
return 0;
}
s32 Wbfs_Fat::GetHeaders(struct discHdr *outbuf, u32 cnt, u32 len)
{
u32 i;
if (len > sizeof(struct discHdr)) {
len = sizeof(struct discHdr);
}
gprintf("GetHeaders\n");
for (i=0; i<cnt && i<fat_hdr_count; i++) {
memcpy(&outbuf[i], &fat_hdr_list[i], len);
}
SAFE_FREE(fat_hdr_list);
fat_hdr_count = 0;
return 0;
}
s32 Wbfs_Fat::AddGame(void)
{
static struct discHdr header ATTRIBUTE_ALIGN(32);
char path[MAX_FAT_PATH];
wbfs_t *part = NULL;
s32 ret;
// read ID from DVD
Disc_ReadHeader(&header);
// path
GetDir(&header, path);
// create wbfs 'partition' file
part = CreatePart(header.id, path);
if (!part) return -1;
/* Add game to device */
partition_selector_t part_sel = ALL_PARTITIONS;
int copy_1_1 = Settings.fullcopy;
switch (Settings.partitions_to_install) {
case install_game_only:
part_sel = ONLY_GAME_PARTITION;
break;
case install_all:
part_sel = ALL_PARTITIONS;
break;
case install_all_but_update:
part_sel = REMOVE_UPDATE_PARTITION;
break;
}
if (copy_1_1) {
part_sel = ALL_PARTITIONS;
}
wbfs_t *old_hdd = hdd;
hdd = part; // used by spinner
ret = wbfs_add_disc(part, __ReadDVD, NULL, Spinner, part_sel, copy_1_1);
hdd = old_hdd;
wbfs_trim(part);
ClosePart(part);
if (ret < 0) return ret;
mk_title_txt(&header, path);
return 0;
}
s32 Wbfs_Fat::RemoveGame(u8 *discid)
{
char fname[MAX_FAT_PATH];
int loc;
// wbfs 'partition' file
loc = FindFilename(discid, fname, sizeof(fname));
if ( !loc ) return -1;
split_create(&split, fname, 0, 0, true);
split_close(&split);
if (loc == 1) return 0;
// game is in subdir
// remove optional .txt file
DIR_ITER *dir_iter;
struct stat st;
char path[MAX_FAT_PATH];
char name[MAX_FAT_PATH];
strncpy(path, fname, sizeof(path));
char *p = strrchr(path, '/');
if (p) *p = 0;
dir_iter = diropen(path);
if (!dir_iter) return 0;
while (dirnext(dir_iter, name, &st) == 0) {
if (name[0] == '.') continue;
if (name[6] != '_') continue;
if (strncmp(name, (char*)discid, 6) != 0) continue;
p = strrchr(name, '.');
if (!p) continue;
if (strcasecmp(p, ".txt") != 0) continue;
snprintf(fname, sizeof(fname), "%s/%s", path, name);
remove(fname);
break;
}
dirclose(dir_iter);
// remove game subdir
unlink(path);
return 0;
}
s32 Wbfs_Fat::DiskSpace(f32 *used, f32 *free)
{
f32 size;
int ret;
struct statvfs wbfs_fat_vfs;
*used = 0;
*free = 0;
ret = statvfs(wbfs_fs_drive, &wbfs_fat_vfs);
if (ret) return -1;
/* FS size in GB */
size = (f32)wbfs_fat_vfs.f_frsize * (f32)wbfs_fat_vfs.f_blocks / GB_SIZE;
*free = (f32)wbfs_fat_vfs.f_frsize * (f32)wbfs_fat_vfs.f_bfree / GB_SIZE;
*used = size - *free;
return 0;
}
s32 Wbfs_Fat::RenameGame(u8 *discid, const void *newname)
{
wbfs_t *part = OpenPart((char *) discid);
if (!part)
return -1;
s32 ret = wbfs_ren_disc(part, discid,(u8*)newname);
ClosePart(part);
return ret;
}
s32 Wbfs_Fat::ReIDGame(u8 *discid, const void *newID)
{
wbfs_t *part = OpenPart((char *) discid);
if (!part)
return -1;
s32 ret = wbfs_rID_disc(part, discid,(u8*)newID);
ClosePart(part);
if(ret == 0)
{
char fname[100];
char fnamenew[100];
s32 cnt = 0x31;
Filename(discid, fname, sizeof(fname), NULL);
Filename((u8*) newID, fnamenew, sizeof(fnamenew), NULL);
int stringlength = strlen(fname);
while(rename(fname, fnamenew) == 0)
{
fname[stringlength] = cnt;
fname[stringlength+1] = 0;
fnamenew[stringlength] = cnt;
fnamenew[stringlength+1] = 0;
cnt++;
}
}
return ret;
}
f32 Wbfs_Fat::EstimateGameSize()
{
wbfs_t *part = NULL;
u64 size = (u64)143432*2*0x8000ULL;
u32 n_sector = size / fat_sector_size;
u32 wii_sec_sz;
// init a temporary dummy part
// as a placeholder for wbfs_size_disc
part = wbfs_open_partition(
nop_rw_sector, nop_rw_sector,
NULL, fat_sector_size, n_sector, 0, 1);
if (!part) return -1;
wii_sec_sz = part->wii_sec_sz;
partition_selector_t part_sel;
if (Settings.fullcopy) {
part_sel = ALL_PARTITIONS;
} else {
part_sel = Settings.partitions_to_install == install_game_only ? ONLY_GAME_PARTITION : ALL_PARTITIONS;
}
return wbfs_estimate_disc(part, __ReadDVD, NULL, part_sel);
}
// TITLE [GAMEID]
bool Wbfs_Fat::CheckLayoutB(char *fname, int len, u8* id, char *fname_title)
{
if (len <= 8) return false;
if (fname[len-8] != '[' || fname[len-1] != ']') return false;
if (!is_gameid(&fname[len-7])) return false;
strncpy(fname_title, fname, TITLE_LEN);
// cut at '['
fname_title[len-8] = 0;
int n = strlen(fname_title);
if (n == 0) return false;
// cut trailing _ or ' '
if (fname_title[n - 1] == ' ' || fname_title[n - 1] == '_' ) {
fname_title[n - 1] = 0;
}
if (strlen(fname_title) == 0) return false;
if (id) {
memcpy(id, &fname[len-7], 6);
id[6] = 0;
}
return true;
}
s32 Wbfs_Fat::GetHeadersCount()
{
char path[MAX_FAT_PATH];
char fname[MAX_FAT_PATH];
char fpath[MAX_FAT_PATH];
struct discHdr tmpHdr;
struct stat st;
wbfs_t *part = NULL;
u8 id[8];
int ret;
char *p;
u32 size;
int is_dir;
int len;
char dir_title[65];
char fname_title[TITLE_LEN];
char *title;
DIR_ITER *dir_iter;
//dbg_time1();
SAFE_FREE(fat_hdr_list);
fat_hdr_count = 0;
strcpy(path, wbfs_fs_drive);
strcat(path, wbfs_fat_dir);
dir_iter = diropen(path);
if (!dir_iter) return 0;
dir_iter = diropen(path);
if (!dir_iter) return 0;
while (dirnext(dir_iter, fname, &st) == 0) {
//printf("found: %s\n", fname); Wpad_WaitButtonsCommon();
if ((char)fname[0] == '.') continue;
len = strlen(fname);
if (len < 8) continue; // "GAMEID_x"
memcpy(id, fname, 6);
id[6] = 0;
*fname_title = 0;
is_dir = S_ISDIR(st.st_mode);
//printf("mode: %d %d %x\n", is_dir, st.st_mode, st.st_mode);
if (is_dir) {
int lay_a = 0;
int lay_b = 0;
if (fname[6] == '_' && is_gameid((char*)id)) {
// usb:/wbfs/GAMEID_TITLE/GAMEID.wbfs
lay_a = 1;
}
if (CheckLayoutB(fname, len, NULL, fname_title)) {
// usb:/wbfs/TITLE[GAMEID]/GAMEID.wbfs
lay_b = 1;
}
if (!lay_a && !lay_b) continue;
if (lay_a) {
strncpy(dir_title, &fname[7], sizeof(dir_title));
} else {
try_lay_b:
if (!CheckLayoutB(fname, len, id, fname_title)) continue;
}
snprintf(fpath, sizeof(fpath), "%s/%s/%s.wbfs", path, fname, id);
//printf("path2: %s\n", fpath);
// if more than 50 games, skip second stat to improve speed
// but if ambiguous layout check anyway
if (fat_hdr_count < 50 || (lay_a && lay_b)) {
if (stat(fpath, &st) == -1) {
//printf("missing: %s\n", fpath);
// try .iso
strcpy(strrchr(fpath, '.'), ".iso"); // replace .wbfs with .iso
if (stat(fpath, &st) == -1) {
//printf("missing: %s\n", fpath);
if (lay_a && lay_b == 1) {
// mark lay_b so that the stat check is still done,
// but lay_b is not re-tried again
lay_b = 2;
// retry with layout b
goto try_lay_b;
}
continue;
}
}
} else {
st.st_size = 1024*1024;
}
} else {
// usb:/wbfs/GAMEID.wbfs
// or usb:/wbfs/GAMEID.iso
p = strrchr(fname, '.');
if (!p) continue;
if ( (strcasecmp(p, ".wbfs") != 0)
&& (strcasecmp(p, ".iso") != 0) ) continue;
int n = p - fname; // length withouth .wbfs
if (n != 6) {
// TITLE [GAMEID].wbfs
if (!CheckLayoutB(fname, n, id, fname_title)) continue;
}
snprintf(fpath, sizeof(fpath), "%s/%s", path, fname);
}
//printf("found: %s %d MB\n", fpath, (int)(st.st_size/1024/1024));
// size must be at least 1MB to be considered a valid wbfs file
if (st.st_size < 1024*1024) continue;
// if we have titles.txt entry use that
title = cfg_get_title(id);
// if no titles.txt get title from dir or file name
if (!title && *fname_title) {
title = fname_title;
}
if (title) {
memset(&tmpHdr, 0, sizeof(tmpHdr));
memcpy(tmpHdr.id, id, 6);
strncpy(tmpHdr.title, title, sizeof(tmpHdr.title)-1);
tmpHdr.magic = 0x5D1C9EA3;
goto add_hdr;
}
// else read it from file directly
if (strcasecmp(strrchr(fpath,'.'), ".wbfs") == 0) {
// wbfs file directly
FILE *fp = fopen(fpath, "rb");
if (fp != NULL) {
fseek(fp, 512, SEEK_SET);
fread(&tmpHdr, sizeof(struct discHdr), 1, fp);
fclose(fp);
if ((tmpHdr.magic == 0x5D1C9EA3) && (memcmp(tmpHdr.id, id, 6) == 0)) {
goto add_hdr;
}
}
// no title found, read it from wbfs file
// but this is a little bit slower
// open 'partition' file
part = OpenPart(fpath);
if (!part) {
continue;
}
// Get header
ret = wbfs_get_disc_info(part, 0, (u8*)&tmpHdr,
sizeof(struct discHdr), &size);
ClosePart(part);
if (ret == 0) {
goto add_hdr;
}
} else if (strcasecmp(strrchr(fpath,'.'), ".iso") == 0) {
// iso file
FILE *fp = fopen(fpath, "rb");
if (fp != NULL) {
fseek(fp, 0, SEEK_SET);
fread(&tmpHdr, sizeof(struct discHdr), 1, fp);
fclose(fp);
if ((tmpHdr.magic == 0x5D1C9EA3) && (memcmp(tmpHdr.id, id, 6) == 0)) {
goto add_hdr;
}
}
}
// fail:
continue;
// succes: add tmpHdr to list:
add_hdr:
memset(&st, 0, sizeof(st));
//printf("added: %.6s %.20s\n", tmpHdr.id, tmpHdr.title); Wpad_WaitButtons();
fat_hdr_count++;
fat_hdr_list = (struct discHdr *) realloc(fat_hdr_list, fat_hdr_count * sizeof(struct discHdr));
memcpy(&fat_hdr_list[fat_hdr_count-1], &tmpHdr, sizeof(struct discHdr));
}
dirclose(dir_iter);
//dbg_time2("\nFAT_GetCount"); Wpad_WaitButtonsCommon();
return 0;
}
int Wbfs_Fat::FindFilename(u8 *id, char *fname, int len)
{
struct stat st;
// look for direct .wbfs file
Filename(id, fname, len, NULL);
if (stat(fname, &st) == 0) return 1;
// look for direct .iso file
strcpy(strrchr(fname, '.'), ".iso"); // replace .wbfs with .iso
if (stat(fname, &st) == 0) return 1;
// direct file not found, check subdirs
*fname = 0;
DIR_ITER *dir_iter;
char path[MAX_FAT_PATH];
char name[MAX_FAT_PATH];
strcpy(path, wbfs_fs_drive);
strcat(path, wbfs_fat_dir);
dir_iter = diropen(path);
//printf("dir: %s %p\n", path, dir); Wpad_WaitButtons();
if (!dir_iter) {
return 0;
}
while (dirnext(dir_iter, name, &st) == 0) {
//dbg_printf("name:%s\n", name);
if (name[0] == '.') continue;
int n = strlen(name);
if (n < 8) continue;
if (S_ISDIR(st.st_mode)) {
if (name[6] == '_') {
// GAMEID_TITLE
if (strncmp(name, (char*)id, 6) != 0) goto try_alter;
} else {
try_alter:
// TITLE [GAMEID]
if (name[n-8] != '[' || name[n-1] != ']') continue;
if (strncmp(&name[n-7], (char*)id, 6) != 0) continue;
}
// look for .wbfs file
snprintf(fname, len, "%s/%s/%.6s.wbfs", path, name, id);
if (stat(fname, &st) == 0) break;
// look for .iso file
snprintf(fname, len, "%s/%s/%.6s.iso", path, name, id);
} else {
// TITLE [GAMEID].wbfs
char fn_title[TITLE_LEN];
u8 fn_id[8];
char *p = strrchr(name, '.');
if (!p) continue;
if ( (strcasecmp(p, ".wbfs") != 0)
&& (strcasecmp(p, ".iso") != 0) ) continue;
int n = p - name; // length withouth .wbfs
if (!CheckLayoutB(name, n, fn_id, fn_title)) continue;
if (strncmp((char*)fn_id, (char*)id, 6) != 0) continue;
snprintf(fname, len, "%s/%s", path, name);
}
if (stat(fname, &st) == 0) break;
*fname = 0;
}
dirclose(dir_iter);
if (*fname) {
// found
//printf("found:%s\n", fname);
return 2;
}
// not found
return 0;
}
wbfs_t* Wbfs_Fat::OpenPart(char *fname)
{
wbfs_t *part = NULL;
int ret;
// wbfs 'partition' file
ret = split_open(&split, fname);
if (ret) return NULL;
part = wbfs_open_partition(
split_read_sector,
nop_rw_sector, //readonly //split_write_sector,
&split, fat_sector_size, split.total_sec, 0, 0);
if (!part) {
split_close(&split);
}
return part;
}
void Wbfs_Fat::ClosePart(wbfs_t* part)
{
if (!part) return;
split_info_t *s = (split_info_t*)part->callback_data;
wbfs_close(part);
if (s) split_close(s);
}
void Wbfs_Fat::Filename(u8 *id, char *fname, int len, char *path)
{
if (path == NULL) {
snprintf(fname, len, "%s%s/%.6s.wbfs", wbfs_fs_drive, wbfs_fat_dir, id);
} else {
snprintf(fname, len, "%s/%.6s.wbfs", path, id);
}
}
void Wbfs_Fat::GetDir(struct discHdr *header, char *path)
{
strcpy(path, wbfs_fs_drive);
strcat(path, wbfs_fat_dir);
if (Settings.FatInstallToDir) {
strcat(path, "/");
int layout = 0;
if (Settings.FatInstallToDir == 2) layout = 1;
mk_gameid_title(header, path + strlen(path), 0, layout);
}
}
wbfs_t* Wbfs_Fat::CreatePart(u8 *id, char *path)
{
char fname[MAX_FAT_PATH];
wbfs_t *part = NULL;
u64 size = (u64)143432*2*0x8000ULL;
u32 n_sector = size / 512;
int ret;
//printf("CREATE PART %s %lld %d\n", id, size, n_sector);
snprintf(fname, sizeof(fname), "%s%s", wbfs_fs_drive, wbfs_fat_dir);
mkdir(fname, 0777); // base usb:/wbfs
mkdir(path, 0777); // game subdir
Filename(id, fname, sizeof(fname), path);
printf("Writing to %s\n", fname);
ret = split_create(&split, fname, OPT_split_size, size, true);
if (ret) return NULL;
// force create first file
u32 scnt = 0;
int fd = split_get_file(&split, 0, &scnt, 0);
if (fd<0) {
printf("ERROR creating file\n");
sleep(2);
split_close(&split);
return NULL;
}
part = wbfs_open_partition(
split_read_sector,
split_write_sector,
&split, fat_sector_size, n_sector, 0, 1);
if (!part) {
split_close(&split);
}
return part;
}
void Wbfs_Fat::mk_title_txt(struct discHdr *header, char *path)
{
char fname[MAX_FAT_PATH];
FILE *f;
strcpy(fname, path);
strcat(fname, "/");
mk_gameid_title(header, fname+strlen(fname), 1, 0);
strcat(fname, ".txt");
f = fopen(fname, "wb");
if (!f) return;
fprintf(f, "%.6s = %.64s\n", header->id, get_title(header));
fclose(f);
printf("Info file: %s\n", fname);
}
void Wbfs_Fat::mk_gameid_title(struct discHdr *header, char *name, int re_space, int layout)
{
int i, len;
char title[65];
char id[8];
memcpy(name, header->id, 6);
name[6] = 0;
strncpy(title, get_title(header), sizeof(title));
title_filename(title);
if (layout == 0) {
sprintf(name, "%s_%s", id, title);
} else {
sprintf(name, "%s [%s]", title, id);
}
// replace space with '_'
if (re_space) {
len = strlen(name);
for (i = 0; i < len; i++) {
if(name[i]==' ') name[i] = '_';
}
}
}
void Wbfs_Fat::title_filename(char *title)
{
int i, len;
// trim leading space
len = strlen(title);
while (*title == ' ') {
memmove(title, title+1, len);
len--;
}
// trim trailing space - not allowed on windows directories
while (len && title[len-1] == ' ') {
title[len-1] = 0;
len--;
}
// replace silly chars with '_'
for (i=0; i<len; i++) {
if(strchr(invalid_path, title[i]) || iscntrl((int) title[i])) {
title[i] = '_';
}
}
}
bool Wbfs_Fat::is_gameid(char *id)
{
int i;
for (i=0; i<6; i++) {
if (!isalnum((u32) id[i])) return false;
}
return true;
}
int Wbfs_Fat::GetFragList(u8 *id)
{
char fname[1024];
char fname1[1024];
struct stat st;
FragList *fs = NULL;
FragList *fa = NULL;
FragList *fw = NULL;
int ret;
int i;
int is_wbfs = 0;
int ret_val = -1;
ret = FindFilename(id, fname, sizeof(fname));
if (!ret) return -1;
if (strcasecmp(strrchr(fname,'.'), ".wbfs") == 0) {
is_wbfs = 1;
}
fs = (FragList *) malloc(sizeof(FragList));
fa = (FragList *) malloc(sizeof(FragList));
fw = (FragList *) malloc(sizeof(FragList));
frag_init(fa, MAX_FRAG);
for (i=0; i<10; i++) {
frag_init(fs, MAX_FRAG);
if (i > 0) {
fname[strlen(fname)-1] = '0' + i;
if (stat(fname, &st) == -1) break;
}
strcpy(fname1, fname);
if ((ret = GetFragList((char *) &fname, &_frag_append, fs)))
{
ret_val = ret;
goto out;
}
frag_concat(fa, fs);
}
frag_list = (FragList *) malloc(sizeof(FragList));
frag_init(frag_list, MAX_FRAG);
if (is_wbfs) {
// if wbfs file format, remap.
//printf("=====\n");
wbfs_disc_t *d = OpenDisc(id);
if (!d) goto out;
frag_init(fw, MAX_FRAG);
ret = wbfs_get_fragments(d, &_frag_append, fw);
if (ret) goto out;
CloseDisc(d);
// DEBUG: frag_list->num = MAX_FRAG-10; // stress test
ret = frag_remap(frag_list, fw, fa);
if (ret) goto out;
} else {
// .iso does not need remap just copy
//printf("fa:\n");
memcpy(frag_list, fa, sizeof(FragList));
}
ret_val = 0;
out:
if (ret_val) {
// error
SAFE_FREE(frag_list);
}
SAFE_FREE(fs);
SAFE_FREE(fa);
SAFE_FREE(fw);
return ret_val;
}
int Wbfs_Fat::GetFragList(char *filename, _frag_append_t append_fragment, FragList *fs)
{
return _FAT_get_fragments(filename, append_fragment, fs);
}
bool Wbfs_Fat::ShowFreeSpace(void)
{
return false;
}

View File

@ -0,0 +1,64 @@
#ifndef _WBFS_FAT_H
#define _WBFS_FAT_H
#include <ogcsys.h>
#include "usbloader/splits.h"
#include "wbfs_base.h"
class Wbfs_Fat : public Wbfs
{
public:
Wbfs_Fat(u32 device, u32 lba, u32 size);
~Wbfs_Fat();
virtual s32 Open();
wbfs_disc_t* OpenDisc(u8 *);
void CloseDisc(wbfs_disc_t *);
s32 GetCount(u32 *);
s32 GetHeaders(struct discHdr *, u32, u32);
s32 AddGame();
s32 RemoveGame(u8 *);
s32 DiskSpace(f32 *, f32 *);
s32 RenameGame(u8 *, const void *);
s32 ReIDGame(u8 *, const void *);
f32 EstimateGameSize();
int GetFragList(u8 *);
virtual int GetFragList(char *, _frag_append_t, FragList *);
virtual bool ShowFreeSpace(void);
protected:
static char wbfs_fs_drive[16];
private:
split_info_t split;
static u32 fat_sector_size;
static char wbfs_fat_dir[16];
static char invalid_path[];
static struct discHdr *fat_hdr_list;
static u32 fat_hdr_count;
wbfs_t* OpenPart(char *fname);
void ClosePart(wbfs_t* part);
wbfs_t* CreatePart(u8 *id, char *path);
int FindFilename(u8 *id, char *fname, int len);
void Filename(u8 *id, char *fname, int len, char *path);
bool CheckLayoutB(char *fname, int len, u8* id, char *fname_title);
s32 GetHeadersCount();
void GetDir(struct discHdr *header, char *path);
void mk_title_txt(struct discHdr *header, char *path);
void mk_gameid_title(struct discHdr *header, char *name, int re_space, int layout);
void title_filename(char *title);
bool is_gameid(char *id);
static int nop_rw_sector(void *_fp, u32 lba, u32 count, void* buf) { return 0; }
};
#endif //_WBFS_FAT_H

View File

@ -0,0 +1,28 @@
#include "wbfs_ntfs.h"
#include "fatmounter.h"
#include "libntfs/ntfs.h"
s32 Wbfs_Ntfs::Open()
{
strcpy(wbfs_fs_drive, "NTFS:");
return MountNTFS(lba);
}
int Wbfs_Ntfs::GetFragList(char *filename, _frag_append_t append_fragment, FragList *fs)
{
int ret = _NTFS_get_fragments(filename, append_fragment, fs);
if (ret) {
return ret;
}
// offset to start of partition
for (unsigned int j=0; j<fs->num; j++) {
fs->frag[j].sector += fs_ntfs_sec;
}
return ret;
}
bool Wbfs_Ntfs::ShowFreeSpace(void)
{
return true;
}

View File

@ -0,0 +1,17 @@
#ifndef _WBFS_NTFS_H
#define _WBFS_NTFS_H
#include "wbfs_fat.h"
class Wbfs_Ntfs : public Wbfs_Fat
{
public:
Wbfs_Ntfs(u32 device, u32 lba, u32 size) : Wbfs_Fat(device, lba, size) {}
virtual s32 Open();
int GetFragList(char *filename, _frag_append_t append_fragment, FragList *fs);
bool ShowFreeSpace(void);
};
#endif //_WBFS_NTFS_H

View File

@ -0,0 +1,159 @@
#include <ogcsys.h>
#include <malloc.h>
#include "usbloader/sdhc.h"
#include "usbloader/usbstorage.h"
#include "usbloader/wdvd.h"
#include "wbfs_base.h"
/* Constants */
#define MAX_NB_SECTORS 32
s32 Wbfs::__ReadDVD(void *fp, u32 lba, u32 len, void *iobuf) {
void *buffer = NULL;
u64 offset;
u32 mod, size;
s32 ret;
/* Calculate offset */
offset = ((u64)lba) << 2;
/* Calcualte sizes */
mod = len % 32;
size = len - mod;
/* Read aligned data */
if (size) {
ret = WDVD_UnencryptedRead(iobuf, size, offset);
if (ret < 0)
goto out;
}
/* Read non-aligned data */
if (mod) {
/* Allocate memory */
buffer = memalign(32, 0x20);
if (!buffer)
return -1;
/* Read data */
ret = WDVD_UnencryptedRead(buffer, 0x20, offset + size);
if (ret < 0)
goto out;
/* Copy data */
void *ptr = ((u8 *) iobuf) + size;
memcpy(ptr, buffer, mod);
}
/* Success */
ret = 0;
out:
/* Free memory */
if (buffer)
free(buffer);
return ret;
}
s32 Wbfs::__ReadUSB(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do reads */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Read sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* USB read */
ret = USBStorage_ReadSectors(lba + cnt, sectors, ptr);
if (ret < 0)
return ret;
/* Increment counter */
cnt += sectors;
}
return 0;
}
s32 Wbfs::__WriteUSB(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do writes */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Write sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* USB write */
ret = USBStorage_WriteSectors(lba + cnt, sectors, ptr);
if (ret < 0)
return ret;
/* Increment counter */
cnt += sectors;
}
return 0;
}
s32 Wbfs::__ReadSDHC(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do reads */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Read sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* SDHC read */
ret = SDHC_ReadSectors(lba + cnt, sectors, ptr);
if (!ret)
return -1;
/* Increment counter */
cnt += sectors;
}
return 0;
}
s32 Wbfs::__WriteSDHC(void *fp, u32 lba, u32 count, void *iobuf) {
u32 cnt = 0;
s32 ret;
/* Do writes */
while (cnt < count) {
void *ptr = ((u8 *)iobuf) + (cnt * sector_size);
u32 sectors = (count - cnt);
/* Write sectors is too big */
if (sectors > MAX_NB_SECTORS)
sectors = MAX_NB_SECTORS;
/* SDHC write */
ret = SDHC_WriteSectors(lba + cnt, sectors, ptr);
if (!ret)
return -1;
/* Increment counter */
cnt += sectors;
}
return 0;
}

View File

@ -0,0 +1,204 @@
#include "wbfs_wbfs.h"
#include "settings/cfg.h"
extern u32 sector_size;
s32 Wbfs_Wbfs::Open()
{
wbfs_t *part = NULL;
/* Open partition */
part = wbfs_open_partition(readCallback, writeCallback, NULL, sector_size, size, lba, 0);
if (!part) return -1;
/* Close current hard disk */
Close();
hdd = part;
// Save the new sector size, so it will be used in read and write calls
sector_size = 1 << hdd->head->hd_sec_sz_s;
return 0;
}
wbfs_disc_t* Wbfs_Wbfs::OpenDisc(u8 *discid)
{
/* No device open */
if (!hdd)
return NULL;
/* Open disc */
return wbfs_open_disc(hdd, discid);
}
void Wbfs_Wbfs::CloseDisc(wbfs_disc_t *disc)
{
/* No device open */
if (!hdd || !disc)
return;
/* Close disc */
wbfs_close_disc(disc);
}
s32 Wbfs_Wbfs::Format()
{
wbfs_t *partition = NULL;
/* Reset partition */
partition = wbfs_open_partition(readCallback, writeCallback, NULL, sector_size, size, lba, 1);
if (!partition)
return -1;
/* Free memory */
wbfs_close(partition);
return 0;
}
s32 Wbfs_Wbfs::GetCount(u32 *count)
{
/* No device open */
if (!hdd)
return -1;
/* Get list length */
*count = wbfs_count_discs(hdd);
return 0;
}
s32 Wbfs_Wbfs::GetHeaders(struct discHdr *outbuf, u32 cnt, u32 len)
{
u32 idx, size;
s32 ret;
/* No device open */
if (!hdd)
return -1;
for (idx = 0; idx < cnt; idx++) {
u8 *ptr = ((u8 *)outbuf) + (idx * len);
/* Get header */
ret = wbfs_get_disc_info(hdd, idx, ptr, len, &size);
if (ret < 0)
return ret;
}
return 0;
}
s32 Wbfs_Wbfs::AddGame()
{
s32 ret;
/* No device open */
if (!hdd)
return -1;
/* Add game to device */
partition_selector_t part_sel;
int copy_1_1 = 0;
if (Settings.fullcopy) {
part_sel = ALL_PARTITIONS;
copy_1_1 = 1;
} else {
part_sel = Settings.partitions_to_install == install_game_only ? ONLY_GAME_PARTITION : ALL_PARTITIONS;
}
ret = wbfs_add_disc(hdd, __ReadDVD, NULL, Spinner, part_sel, copy_1_1);
if (ret < 0)
return ret;
return 0;
}
s32 Wbfs_Wbfs::RemoveGame(u8 *discid)
{
s32 ret;
/* No device open */
if (!hdd)
return -1;
/* Remove game from USB device */
ret = wbfs_rm_disc(hdd, discid);
if (ret < 0)
return ret;
return 0;
}
s32 Wbfs_Wbfs::DiskSpace(f32 *used, f32 *free)
{
f32 ssize;
u32 cnt;
/* No device open */
if (!hdd)
return -1;
/* Count used blocks */
cnt = wbfs_count_usedblocks(hdd);
/* Sector size in GB */
ssize = hdd->wbfs_sec_sz / GB_SIZE;
/* Copy values */
*free = ssize * cnt;
*used = ssize * (hdd->n_wbfs_sec - cnt);
return 0;
}
s32 Wbfs_Wbfs::RenameGame(u8 *discid, const void *newname)
{
s32 ret;
/* No USB device open */
if (!hdd)
return -1;
ret = wbfs_ren_disc(hdd, discid,(u8*)newname);
if (ret < 0)
return ret;
return 0;
}
s32 Wbfs_Wbfs::ReIDGame(u8 *discid, const void *newID)
{
s32 ret;
/* No USB device open */
if (!hdd)
return -1;
ret = wbfs_rID_disc(hdd, discid,(u8*)newID);
if (ret < 0)
return ret;
return 0;
}
f32 Wbfs_Wbfs::EstimateGameSize()
{
partition_selector_t part_sel = ONLY_GAME_PARTITION;
if (Settings.fullcopy) {
part_sel = ALL_PARTITIONS;
} else {
switch(Settings.partitions_to_install)
{
case install_game_only:
part_sel = ONLY_GAME_PARTITION;
break;
case install_all:
part_sel = ALL_PARTITIONS;
break;
case install_all_but_update:
part_sel = REMOVE_UPDATE_PARTITION;
break;
}
}
return wbfs_estimate_disc(hdd, __ReadDVD, NULL, part_sel);
}

View File

@ -0,0 +1,31 @@
#ifndef _WBFS_WBFS_H
#define _WBFS_WBFS_H
#include "wbfs_base.h"
#include "libwbfs/libwbfs.h"
class Wbfs_Wbfs : public Wbfs
{
public:
Wbfs_Wbfs(u32 device, u32 lba, u32 size) : Wbfs(device, lba, size) {}
s32 Open();
wbfs_disc_t* OpenDisc(u8 *);
void CloseDisc(wbfs_disc_t *);
s32 Format();
s32 GetCount(u32 *);
s32 GetHeaders(struct discHdr *, u32, u32);
s32 AddGame();
s32 RemoveGame(u8 *);
s32 DiskSpace(f32 *, f32 *);
s32 RenameGame(u8 *, const void *);
s32 ReIDGame(u8 *, const void *);
f32 EstimateGameSize();
};
#endif //_WBFS_WBFS_H

View File

@ -1,19 +0,0 @@
#ifndef _WBFS_FAT_H
#define _WBFS_FAT_H
wbfs_t* WBFS_FAT_OpenPart(char *fname);
void WBFS_FAT_ClosePart(wbfs_t* part);
s32 WBFS_FAT_GetCount(u32 *count);
s32 WBFS_FAT_GetHeaders(void *outbuf, u32 cnt, u32 len);
wbfs_disc_t* WBFS_FAT_OpenDisc(u8 *discid);
void WBFS_FAT_CloseDisc(wbfs_disc_t* disc);
s32 WBFS_FAT_DiskSpace(f32 *used, f32 *free);
s32 WBFS_FAT_RemoveGame(u8 *discid);
s32 WBFS_FAT_AddGame(void);
s32 WBFS_FAT_DVD_Size(u64 *comp_size, u64 *real_size);
int WBFS_FAT_find_fname(u8 *id, char *fname, int len);
s32 WBFS_FAT_RenameGame(u8 *discid, const void *newname);
s32 WBFS_FAT_ReIDGame(u8 *discid, const void *newID);
s32 WBFS_FAT_EstimateGameSize(void);
#endif