Compare commits
10 Commits
master
...
release_0_
Author | SHA1 | Date |
---|---|---|
![]() |
8598aedc55 | |
![]() |
0523bceaa7 | |
![]() |
9967581aa8 | |
![]() |
042afbaec5 | |
![]() |
40bf609a2c | |
![]() |
3695f5b329 | |
![]() |
c07d7945d8 | |
![]() |
60ffb9f6ef | |
![]() |
47c60130b8 | |
![]() |
0b6de71565 |
|
@ -1,19 +0,0 @@
|
|||
---
|
||||
name: New Issue, Bug report, Question
|
||||
about: New Issue, Bug report, Question
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## State your operating system:
|
||||
Windows/Mac/Linux. in case of linux, whether you use CLI, gtk2, or gtk3 version.
|
||||
|
||||
## DesMuME version
|
||||
e.g. 0.9.13 or git master
|
||||
|
||||
## Isse
|
||||
type here what's bothering you, in a detailed manner.
|
||||
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
name: DeSmuME
|
||||
|
||||
on:
|
||||
- push
|
||||
- pull_request
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build DeSmuME (Linux)
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: install dependencies
|
||||
run: sudo apt update && sudo apt install meson libsdl2-dev libpcap-dev libgtk-3-dev
|
||||
|
||||
- name: meson
|
||||
run: |
|
||||
cd desmume/src/frontend/posix/
|
||||
meson build
|
||||
|
||||
- name: ninja
|
||||
run: ninja -C desmume/src/frontend/posix/build
|
||||
|
||||
build_gtk2:
|
||||
name: Build DeSmuME (Linux/GTK+2)
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: install dependencies
|
||||
run: sudo apt update && sudo apt install autoconf libglu1-mesa-dev libsdl2-dev libpcap-dev libgtk2.0-dev
|
||||
|
||||
- name: buildit
|
||||
run: |
|
||||
cd desmume/src/frontend/posix/
|
||||
autoreconf -i
|
||||
./configure --prefix=/usr --enable-gdb-stub --enable-wifi
|
||||
make -j8
|
||||
make DESTDIR=/tmp/DeSmuME install
|
||||
|
||||
- name: Pack artifact
|
||||
run: |
|
||||
cd /tmp
|
||||
tar cJf DeSmuME.tar.xz DeSmuME/
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: desmume-linux-gtk2-cli-x86_64
|
||||
path: /tmp/DeSmuME.tar.xz
|
||||
|
||||
build_macos:
|
||||
name: Build DeSmuME (macOS)
|
||||
runs-on: macos-14
|
||||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: xcodebuild
|
||||
run: |
|
||||
cd desmume/src/frontend/cocoa/
|
||||
xcodebuild archive -project "DeSmuME (Latest).xcodeproj" -scheme "DeSmuME (macOS App; Intel64 -- Latest Xcode)" -arch x86_64 -archivePath "$(pwd)/desmume.xcarchive" | xcpretty -c
|
||||
|
||||
- name: make zip
|
||||
run: |
|
||||
cd desmume/src/frontend/cocoa/desmume.xcarchive/Products/Applications/
|
||||
7z a DeSmuME.app.zip DeSmuME.app
|
||||
|
||||
- name: Upload artifict
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos
|
||||
path: desmume/src/frontend/cocoa/desmume.xcarchive/Products/Applications/DeSmuME.app.zip
|
||||
if-no-files-found: error
|
|
@ -1,87 +0,0 @@
|
|||
name: DeSmuME Interface (DLL/SO)
|
||||
|
||||
on:
|
||||
- push
|
||||
- pull_request
|
||||
|
||||
jobs:
|
||||
build_linux:
|
||||
runs-on: ubuntu-24.04
|
||||
name: Build Linux
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: sudo apt update && sudo apt install meson libsdl2-dev libpcap-dev
|
||||
|
||||
- name: Build - Meson
|
||||
run: |
|
||||
cd desmume/src/frontend/interface/
|
||||
meson build
|
||||
|
||||
- name: Build - ninja
|
||||
run: ninja -C desmume/src/frontend/interface/build
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: linux
|
||||
path: desmume/src/frontend/interface/build/libdesmume.so
|
||||
|
||||
build_macos:
|
||||
runs-on: macos-14
|
||||
name: Build MacOS
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install MacOS build deps
|
||||
run: brew install coreutils sdl2 meson
|
||||
|
||||
- name: Build - Meson
|
||||
run: |
|
||||
cd desmume/src/frontend/interface/
|
||||
meson build
|
||||
env:
|
||||
CC: clang
|
||||
CXX: clang++
|
||||
|
||||
- name: Build - ninja
|
||||
run: ninja -C desmume/src/frontend/interface/build
|
||||
env:
|
||||
CC: clang
|
||||
CXX: clang++
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos
|
||||
path: desmume/src/frontend/interface/build/libdesmume.dylib
|
||||
|
||||
build_windows:
|
||||
runs-on: windows-2022
|
||||
name: Build Windows
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [ 'x64', 'x86' ]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Add msbuild to PATH
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
with:
|
||||
msbuild-architecture: ${{ matrix.arch }}
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cd desmume\src\frontend\interface\windows
|
||||
MSBuild.exe DeSmuME_Interface.vcxproj /p:configuration="Release Fastbuild" /p:Platform=${{ matrix.arch }}
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: win-${{ matrix.arch }}
|
||||
path: desmume/src/frontend/interface/windows/__bins/*.dll
|
|
@ -1,30 +0,0 @@
|
|||
name: DeSmuME Windows build
|
||||
|
||||
on:
|
||||
- push
|
||||
- pull_request
|
||||
|
||||
jobs:
|
||||
build-sln:
|
||||
runs-on: windows-2022
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup MSBuild.exe
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
with:
|
||||
msbuild-architecture: x64
|
||||
|
||||
- name: Build solution
|
||||
run: |
|
||||
SET CL=-Wno-c++11-narrowing
|
||||
msbuild 'desmume/src/frontend/windows/DeSmuME.sln' /p:configuration="Release" /p:platform=x64 /p:CL_cgthreads=1 /p:CLToolExe=clang-cl.exe
|
||||
cmd /c desmume\src\frontend\windows\ci_postbuild.bat
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: desmume-win-x64
|
||||
path: desmume/src/frontend/windows/__bins/*.exe
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
name: Generate Source Tarball
|
||||
|
||||
# Trigger whenever a release is created
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: archive
|
||||
id: archive
|
||||
run: |
|
||||
THISDIR="$PWD"
|
||||
cd desmume/src/frontend/posix
|
||||
autoreconf -i
|
||||
cd "$THISDIR"
|
||||
VERSION=$(printf "%s\n" ${{ github.event.release.tag_name }} | sed -e 's/^release_//' -e 's/_/./g')
|
||||
PKGNAME="desmume-$VERSION"
|
||||
mkdir -p /tmp/$PKGNAME
|
||||
mv * /tmp/$PKGNAME
|
||||
mv /tmp/$PKGNAME .
|
||||
TARBALL=$PKGNAME.tar.xz
|
||||
tar cJf $TARBALL $PKGNAME
|
||||
echo "::set-output name=tarball::$TARBALL"
|
||||
|
||||
- name: upload tarball
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./${{ steps.archive.outputs.tarball }}
|
||||
asset_name: ${{ steps.archive.outputs.tarball }}
|
||||
asset_content_type: application/x-xz
|
|
@ -1,77 +0,0 @@
|
|||
/desmume/src/scmrev.h
|
||||
/desmume/src/frontend/windows/defaultconfig/scmrev.h
|
||||
/desmume/src/frontend/windows/.libs
|
||||
/desmume/src/frontend/windows/.obj
|
||||
/desmume/src/frontend/windows/__bins
|
||||
/desmume/src/frontend/windows/*.tlog
|
||||
/desmume/src/frontend/windows/*.aps
|
||||
.vs/
|
||||
*.user
|
||||
*.suo
|
||||
*.VC.db
|
||||
*.VC.opendb
|
||||
*.o
|
||||
*.ipch
|
||||
.deps
|
||||
*.dirstamp
|
||||
Makefile.in
|
||||
/desmume/src/frontend/posix/missing
|
||||
/desmume/src/frontend/posix/*.a
|
||||
/desmume/src/frontend/posix/autom4te.cache
|
||||
/desmume/src/frontend/posix/Makefile
|
||||
/desmume/src/frontend/posix/aclocal.m4
|
||||
/desmume/src/frontend/posix/configure
|
||||
/desmume/src/frontend/posix/cli/Makefile
|
||||
/desmume/src/frontend/posix/cli/desmume-cli
|
||||
/desmume/src/frontend/posix/cli/doc/Makefile
|
||||
/desmume/src/frontend/posix/compile
|
||||
/desmume/src/frontend/posix/config.guess
|
||||
/desmume/src/frontend/posix/config.log
|
||||
/desmume/src/frontend/posix/config.status
|
||||
/desmume/src/frontend/posix/config.sub
|
||||
/desmume/src/frontend/posix/depcomp
|
||||
/desmume/src/frontend/posix/gtk/Makefile
|
||||
/desmume/src/frontend/posix/gtk/desmume
|
||||
/desmume/src/frontend/posix/gtk/doc/Makefile
|
||||
/desmume/src/frontend/posix/gtk-glade/Makefile
|
||||
/desmume/src/frontend/posix/gtk-glade/desmume-glade
|
||||
/desmume/src/frontend/posix/gtk-glade/doc/Makefile
|
||||
/desmume/src/frontend/posix/install-sh
|
||||
/desmume/src/frontend/cocoa/openemu/OpenEmuBase.framework/
|
||||
/desmume/src/frontend/cocoa/OptimizationProfiles/
|
||||
|
||||
# Xcode
|
||||
|
||||
## Build generated
|
||||
build/
|
||||
DerivedData/
|
||||
|
||||
## Various settings
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata/
|
||||
.vs/ProjectSettings.json
|
||||
|
||||
## Other
|
||||
*.moved-aside
|
||||
*.xcuserstate
|
||||
*.xcscmblueprint
|
||||
|
||||
## Obj-C/Swift specific
|
||||
*.hmap
|
||||
*.ipa
|
||||
*.dSYM.zip
|
||||
*.dSYM
|
||||
|
||||
## Eclipse CDT generated files
|
||||
/.autotools
|
||||
/.cproject
|
||||
/config.log
|
||||
/.project
|
||||
.DS_Store
|
|
@ -1,6 +0,0 @@
|
|||
# DeSmuME
|
||||
[](https://ci.appveyor.com/project/zeromus/desmume)
|
||||
|
||||
DeSmuME is a Nintendo DS emulator.
|
||||
|
||||
http://desmume.org/download
|
|
@ -6,12 +6,15 @@ Current team
|
|||
------------
|
||||
Guillaume Duhamel
|
||||
Normmatt
|
||||
Bernat Muñoz (shash)
|
||||
Riccardo Magliocchetti
|
||||
Max Tabachenko (CrazyMax)
|
||||
zeromus
|
||||
rogerman
|
||||
Luigi__
|
||||
|
||||
Contributors
|
||||
------------
|
||||
Bernat Muńoz (shash)
|
||||
Allustar
|
||||
amponzi
|
||||
Anthony Molinaro
|
||||
|
@ -37,14 +40,9 @@ WinterMute
|
|||
pengvado
|
||||
dormito
|
||||
ldesnogue
|
||||
mtheall
|
||||
thelemonman
|
||||
|
||||
Thanks to our super testers for this release
|
||||
------------
|
||||
nash679
|
||||
pokefan999
|
||||
dottorleo
|
||||
yki
|
||||
Luigi__
|
||||
CrazyMax
|
||||
Riccardo Magliocchetti
|
||||
CyberWarriorX
|
||||
mic
|
|
@ -1,203 +1,4 @@
|
|||
0.9.12 -> 0.9.13
|
||||
|
||||
In this version we have added support for high-resolution 3D rendering. Try the new "GPU Scaling Factor" feature to
|
||||
increase the 3D resolution beyond the native resolution of 256x192 pixels. Also, the Cocoa frontend sees continued
|
||||
radical enhancements and while the Windows frontend sees some new incremental enhancements.
|
||||
|
||||
General/Core:
|
||||
bug: numerous host compatibility and accuracy improvements to OpenGL renderer, tho off-by-1 sampling bugs will remain.
|
||||
bug: fixes to 'edge marking', shadows, box tests, maths & depths precision, and some other rarer 3d rendering usecases
|
||||
bug: fixes to AR cheat processing
|
||||
bug: fixes to cheat database game identification
|
||||
bug: fix interpolation at SPU loop points, emulation of SPU half/byte size registers & others
|
||||
bug: backlight emulation added (for fade effects)
|
||||
bug: other small ongoing fixes to 2d rendering and GPU memory maps
|
||||
bug: emulate slot-1 read timings, probably for AP-related purposes
|
||||
bug: general improvement to hardware component power-off state handling, especially 3d engine
|
||||
bug: fix virtual fat (homebrew) building in environment with symlinks
|
||||
bug: fix some rarely-bugged CPU instructions
|
||||
bug: fix bugs in homebrew filesystems
|
||||
bug: fix bugs in big-endian hosts
|
||||
bug: fix loading gzipped files and some newer rars
|
||||
bug: fix inconsistencies and omissions in command-line processing
|
||||
bug: extensive improvement to wifi emulation, though wifi is still not supported.
|
||||
bug: firmware file settings/management now behaves more or less sensibly as advertised
|
||||
bug: fix movie (dsm) being bitrotted and failing to sync settings or manage sram properly
|
||||
enh: movie (dsm) add record from state feature
|
||||
enh: high-resolution 3d rendering, from 1x-16x the native resolution of 256x192 pixels
|
||||
enh: texture upscaling for 3d rendering, from 1x-4x the native texture size
|
||||
enh: texture smoothing option for OpenGL renderer
|
||||
enh: user-selectable internal GPU bpp 15/18/24 to change from accuracy to attractiveness
|
||||
enh: game-specific hacks library finally implemented internally, user-selectable.
|
||||
enh: game-specific hack for popular games that randomly corrupt their sprites when going in and out of doors
|
||||
enh: officially supported arm and arm64 jits and overall improvements on arm hosts
|
||||
enh: emulator now makes "(backups)" states on every loadstate, for in case you hit loadstate on accident
|
||||
enh: User-selectable MSAA level for OpenGL renderer.
|
||||
enh: "interface" for dll/so control of a desmume core
|
||||
enh: optimizations, cpu arch-specific, and otherwise, to all 3d and 2d rendering, ranging from SSE to AVX2
|
||||
enh: lua - Add raw joystick API and setlayermask API (windows only)
|
||||
enh: lua - Add gamecode APU for game-specific hacks in scripts and 'freelook' script functionality
|
||||
enh: add options to emulate game cards more badly, to trip AP on purpose
|
||||
enh: fix some save type / slot type autodetections and save memory import codepaths
|
||||
enh: add fake impossible debug AR code to select CPU: DFFFFFFF 77777777/99999999
|
||||
enh: add --rtc-day and --rtc-hour to specify an offset from host RTC
|
||||
enh: support newer duc files
|
||||
enh: upgrade and add some upscalers, hq3x, 6xBRZ, etc.
|
||||
enh: add "interface" frontend for use via dll/so
|
||||
|
||||
Windows:
|
||||
note: windows xp and x86 support is dropped for official builds. windows 7 support will be dropped over my dead body.
|
||||
bug: fix numerous bugs involving filenames and path with non-latin characters
|
||||
bug: fix bugs in various display layout, rotate, vsync, gaps, and display method configurations
|
||||
bug: fix bugs in user configured paths
|
||||
bug: aviout/wavout is now more robust
|
||||
bug: fix bugs in window clearing and various display method configurations which leave garbage on screen
|
||||
enh: add fullscreen display options
|
||||
enh: major revisions to mic sample feature, loaded as a bunch and rotated with hotkeys
|
||||
enh: add user-facing option to control console window visibility
|
||||
enh: add some crude capability for breakpoints to cpu debugger and memory viewer, and other bugfixes
|
||||
enh: add "screen size ratio" for smaller sub-screens, etc.
|
||||
enh: add some hotkeys
|
||||
enh: add option to kill stylus input when outside the NDS screen
|
||||
enh: improve cheat list UX
|
||||
enh: optimizations to reduce cpu usage overall and during idle especially for high resolutions, scalers, etc.
|
||||
enh: improve pen&touch support
|
||||
|
||||
Cocoa:
|
||||
bug: fix issues with v-sync causing frame rate issues under various circumstances
|
||||
bug: fix issues when running a display window in fullscreen
|
||||
enh: add native binary support for Apple Silicon CPUs
|
||||
enh: Macs with an Intel Haswell or later CPU now benefit from the new AVX2 optimizations
|
||||
enh: add support for Apple's Dark Mode user interface introduced in macOS Mojave
|
||||
enh: add some new toolbar items for the following: Frame Advance, Enable/Disable HUD, Toggle Displays
|
||||
enh: turbo inputs can now be configured with a frame-by-frame press/release pattern
|
||||
enh: display windows now run their video output using Metal, if available
|
||||
enh: display windows now support HiDPI monitors like Apple's Retina monitors
|
||||
enh: display windows have new "Hybrid" layouts for better fit on modern widescreen monitors (View > Display Layout)
|
||||
enh: display windows can now change the video source going to each individual DS screen (View > Display Video Source)
|
||||
enh: display windows can now run a Heads-Up Display for reporting useful info (View > Show HUD Settings)
|
||||
enh: add support for changing the NDS stylus pressure (Emulation > Show Stylus Settings)
|
||||
enh: screenshots can now be captured using a dedicated tool for it (Tools > Show Screenshot Capture Tool)
|
||||
enh: lots of miscellaneous stability and performance improvements
|
||||
|
||||
Linux:
|
||||
note: SDL2 now employed
|
||||
note: GTK3 port added, built with meson
|
||||
note: CLI and GTK ports improved, according to their respective niche (gaming vs functionality)
|
||||
note: CLI: added horizontal screen layout
|
||||
note: CLI: added floating-point scale factor support with HW stretching
|
||||
note: CLI/GTK2: improved gdb stub for game debugging
|
||||
note: CLI/GTK2/GTK3: various other improvements
|
||||
|
||||
0.9.11 -> 0.9.12
|
||||
|
||||
We decided to start skipping even versions to disambiguate official releases from several years of interim builds,
|
||||
and to insulate ourselves from consideration for world record of "longest time between consecutive releases" by
|
||||
creating confusion as to what constitutes a consecutive release.
|
||||
|
||||
0.9.10 -> 0.9.11 (r4908-r5146)
|
||||
|
||||
In this version, we have focused on the Cocoa frontend, but there have been some good core fixes over so long.
|
||||
Notably, the save-related issues resulting in the advice "dont use 0.9.10" have been resolved.
|
||||
|
||||
General/Core:
|
||||
bug: fix large numbers of games not being able to save anymore
|
||||
bug: fix some missing sound effects due to wrong volumes in some boot scenarios and other things
|
||||
bug: fix freezes due to tiny looping sounds
|
||||
bug: fix many big endian issues
|
||||
bug: fix some apparently rarely-used CPU instructions, no known consequences
|
||||
bug: fix (block) reading of some GPU registers
|
||||
bug: fix action replay code type 0xE
|
||||
bug: fix reading of last 4 bytes of rom
|
||||
bug: large improvements to stability of GDB stub
|
||||
bug: support w-buffer support in OpenGL renderers
|
||||
bug: fix unpredictable crashes in some 3d scenes from w=0
|
||||
enh: better loading of roms (bad patches) with wrong size info in header
|
||||
enh: warn user sometimes when 'stream rom from disk' will create malfunctions
|
||||
enh: add xBRZ filters
|
||||
enh: add "TXT Hack" for software rasterizer to improve text rendering in some games
|
||||
|
||||
Windows:
|
||||
bug: fix 5x filters
|
||||
enh: support import of action replay save files (.dss)
|
||||
enh: add antialiasing option for OpenGL renderers
|
||||
enh: don't malfunction if saveram is unavailable or read-only
|
||||
|
||||
Cocoa:
|
||||
bug: 16-bit to 32-bit color space conversions no longer darken video or images
|
||||
bug: fix intermittent issues with loading user defaults on app startup
|
||||
bug: fix rendering inaccuracies of the video preview in the app display preferences
|
||||
bug: fix various UI font rendering and text alignment issues on OS X Yosemite
|
||||
bug: fix crackly sound from N-sync and Z-sync methods
|
||||
enh: make N-sync method the default sound sync method since it has much lower latency than P-sync method
|
||||
enh: add support for gdbstub (Tools > Show GDB Stub Control) (only available on custom builds using the dev+ build target)
|
||||
enh: optimize input handling to use less CPU
|
||||
enh: add support for App Nap when the app is in an idle state (only supported on OS X Mavericks and later)
|
||||
enh: add Execution Control panel (Emulation > Show Execution Control), now with frame advance and frame jump controls
|
||||
enh: auto frame skip is now smoother
|
||||
enh: further improve execution timing accuracy
|
||||
enh: improve overall video performance
|
||||
enh: render video through a 3-stage filtering pipeline, (Video Source)-->(Pixel Scaler)-->(Video Output)
|
||||
enh: add the following video source filters - Deposterize
|
||||
enh: add the following video output filters - Bicubic B-Spline, Bicubic Mitchell-Netravali, Lanczos2, Lanczos3
|
||||
enh: add ability to run all existing pixel scalers on either the CPU or the GPU
|
||||
enh: add ability to toggle the main and touch display positions (View > Toggle All Displays)
|
||||
enh: add preliminary support for replay playback and recording
|
||||
enh: add support for turbo and autohold
|
||||
enh: add support for the entire suite of slot-2 devices (Emulation > Show SLOT-2 Manager)
|
||||
enh: add support for using the host machine's audio input device for emulating the NDS microphone (Emulation > Show Microphone Settings)
|
||||
enh: change the sine wave tone generator's range from 100Hz-5000Hz to 40Hz-4000Hz
|
||||
enh: reorganize the menu options to more logical locations
|
||||
enh: greatly improve the File Migration Assistant (now renamed Game Data Migration Assistant) and ROM Info panel with a more modern and space efficient look and feel
|
||||
enh: miscellaneous user interface improvements
|
||||
|
||||
Linux:
|
||||
bug: fix screen gap bug
|
||||
bug: workaround for std::bad_alloc exceptions compiler bugs
|
||||
enh: add experimental AV recording
|
||||
enh: generally improve main loop throttling and skipping
|
||||
enh: massive improvements to HUD and menu layout
|
||||
enh: add window sizing options and sound interpolation options
|
||||
enh: add Lid button; disallow U+D, L+R; manual option saving
|
||||
|
||||
0.9.9 -> 0.9.10 (r4623-r4908)
|
||||
|
||||
In this version, we have focused on trying to clean up some complexities in the user experience and emulator internals. Pretty unglamorous stuff, but some games are newly compatible.
|
||||
|
||||
General/Core:
|
||||
enh: break savestate back-compatibility
|
||||
bug: improve save size autodetection for some games
|
||||
bug: cpu: fix many basic jit cpu bugs
|
||||
bug: 3d: tweak softrasterizer edge marking
|
||||
bug: 3d: fix stale 4x4 texture palettes
|
||||
bug: fix some GPU sprite blending scenarios
|
||||
bug: fix bios HLE BitUnPack, UnCompHuffman
|
||||
enh: modular slot-1 device system, emulate GC bus more faithfully
|
||||
enh: support NAND slot-1 device
|
||||
enh: auto-detect appropriate slot-1 and slot-2 device
|
||||
enh: many revisions to firmware boot process for more authenticity. iQue and FlashME versions function, .dfc rewritten.
|
||||
enh: support streaming NDS file from disk (like an ISO, to avoid long initial load time)
|
||||
enh: run .dsv directly on disk, to save long flushing times. should speed backup operations.
|
||||
enh: spu synch mode and method on commandline
|
||||
|
||||
Windows:
|
||||
bug: fixes to advanscene DB import
|
||||
bug: save opengl display method filter option
|
||||
bug: general bugfixes to various screen layout modes
|
||||
enh: add option to stop non-integer scaling during fullscreen or maximize
|
||||
enh: improvements to save import dialog
|
||||
enh: improved memory viewer tool
|
||||
enh: operate better when run, against our advice, from a zipfile
|
||||
enh: add slot-1 Nitro Filesystem viewer tool
|
||||
|
||||
Cocoa:
|
||||
bug: fix slot1-R4 path saving
|
||||
bug: fix bug with mic samples < 16khz
|
||||
bug: fix bugs and enhancements in multi display windows
|
||||
bug: fix handling of some joystick analog inputs
|
||||
enh: save display windows configuration and emulation speed on app exit
|
||||
|
||||
0.9.8 -> 0.9.9 (r4228-r4623)
|
||||
0.9.8 -> 0.9.9 (r4228-r4591-r4623)
|
||||
|
||||
Yes, it's been a while since the last release, but we haven't been completely idle. There's a brand new jit cpu core which yields some impressive speedups!
|
||||
|
||||
|
@ -216,6 +17,7 @@ Graphics:
|
|||
bug: 3d: fix some polygon and texture coloring bugs on big-endian systems
|
||||
|
||||
Windows:
|
||||
bug: fixes to advanscene DB import
|
||||
bug: fix some full screen stretching bugs
|
||||
enh: add xaudio2 output driver
|
||||
enh: add opengl display method (as opposed to directdraw), with controllable bilinear filter
|
||||
|
@ -328,8 +130,8 @@ Linux:
|
|||
enh: cli: better fps limiting (Thomas Jones)
|
||||
|
||||
Wx:
|
||||
bug: some small fixes here and there (Jan Bücken)
|
||||
enh: lot of code cleanup (Jan Bücken)
|
||||
bug: some small fixes here and there (Jan Bücken)
|
||||
enh: lot of code cleanup (Jan Bücken)
|
||||
|
||||
0.9.6 -> 0.9.7 (r3493-r3812)
|
||||
|
||||
|
@ -714,7 +516,7 @@ CPU/MMU:
|
|||
bug: Fixed Thumb LDMIA (fixes ingame Dead'n'Furious) [shash]
|
||||
bug: Fix repeating DMA (fixes NSMB parallax BG) [zeromus]
|
||||
bug: Proper handling for unaligned CPU accesses [luigi__]
|
||||
bug: Proper handling for undefined instruction exceptions [Salva Peiró]
|
||||
bug: Proper handling for undefined instruction exceptions [Salva Peiró]
|
||||
bug: correctly return vram control register values (fixes homebrew 3d games) [zeromus]
|
||||
enh: Remove 16MB of WRAM at 0x01****** from arm9. Mapped to unused instead. Nobody knows what this was. [zeromus]
|
||||
enh: Changed instruction execution to 16 at a time blocks (tested and stable) [shash]
|
||||
|
@ -760,8 +562,8 @@ Mac OS X port:
|
|||
bug: Fixed: Frozen video output (and/or messed 3d emulation) after loading a state. [Jeff]
|
||||
bug: Added option to load the most recent file upon launching the program. [Jeff]
|
||||
enh: Added French translation (thanks to Pierre Rudloff). [Jeff]
|
||||
enh: Added basic key mapping configuration to application preferences (thanks to Julio Gorg). [Jeff]
|
||||
enh: Added keyboard shortcuts for Execute, Pause and Reset command (thanks to Julio Gorg). [Jeff]
|
||||
enh: Added basic key mapping configuration to application preferences (thanks to Julio GorgŽ). [Jeff]
|
||||
enh: Added keyboard shortcuts for Execute, Pause and Reset command (thanks to Julio GorgŽ). [Jeff]
|
||||
enh: Default key mappings are no longer case sensitive. [Jeff]
|
||||
enh: Added ability to limit speed. [Jeff]
|
||||
enh: Fixed: Video output should work on software-only 3D renderers. [Jeff]
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
EXTRA_DIST = README.LIN README.MAC README.WIN dsm.txt dsv.txt autogen.sh \
|
||||
$(PO_FILES_IN)
|
||||
DISTCLEANFILES = $(PO_FILES)
|
||||
SUBDIRS = $(PO_DIR) src
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
DeSmuME
|
||||
_________________________________________
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2022 DeSmuME team
|
||||
Last Updated: May 23, 2022
|
||||
Copyright (C) 2006-2012 DeSmuME team
|
||||
Last Updated: March 31, 2012
|
||||
|
||||
Contents:
|
||||
1) About ................................................................... 14
|
||||
|
@ -23,7 +23,7 @@ For information on how to install or operate DeSmuME for your operating system,
|
|||
please see the README file that should be present with your installation.
|
||||
|
||||
Port-specific README files:
|
||||
* README.LIN for the Linux ports
|
||||
* README.LIN for the Linux port
|
||||
* README.WIN for the Windows port
|
||||
* README.MAC for the Macintosh port
|
||||
|
||||
|
@ -34,23 +34,23 @@ developing DeSmuME.
|
|||
You can find our documentation on our online Wiki page. The major pages of
|
||||
interest are:
|
||||
|
||||
* Official Documentation: https://wiki.desmume.org/index.php?title=Main_Page
|
||||
* Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page
|
||||
|
||||
This is the main Wiki page that contains all of our official documentation.
|
||||
|
||||
* Manuals: https://wiki.desmume.org/index.php?title=Manual
|
||||
* Manuals: http://wiki.desmume.org/index.php?title=Manual
|
||||
|
||||
The manuals contain detailed information about how to operate DeSmuME for each
|
||||
port.
|
||||
|
||||
* FAQ: https://wiki.desmume.org/index.php?title=Faq
|
||||
* FAQ: http://wiki.desmume.org/index.php?title=Faq
|
||||
|
||||
The Frequently Asked Questions (FAQ) page has a lot of useful general
|
||||
information about DeSmuME. Do note that some of the information may be platform
|
||||
specific, and may not directly apply to your version of DeSmuME.
|
||||
|
||||
* Build Instructions:
|
||||
https://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source
|
||||
http://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source
|
||||
|
||||
This page contains detailed port-specific instructions about how to make your
|
||||
own build of DeSmuME directly from the source code.
|
||||
|
@ -71,10 +71,10 @@ Special thanks go to:
|
|||
|
||||
3) Contact Information ________________________________________________________
|
||||
|
||||
Official Website: https://desmume.org
|
||||
Public Forum: https://forums.desmume.org
|
||||
Developer Chat: irc://irc.libera.chat:6697/desmume
|
||||
Source & Bug Reports: https://github.com/TASEmulators/desmume
|
||||
Official Website: http://desmume.org
|
||||
Public Forum: http://forums.desmume.org
|
||||
Developer Chat: irc://irc.freenode.net/desmume
|
||||
Bug Reports: http://sourceforge.net/tracker/?group_id=164579&atid=832291
|
||||
|
||||
Please don't ask for ROMs, BIOS files, or any other copyrighted stuff.
|
||||
|
||||
|
@ -91,7 +91,7 @@ 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 software. If not, see <https://www.gnu.org/licenses/>.
|
||||
this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
* See the GNU General Public License details in COPYING.
|
||||
|
|
|
@ -1,441 +0,0 @@
|
|||
DeSmuME DLL/SO
|
||||
|
||||
DeSmuME is written in C++ using the SDL libraries.
|
||||
|
||||
* http://www.libsdl.org/
|
||||
|
||||
|
||||
Reference Usage
|
||||
===============
|
||||
A Python library using the DLL/SO interface can be found at
|
||||
`https://github.com/SkyTemple/py-desmume/blob/master/desmume/emulator.py`.
|
||||
|
||||
|
||||
Build Linux & Mac
|
||||
=================
|
||||
|
||||
DeSmuME uses the Meson build system to the shared object under Linux and MacOS:
|
||||
|
||||
* https://mesonbuild.com/
|
||||
|
||||
To build, first cd to src/frontend/interface and then run `meson build`
|
||||
|
||||
Then build the library by running `ninja -C build`
|
||||
|
||||
It will generate a shared object under `build/libdesmume.so`.
|
||||
|
||||
Build Windows
|
||||
=============
|
||||
To build open and build the Visual Studio solution at
|
||||
`src/frontend/interface/windows/DeSmuME_Interface.sln`.
|
||||
|
||||
|
||||
Interface
|
||||
=========
|
||||
The interface has the following API functions exposed in the DLL/SO.
|
||||
|
||||
|
||||
Emulator key indices
|
||||
--------------------
|
||||
Internal ID numbers for emulator keys (used for some functions):
|
||||
|
||||
#define KEY_NONE 0
|
||||
#define KEY_A 1
|
||||
#define KEY_B 2
|
||||
#define KEY_SELECT 3
|
||||
#define KEY_START 4
|
||||
#define KEY_RIGHT 5
|
||||
#define KEY_LEFT 6
|
||||
#define KEY_UP 7
|
||||
#define KEY_DOWN 8
|
||||
#define KEY_R 9
|
||||
#define KEY_L 10
|
||||
#define KEY_X 11
|
||||
#define KEY_Y 12
|
||||
#define KEY_DEBUG 13
|
||||
#define KEY_BOOST 14
|
||||
#define KEY_LID 15
|
||||
|
||||
|
||||
int desmume_init(void);
|
||||
-----------------------
|
||||
Initializes the emulator. Needs to be called before any other API functions.
|
||||
|
||||
|
||||
void desmume_free(void);
|
||||
------------------------
|
||||
Destroys the emulator, needs to be called to free memory. After this no API
|
||||
functions must be called.
|
||||
|
||||
|
||||
void desmume_set_language(unsigned char language);
|
||||
--------------------------------------------------
|
||||
Sets the firmware language. Valid values:
|
||||
0 = Japanese, 1 = English, 2 = French, 3 = German, 4 = Italian, 5 = Spanish
|
||||
|
||||
|
||||
int desmume_open(const char *filename);
|
||||
---------------------------------------
|
||||
Loads a ROM into the emulator. Returns 0 on success and another number on error.
|
||||
|
||||
|
||||
void desmume_set_savetype(int type);
|
||||
------------------------------------
|
||||
Sets the type of SRAM save. 0 for auto.
|
||||
|
||||
|
||||
void desmume_pause(void);
|
||||
-------------------------
|
||||
Pauses the emulator.
|
||||
|
||||
|
||||
void desmume_resume(void);
|
||||
--------------------------
|
||||
Resumes the emulator.
|
||||
|
||||
|
||||
void desmume_reset(void);
|
||||
-------------------------
|
||||
Resets the emulator and resumes.
|
||||
|
||||
|
||||
BOOL desmume_running(void);
|
||||
---------------------------
|
||||
Returns 0 if the emulator is not running and 1 if it is.
|
||||
|
||||
|
||||
void desmume_skip_next_frame(void);
|
||||
-----------------------------------
|
||||
Instructs the emulator to not draw the next frame.
|
||||
|
||||
|
||||
void desmume_cycle(BOOL with_joystick);
|
||||
---------------------------------------
|
||||
Runs one loop iteration (tick) of the emulation.
|
||||
The parameter must be 1 if `desmume_input_joy_init` was called before and
|
||||
joystick input should be processed
|
||||
and 0 otherwise.
|
||||
|
||||
|
||||
int desmume_sdl_get_ticks();
|
||||
----------------------------
|
||||
Get the current tick number as reported by SDL.
|
||||
|
||||
|
||||
void desmume_draw_opengl(GLuint *texture);
|
||||
------------------------------------------
|
||||
Only available if INCLUDE_OPENGL_2D was defined.
|
||||
|
||||
Draws the current tick onto the provided OpenGL texture.
|
||||
|
||||
|
||||
BOOL desmume_has_opengl();
|
||||
--------------------------
|
||||
Returns whether or not OpenGL support is available.
|
||||
|
||||
|
||||
int desmume_draw_window_init(BOOL auto_pause, BOOL use_opengl_if_possible);
|
||||
---------------------------------------------------------------------------
|
||||
Opens an SDL-powered window for drawing the emulator on and processing input.
|
||||
If `auto_pause` is >0, the emulator is paused when the window is not in focus.
|
||||
If `use_opengl_if_possible` is >0, OpenGL-based drawing is used
|
||||
if OpenGL is available.
|
||||
|
||||
|
||||
void desmume_draw_window_input();
|
||||
---------------------------------
|
||||
Process user input on the SDL window for this tick.
|
||||
Requires `desmume_draw_window_init` to be called first.
|
||||
|
||||
|
||||
void desmume_draw_window_frame();
|
||||
---------------------------------
|
||||
Draw the SDL window for this tick. Requires `desmume_draw_window_init` to be called first.
|
||||
|
||||
|
||||
BOOL desmume_draw_window_has_quit();
|
||||
------------------------------------
|
||||
Returns 1 if the SDL window was closed by the user and 0 if not.
|
||||
Requires `desmume_draw_window_init` to be called first.
|
||||
|
||||
|
||||
void desmume_draw_window_free();
|
||||
--------------------------------
|
||||
Destroys the SDL window and frees memory. Requires `desmume_draw_window_init` to be called first.
|
||||
No other SDL window functions must be called after this.
|
||||
|
||||
|
||||
unsigned short *desmume_draw_raw();
|
||||
-----------------------------------
|
||||
Returns the content of the raw framebuffer of the emulator.
|
||||
|
||||
|
||||
void desmume_draw_raw_as_rgbx(unsigned char *buffer);
|
||||
-----------------------------------------------------
|
||||
Fills the provided buffer as an RGBx formatted version of the emulator's framebuffer.
|
||||
|
||||
|
||||
void desmume_savestate_clear();
|
||||
-------------------------------
|
||||
Deletes all savestates stored on slots.
|
||||
|
||||
|
||||
BOOL desmume_savestate_load(const char *file_name);
|
||||
---------------------------------------------------
|
||||
Loads a savestate from a file. Returns 1 on success, 0 on failure.
|
||||
|
||||
|
||||
BOOL desmume_savestate_save(const char *file_name);
|
||||
---------------------------------------------------
|
||||
Saves a savestate to a file. Returns 1 on success, 0 on failure.
|
||||
|
||||
|
||||
void desmume_savestate_scan();
|
||||
------------------------------
|
||||
Scans the savestate slots for data. Required for `desmume_savestate_slot_exists` and
|
||||
`desmume_savestate_save_slot` to return the correct data.
|
||||
|
||||
|
||||
void desmume_savestate_slot_load(int index);
|
||||
--------------------------------------------
|
||||
Loads the savestate from slot `index`.
|
||||
|
||||
|
||||
void desmume_savestate_slot_save(int index);
|
||||
--------------------------------------------
|
||||
Saves the current state to the savestate in slot `index`.
|
||||
|
||||
|
||||
BOOL desmume_savestate_slot_exists(int index);
|
||||
----------------------------------------------
|
||||
Returns whether or not the savetstate at slot `index` exists.
|
||||
|
||||
|
||||
char* desmume_savestate_slot_date(int index);
|
||||
---------------------------------------------
|
||||
Returns the date (as string) that the savestate at slot `index` was saved.
|
||||
|
||||
|
||||
BOOL desmume_gpu_get_layer_main_enable_state(int layer_index);
|
||||
--------------------------------------------------------------
|
||||
Returns whether or not the layer with the given index for the main GPU is enabled.
|
||||
|
||||
|
||||
BOOL desmume_gpu_get_layer_sub_enable_state(int layer_index);
|
||||
-------------------------------------------------------------
|
||||
Returns whether or not the layer with the given index for the sub GPU is enabled.
|
||||
|
||||
|
||||
void desmume_gpu_set_layer_main_enable_state(int layer_index, BOOL the_state);
|
||||
------------------------------------------------------------------------------
|
||||
Disables or enables the layer with the given index for the main GPU.
|
||||
Disabled layers are not drawn.
|
||||
|
||||
|
||||
void desmume_gpu_set_layer_sub_enable_state(int layer_index, BOOL the_state);
|
||||
-----------------------------------------------------------------------------
|
||||
Disables or enables the layer with the given index for the sub GPU.
|
||||
Disabled layers are not drawn.
|
||||
|
||||
|
||||
int desmume_volume_get();
|
||||
-------------------------
|
||||
Returns the current emulator volume in a range from 0-100.
|
||||
|
||||
|
||||
void desmume_volume_set(int volume);
|
||||
------------------------------------
|
||||
Sets the current emulator volume in a range from 0-100.
|
||||
|
||||
|
||||
unsigned char desmume_memory_read_byte(int address);
|
||||
signed char desmume_memory_read_byte_signed(int address);
|
||||
unsigned short desmume_memory_read_short(int address);
|
||||
signed short desmume_memory_read_short_signed(int address);
|
||||
unsigned long desmume_memory_read_long(int address);
|
||||
signed long desmume_memory_read_long_signed(int address);
|
||||
-----------------------------------------------------------
|
||||
Read the emulated memory at `address` with different sizes and sign settings.
|
||||
|
||||
|
||||
void desmume_memory_write_byte(int address, unsigned char value);
|
||||
void desmume_memory_write_short(int address, unsigned short value);
|
||||
void desmume_memory_write_long(int address, unsigned long value);
|
||||
-------------------------------------------------------------------
|
||||
Write the value `value` as bytes/shorts/longs to `address` in the emulated memory.
|
||||
|
||||
|
||||
int desmume_memory_read_register(char* register_name);
|
||||
void desmume_memory_write_register(char* register_name, long value);
|
||||
--------------------------------------------------------------------
|
||||
Read or write the value of the specified register.
|
||||
|
||||
Valid register names:
|
||||
- arm9.r0 - arm9.r15 : Registers r0 - r15 on the ARM9 processor.
|
||||
- arm9.cpsr
|
||||
- arm9.spsr
|
||||
- arm7.r0 - arm7.r15 : Registers r0 - r15 on the ARM7 processor.
|
||||
- arm7.cpsr
|
||||
- arm7.spsr
|
||||
|
||||
`main` may be used as an alias for `arm9` and `sub` for `arm7`.
|
||||
If the prefix is omitted, `arm9` is used.
|
||||
|
||||
|
||||
typedef BOOL (*memory_cb_fnc)(unsigned int, int);
|
||||
void desmume_memory_register_write(int address, int size, memory_cb_fnc cb);
|
||||
void desmume_memory_register_read(int address, int size, memory_cb_fnc cb);
|
||||
void desmume_memory_register_exec(int address, int size, memory_cb_fnc cb);
|
||||
----------------------------------------------------------------------------
|
||||
Register a callback function to execute when the emulator writes/reads or executes
|
||||
an instruction at `address`. `size` is the size in bytes to monitor for that location
|
||||
(should always be 2 to exec).
|
||||
|
||||
The passed callback function gets to arguments when called. The first argument
|
||||
is the address the callback was triggered for, the second the size.
|
||||
|
||||
Only one callback can be specified per address and type (write/read/exec).
|
||||
Pass 0 instead for `cb` to unregister previously registered callbacks.
|
||||
|
||||
|
||||
void desmume_screenshot(char *screenshot_buffer);
|
||||
-------------------------------------------------
|
||||
Fills the 98304*3 bytes long `screenshot_buffer` with an RGB snapshot of
|
||||
the framebuffer.
|
||||
|
||||
|
||||
BOOL desmume_input_joy_init(void);
|
||||
----------------------------------
|
||||
Initialize SDL joypad handling. Returns 1 on success, 0 otherwise.
|
||||
Must be called before any other joypad operation.
|
||||
|
||||
void desmume_input_joy_uninit(void);
|
||||
------------------------------------
|
||||
Destroys the joypad functionality. After calling this, no other joypad
|
||||
operations must be called.
|
||||
|
||||
|
||||
unsigned short desmume_input_joy_number_connected(void);
|
||||
--------------------------------------------------------
|
||||
Returns the number of connected joypads.
|
||||
|
||||
|
||||
unsigned short desmume_input_joy_get_key(int index);
|
||||
----------------------------------------------------
|
||||
Returns the joypad key assigned to the specified emulator key.
|
||||
|
||||
|
||||
unsigned short desmume_input_joy_get_set_key(int index);
|
||||
--------------------------------------------------------
|
||||
Pause and wait for the user to press a button on a joypad.
|
||||
This button will be assigned to the specified emulator key.
|
||||
|
||||
void desmume_input_joy_set_key(int index, int joystick_key_index);
|
||||
------------------------------------------------------------------
|
||||
Sets the emulator key `index` to the specified joypad key `joystick_key_index`.
|
||||
|
||||
|
||||
void desmume_input_keypad_update(unsigned short keys);
|
||||
------------------------------------------------------
|
||||
Update the currently pressed emulator keys. This is a bitmask where each bit
|
||||
is one of the emulator's keys. See:
|
||||
|
||||
#define ADD_KEY(keypad,key) ( (keypad) |= (key) )
|
||||
#define RM_KEY(keypad,key) ( (keypad) &= ~(key) )
|
||||
#define KEYMASK_(k) (1 << (k))
|
||||
|
||||
|
||||
unsigned short desmume_input_keypad_get(void);
|
||||
----------------------------------------------
|
||||
Get the currently pressed emulator keys. This is a bitmask where each bit is
|
||||
one of the emulator's keys.
|
||||
|
||||
|
||||
void desmume_input_set_touch_pos(unsigned short x, unsigned short y);
|
||||
---------------------------------------------------------------------
|
||||
Register a touch input at the specified location on the bottom screen.
|
||||
Use `desmume_input_release_touch` to release.
|
||||
|
||||
|
||||
void desmume_input_release_touch();
|
||||
-----------------------------------
|
||||
Release the current touch.
|
||||
|
||||
|
||||
BOOL desmume_movie_is_active();
|
||||
BOOL desmume_movie_is_recording();
|
||||
BOOL desmume_movie_is_playing();
|
||||
BOOL desmume_movie_is_finished();
|
||||
----------------------------------
|
||||
Returns whether the movie system is active/recording/playing/finished.
|
||||
|
||||
|
||||
int desmume_movie_get_length();
|
||||
-------------------------------
|
||||
Returns the size of the movie records.
|
||||
|
||||
|
||||
char *desmume_movie_get_name();
|
||||
-------------------------------
|
||||
Returns the name of the movie.
|
||||
|
||||
|
||||
int desmume_movie_get_rerecord_count();
|
||||
---------------------------------------
|
||||
Returns the current rerecount counter value of the movie.
|
||||
|
||||
|
||||
void desmume_movie_set_rerecord_count(int count);
|
||||
-------------------------------------------------
|
||||
Sets the current rerecount counter value of the movie.
|
||||
|
||||
|
||||
BOOL desmume_movie_get_readonly();
|
||||
----------------------------------
|
||||
Returns 1 if the movie can only be read, 0 if it can also be modified.
|
||||
|
||||
|
||||
void desmume_movie_set_readonly(BOOL state);
|
||||
--------------------------------------------
|
||||
Change whether or not the movie is only read-only (can not be modified).
|
||||
|
||||
|
||||
// Returns NULL on success, error message otherwise.
|
||||
const char *desmume_movie_play(const char *file_name);
|
||||
------------------------------------------------------
|
||||
Play the movie from the file `file_name`. Returns NULL on success, otherwise
|
||||
an error message.
|
||||
|
||||
|
||||
enum START_FROM {START_BLANK = 0, START_SRAM, START_SAVESTATE};
|
||||
struct SimpleDate {int year; int month; int day; int hour; int minute; int second; int millisecond;};
|
||||
void desmume_movie_record_simple(const char *save_file_name, const char *author_name);
|
||||
void desmume_movie_record(const char *save_file_name, const char *author_name,
|
||||
START_FROM start_from, const char* sram_file_name);
|
||||
void desmume_movie_record_from_date(const char *save_file_name, const char *author_name,
|
||||
START_FROM start_from, const char* sram_file_name,
|
||||
SimpleDate date);
|
||||
----------------------------------------------------------------------------------------
|
||||
Record a movie.
|
||||
|
||||
- `save_file_name`: The name of the file to save the movie to.
|
||||
- `author_name`: The name of the author of the movie.
|
||||
- `start_from`: Where to start from:
|
||||
- START_BLANK (0): Reset the emulator, start without SRAM (no savefile).
|
||||
- START_SRAM (1): Reset the emulator, start using the SRAM loaded from `sram_file_name`.
|
||||
- START_SAVESTATE (2): Not supported.
|
||||
- `sram_file_name`: Name of the SRAM to load, if `start_from` == 1. NULL otherwise.
|
||||
- `date`: Date to set the emulated device's clock to.
|
||||
|
||||
|
||||
void desmume_movie_replay();
|
||||
----------------------------
|
||||
Restart playback of the current movie.
|
||||
|
||||
|
||||
void desmume_movie_stop();
|
||||
----------------------------
|
||||
Stop playback/recording of the current movie.
|
||||
|
||||
|
||||
Visit us on the web at http://www.desmume.org
|
|
@ -1,66 +1,74 @@
|
|||
DeSmuME
|
||||
_________________________________________
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2007 DeSmuME team
|
||||
|
||||
DeSmuME is written in C++ using the GTK+ and SDL2 libraries.
|
||||
|
||||
* https://gtk.org/
|
||||
* https://libsdl.org/
|
||||
1) Compiling instructions...................................13
|
||||
2) How to use DeSmuME.......................................53
|
||||
3) Contact information......................................142
|
||||
4) Disclaimer...............................................160
|
||||
|
||||
It uses the Meson build system to build the GTK+3 and SDL2 port:
|
||||
|
||||
* https://mesonbuild.com/
|
||||
1 Compiling instructions______________________________________
|
||||
|
||||
... and the autotools build system for the GTK+2 and SDL2 port.
|
||||
DeSmuME is written in C using the gtk+ and SDL libraries.
|
||||
So you need a working C compiler, such as gcc and
|
||||
the above libraries runtime and development packages:
|
||||
|
||||
to build GTK+2 or SDL2 frontend with autotools, cd to src/frontend/posix, then
|
||||
* http://www.gtk.org
|
||||
|
||||
autoreconf -i (or alternatively: ./autogen.sh)
|
||||
./configure
|
||||
make -jN (where N is the number of CPU cores to use).
|
||||
* http://www.libsdl.org/
|
||||
|
||||
Once these libraries are installed, you should be ready to
|
||||
install DeSmuME.
|
||||
|
||||
DeSmuME provides another interface based on libglade, to use
|
||||
, you'll need glade:
|
||||
it, you'll need glade:
|
||||
|
||||
* http://glade.gnome.org/
|
||||
* http://glade.gnome.org/
|
||||
|
||||
To build, first cd to src/frontend/posix and run
|
||||
`meson build --buildtype=release`
|
||||
|
||||
Then build the program by running `ninja -C build`
|
||||
1.1 From a release archive____________________________________
|
||||
|
||||
Uncompress the DeSmuME archive, move to the newly created
|
||||
directory, type "./configure", then "make".
|
||||
It will generate three programs:
|
||||
1) "desmume" in the "build/gtk" directory;
|
||||
2) "desmume-cli" in the "build/cli" directory.
|
||||
|
||||
1) "desmume" in the "src/gtk" directory;
|
||||
2) "desmume-cli" in the "src/cli" directory.
|
||||
If glade is installed on your system, you'll get a third
|
||||
binary:
|
||||
3) "desmume-glade" in the "src/gtk-glade" directory.
|
||||
|
||||
3) "desmume-glade" in the "build/gtk-glade" directory.
|
||||
You can even type "make install" to install those programs on
|
||||
your system (in /usr/local/ by default), then uninstalling is
|
||||
done by typing "make uninstall".
|
||||
|
||||
You can even type "ninja -C build install" to install those programs on
|
||||
your system (in /usr/local/ by default); then uninstalling is
|
||||
done by typing "ninja -C build uninstall".
|
||||
1.2 From a CVS copy___________________________________________
|
||||
|
||||
For more information on the available commandline options,
|
||||
check the other README files which will be more up to date.
|
||||
Move to the toplevel directory (the one that contains the
|
||||
configure.ac file). Type "./autogen.sh" to generate the
|
||||
configure/install scripts and needed Makefiles. Then you can follow the
|
||||
same procedure as in 1.1 .
|
||||
|
||||
The following options specially are available on these posix ports:
|
||||
2 How to use DeSmuME__________________________________________
|
||||
|
||||
There are three versions of DeSmuME under Linux. These are a
|
||||
Gtk+ build, a Glade build and a CLI SDL build. All these builds
|
||||
have some common command line options:
|
||||
|
||||
--disable-limiter Disables the 60 fps limiter
|
||||
--soft-convert Use software colour conversion during OpenGL
|
||||
screen rendering. May produce better or worse
|
||||
frame rates depending on hardware.
|
||||
|
||||
The following options specially are available on the Gtk+ port:
|
||||
--arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port
|
||||
--arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port
|
||||
|
||||
--opengl-2d Enables using OpenGL for screen rendering
|
||||
--disable-sound Disables the sound emulation
|
||||
--disable-3d Disables the 3D emulation
|
||||
--cflash=PATH_TO_DISK_IMAGE
|
||||
Enable disk image GBAMP compact flash emulation
|
||||
|
||||
The following options specially are available on the CLI port:
|
||||
--help Display this message
|
||||
|
||||
--opengl-2d Enables using OpenGL for screen rendering
|
||||
--disable-sound Disables the sound emulation
|
||||
|
||||
NOTE:
|
||||
The Gtk+ and Glade builds use gtkGLext to handle the OpenGL
|
||||
|
@ -69,4 +77,100 @@ also passing the argument --gdk-gl-force-indirect. This has
|
|||
been seen to improve things for Nvidia based graphics cards
|
||||
under Linux.
|
||||
|
||||
Visit us on the web at http://www.desmume.org
|
||||
|
||||
GDB Debugger Stubs:
|
||||
Source level debugging of ARM9 and/or ARM7 code is supported
|
||||
using a GDB/Insight debugger.
|
||||
The GDB stubs are enabled from the command line using the
|
||||
following options:
|
||||
|
||||
--arm9gdb=<PORT_NUM> (for the ARM9)
|
||||
--arm7gdb=<PORT_NUM> (for the ARM7)
|
||||
|
||||
The PORT_NUM is the TCP port upon which the stub will listen for
|
||||
connections. Once enabled you can connect to the stub using the
|
||||
following command at the GDB debugger prompt (assuming GDB and
|
||||
DeSmuME are running on the same machine):
|
||||
|
||||
target remote :<PORT_NUM>
|
||||
|
||||
NOTE: there are problems with the ARM support when stepping code
|
||||
with GDB versions prior to version 6.6. It is recommended that
|
||||
you use at least version 6.6 if possible.
|
||||
|
||||
|
||||
GBAMP compact flash emulation:
|
||||
|
||||
The default behaviour of DeSmumME is to attempt to emulate the
|
||||
FAT image for the contents of the directory where the running
|
||||
.nds file was located.
|
||||
This behaviour can be altered using the
|
||||
--cflash=<DISK_IMAGE_FILE> command line option. Using this
|
||||
option DeSmuME will emulation a GBAMP and read and write sectors
|
||||
from/to the disk image file.
|
||||
The disk image file must be created and populated with files
|
||||
using some external tool.
|
||||
NOTE: currently if desmume fails to open the disk image file it
|
||||
will silently continue minus a working GBAMP emulation.
|
||||
|
||||
|
||||
2.1 Gtk+ version______________________________________________
|
||||
|
||||
Type "desmume" in a shell, a window should appear, then open
|
||||
a rom file using the "open" button, next use the "run" button
|
||||
to start emulation.
|
||||
|
||||
The following command line options are specific to the Gtk+
|
||||
build:
|
||||
|
||||
--opengl-2d Enables using OpenGL for screen rendering
|
||||
--disable-sound Disables the sound emulation
|
||||
--disable-3d Disables the 3D emulation
|
||||
|
||||
|
||||
2.2 CLI SDL version_______________________________________________
|
||||
|
||||
Just type "desmume-cli path-to-a-rom" in a shell.
|
||||
|
||||
The following command line options are specific to the CLI
|
||||
build:
|
||||
|
||||
--opengl-2d Enables using OpenGL for screen rendering
|
||||
--disable-sound Disables the sound emulation
|
||||
|
||||
|
||||
3 Contact information_________________________________________
|
||||
|
||||
General inquiries should go to:
|
||||
E-mail: guillaume@desmume.org
|
||||
|
||||
Linux Port-related inquiries should go to:
|
||||
E-mail: guillaume@desmume.org
|
||||
|
||||
Web: http://desmume.org
|
||||
|
||||
Please don't ask for roms, bios files or any other copyrighted
|
||||
stuff.
|
||||
|
||||
If you want to submit a bug report, please run desmume, go into
|
||||
the "Help" menu, and click on "Submit a bug report". If you're
|
||||
having trouble with it, please feel free to email.
|
||||
|
||||
|
||||
4 Disclaimer__________________________________________________
|
||||
|
||||
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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
See the GNU General Public License details in COPYING.
|
||||
|
|
|
@ -1,71 +1,49 @@
|
|||
DeSmuME
|
||||
_________________________________________
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2022 DeSmuME team
|
||||
Last Updated: May 23, 2022
|
||||
Copyright (C) 2006-2013 DeSmuME team
|
||||
Last Updated: April 16, 2013
|
||||
|
||||
Contents:
|
||||
1) System Requirements ..................................................... 17
|
||||
2) Quick Start Guide for Using DeSmuME for macOS ........................... 58
|
||||
3) Improving Emulation Performance ........................................ 204
|
||||
4) Troubleshooting ........................................................ 230
|
||||
5) Additional Documentation ............................................... 245
|
||||
6) Contact Information .................................................... 275
|
||||
7) License ................................................................ 377
|
||||
1) System Requirements ..................................................... 15
|
||||
2) Quick Start Guide for Using DeSmuME for OS X ............................ 36
|
||||
3) Additional Documentation ............................................... 137
|
||||
4) Contact Information .................................................... 167
|
||||
5) License ................................................................ 269
|
||||
|
||||
|
||||
1) System Requirements ________________________________________________________
|
||||
|
||||
Operating System: macOS v10.5 (Leopard) or later
|
||||
DeSmuME is a very demanding app, especially for CPU usage. Before you begin,
|
||||
make sure that your Mac meets the listed system requirements.
|
||||
|
||||
If your Mac meets only the minimum requirements, then you should expect to run
|
||||
most simple 2D-only games with some frameskip, but you will be unable to run
|
||||
complex 2D games or any 3D-heavy games. However, if your Mac meets the
|
||||
recommended requirements, then you should expect to run almost every game,
|
||||
including very complex 3D-heavy games, with minimal to no frameskip.
|
||||
|
||||
Operating System: OS X v10.5 (Leopard) or later
|
||||
|
||||
CPU: Can run on any PowerPC G4, G5, or Intel processor
|
||||
Minimum Recommended: 2.4 GHz Intel Core 2 Duo
|
||||
Best Experience Recommended: 2.4 GHz Intel i5 (Haswell)
|
||||
2.1 GHz Intel Core 2 Duo (minimum)
|
||||
3.0 GHz Intel Core 2 Duo or faster (recommended)
|
||||
|
||||
RAM: 512 MB (minimum)
|
||||
2 GB (recommended)
|
||||
|
||||
Before you begin, make sure that your Mac meets the listed system requirements.
|
||||
In general, any Mac with an Intel Core 2 Duo processor (from Mid-2007) should
|
||||
be sufficient for basic gaming. However, it is possible to run DeSmuME with
|
||||
even older hardware than that. In this case, you will need to use the settings
|
||||
listed in the section "Improving Emulation Performance" to make things usable.
|
||||
With this level of hardware, running any additional graphics enhancing features
|
||||
will result in a poor experience. Some frameskip will also be necessary in
|
||||
order maintain your execution speed.
|
||||
|
||||
If your Mac meets the minimum recommended requirements, then you should be able
|
||||
to run all games at full speed without any frameskip. You may need to use some
|
||||
of the settings listed in the section "Improving Emulation Performance" for
|
||||
certain games, but they should not be required for most games. You will also be
|
||||
able to use some basic graphical enhancements, such as using some of the
|
||||
display filters. However, increased 3D rendering resolution may not be possible
|
||||
for all games for this level of hardware.
|
||||
|
||||
However, if your Mac has an Intel Haswell (from late 2013) or an Apple Silicon
|
||||
processor (from 2020), you will be able to run all games with all of DeSmuME's
|
||||
features without any performance problems. Graphics enhancements, such as
|
||||
increased 3D rendering resolution, can be adjusted as needed to fit the
|
||||
performance level of your hardware.
|
||||
|
||||
Please note that running DeSmuME on a PowerPC, while possible, is not fully
|
||||
supported. The PowerPC binary exists mostly for testing and development
|
||||
purposes, and also just because we can. Most games don't work well on PowerPC,
|
||||
and so you will be limited to running only the most basic of games, such as
|
||||
"Phoenix Wright: Ace Attorney" or "Picross DS."
|
||||
|
||||
|
||||
2) Quick Start Guide for Using DeSmuME for macOS ______________________________
|
||||
2) Quick Start Guide for Using DeSmuME for OS X _______________________________
|
||||
|
||||
Installing DeSmuME is as easy as copying DeSmuME.app to your Applications
|
||||
folder (or other folder of your choice). Double-click the app to start DeSmuME.
|
||||
|
||||
Note that DeSmuME for macOS may have a different feature set than DeSmuME for
|
||||
Note that DeSmuME for OS X may have a different feature set than DeSmuME for
|
||||
Windows and DeSmuME for Linux. As of this writing, some features that are
|
||||
present in DeSmuME for Windows are not present in DeSmuME for macOS.
|
||||
present in DeSmuME for Windows are not present in DeSmuME for OS X.
|
||||
|
||||
The rest of this section will be a guide to help you quickly get started using
|
||||
DeSmuME for macOS.
|
||||
DeSmuME for OS X.
|
||||
|
||||
Loading a ROM and Starting the Emulator:
|
||||
Simply double-click the desired ROM from the Finder to play the game. By
|
||||
|
@ -73,13 +51,13 @@ default, DeSmuME will load the ROM and start emulation. Also, there are
|
|||
additional ROM loading options that you can change in DeSmuME > Preferences if
|
||||
you need them.
|
||||
|
||||
Using the NDS Controller:
|
||||
Each NDS controller button can be mapped to a button of your choice on your
|
||||
Using the DS Controller:
|
||||
Each DS controller button can be mapped to a button of your choice on your
|
||||
keyboard, gamepad, or joystick. You can view the mappings by clicking on Input
|
||||
in DeSmuME > Preferences. To change a mapping, click on the NDS control that
|
||||
you want to change, then press the button on your input device to map it.
|
||||
in DeSmuME > Preferences. To change a mapping, click on the DS control that you
|
||||
want to change, then press the button on your input device to map it.
|
||||
|
||||
By default, the NDS controller is mapped to the following keys on your keyboard:
|
||||
By default, the DS controller is mapped to the following keys on your keyboard:
|
||||
Up - Up Arrow
|
||||
Down - Down Arrow
|
||||
Left - Left Arrow
|
||||
|
@ -93,94 +71,25 @@ By default, the NDS controller is mapped to the following keys on your keyboard:
|
|||
Start - Return
|
||||
Select - Tab
|
||||
Lid - Delete (Backspace)
|
||||
Microphone (Internal Noise Samples) - ` (Accent)
|
||||
|
||||
The NDS can support a variety of SLOT-2 devices. Some devices, such as the
|
||||
Guitar Grip, EasyPiano, and Taito Paddle have inputs, which are mapped to your
|
||||
keyboard using these defaults:
|
||||
Guitar Grip:
|
||||
Green - E
|
||||
Red - R
|
||||
Yellow - T
|
||||
Blue - Y
|
||||
|
||||
EasyPiano:
|
||||
C - C
|
||||
C# - F
|
||||
D - V
|
||||
D# - G
|
||||
E - B
|
||||
F - N
|
||||
F# - J
|
||||
G - M
|
||||
G# - K
|
||||
A - , (Comma)
|
||||
A# - L
|
||||
B - . (Period)
|
||||
High C - / (Forward Slash)
|
||||
|
||||
Paddle:
|
||||
Paddle Adjust -5 - O
|
||||
Paddle Adjust +5 - P
|
||||
Microphone - ` (Accent)
|
||||
|
||||
In addition, the following emulator functions are mapped to your keyboard by
|
||||
default:
|
||||
Execute/Pause - Forward Delete
|
||||
Reset - Page Down
|
||||
Rotate Display Left - [ (Left Bracket)
|
||||
Rotate Display Right - ] (Right Bracket)
|
||||
Set Speed to Half - - (Dash)
|
||||
Set Speed to Double - = (Equal)
|
||||
Set Speed to Double - =
|
||||
|
||||
Using the NDS Touch Pad:
|
||||
Touch pad input is emulated using the left mouse button by default. Simply
|
||||
click in the touch pad area of the NDS display window to use the NDS touch pad.
|
||||
Using the DS Touch Pad:
|
||||
Touch pad input is emulated using the left mouse button by default. Simply click
|
||||
in the touch pad area of the DS display window to use the DS touch pad.
|
||||
|
||||
Using the NDS Microphone:
|
||||
Some games make use of the NDS microphone. DeSmuME emulates the NDS microphone
|
||||
by using the default audio input device selected in your System Preferences.
|
||||
You can choose Emulation > Show Microphone Settings to view the audio input
|
||||
device that DeSmuME is currently using, as well as setting its gain.
|
||||
|
||||
DeSmuME will track the audio input level on the meter as the NDS reads the
|
||||
microphone. The meter reflects the audio input level as seen by the NDS, not
|
||||
the host. Note that some games ignore the microphone, and therefore will not
|
||||
register on the meter. If you need to view the audio input level from the host
|
||||
machine's perspective, you can view the host's audio input level in your System
|
||||
Preferences.
|
||||
|
||||
Finally, you can generate audio samples in software by using one of DeSmuME's
|
||||
audio generators, and send those audio samples to the NDS. This is what the
|
||||
Microphone command in your Input Preferences does. As long as the Microphone
|
||||
command is engaged, the host input device will be ignored. When you disengage
|
||||
the Microphone command, DeSmuME will automatically return to reading the host
|
||||
input device.
|
||||
|
||||
The microphone icon serves to indicate the current status of the NDS
|
||||
microphone, and will change color for each status:
|
||||
Black - The microphone is inactive due to the emulation being paused.
|
||||
Dark Gray - The host audio input is inactive because the user has muted it
|
||||
or because the user never authorized its usage. The emulation
|
||||
is currently only accepting software-generated sources.
|
||||
Bright Gray - A software-generated source is being used for the microphone
|
||||
input. This overrides any host audio input.
|
||||
Dark Green - The host audio input is active. However, the input level is
|
||||
too low to be meaningful, or the game is ignoring the
|
||||
microphone.
|
||||
Bright Green - The microphone is active and the game is reading a
|
||||
meaningful input level from the host audio input.
|
||||
Bright Red - The microphone is active and the game is reading a clipped
|
||||
input level. Depending on the situation, this may or may not
|
||||
be desirable. Use the gain slider to influence the host audio
|
||||
input level if needed.
|
||||
|
||||
Rotating the NDS Display:
|
||||
Some games require that the NDS display be at a certain rotation in order to
|
||||
Rotating the DS Display:
|
||||
Some games require that the DS display be at a certain rotation in order to
|
||||
look correct. Rotation options can be found by choosing
|
||||
View > Display Rotation. You can also use the toolbar buttons Rotate Left and
|
||||
Rotate Right to rotate the display by 90 degrees counterclockwise or clockwise,
|
||||
respectively. Finally, you can assign inputs to Rotate Left and Rotate Right in
|
||||
your Input Preferences.
|
||||
respectively.
|
||||
|
||||
Freezing and Restoring the Emulation State:
|
||||
Save states are a powerful feature that allows you to freeze the emulation
|
||||
|
@ -199,10 +108,8 @@ use to quickly freeze/restore the emulation state.
|
|||
The default hotkey for this is (Shift-#).
|
||||
- To quick restore the emulation state, choose File > Load State Slot > Slot #.
|
||||
The default hotkey for this is (#).
|
||||
|
||||
|
||||
3) Improving Emulation Performance ____________________________________________
|
||||
|
||||
Improving Emulation Performance:
|
||||
There are many settings you can change in order to improve DeSmuME's emulation
|
||||
performance. All of the settings listed below affect performance the most. Use
|
||||
the settings as shown for the best possible performance. All of these settings
|
||||
|
@ -210,69 +117,54 @@ may be found in DeSmuME > Preferences.
|
|||
|
||||
- WARNING: Changing any Emulation setting may cause emulation glitches in
|
||||
certain ROMs. Do not change these settings unless you are willing to
|
||||
accept reduced emulation accuracy or ROM compatibility.
|
||||
accept reduced ROM compatibility.
|
||||
|
||||
Display:
|
||||
Video Output:
|
||||
Use Vertical Sync - Off
|
||||
Video Filter - None
|
||||
3D Rendering:
|
||||
3D Rendering Engine - SoftRasterizer
|
||||
Rendering Threads - Automatic
|
||||
|
||||
Emulation:
|
||||
Advanced Bus Level Timing - Off (May cause glitches)
|
||||
Rigorous 3D Rendering Timing - On (May cause graphical glitches)
|
||||
CPU Emulation Engine - Dynamic Recompiler (Reduces ROM compatibility)
|
||||
Rigourous 3D Rendering Timing - On (May cause graphical glitches)
|
||||
3D Rendering Engine - Dynamic Recompiler (May reduce ROM compatibility)
|
||||
Dynamic Recompiler Block Size - 100 (May cause glitches)
|
||||
Use External BIOS Images - Off (May reduce ROM compatibility)
|
||||
|
||||
3D Rendering:
|
||||
3D Rendering Engine - SoftRasterizer (or OpenGL if GPU Scaling Factor
|
||||
is greater than 4)
|
||||
GPU Scaling Factor - 1
|
||||
GPU Color Depth - 15-bit (Reduces color accuracy of 3D rendering)
|
||||
Texture Scaling Factor - 1
|
||||
|
||||
|
||||
4) Troubleshooting ____________________________________________________________
|
||||
|
||||
The vast majority of problems can be resolved by simply resetting DeSmuME's
|
||||
settings back to their defaults. The easiest way to do this is to delete the
|
||||
org.desmume.DeSmuME.plist file in your ~/Library/Preferences folder. There is
|
||||
also a DeleteUserDefaults.applescript script that is included with your DeSmuME
|
||||
installation that will do this for you.
|
||||
|
||||
If you are still experiencing problems after restoring your DeSmuME settings to
|
||||
their defaults, then you may want to post your issue on our DeSmuME forum. Your
|
||||
post may gain the attention of another user, or even a DeSmuME developer, to
|
||||
help assist you with your issue. See the section "Contact Information" for how
|
||||
to contact us on the forum.
|
||||
|
||||
|
||||
5) Additional Documentation ___________________________________________________
|
||||
3) Additional Documentation ___________________________________________________
|
||||
|
||||
The quick start guide in this Read Me is by no means a complete reference to
|
||||
everything that DeSmuME can do! If you need any additional information about
|
||||
DeSmuME, then you can reference our online Wiki pages for up-to-date
|
||||
information.
|
||||
|
||||
* Official Documentation: https://wiki.desmume.org/index.php?title=Main_Page
|
||||
* Official Documentation: http://wiki.desmume.org/index.php?title=Main_Page
|
||||
|
||||
This is the main Wiki page that contains all of our official documentation.
|
||||
|
||||
* FAQ: https://wiki.desmume.org/index.php?title=Faq
|
||||
* FAQ: http://wiki.desmume.org/index.php?title=Faq
|
||||
|
||||
The Frequently Asked Questions (FAQ) page has a lot of useful general
|
||||
information about DeSmuME. Do note that some of the information may be platform
|
||||
specific, and may not directly apply to the macOS version of DeSmuME.
|
||||
specific, and may not directly apply to the OS X version of DeSmuME.
|
||||
|
||||
* DeSmuME Manual for macOS:
|
||||
https://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Macintosh_port
|
||||
* DeSmuME Manual for OS X:
|
||||
http://wiki.desmume.org/index.php?title=DeSmuME_Manual_for_the_Macintosh_port
|
||||
|
||||
This page contains complete and detailed information about how to operate
|
||||
DeSmuME for macOS.
|
||||
DeSmuME for OS X.
|
||||
|
||||
* DeSmuME Build Instructions for macOS:
|
||||
https://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source_on_OS_X
|
||||
* DeSmuME Build Instructions for OS X:
|
||||
http://wiki.desmume.org/index.php?title=Installing_DeSmuME_from_source_on_OS_X
|
||||
|
||||
This page contains complete and detailed instructions about how to make your
|
||||
own build of DeSmuME for macOS directly from the source code.
|
||||
own build of DeSmuME for OS X directly from the source code.
|
||||
|
||||
|
||||
6) Contact Information ________________________________________________________
|
||||
4) Contact Information ________________________________________________________
|
||||
|
||||
Thank you for you interest in DeSmuME! If you want to tell us how useful
|
||||
DeSmuME is in your life, your love (or hate) of certain NDS games, your passion
|
||||
|
@ -295,14 +187,14 @@ However, keep in mind that there are a few of rules that you need to follow:
|
|||
go to the Support forum. In short, use the appropriate contact method. That's
|
||||
why the different methods exist!
|
||||
|
||||
* Official Website: https://desmume.org
|
||||
* Official Website: http://desmume.org
|
||||
|
||||
Our official website has the latest news on DeSmuME releases, and also has a
|
||||
lot of other useful information about DeSmuME. You can comment on different
|
||||
posts telling us how you feel about DeSmuME. Is DeSmuME the best thing in your
|
||||
life? Is it making you cry? Or is it a bunch of blah? Let us know here!
|
||||
|
||||
* Public Forum: https://forums.desmume.org
|
||||
* Public Forum: http://forums.desmume.org
|
||||
|
||||
If you have a question about DeSmuME, then this is the place to ask it. But
|
||||
before you ask it, be aware that your question may have already been answered
|
||||
|
@ -316,9 +208,9 @@ If you still need to ask a question, choose Help > Submit a Support Request in
|
|||
the DeSmuME application. Follow the onscreen instructions on the Support
|
||||
Request Form.
|
||||
|
||||
* Live Developer Chat Channel: irc://irc.libera.chat:6697/desmume
|
||||
* Live Developer Chat Channel: irc://irc.freenode.net/desmume
|
||||
|
||||
We have a live developer chatline on Libera IRC at #desmume. This channel
|
||||
We have a live developer chatline on Freenode IRC at #desmume. This channel
|
||||
is meant for discussing the development of DeSmuME, and shows the real work
|
||||
that goes on behind the scenes. If you are interested in doing any sort of
|
||||
software programming, software testing, documentation, or graphics work, then
|
||||
|
@ -353,12 +245,12 @@ from Help > Submit a Bug Report.
|
|||
|
||||
When you write your description, make sure that they are as detailed as
|
||||
possible. The better your descriptions are, the faster we can test and fix
|
||||
bugs. For example, if you observed a bug in the game "Golden Sun: Dark Dawn,"
|
||||
then the bug report could look something like this:
|
||||
bugs. For example, if you observed a bug in the game Golden Sun: Dark Dawn, then
|
||||
the bug report could look something like this:
|
||||
|
||||
App Version: 0.9.13
|
||||
Operating System: macOS v12.4 (21F79)
|
||||
Mac Model Identifier: MacBookPro15,1
|
||||
App Version: v0.9.9
|
||||
Operating System: OS X v10.8.3 (12D78)
|
||||
Mac Model Identifier: iMac11,2
|
||||
ROM Name: GOLDENSUN_DD
|
||||
ROM Serial: NTR-BO5E-USA
|
||||
Observed Behavior: I tried to load a save state using the
|
||||
|
@ -374,7 +266,7 @@ logs. For the above example, we would probably ask you for your save states to
|
|||
help us track down the bug.
|
||||
|
||||
|
||||
7) License ____________________________________________________________________
|
||||
5) License ____________________________________________________________________
|
||||
|
||||
This file 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
|
||||
|
@ -386,7 +278,7 @@ 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 software. If not, see <https://www.gnu.org/licenses/>.
|
||||
this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
* See the GNU General Public License details in COPYING.
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/sh
|
||||
# intltoolize is optionnal as it's only required for the gtk-glade UI.
|
||||
|
||||
if test ! "x$(which intltoolize)" = "x"; then
|
||||
echo "Running intltoolize"
|
||||
intltoolize --copy --force --automake
|
||||
else
|
||||
if test ! "x$(which gintltoolize)" = "x"; then
|
||||
echo "Running gintltoolize"
|
||||
gintltoolize --copy --force --automake
|
||||
fi
|
||||
fi
|
||||
|
||||
autoreconf --install --force --verbose
|
|
@ -0,0 +1,39 @@
|
|||
# -*-shell-script-*-
|
||||
|
||||
[Meta]
|
||||
RootName: @desmume.sf.net/desmume:$SOFTWAREVERSION
|
||||
DisplayName: DeSmuME Nintendo DS Emulator
|
||||
ShortName: desmume
|
||||
Maintainer: Guillaume Duhamel <guillaume.duhamel@gmail.com>
|
||||
Packager: Guillaume Duhamel <guillaume.duhamel@gmail.com>
|
||||
Summary: DeSmuME is a Nintendo DS emulator.
|
||||
URL: http://desmume.sf.net/
|
||||
License: GNU General Public License, Version 2
|
||||
SoftwareVersion: @VERSION@
|
||||
AutopackageTarget: 1.0
|
||||
|
||||
[Description]
|
||||
This is a Nintendo DS emulator.
|
||||
|
||||
[BuildPrepare]
|
||||
prepareBuild
|
||||
|
||||
[BuildUnprepare]
|
||||
unprepareBuild
|
||||
|
||||
[Imports]
|
||||
echo '*' | import
|
||||
|
||||
[Prepare]
|
||||
# Dependency checking
|
||||
require @gtk.org/gtk 2.4
|
||||
|
||||
[Install]
|
||||
# Put your installation script here
|
||||
installExe bin/desmume
|
||||
installExe bin/desmume-cli
|
||||
installExe bin/desmume-glade
|
||||
|
||||
[Uninstall]
|
||||
# Usually just the following line is enough to uninstall everything
|
||||
uninstallFromLog
|
|
@ -0,0 +1,142 @@
|
|||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand `-c -o'.
|
||||
|
||||
scriptversion=2005-05-14.22
|
||||
|
||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
# 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Wrapper for compilers which do not understand `-c -o'.
|
||||
Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||
arguments, and rename the output as expected.
|
||||
|
||||
If you are trying to build a whole package this is not the
|
||||
right script to run: please start by reading the file `INSTALL'.
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "compile $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
eat=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as `compile cc -o foo foo.c'.
|
||||
# So we strip `-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no `-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# `.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use `[/.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-end: "$"
|
||||
# End:
|
|
@ -0,0 +1,369 @@
|
|||
dnl --- Package name is first argument to AC_INIT
|
||||
dnl --- Release version is second argument to AC_INIT
|
||||
|
||||
AC_INIT(desmume, [0.9.9])
|
||||
|
||||
dnl -- find host architecture for some os specific libraries
|
||||
AC_CANONICAL_HOST
|
||||
case $host in
|
||||
*linux*) desmume_arch=linux;;
|
||||
*mingw*) desmume_arch=windows;;
|
||||
*darwin*) desmume_arch=linux;;
|
||||
*bsd*) desmume_arch=linux;;
|
||||
esac
|
||||
AC_SUBST(desmume_arch)
|
||||
|
||||
AM_INIT_AUTOMAKE([1.10])
|
||||
|
||||
dnl -- make sure we have a c++ compiler
|
||||
AC_PROG_CXX
|
||||
|
||||
dnl -- use ranlib for libraries
|
||||
AC_PROG_RANLIB
|
||||
|
||||
dnl -- check for endianess
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
# took this from geany, hope it works
|
||||
REVISION="r0"
|
||||
SVN=`which svn 2>/dev/null`
|
||||
if test -d ".svn" -a "x${SVN}" != "x" -a -x "${SVN}" ; then
|
||||
REVISION=r`$SVN info|grep 'Last Changed Rev'|cut -d' ' -f4`
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED([SVN_REV], "$REVISION", [subversion revision number])
|
||||
|
||||
|
||||
dnl - Check for intltool/gettext macros
|
||||
IT_PROG_INTLTOOL
|
||||
|
||||
dnl - Check for zlib
|
||||
AC_CHECK_LIB(z, gzopen, [], [AC_MSG_ERROR([zlib was not found, we can't go further. Please install it or specify the location where it's installed.])])
|
||||
|
||||
dnl - Check for zziplib
|
||||
AC_CHECK_LIB(zzip, zzip_open, [
|
||||
LIBS="-lzzip $LIBS"
|
||||
AC_DEFINE([HAVE_LIBZZIP])
|
||||
AC_MSG_CHECKING([[whether zzip use void * as second parameter]])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <zzip/lib.h>]], [[
|
||||
void * v;
|
||||
zzip_read(NULL, v, 0);]])],
|
||||
AC_MSG_RESULT(yes),
|
||||
AC_DEFINE([ZZIP_OLD_READ])
|
||||
AC_MSG_RESULT(no))
|
||||
])
|
||||
|
||||
dnl - Check for SDL
|
||||
AC_PATH_PROGS(SDLCONFIG, [sdl-config sdl11-config])
|
||||
if test ! "x$SDLCONFIG" = "x" ; then
|
||||
SDL_CFLAGS=`$SDLCONFIG --cflags`
|
||||
SDL_LIBS=`$SDLCONFIG --libs`
|
||||
AC_SUBST(SDL_CFLAGS)
|
||||
AC_SUBST(SDL_LIBS)
|
||||
else
|
||||
AC_MSG_ERROR([sdl is required to build desmume])
|
||||
fi
|
||||
|
||||
dnl - Check for the OpenGL includes
|
||||
AC_CHECK_HEADERS([GL/gl.h],
|
||||
[AC_CHECK_HEADERS([GL/glu.h], [have_gl_h=yes LIBS="$LIBS -lGLU"], [have_gl_h=no])],
|
||||
[have_gl_h=no])
|
||||
if test "have_gl_h" = "no" ; then
|
||||
AC_MSG_WARN([Building without GL support because of missing headers.])
|
||||
fi
|
||||
AM_CONDITIONAL([HAVE_GL], [test "${have_gl_h}" = "yes"])
|
||||
|
||||
dnl - if --enable-osmesa is used, check for it
|
||||
AC_ARG_ENABLE([osmesa],
|
||||
[AC_HELP_STRING([--enable-osmesa], [use off-screen mesa])],
|
||||
[osmesa=$enableval],
|
||||
[osmesa=yes])
|
||||
|
||||
if test "x$osmesa" = "xyes" ; then
|
||||
AC_CHECK_LIB(dl, main)
|
||||
AC_CHECK_LIB([GL], main)
|
||||
AC_CHECK_LIB(OSMesa, main,[
|
||||
useosmesa=yes
|
||||
AC_DEFINE(HAVE_LIBOSMESA)
|
||||
OSMESA_LIBS="-lOSMesa"
|
||||
AC_SUBST(OSMESA_LIBS)
|
||||
])
|
||||
fi
|
||||
AM_CONDITIONAL([HAVE_LIBOSMESA], [test "${useosmesa}" = "yes"])
|
||||
|
||||
dnl - make the usage of libagg for HUD rendering configurable
|
||||
AC_ARG_ENABLE([hud],
|
||||
[AC_HELP_STRING([--enable-hud], [Enable HUD rendering, requires libagg])],
|
||||
[libagg=yes])
|
||||
|
||||
HAVE_OPENAL=no
|
||||
dnl - openal support
|
||||
AC_ARG_ENABLE(openal,
|
||||
[AC_HELP_STRING(--enable-openal, enable experimental OpenAL microphone input)],
|
||||
[openal=yes])
|
||||
|
||||
if test "x$openal" = "xyes" ; then
|
||||
AC_CHECK_LIB([openal], [main],[
|
||||
HAVE_OPENAL=yes
|
||||
LIBS="$LIBS -lopenal"
|
||||
])
|
||||
fi
|
||||
AM_CONDITIONAL([HAVE_OPENAL], [test "${HAVE_OPENAL}" = "yes"])
|
||||
|
||||
dnl - Check for GTK and/or libglade
|
||||
FOUND_GLIB=no
|
||||
HAVE_ALSA=no
|
||||
GLIB_VER=2.8
|
||||
GTK_VER=2.14
|
||||
|
||||
PKG_CHECK_MODULES(GLIB,
|
||||
glib-2.0 >= $GLIB_VER,
|
||||
FOUND_GLIB=yes,
|
||||
FOUND_GLIB=no)
|
||||
|
||||
PKG_CHECK_MODULES(GTK,
|
||||
gtk+-2.0 >= $GTK_VER,
|
||||
HAVE_GTK=yes,
|
||||
HAVE_GTK=no)
|
||||
AC_SUBST(GTK_CFLAGS)
|
||||
AC_SUBST(GTK_LIBS)
|
||||
|
||||
|
||||
PKG_CHECK_MODULES(GTHREAD,
|
||||
"gthread-2.0",
|
||||
HAVE_GTHREAD=yes,
|
||||
HAVE_GTHREAD=no)
|
||||
AC_SUBST(GTHREAD_CFLAGS)
|
||||
AC_SUBST(GTHREAD_LIBS)
|
||||
|
||||
AC_ARG_ENABLE([glade],
|
||||
[AC_HELP_STRING([--enable-glade], [enable glade frontend])],
|
||||
[glade=$enableval],
|
||||
[glade=no])
|
||||
|
||||
if test "x$glade" = "xyes" ; then
|
||||
PKG_CHECK_MODULES(LIBGLADE,
|
||||
"libglade-2.0",
|
||||
HAVE_LIBGLADE=yes,
|
||||
HAVE_LIBGLADE=no)
|
||||
AC_SUBST(LIBGLADE_CFLAGS)
|
||||
AC_SUBST(LIBGLADE_LIBS)
|
||||
|
||||
dnl uninstalled glade ui dir
|
||||
AC_DEFINE_UNQUOTED(GLADEUI_UNINSTALLED_DIR,"`pwd`/src/gtk-glade/glade/",[path to glade ui dir])
|
||||
AC_SUBST(GLADEUI_UNINSTALLED_DIR)
|
||||
|
||||
PKG_CHECK_MODULES(GTKGLEXT,
|
||||
"gtkglext-1.0",
|
||||
AC_DEFINE([GTKGLEXT_AVAILABLE], [1])
|
||||
[])
|
||||
AC_SUBST(GTKGLEXT_CFLAGS)
|
||||
AC_SUBST(GTKGLEXT_LIBS)
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(UPDATEDESKTOP, [update-desktop-database])
|
||||
|
||||
# Need check for both lua and lua5.1 to run on debian, see mysql bug #29945
|
||||
PKG_CHECK_MODULES(LUA,
|
||||
lua >= 5.1,
|
||||
HAVE_LUA=yes,
|
||||
HAVE_LUA=no)
|
||||
PKG_CHECK_MODULES(LUA,
|
||||
lua5.1 >= 5.1,
|
||||
HAVE_LUA=yes,
|
||||
HAVE_LUA=no)
|
||||
AC_SUBST(LUA_CFLAGS)
|
||||
AC_SUBST(LUA_LIBS)
|
||||
dnl -- force lua disabled
|
||||
AM_CONDITIONAL([HAVE_LUA], [test "${HAVE_LUA}x" = "yes"])
|
||||
|
||||
if test ! "x$HAVE_OPENAL" = "xyes" ; then
|
||||
PKG_CHECK_MODULES(ALSA, alsa >= 1.0, HAVE_ALSA=yes, HAVE_ALSA=no)
|
||||
AC_SUBST(ALSA_CFLAGS)
|
||||
AC_SUBST(ALSA_LIBS)
|
||||
fi
|
||||
AM_CONDITIONAL([HAVE_ALSA], [test "${HAVE_ALSA}" = "yes"])
|
||||
|
||||
PKG_CHECK_MODULES(LIBAGG, libagg >= 2.5.0, FOUND_LIBAGG=yes, FOUND_LIBAGG=no)
|
||||
AM_CONDITIONAL([HAVE_LIBAGG], [test "x$libagg" = "xyes" -a "${FOUND_LIBAGG}" = "yes"])
|
||||
if test "x$libagg" = "xyes" ; then
|
||||
if test "x$FOUND_LIBAGG" = "xyes" ; then
|
||||
AC_SUBST(LIBAGG_CFLAGS)
|
||||
AC_SUBST(LIBAGG_LIBS)
|
||||
AC_DEFINE([HAVE_LIBAGG])
|
||||
else
|
||||
AC_MSG_WARN([HUD rendering enabled, but libagg not found])
|
||||
fi
|
||||
fi
|
||||
|
||||
PKG_CHECK_MODULES(LIBSOUNDTOUCH, soundtouch >= 1.5.0, HAVE_LIBSOUNDTOUCH=yes, HAVE_LIBSOUNDTOUCH=no)
|
||||
AC_SUBST(LIBSOUNDTOUCH_CFLAGS)
|
||||
AC_SUBST(LIBSOUNDTOUCH_LIBS)
|
||||
AM_CONDITIONAL([HAVE_LIBSOUNDTOUCH], [test "${HAVE_LIBSOUNDTOUCH}" = "yes"])
|
||||
if test "x$HAVE_LIBSOUNDTOUCH" = "xyes"; then
|
||||
AC_DEFINE([HAVE_LIBSOUNDTOUCH])
|
||||
else
|
||||
AC_MSG_WARN([SoundTouch library not found, pcsx2 resampler will be disabled])
|
||||
fi
|
||||
|
||||
if test "x$HAVE_ALSA" = "xno"; then
|
||||
if test "x$HAVE_OPENAL" = "xno"; then
|
||||
AC_DEFINE([FAKE_MIC])
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl - Check for wxWidgets
|
||||
|
||||
dnl - if --enable-wxwidgets is used, check for it
|
||||
AC_ARG_ENABLE([wxwidgets],
|
||||
[AC_HELP_STRING([--enable-wxwidgets], [Enable cross platform wx widgets frontend])],
|
||||
[wxwidgets=$enableval],
|
||||
[wxwidgets=no])
|
||||
if test "x$wxwidgets" = "xyes" ; then
|
||||
m4_include(wxwin.m4)
|
||||
AM_PATH_WXCONFIG([2.4.0], wxwin=yes)
|
||||
if test "x$wxwin" = "xyes"; then
|
||||
AC_SUBST(WX_CPPFLAGS)
|
||||
AC_SUBST(WX_LIBS)
|
||||
AC_DEFINE([WANT_WX])
|
||||
fi
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL([HAVE_WX], [test "x$wxwidgets" = "xyes"])
|
||||
|
||||
dnl - Determine which UIs to build and if po/ should be included
|
||||
PO_DIR="po"
|
||||
PO_MAKEFILE="po/Makefile.in"
|
||||
UI_DIR="cli $UI_DIR"
|
||||
if test "x$HAVE_GTK" = "xyes"; then
|
||||
UI_DIR="gtk $UI_DIR"
|
||||
fi
|
||||
if test "x$wxwin" = "xyes"; then
|
||||
UI_DIR="wx $UI_DIR"
|
||||
fi
|
||||
|
||||
if test "x$HAVE_LIBGLADE" = "xyes"; then
|
||||
UI_DIR="gtk-glade $UI_DIR"
|
||||
|
||||
dnl -- localization for gtk-glade UI
|
||||
GETTEXT_PACKAGE=desmume
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Define to the gettext package name])
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
ALL_LINGUAS="fr nb pt_BR sv zh_CN zh_TW"
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
fi
|
||||
|
||||
dnl - jit support
|
||||
case $host_cpu in
|
||||
x86|x86_64|i386|i486|i586|i686)
|
||||
HAVE_JIT=yes
|
||||
AC_DEFINE(HAVE_JIT)
|
||||
;;
|
||||
esac
|
||||
AM_CONDITIONAL([HAVE_JIT], [test "x$HAVE_JIT" = "xyes"])
|
||||
|
||||
dnl - wifi support
|
||||
AC_ARG_ENABLE(wifi,
|
||||
[AC_HELP_STRING(--enable-wifi, enable experimental wifi comm support)],
|
||||
[
|
||||
AC_CHECK_LIB(pcap, main,[
|
||||
AC_DEFINE(EXPERIMENTAL_WIFI_COMM)
|
||||
LIBS="$LIBS -lpcap"],
|
||||
[AC_MSG_WARN([pcap library not found, wifi will not work])])
|
||||
])
|
||||
|
||||
dnl Set compiler library flags per host architecture
|
||||
case $host in
|
||||
*mingw*)
|
||||
LIBS="$LIBS -ldxguid -ldxerr8 -ldsound -lopengl32 -lws2_32 -mwindows"
|
||||
UI_DIR="windows"
|
||||
;;
|
||||
*darwin*)
|
||||
dnl - openal is required on mac os x and we are not able to figure out if it's installed or not
|
||||
AC_DEFINE(HAVE_OPENAL)
|
||||
LIBS="$LIBS -framework OpenGL -framework OpenAL"
|
||||
CPPFLAGS="$CPPFLAGS -I/System/Library/Frameworks/OpenAL.framework/Headers"
|
||||
AC_SUBST(CPPFLAGS)
|
||||
dnl - extra hackery needed for X includes
|
||||
AC_PATH_XTRA
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(UI_DIR)
|
||||
AC_SUBST(PO_DIR)
|
||||
|
||||
dnl - Gdb stub
|
||||
AC_ARG_ENABLE(gdb-stub,
|
||||
[AC_HELP_STRING(--enable-gdb-stub, enable gdb stub)],
|
||||
[
|
||||
AC_DEFINE(GDB_STUB)
|
||||
wantgdbstub=yes
|
||||
])
|
||||
AM_CONDITIONAL([HAVE_GDB_STUB], [test "${wantgdbstub}" = "yes"])
|
||||
|
||||
dnl - Compiler warnings
|
||||
|
||||
# for developer use, enable lots of compile warnings,
|
||||
# but don't require this generally, because some system's
|
||||
# header files (BSD) can't handle it
|
||||
#
|
||||
# NB: must add -Werror after AC_PROG_CC, etc., so do this last
|
||||
AC_ARG_ENABLE(hardcore,
|
||||
[AC_HELP_STRING(--enable-hardcore, turn on -W -Wall -Werror)],
|
||||
[case "${enableval}" in
|
||||
yes) ENABLE_HARDCORE=1 ;;
|
||||
no) ENABLE_HARDCORE=0 ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-hardcore) ;; esac],
|
||||
[ENABLE_HARDCORE=0])
|
||||
|
||||
if test "x[$]ENABLE_HARDCORE" = "x1"; then
|
||||
AC_MSG_WARN(enable hardcore compile warnings)
|
||||
if test "x$CXX" = "x"; then
|
||||
dnl - only valid for C with newer gcc's
|
||||
CPPFLAGS="[$]CPPFLAGS -Wmissing-prototypes"
|
||||
fi
|
||||
dnl - -Wshadow
|
||||
CPPFLAGS="[$]CPPFLAGS -Wall -Wextra -D_FORTIFY_SOURCE=2 -Wno-missing-field-initializers -Wpointer-arith -Wcast-align -Wwrite-strings -Wno-unused-parameter -Wmissing-declarations -Wundef -Wmissing-noreturn -Wredundant-decls -Wformat-nonliteral -Wformat-security -Winit-self -Wno-reorder"
|
||||
fi
|
||||
|
||||
dnl - Enable debug mode
|
||||
AC_ARG_ENABLE(debug,
|
||||
AC_HELP_STRING(--enable-debug, enable debug information),
|
||||
AC_DEFINE(DEBUG))
|
||||
AC_ARG_ENABLE(gpu-debug,
|
||||
AC_HELP_STRING(--enable-gpu-debug, enable gpu debug information),
|
||||
AC_DEFINE(GPUDEBUG))
|
||||
AC_ARG_ENABLE(div-debug,
|
||||
AC_HELP_STRING(--enable-div-debug, enable div debug information),
|
||||
AC_DEFINE(DIVDEBUG))
|
||||
AC_ARG_ENABLE(sqrt-debug,
|
||||
AC_HELP_STRING(--enable-sqrt-debug, enable sqrt debug information),
|
||||
AC_DEFINE(SQRTDEBUG))
|
||||
AC_ARG_ENABLE(dma-debug,
|
||||
AC_HELP_STRING(--enable-dma-debug, enable dma debug information),
|
||||
AC_DEFINE(DMADEBUG))
|
||||
|
||||
dnl - Enable memory profiling (disabled)
|
||||
dnl - AC_ARG_ENABLE(memory-profiling,
|
||||
dnl - AC_HELP_STRING(--enable-memory-profiling, enable memory profiling information),
|
||||
dnl - AC_DEFINE(PROFILE_MEMORY_ACCESS))
|
||||
|
||||
dnl -- set maintainer mode
|
||||
AM_MAINTAINER_MODE
|
||||
AC_SUBST(USE_MAINTAINER_MODE)
|
||||
|
||||
|
||||
dnl --- Finally, output all the makefiles
|
||||
AC_CONFIG_FILES([Makefile
|
||||
${PO_MAKEFILE}
|
||||
src/Makefile
|
||||
src/cli/Makefile
|
||||
src/cli/doc/Makefile
|
||||
src/gtk/Makefile
|
||||
src/gtk/doc/Makefile
|
||||
src/gtk-glade/Makefile
|
||||
src/gtk-glade/doc/Makefile
|
||||
src/wx/Makefile
|
||||
src/gdbstub/Makefile
|
||||
autopackage/default.apspec
|
||||
])
|
||||
AC_OUTPUT
|
|
@ -0,0 +1 @@
|
|||
./configure CFLAGS="-arch i386" CXXFLAGS="-arch i386"
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,8 +0,0 @@
|
|||
Tips:
|
||||
* Set hotkeys for "Mic Prev Sample" and "Mic Next Sample" in the "Main" section of hotkey configuration (suggest [ and ])
|
||||
* This will rotate through all the provided desmume_N.wav. You can add your own in the series, just pick the next number.
|
||||
* Keep the microphone hotkey held down for as long as you want the noise to play! Just tapping it will make a very short sound indeed.
|
||||
|
||||
desmume_0.wav was formerly "PERFECT BLOW FOR DS EMULATORS.wav"
|
||||
desmume_1.wav was formerly "noise_loud.wav"
|
||||
desmume_4.wav came to us as "pcm0822m.wav"; these are alleged to work well for Giant Bowser fights in Bowser's Inside Story.
|
Binary file not shown.
|
@ -0,0 +1,7 @@
|
|||
fr
|
||||
nb
|
||||
pt_BR
|
||||
sv
|
||||
zh_CN
|
||||
zh_TW
|
||||
es
|
|
@ -0,0 +1,17 @@
|
|||
# Makefile snippet that holds all package-dependent information.
|
||||
|
||||
# Add more languages here! Beware that this is a makefile snippet and
|
||||
# you have to adhere to make syntax.
|
||||
LINGUAS = fr pt_BR sv zh_CN
|
||||
|
||||
# Textdomain for our package.
|
||||
|
||||
TEXTDOMAIN = desmume
|
||||
|
||||
# Initial copyright holder added to pot and po files.
|
||||
COPYRIGHT_HOLDER = Pascal Giard
|
||||
#COPYRIGHT_HOLDER = Edit the file PACKAGE to change this.
|
||||
|
||||
# Where to send msgid bugs?
|
||||
MSGID_BUGS_ADDRESS = Desmume Team <desmume-devel@lists.sourceforge.net>
|
||||
#MSGID_BUGS_ADDRESS = Edit the file PACAKGE to change this.
|
|
@ -0,0 +1,8 @@
|
|||
[encoding: UTF-8]
|
||||
src/gtk-glade/callbacks.cpp
|
||||
src/gtk-glade/gdk_3Demu.cpp
|
||||
src/gtk-glade/glade-xml.cpp
|
||||
src/gtk-glade/keyval_names.cpp
|
||||
src/gtk-glade/main.cpp
|
||||
src/gtk-glade/glade/DeSmuMe.glade
|
||||
src/gtk-glade/glade/DeSmuMe_Dtools.glade
|
|
@ -0,0 +1,7 @@
|
|||
src/wx/PadSimple/GUI/ConfigDlg.cpp
|
||||
src/wxdlg/wxdlg3dViewer.cpp
|
||||
src/wxdlg/wxcontrolsconfigdialog.cpp
|
||||
src/windows/libelf_libdwarf/libelf/errors.h
|
||||
src/windows/wx/include/wx/msw/ole/oleutils.h
|
||||
src/windows/wx/include/wx/unix/pipe.h
|
||||
src/windows/wx/include/wx/xti.h
|
|
@ -0,0 +1,645 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-12-28 15:37+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:53
|
||||
#, c-format
|
||||
msgid "State %d (empty)"
|
||||
msgstr ""
|
||||
|
||||
#. Creating the selection window
|
||||
#: ../src/gtk-glade/callbacks.cpp:166
|
||||
msgid "Open..."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:175
|
||||
msgid "Nds binary (.nds)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:176
|
||||
msgid "Nds binary with loader (.ds.gba)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:177
|
||||
msgid "All files"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:192 ../src/gtk-glade/main.cpp:553
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Unable to load :\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:408
|
||||
msgid "You don't have any joystick!"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:410
|
||||
msgid "Can't configure joystick while the game is running!"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:66
|
||||
#, c-format
|
||||
msgid "*** Cannot get %s attribute value\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:164
|
||||
#, c-format
|
||||
msgid "*** Failed to create pixmap.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:174
|
||||
#, c-format
|
||||
msgid "*** No appropriate OpenGL-capable visual found.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:187
|
||||
#, c-format
|
||||
msgid "Failed to create the GdkGLPixmap\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:197
|
||||
#, c-format
|
||||
msgid "Connot create the OpenGL rendering context\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade-xml.cpp:58
|
||||
#, c-format
|
||||
msgid "could not find signal handler '%s'."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:132
|
||||
#, c-format
|
||||
msgid "USAGE: %s [OPTIONS] [nds-file]\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:133
|
||||
#, c-format
|
||||
msgid "OPTIONS:\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:134
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --load-slot=NUM Load game saved under NUM position.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:137
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --soft-convert Use software colour conversion during OpenGL\n"
|
||||
" screen rendering. May produce better or worse\n"
|
||||
" frame rates depending on hardware.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:142
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --3d-engine=ENGINE Selects 3D rendering engine\n"
|
||||
" 0 = disabled\n"
|
||||
" 1 = internal desmume rasterizer (default)\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:147
|
||||
#, c-format
|
||||
msgid ""
|
||||
" 2 = gtkglext off-screen 3d opengl\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:150
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --disable-limiter Disables the 60 fps limiter\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:152
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --save-type=TYPE Selects savetype:\n"
|
||||
" 0 = Autodetect (default)\n"
|
||||
" 1 = EEPROM 4kbit\n"
|
||||
" 2 = EEPROM 64kbit\n"
|
||||
" 3 = EEPROM 512kbit\n"
|
||||
" 4 = FRAM 256kbit\n"
|
||||
" 5 = FLASH 2mbit\n"
|
||||
" 6 = FLASH 4mbit\n"
|
||||
" \n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:162
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --fwlang=LANG Set the language in the firmware, LANG as follows:\n"
|
||||
" 0 = Japanese\n"
|
||||
" 1 = English\n"
|
||||
" 2 = French\n"
|
||||
" 3 = German\n"
|
||||
" 4 = Italian\n"
|
||||
" 5 = Spanish\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:171
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n"
|
||||
" --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:175
|
||||
#, c-format
|
||||
msgid " --help Display this message\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:188
|
||||
#, c-format
|
||||
msgid "I only know how to load from slots 1-10.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:212
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Supported 3d engines: 0, 1, and on some machines 2; use --help option for "
|
||||
"details\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:224
|
||||
#, c-format
|
||||
msgid "select savetype from 0 to 6; use --help option for details\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:236
|
||||
#, c-format
|
||||
msgid "Firmware language must be set to a value from 0 to 5.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:249
|
||||
#, c-format
|
||||
msgid "ARM9 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:261
|
||||
#, c-format
|
||||
msgid "ARM7 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:274
|
||||
#, c-format
|
||||
msgid "NDS file (\"%s\") already set\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:287
|
||||
#, c-format
|
||||
msgid "USAGE: %s [options] [nds-file]\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:288
|
||||
#, c-format
|
||||
msgid "USAGE: %s --help - for help\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:466
|
||||
#, c-format
|
||||
msgid "Failed to create ARM9 gdbstub on port %d\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:477
|
||||
#, c-format
|
||||
msgid "Failed to create ARM7 gdbstub on port %d\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:486
|
||||
#, c-format
|
||||
msgid "Error trying to initialize SDL: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:569
|
||||
#, c-format
|
||||
msgid "Failed to initialise openGL 3D emulation; removing 3D support\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:576
|
||||
#, c-format
|
||||
msgid "Failed to setup 3D engine; removing 3D support\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:1
|
||||
msgid "0"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:2
|
||||
msgid "1"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:3
|
||||
msgid "1x"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:4
|
||||
msgid "2"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:5
|
||||
msgid "2x"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:6
|
||||
msgid "3"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:7
|
||||
msgid "3D operation detected"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:8
|
||||
msgid "3D rom"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:9
|
||||
msgid "3x"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:10
|
||||
msgid "4"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:11
|
||||
msgid "5"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:12
|
||||
msgid "6"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:13
|
||||
msgid "7"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:14
|
||||
msgid "8"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:15
|
||||
msgid "9"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:16
|
||||
msgid "?"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:17
|
||||
msgid "A : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:18
|
||||
msgid "Audio On"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:19
|
||||
msgid "Axis :"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:20
|
||||
msgid "B : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:21
|
||||
msgid "BG0"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:22
|
||||
msgid "BG1"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:23
|
||||
msgid "BG2"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:24
|
||||
msgid "BG3"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:25
|
||||
msgid "Boost : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:26
|
||||
msgid "Config"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:27
|
||||
msgid "DeSmuME"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:28
|
||||
msgid "Debug : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:29
|
||||
msgid "Down : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:30
|
||||
msgid "FrameSkip"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:31
|
||||
msgid "IO regs"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:32
|
||||
msgid "Joystick Config"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:33
|
||||
msgid "Joystick controls"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:34
|
||||
msgid "Key definition"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:35
|
||||
msgid "Keyboard Config"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:36
|
||||
msgid "Keyboard controls"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:37
|
||||
msgid "L : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:38
|
||||
msgid "Layers"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:39
|
||||
msgid "Left : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:40
|
||||
msgid "Load State"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:41
|
||||
msgid "Nintendo DS emulator based on work by Yopyop"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:42
|
||||
msgid "No Gap"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:43
|
||||
msgid "OBJ"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:44
|
||||
msgid "Press a button..."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:45
|
||||
msgid "Press a key..."
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:46
|
||||
msgid "R : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:47
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:48
|
||||
msgid "Right : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:49
|
||||
msgid "Right Screen"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:50
|
||||
msgid "Rotate Screen 0"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:51
|
||||
msgid "Rotate Screen 180"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:52
|
||||
msgid "Rotate Screen 270"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:53
|
||||
msgid "Rotate Screen 90"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:54
|
||||
msgid "Save State"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:55
|
||||
msgid "Select : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:56
|
||||
msgid "Size"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:57
|
||||
msgid "Start : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:58
|
||||
msgid "State 1"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:59
|
||||
msgid "State 10"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:60
|
||||
msgid "State 2"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:61
|
||||
msgid "State 3"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:62
|
||||
msgid "State 4"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:63
|
||||
msgid "State 5"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:64
|
||||
msgid "State 6"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:65
|
||||
msgid "State 7"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:66
|
||||
msgid "State 8"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:67
|
||||
msgid "State 9"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:68
|
||||
msgid "TYPE: Auto (1B)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:69
|
||||
msgid "TYPE: EEPROM1 (4kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:70
|
||||
msgid "TYPE: EEPROM2 (512kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:71
|
||||
msgid "TYPE: EEPROM2 (64kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:72
|
||||
msgid "TYPE: FLASH (256kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:73
|
||||
msgid "TYPE: FRAM (2MB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:74
|
||||
msgid "TYPE: FRAM (4MB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:75
|
||||
msgid "Tools"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:76
|
||||
msgid "True Gap"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:77
|
||||
msgid "Up : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:78
|
||||
msgid "View Memory"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:79
|
||||
msgid "View Palette"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:80
|
||||
msgid "View Tiles"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:81
|
||||
msgid "X : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:82
|
||||
msgid "Y : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:83
|
||||
msgid "_Emulation"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:84
|
||||
msgid "_File"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:85
|
||||
msgid "_PrintScreen"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:86
|
||||
msgid "_Saves"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:87
|
||||
msgid "http://desmume.org"
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: Replace this string with your names, one name per line.
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:89
|
||||
msgid "translator-credits"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1
|
||||
msgid " GoTo: "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2
|
||||
msgid " Palette : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3
|
||||
msgid "16 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4
|
||||
msgid "16c"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5
|
||||
msgid "256c"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6
|
||||
msgid "32 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7
|
||||
msgid "8 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8
|
||||
msgid ""
|
||||
"ARM9 cpu\n"
|
||||
"ARM7 cpu"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10
|
||||
msgid "BMP"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11
|
||||
msgid "Go!"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12
|
||||
msgid ""
|
||||
"cpu : ARM9\n"
|
||||
"cpu : ARM7"
|
||||
msgstr ""
|
|
@ -0,0 +1,684 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-04-07 14:37+0000\n"
|
||||
"PO-Revision-Date: 2012-09-13 01:16-0000\n"
|
||||
"Last-Translator: Tim Roden <othyro@freeshell.org>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:53
|
||||
#, c-format
|
||||
msgid "State %d (empty)"
|
||||
msgstr "Estado %d (vacío)"
|
||||
|
||||
#. Creating the selection window
|
||||
#: ../src/gtk-glade/callbacks.cpp:166
|
||||
msgid "Open..."
|
||||
msgstr "Abre..."
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:175
|
||||
msgid "Nds binary (.nds)"
|
||||
msgstr "Binario Nds (.nds)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:176
|
||||
msgid "Nds binary with loader (.ds.gba)"
|
||||
msgstr "Binario Nds con cargador (.ds.gba)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:177
|
||||
msgid "All files"
|
||||
msgstr "Todos los archivos"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:192
|
||||
#: ../src/gtk-glade/main.cpp:488
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Unable to load :\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"No pudo cargar :\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:408
|
||||
msgid "You don't have any joystick!"
|
||||
msgstr "¡No tienes ningún palanca de juego!"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:410
|
||||
msgid "Can't configure joystick while the game is running!"
|
||||
msgstr "¡No se puede configurar palanca de juego mientras está funcionando el juego!"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:66
|
||||
#, c-format
|
||||
msgid "*** Cannot get %s attribute value\n"
|
||||
msgstr "*** No puede sacar valor atributo %s\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:164
|
||||
#, c-format
|
||||
msgid "*** Failed to create pixmap.\n"
|
||||
msgstr "*** Falló en crear el pixmap.\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:174
|
||||
#, c-format
|
||||
msgid "*** No appropriate OpenGL-capable visual found.\n"
|
||||
msgstr "*** Visual OpenGL-capaz apropiado no encontrado.\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:187
|
||||
#, c-format
|
||||
msgid "Failed to create the GdkGLPixmap\n"
|
||||
msgstr "Falló a crear el GdkGLPixmap\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:197
|
||||
#, c-format
|
||||
msgid "Connot create the OpenGL rendering context\n"
|
||||
msgstr "No puede crear el contexto de sintesis de imágenes OpenGL\n"
|
||||
|
||||
#: ../src/gtk-glade/glade-xml.cpp:58
|
||||
#, c-format
|
||||
msgid "could not find signal handler '%s'."
|
||||
msgstr "no pudo encontrar manipulador de señal '%s'."
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:133
|
||||
#, c-format
|
||||
msgid "USAGE: %s [OPTIONS] [nds-file]\n"
|
||||
msgstr "SE USA: %s [OPCIONES] [archivo-nds]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:134
|
||||
#, c-format
|
||||
msgid "OPTIONS:\n"
|
||||
msgstr "OPCIONES:\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:135
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --load-slot=NUM Load game saved under NUM position.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --load-slot=NÚM Carga el juego guardado en posición NÚM.\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:138
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --soft-convert Use software colour conversion during OpenGL\n"
|
||||
" screen rendering. May produce better or worse\n"
|
||||
" frame rates depending on hardware.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --soft-convert Usa conversión color software durante sintesis\n"
|
||||
" de imágenes en pantalla OpenGL. Puede producir\n"
|
||||
" mejor o peor velocidades de fotograma\n"
|
||||
" dependiendo en hardware.\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:143
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --3d-engine=ENGINE Selects 3D rendering engine\n"
|
||||
" 0 = disabled\n"
|
||||
" 1 = internal desmume rasterizer (default)\n"
|
||||
msgstr ""
|
||||
" --3d-engine=MOTOR Selecciona motor de sintesis de imágenes 3D\n"
|
||||
" 0 = inutilizado\n"
|
||||
" 1 = rasterizador desmume internal (opción por defecto)\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:148
|
||||
#, c-format
|
||||
msgid ""
|
||||
" 2 = gtkglext off-screen 3d opengl\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" 2 = opengl 3d fuera de pantalla gtkglext\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:151
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --disable-limiter Disables the 60 fps limiter\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --disable-limiter Inutiliza el limitador 60 fps\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:153
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --save-type=TYPE Selects savetype:\n"
|
||||
" 0 = Autodetect (default)\n"
|
||||
" 1 = EEPROM 4kbit\n"
|
||||
" 2 = EEPROM 64kbit\n"
|
||||
" 3 = EEPROM 512kbit\n"
|
||||
" 4 = FRAM 256kbit\n"
|
||||
" 5 = FLASH 2mbit\n"
|
||||
" 6 = FLASH 4mbit\n"
|
||||
" \n"
|
||||
msgstr ""
|
||||
" --save-type=TIPO Selecciona tipo de parada:\n"
|
||||
" 0 = Autodetecta (opción por defecto)\n"
|
||||
" 1 = EEPROM 4kbit\n"
|
||||
" 2 = EEPROM 64kbit\n"
|
||||
" 3 = EEPROM 512kbit\n"
|
||||
" 4 = FRAM 256kbit\n"
|
||||
" 5 = FLASH 2mbit\n"
|
||||
" 6 = FLASH 4mbit\n"
|
||||
" \n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:163
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --fwlang=LANG Set the language in the firmware, LANG as follows:\n"
|
||||
" 0 = Japanese\n"
|
||||
" 1 = English\n"
|
||||
" 2 = French\n"
|
||||
" 3 = German\n"
|
||||
" 4 = Italian\n"
|
||||
" 5 = Spanish\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --fwlang=LENG Pone el idioma en el microprograma, LENG a continuación:\n"
|
||||
" 0 = japonés\n"
|
||||
" 1 = inglés\n"
|
||||
" 2 = francés\n"
|
||||
" 3 = alemán\n"
|
||||
" 4 = italiano\n"
|
||||
" 5 = español\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:172
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n"
|
||||
" --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --arm9gdb=NÚM_PTO Admite el fragmento GDB ARM9 en el puerto dado\n"
|
||||
" --arm7gdb=NÚM_PTO Admite el fragmento GDB ARM7 en el puerto dado\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:176
|
||||
#, c-format
|
||||
msgid " --help Display this message\n"
|
||||
msgstr " --help Visualiza este mensaje\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:189
|
||||
#, c-format
|
||||
msgid "I only know how to load from slots 1-10.\n"
|
||||
msgstr "Sólo yo sé como cargar desde espacios 1-10.\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:213
|
||||
#, c-format
|
||||
msgid "Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n"
|
||||
msgstr "Motores 3D admitidos: 0, 1 y en algunas máquinas 2; usa la opción --help para detalles\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:225
|
||||
#, c-format
|
||||
msgid "select savetype from 0 to 6; use --help option for details\n"
|
||||
msgstr "selecciona tipo de parada desde 0 a 6; usa la opción --help para detalles\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:237
|
||||
#, c-format
|
||||
msgid "Firmware language must be set to a value from 0 to 5.\n"
|
||||
msgstr "El idioma de microprograma tiene que ser puesto a un valor entre 0 a 5.\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:250
|
||||
#, c-format
|
||||
msgid "ARM9 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr "El puerto fragmento de código GDB ARM9 tiene que ser entre el rango de 1 a 65535\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:262
|
||||
#, c-format
|
||||
msgid "ARM7 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr "El puerto fragmento de código GDB ARM7 tiene que ser entre el rango de 1 a 65535\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:275
|
||||
#, c-format
|
||||
msgid "NDS file (\"%s\") already set\n"
|
||||
msgstr "Ya puesto el archivo NDS (\"%s\") \n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:288
|
||||
#, c-format
|
||||
msgid "USAGE: %s [options] [nds-file]\n"
|
||||
msgstr "SE USA: %s [opciones] [archivo-nds]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:289
|
||||
#, c-format
|
||||
msgid "USAGE: %s --help - for help\n"
|
||||
msgstr "SE USA: %s --help -para ayuda\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:402
|
||||
#, c-format
|
||||
msgid "Failed to create ARM9 gdbstub on port %d\n"
|
||||
msgstr "Falló en crear el gdbstub ARM9 en puerto %d\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:413
|
||||
#, c-format
|
||||
msgid "Failed to create ARM7 gdbstub on port %d\n"
|
||||
msgstr "Falló en crear el gdbstub ARM7 en puerto %d\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:422
|
||||
#, c-format
|
||||
msgid "Error trying to initialize SDL: %s\n"
|
||||
msgstr "Error probando a iniciar SDL: %s\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:504
|
||||
#, c-format
|
||||
msgid "Failed to initialise openGL 3D emulation; removing 3D support\n"
|
||||
msgstr "Falló en inicializar la emulación 3D OpenGL; sacando apoyo 3D\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:511
|
||||
#, c-format
|
||||
msgid "Failed to setup 3D engine; removing 3D support\n"
|
||||
msgstr "Falló en montar el motor 3D; sacando apoyo 3D\n"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:1
|
||||
msgid "0"
|
||||
msgstr "0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:2
|
||||
msgid "1"
|
||||
msgstr "1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:3
|
||||
msgid "1x"
|
||||
msgstr "1x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:4
|
||||
msgid "2"
|
||||
msgstr "2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:5
|
||||
msgid "2x"
|
||||
msgstr "2x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:6
|
||||
msgid "3"
|
||||
msgstr "3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:7
|
||||
msgid "3D operation detected"
|
||||
msgstr "Detectado la operación 3D"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:8
|
||||
msgid "3D rom"
|
||||
msgstr "ROM 3D"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:9
|
||||
msgid "3x"
|
||||
msgstr "3x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:10
|
||||
msgid "4"
|
||||
msgstr "4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:11
|
||||
msgid "5"
|
||||
msgstr "5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:12
|
||||
msgid "6"
|
||||
msgstr "6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:13
|
||||
msgid "7"
|
||||
msgstr "7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:14
|
||||
msgid "8"
|
||||
msgstr "8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:15
|
||||
msgid "9"
|
||||
msgstr "9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:16
|
||||
msgid "?"
|
||||
msgstr "¿?"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:17
|
||||
msgid "A : "
|
||||
msgstr "A :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:18
|
||||
msgid "Audio On"
|
||||
msgstr "Audio encendido"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:19
|
||||
msgid "Axis :"
|
||||
msgstr "Eje :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:20
|
||||
msgid "B : "
|
||||
msgstr "B :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:21
|
||||
msgid "BG0"
|
||||
msgstr "F0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:22
|
||||
msgid "BG1"
|
||||
msgstr "F1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:23
|
||||
msgid "BG2"
|
||||
msgstr "F2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:24
|
||||
msgid "BG3"
|
||||
msgstr "F3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:25
|
||||
msgid "Boost : "
|
||||
msgstr "Aumenta : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:26
|
||||
msgid "Config"
|
||||
msgstr "Config"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:27
|
||||
msgid "DeSmuME"
|
||||
msgstr "DeSmuME"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:28
|
||||
msgid "Debug : "
|
||||
msgstr "Depura : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:29
|
||||
msgid "Down : "
|
||||
msgstr "Bajo :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:30
|
||||
msgid "FrameSkip"
|
||||
msgstr "SáltateFotograma"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:31
|
||||
msgid "IO regs"
|
||||
msgstr "Regs IO"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:32
|
||||
msgid "Joystick Config"
|
||||
msgstr "Config de palanca de juego"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:33
|
||||
msgid "Joystick controls"
|
||||
msgstr "Controles de palanca de juego"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:34
|
||||
msgid "Key definition"
|
||||
msgstr "Definición de tecla"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:35
|
||||
msgid "Keyboard Config"
|
||||
msgstr "Config de teclado"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:36
|
||||
msgid "Keyboard controls"
|
||||
msgstr "Controles de teclado"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:37
|
||||
msgid "L : "
|
||||
msgstr "L :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:38
|
||||
msgid "Layers"
|
||||
msgstr "Capas"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:39
|
||||
msgid "Left : "
|
||||
msgstr "Izquierda :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:40
|
||||
msgid "Load State"
|
||||
msgstr "Carga estado"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:41
|
||||
msgid "Nintendo DS emulator based on work by Yopyop"
|
||||
msgstr "Emulador de Nintendo DS basado en trabajo hecho por Yopyop"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:42
|
||||
msgid "No Gap"
|
||||
msgstr "No espacio"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:43
|
||||
msgid "OBJ"
|
||||
msgstr "OBJ"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:44
|
||||
msgid "Press a button..."
|
||||
msgstr "Presiona un botón..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:45
|
||||
msgid "Press a key..."
|
||||
msgstr "Presiona una tecla..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:46
|
||||
msgid "R : "
|
||||
msgstr "R :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:47
|
||||
msgid "Reset"
|
||||
msgstr "Reinicia"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:48
|
||||
msgid "Right : "
|
||||
msgstr "Derecha :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:49
|
||||
msgid "Right Screen"
|
||||
msgstr "Pantalla derecha"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:50
|
||||
msgid "Rotate Screen 0"
|
||||
msgstr "Rota la pantalla 0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:51
|
||||
msgid "Rotate Screen 180"
|
||||
msgstr "Rota la pantalla 180"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:52
|
||||
msgid "Rotate Screen 270"
|
||||
msgstr "Rota la pantalla 270"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:53
|
||||
msgid "Rotate Screen 90"
|
||||
msgstr "Rota la pantalla 90"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:54
|
||||
msgid "Save State"
|
||||
msgstr "Guarda parada"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:55
|
||||
msgid "Select : "
|
||||
msgstr "Selecciona : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:56
|
||||
msgid "Size"
|
||||
msgstr "Tamaño"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:57
|
||||
msgid "Start : "
|
||||
msgstr "Empieza : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:58
|
||||
msgid "State 1"
|
||||
msgstr "Estado 1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:59
|
||||
msgid "State 10"
|
||||
msgstr "Estado 10"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:60
|
||||
msgid "State 2"
|
||||
msgstr "Estado 2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:61
|
||||
msgid "State 3"
|
||||
msgstr "Estado 3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:62
|
||||
msgid "State 4"
|
||||
msgstr "Estado 4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:63
|
||||
msgid "State 5"
|
||||
msgstr "Estado 5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:64
|
||||
msgid "State 6"
|
||||
msgstr "Estado 6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:65
|
||||
msgid "State 7"
|
||||
msgstr "Estado 7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:66
|
||||
msgid "State 8"
|
||||
msgstr "Estado 8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:67
|
||||
msgid "State 9"
|
||||
msgstr "Estado 9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:68
|
||||
msgid "TYPE: Auto (1B)"
|
||||
msgstr "TIPO: Auto (1B)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:69
|
||||
msgid "TYPE: EEPROM1 (4kB)"
|
||||
msgstr "TIPO: EEPROM1 (4kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:70
|
||||
msgid "TYPE: EEPROM2 (512kB)"
|
||||
msgstr "TIPO: EEPROM2 (512kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:71
|
||||
msgid "TYPE: EEPROM2 (64kB)"
|
||||
msgstr "TIPO: EEPROM2 (64kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:72
|
||||
msgid "TYPE: FLASH (256kB)"
|
||||
msgstr "TIPO: FLASH (256kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:73
|
||||
msgid "TYPE: FRAM (2MB)"
|
||||
msgstr "TIPO: FRAM (2MB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:74
|
||||
msgid "TYPE: FRAM (4MB)"
|
||||
msgstr "TIPO: FRAM (4MB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:75
|
||||
msgid "Tools"
|
||||
msgstr "Herramientas"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:76
|
||||
msgid "True Gap"
|
||||
msgstr "Espacio verdadero"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:77
|
||||
msgid "Up : "
|
||||
msgstr "Arriba :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:78
|
||||
msgid "View Memory"
|
||||
msgstr "Ve memoria"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:79
|
||||
msgid "View Palette"
|
||||
msgstr "Ve gama"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:80
|
||||
msgid "View Tiles"
|
||||
msgstr "Ve losas"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:81
|
||||
msgid "X : "
|
||||
msgstr "X :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:82
|
||||
msgid "Y : "
|
||||
msgstr "Y :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:83
|
||||
msgid "_Emulation"
|
||||
msgstr "_Emulación"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:84
|
||||
msgid "_File"
|
||||
msgstr "_Archivo"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:85
|
||||
msgid "_PrintScreen"
|
||||
msgstr "_ImprimePantalla"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:86
|
||||
msgid "_Saves"
|
||||
msgstr "_Paradas"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:87
|
||||
msgid "http://desmume.org"
|
||||
msgstr "http://desmume.org"
|
||||
|
||||
#. TRANSLATORS: Replace this string with your names, one name per line.
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:89
|
||||
msgid "translator-credits"
|
||||
msgstr "creditos-de-traductor"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1
|
||||
msgid " GoTo: "
|
||||
msgstr " VeA: "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2
|
||||
msgid " Palette : "
|
||||
msgstr " Gama : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3
|
||||
msgid "16 bit"
|
||||
msgstr "16 bit"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4
|
||||
msgid "16c"
|
||||
msgstr "16c"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5
|
||||
msgid "256c"
|
||||
msgstr "256c"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6
|
||||
msgid "32 bit"
|
||||
msgstr "32 bit"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7
|
||||
msgid "8 bit"
|
||||
msgstr "8 bit"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8
|
||||
msgid ""
|
||||
"ARM9 cpu\n"
|
||||
"ARM7 cpu"
|
||||
msgstr ""
|
||||
"cpu ARM9\n"
|
||||
"cpu ARM7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10
|
||||
msgid "BMP"
|
||||
msgstr "BMP"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11
|
||||
msgid "Go!"
|
||||
msgstr "¡Ve!"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12
|
||||
msgid ""
|
||||
"cpu : ARM9\n"
|
||||
"cpu : ARM7"
|
||||
msgstr ""
|
||||
"cpu : ARM9\n"
|
||||
"cpu : ARM7"
|
||||
|
|
@ -0,0 +1,592 @@
|
|||
# French translation for the desmume-glade UI.
|
||||
# Copyright (C) 2007 The DeSmuME Team.
|
||||
# Pascal Giard <evilynux@gmail.com>, 2007.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2007-07-17 01:38-0400\n"
|
||||
"PO-Revision-Date: 2007-07-17 05:27-0400\n"
|
||||
"Last-Translator: Pascal Giard <evilynux@gmail.com>\n"
|
||||
"Language-Team: DeSmuME Team <desmume-devel@lists.sourceforge.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. Creating the selection window
|
||||
#: ../src/gtk-glade/callbacks.c:91
|
||||
msgid "Open..."
|
||||
msgstr "Ouvrir..."
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:100
|
||||
msgid "Nds binary (.nds)"
|
||||
msgstr "Binaire NDS (.nds)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:101
|
||||
msgid "Nds binary with loader (.ds.gba)"
|
||||
msgstr "Binaire NDS avec lanceur (.ds.gba)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:102
|
||||
msgid "All files"
|
||||
msgstr "Tous les fichiers"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:117 ../src/gtk-glade/main.c:532
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Unable to load :\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Impossible de charger:\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:291
|
||||
msgid "You don't have any joystick!"
|
||||
msgstr "Aucune manette de jeu n'est connectée!"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:293
|
||||
msgid "Can't configure joystick while the game is running!"
|
||||
msgstr "Vous ne pouvez pas configurer la manette de jeux pendant l'exécution du jeu!"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:64
|
||||
#, c-format
|
||||
msgid "*** Cannot get %s attribute value\n"
|
||||
msgstr "*** Impossible d'obtenir la valeur de l'attribut %s\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:158
|
||||
msgid "*** Failed to create pixmap.\n"
|
||||
msgstr "*** Échec lors de la création du pixmap.\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:168
|
||||
msgid "*** No appropriate OpenGL-capable visual found.\n"
|
||||
msgstr "*** Aucun affichage supportant OpenGL n'est détecté.\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:181
|
||||
msgid "Failed to create the GdkGLPixmap\n"
|
||||
msgstr "Échec lors de la création du GdkGLPixmap\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:191
|
||||
msgid "Connot create the OpenGL rendering context\n"
|
||||
msgstr "Impossible de créer le contexte d'affichage OpenGL\n"
|
||||
|
||||
#: ../src/gtk-glade/glade-xml.c:113
|
||||
#, c-format
|
||||
msgid "could not find signal handler '%s'."
|
||||
msgstr "impossible de trouver la fonction associé au signal '%s'."
|
||||
|
||||
#: ../src/gtk-glade/main.c:106
|
||||
#, c-format
|
||||
msgid "USAGE: %s [OPTIONS] [nds-file]\n"
|
||||
msgstr "UTILISATION: %s [OPTIONS] [fichier-nds]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:107
|
||||
msgid "OPTIONS:\n"
|
||||
msgstr "OPTIONS:\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:109
|
||||
msgid ""
|
||||
" --soft-convert Use software colour conversion during OpenGL\n"
|
||||
" screen rendering. May produce better or worse\n"
|
||||
" frame rates depending on hardware.\n"
|
||||
" \n"
|
||||
" --disable-3d Disables the 3D emulation\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --soft-convert Utiliser la conversion logiciel des couleurs lors de\n"
|
||||
" l'affichage OpenGL. Peut améliorer ou détériorer les\n"
|
||||
" performances dépendamment de la carte vidéo.\n"
|
||||
"\n"
|
||||
" --disable-3d Désactiver l'émulation 3D.\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:116
|
||||
msgid ""
|
||||
" --disable-limiter Disables the 60 fps limiter\n"
|
||||
" \n"
|
||||
" --fwlang=LANG Set the language in the firmware, LANG as follows:\n"
|
||||
" 0 = Japanese\n"
|
||||
" 1 = English\n"
|
||||
" 2 = French\n"
|
||||
" 3 = German\n"
|
||||
" 4 = Italian\n"
|
||||
" 5 = Spanish\n"
|
||||
"\n"
|
||||
" --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n"
|
||||
" --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n"
|
||||
" \n"
|
||||
" --help Display this message\n"
|
||||
msgstr ""
|
||||
" --disable-limiter Désactiver la limitation de 60 images/seconde.\n"
|
||||
" \n"
|
||||
" --fwlang=LANG Configurer la langue du firmware où LANG est:\n"
|
||||
" 0 = Japanais\n"
|
||||
" 1 = Anglais\n"
|
||||
" 2 = Français\n"
|
||||
" 3 = Allemand\n"
|
||||
" 4 = Italien\n"
|
||||
" 5 = Espagnol\n"
|
||||
"\n"
|
||||
" --arm9gdb=PORT_NUM Activer le stub GDB du ARM9 sur le port PORT_NUM.\n"
|
||||
" --arm7gdb=PORT_NUM Activer le stub GDB du ARM7 sur le port PORT_NUM.\n"
|
||||
" \n"
|
||||
" --help Afficher ce message d'aide.\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:149
|
||||
msgid "Firmware language must be set to a value from 0 to 5.\n"
|
||||
msgstr "La langue du firmware doit être une valeur entre 0 et 5.\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:161
|
||||
msgid "ARM9 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr "Le numéro de port du stub GDB du ARM9 doit être entre 1 et 65535\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:173
|
||||
msgid "ARM7 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr "Le numéro de port du stub GDB du ARM7 doit être entre 1 et 65535\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:185
|
||||
#, c-format
|
||||
msgid "NDS file (\"%s\") already set\n"
|
||||
msgstr "Fichier NDS (\"%s\") déjà configuré\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:198
|
||||
#, fuzzy, c-format
|
||||
msgid "USAGE: %s [options] [nds-file]\n"
|
||||
msgstr "UTILISATION: %s [OPTIONS] [fichier-nds]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:199
|
||||
#, c-format
|
||||
msgid "USAGE: %s --help - for help\n"
|
||||
msgstr "UTILISATION: %s --help - pour l'aide\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:332
|
||||
#, c-format
|
||||
msgid "State %d (empty)"
|
||||
msgstr "État %d (vide)"
|
||||
|
||||
#: ../src/gtk-glade/main.c:459
|
||||
#, c-format
|
||||
msgid "Failed to create ARM9 gdbstub on port %d\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.c:470
|
||||
#, c-format
|
||||
msgid "Failed to create ARM7 gdbstub on port %d\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.c:479
|
||||
#, c-format
|
||||
msgid "Error trying to initialize SDL: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.c:551
|
||||
#, c-format
|
||||
msgid "Failed to initialise openGL 3D emulation; removing 3D support\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.c:557
|
||||
#, c-format
|
||||
msgid "Failed to setup openGL 3D emulation; removing 3D support\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.c:584
|
||||
#, c-format
|
||||
msgid "Error trying to start FPS limiter timer: %s\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:1
|
||||
msgid "0"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:2
|
||||
msgid "1"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:3
|
||||
msgid "1x"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:4
|
||||
msgid "2"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:5
|
||||
msgid "2x"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:6
|
||||
msgid "3"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:7
|
||||
msgid "3D operation detected"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:8
|
||||
msgid "3D rom"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:9
|
||||
msgid "3x"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:10
|
||||
msgid "4"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:11
|
||||
msgid "5"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:12
|
||||
msgid "6"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:13
|
||||
msgid "7"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:14
|
||||
msgid "8"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:15
|
||||
msgid "9"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:16
|
||||
msgid "?"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:17
|
||||
msgid "A : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:18
|
||||
msgid "Audio On"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:19
|
||||
msgid "Axis :"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:20
|
||||
msgid "B : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:21
|
||||
msgid "BG0"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:22
|
||||
msgid "BG1"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:23
|
||||
msgid "BG2"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:24
|
||||
msgid "BG3"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:25
|
||||
msgid "Boost : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:26
|
||||
msgid "Config"
|
||||
msgstr "_Config."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:27
|
||||
msgid "DeSmuME"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:28
|
||||
msgid "DeSmuMe"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:29
|
||||
msgid "Debug : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:30
|
||||
msgid "Down : "
|
||||
msgstr "Bas: "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:31
|
||||
msgid "FrameSkip"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:32
|
||||
msgid "IO regs"
|
||||
msgstr "Registres d'E/S"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:33
|
||||
msgid "Joystick Config"
|
||||
msgstr "Configuration de la manette de jeu"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:34
|
||||
msgid "Joystick controls"
|
||||
msgstr "Manette de jeu"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:35
|
||||
msgid "Key definition"
|
||||
msgstr "Valeur de la touche"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:36
|
||||
msgid "Keyboard Config"
|
||||
msgstr "Configuration du clavier"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:37
|
||||
msgid "Keyboard controls"
|
||||
msgstr "Clavier"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:38
|
||||
msgid "L : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:39
|
||||
msgid "Layers"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:40
|
||||
msgid "Left : "
|
||||
msgstr "Gaucher: "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:41
|
||||
msgid "Load State"
|
||||
msgstr "Chargement d'un état"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:42
|
||||
msgid "Nintendo DS emulator based on work by Yopyop"
|
||||
msgstr "Émulateur de Nintendo DS basé sur le travail de Yopyop"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:43
|
||||
msgid "OBJ"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:44
|
||||
msgid "Press a button..."
|
||||
msgstr "Appuyez sur un bouton..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:45
|
||||
msgid "Press a key..."
|
||||
msgstr "Appuyez sur une touche..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:46
|
||||
msgid "R : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:47
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:48
|
||||
msgid "Right : "
|
||||
msgstr "Droite: "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:49
|
||||
msgid "Right Screen"
|
||||
msgstr "Écran à droite"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:50
|
||||
msgid "Rotate Screen 0"
|
||||
msgstr "Rotation de l'écran 0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:51
|
||||
msgid "Rotate Screen 180"
|
||||
msgstr "Rotation de l'écran 180"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:52
|
||||
msgid "Rotate Screen 270"
|
||||
msgstr "Rotation de l'écran 270"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:53
|
||||
msgid "Rotate Screen 90"
|
||||
msgstr "Rotation de l'écran 90"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:54
|
||||
msgid "Save State"
|
||||
msgstr "Sauvegarder l'état"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:55
|
||||
msgid "Select : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:56
|
||||
msgid "Size"
|
||||
msgstr "Taille"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:57
|
||||
msgid "Start : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:58
|
||||
msgid "State 1"
|
||||
msgstr "État 1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:59
|
||||
msgid "State 10"
|
||||
msgstr "État 10"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:60
|
||||
msgid "State 2"
|
||||
msgstr "État 2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:61
|
||||
msgid "State 3"
|
||||
msgstr "État 3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:62
|
||||
msgid "State 4"
|
||||
msgstr "État 4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:63
|
||||
msgid "State 5"
|
||||
msgstr "État 5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:64
|
||||
msgid "State 6"
|
||||
msgstr "État 6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:65
|
||||
msgid "State 7"
|
||||
msgstr "État 7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:66
|
||||
msgid "State 8"
|
||||
msgstr "État 8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:67
|
||||
msgid "State 9"
|
||||
msgstr "État 9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:68
|
||||
msgid "TYPE: Auto (1B)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:69
|
||||
msgid "TYPE: EEPROM1 (4kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:70
|
||||
msgid "TYPE: EEPROM2 (512kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:71
|
||||
msgid "TYPE: EEPROM2 (64kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:72
|
||||
msgid "TYPE: FLASH (256kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:73
|
||||
msgid "TYPE: FRAM (2MB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:74
|
||||
msgid "Tools"
|
||||
msgstr "Outils"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:75
|
||||
msgid "True Gap"
|
||||
msgstr "Espace entre les écrans"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:76
|
||||
msgid "Up : "
|
||||
msgstr "Haut: "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:77
|
||||
msgid "View Memory"
|
||||
msgstr "Afficher la mémoire"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:78
|
||||
msgid "View Palette"
|
||||
msgstr "Afficher la palette de couleur"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:79
|
||||
msgid "View Tiles"
|
||||
msgstr "Afficher les tuiles"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:80
|
||||
msgid "X : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:81
|
||||
msgid "Y : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:82
|
||||
msgid "_Emulation"
|
||||
msgstr "_Émul."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:83
|
||||
msgid "_File"
|
||||
msgstr "_Fichier"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:84
|
||||
msgid "_PrintScreen"
|
||||
msgstr "_Capture d'écran"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:85
|
||||
msgid "_Saves"
|
||||
msgstr "_Sauv."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:86
|
||||
msgid "http://desmume.sf.net"
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: Replace this string with your names, one name per line.
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:88
|
||||
msgid "translator-credits"
|
||||
msgstr "fr: Pascal Giard"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1
|
||||
msgid " GoTo: "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2
|
||||
msgid " Palette : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3
|
||||
msgid "16 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4
|
||||
msgid "16c"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5
|
||||
msgid "256c"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6
|
||||
msgid "32 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7
|
||||
msgid "8 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8
|
||||
msgid ""
|
||||
"ARM9 cpu\n"
|
||||
"ARM7 cpu"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10
|
||||
msgid "BMP"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11
|
||||
msgid "Go!"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12
|
||||
msgid ""
|
||||
"cpu : ARM9\n"
|
||||
"cpu : ARM7"
|
||||
msgstr ""
|
|
@ -0,0 +1,437 @@
|
|||
# Norwegian translation for desmume.
|
||||
# Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the desmume package.
|
||||
# Stian Drøbak <sum41rules4@hotmail.com>, 2009.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: desmume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:1
|
||||
msgid "0"
|
||||
msgstr "0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:2
|
||||
msgid "1"
|
||||
msgstr "1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:3
|
||||
msgid "1x"
|
||||
msgstr "1x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:4
|
||||
msgid "2"
|
||||
msgstr "2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:5
|
||||
msgid "2x"
|
||||
msgstr "2x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:6
|
||||
msgid "3"
|
||||
msgstr "3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:7
|
||||
msgid "3D operation detected"
|
||||
msgstr "3D operasjon oppdaget"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:8
|
||||
msgid "3D rom"
|
||||
msgstr "3D ROM"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:9
|
||||
msgid "3x"
|
||||
msgstr "3x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:10
|
||||
msgid "4"
|
||||
msgstr "4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:11
|
||||
msgid "5"
|
||||
msgstr "5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:12
|
||||
msgid "6"
|
||||
msgstr "6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:13
|
||||
msgid "7"
|
||||
msgstr "7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:14
|
||||
msgid "8"
|
||||
msgstr "8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:15
|
||||
msgid "9"
|
||||
msgstr "9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:16
|
||||
msgid "?"
|
||||
msgstr "?"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:17
|
||||
msgid "A : "
|
||||
msgstr "A : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:18
|
||||
msgid "Audio On"
|
||||
msgstr "Lyd På"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:19
|
||||
msgid "Axis :"
|
||||
msgstr "Akse :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:20
|
||||
msgid "B : "
|
||||
msgstr "B : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:21
|
||||
msgid "BG0"
|
||||
msgstr "BG0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:22
|
||||
msgid "BG1"
|
||||
msgstr "BG1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:23
|
||||
msgid "BG2"
|
||||
msgstr "BG2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:24
|
||||
msgid "BG3"
|
||||
msgstr "BG3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:25
|
||||
msgid "Boost : "
|
||||
msgstr "Boost : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:26
|
||||
msgid "Config"
|
||||
msgstr "Konfigurer"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:27
|
||||
msgid "DeSmuME"
|
||||
msgstr "DeSmuME"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:28
|
||||
msgid "DeSmuMe"
|
||||
msgstr "DeSmuMe"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:29
|
||||
msgid "Debug : "
|
||||
msgstr "Feilsøk : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:30
|
||||
msgid "Down : "
|
||||
msgstr "Ned : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:31
|
||||
msgid "FrameSkip"
|
||||
msgstr "Ramme Hopp"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:32
|
||||
msgid "IO regs"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:33
|
||||
msgid "Joystick Config"
|
||||
msgstr "Konfigurer Joystick"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:34
|
||||
msgid "Joystick controls"
|
||||
msgstr "Joystick kontroller"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:35
|
||||
msgid "Key definition"
|
||||
msgstr "Tastdefinisjon"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:36
|
||||
msgid "Keyboad Config"
|
||||
msgstr "Tastaturkonfigurasjon"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:37
|
||||
msgid "Keyboard controls"
|
||||
msgstr "Tastaturkontroller"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:38
|
||||
msgid "L : "
|
||||
msgstr "V : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:39
|
||||
msgid "Layers"
|
||||
msgstr "Lag"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:40
|
||||
msgid "Left : "
|
||||
msgstr "Venstre : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:41
|
||||
msgid "Load State"
|
||||
msgstr "Last Status"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:42
|
||||
msgid "Nintendo DS emulator based on work by Yopyop"
|
||||
msgstr "Nintendo DS-emulator basert på Yopyops arbeid"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:43
|
||||
msgid "OBJ"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:44
|
||||
msgid "Press a button..."
|
||||
msgstr "Trykk på en knapp..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:45
|
||||
msgid "Press a key..."
|
||||
msgstr "Trykk på en tast..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:46
|
||||
msgid "R : "
|
||||
msgstr "H : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:47
|
||||
msgid "Reset"
|
||||
msgstr "Restart"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:48
|
||||
msgid "Right : "
|
||||
msgstr "Høyre : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:49
|
||||
msgid "Right Screen"
|
||||
msgstr "Høyre Skjerm"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:50
|
||||
msgid "Rotate Screen 0"
|
||||
msgstr "Roter Skjermen 0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:51
|
||||
msgid "Rotate Screen 180"
|
||||
msgstr "Roter Skjermen 180"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:52
|
||||
msgid "Rotate Screen 270"
|
||||
msgstr "Roter Skjermen 270"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:53
|
||||
msgid "Rotate Screen 90"
|
||||
msgstr "Roter Skjermen 90"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:54
|
||||
msgid "Save State"
|
||||
msgstr "Lagre State"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:55
|
||||
msgid "Select : "
|
||||
msgstr "Select : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:56
|
||||
msgid "Size"
|
||||
msgstr "Størrelse"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:57
|
||||
msgid "Start : "
|
||||
msgstr "Start : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:58
|
||||
msgid "State 1"
|
||||
msgstr "Plass 1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:59
|
||||
msgid "State 10"
|
||||
msgstr "Plass 10"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:60
|
||||
msgid "State 2"
|
||||
msgstr "Plass 2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:61
|
||||
msgid "State 3"
|
||||
msgstr "Plass 3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:62
|
||||
msgid "State 4"
|
||||
msgstr "Plass 4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:63
|
||||
msgid "State 5"
|
||||
msgstr "Plass 5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:64
|
||||
msgid "State 6"
|
||||
msgstr "Plass 6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:65
|
||||
msgid "State 7"
|
||||
msgstr "Plass 7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:66
|
||||
msgid "State 8"
|
||||
msgstr "Plass 8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:67
|
||||
msgid "State 9"
|
||||
msgstr "Plass 9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:68
|
||||
msgid "TYPE: Auto (1B)"
|
||||
msgstr "TYPE: Auto (1B)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:69
|
||||
msgid "TYPE: EEPROM1 (4KB)"
|
||||
msgstr "TYPE: EEPROM1 (4KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:70
|
||||
msgid "TYPE: EEPROM2 (512KB)"
|
||||
msgstr "TYPE: EEPROM2 (512KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:71
|
||||
msgid "TYPE: EEPROM2 (64KB)"
|
||||
msgstr "TYPE: EEPROM2 (64KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:72
|
||||
msgid "TYPE: FLASH (256KB)"
|
||||
msgstr "TYPE: FLASH (256KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:73
|
||||
msgid "TYPE: FRAM (2MB)"
|
||||
msgstr "TYPE: FRAM (2MB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:74
|
||||
msgid "Tools"
|
||||
msgstr "Verktøy"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:75
|
||||
msgid "True Gap"
|
||||
msgstr "Virkelig Mellomrom"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:76
|
||||
msgid "Up : "
|
||||
msgstr "Opp : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:77
|
||||
msgid "View Memory"
|
||||
msgstr "Vis Minne"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:78
|
||||
msgid "View Palette"
|
||||
msgstr "Vis Palett"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:79
|
||||
msgid "View Tiles"
|
||||
msgstr "Se Plater"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:80
|
||||
msgid "X : "
|
||||
msgstr "X : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:81
|
||||
msgid "Y : "
|
||||
msgstr "Y : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:82
|
||||
msgid "_Emulation"
|
||||
msgstr "_Emulering"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:83
|
||||
msgid "_File"
|
||||
msgstr "_Fil"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:84
|
||||
msgid "_PrintScreen"
|
||||
msgstr "_Skjermdump"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:85
|
||||
msgid "_Saves"
|
||||
msgstr "_Lagringsplasser"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:86
|
||||
msgid "http://desmume.sf.net"
|
||||
msgstr "http://desmume.sf.net"
|
||||
|
||||
#. TRANSLATORS: Replace this string with your names, one name per line.
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:88
|
||||
msgid "translator-credits"
|
||||
msgstr "Onizuka89 <sum41rules4@hotmail.com>"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1
|
||||
msgid " GoTo: "
|
||||
msgstr " GåTil:"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2
|
||||
msgid " Palette : "
|
||||
msgstr " Palett : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3
|
||||
msgid "0x00000000"
|
||||
msgstr "0x00000000"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4
|
||||
msgid "16 bit"
|
||||
msgstr "16 bit"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5
|
||||
msgid "16c"
|
||||
msgstr "16 farger"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6
|
||||
msgid "256c"
|
||||
msgstr "256 farger"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7
|
||||
msgid "32 bit"
|
||||
msgstr "32 bit"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8
|
||||
msgid "8 bit"
|
||||
msgstr "8 bit"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:9
|
||||
msgid ""
|
||||
"ARM9 cpu\n"
|
||||
"ARM7 cpu"
|
||||
|
||||
msgstr ""
|
||||
"ARM9-processor\n"
|
||||
"ARM7-processor"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11
|
||||
msgid "BMP"
|
||||
msgstr "BMP"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12
|
||||
msgid "Go!"
|
||||
msgstr "Kjør!"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:13
|
||||
msgid "IO registers"
|
||||
msgstr "IO-register"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:14
|
||||
msgid "Palette Viewer"
|
||||
msgstr "Palettviser"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:15
|
||||
msgid "Tile viewer"
|
||||
msgstr "Plateviser"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:16
|
||||
msgid ""
|
||||
"cpu : ARM7\n"
|
||||
"cpu : ARM9"
|
||||
msgstr ""
|
||||
"processor : ARM7\n"
|
||||
"processor : ARM9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:18
|
||||
msgid "memory viewer"
|
||||
msgstr "minnesviser"
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,601 @@
|
|||
# BRAZILIAN PORTUGUESE TRANSLATION
|
||||
# Copyright (C) 2007
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Dreampeppers99 <EMAIL@ADDRESS>, 2007.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Desmume 0.9.5\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2007-09-11 01:38-0400\n"
|
||||
"PO-Revision-Date: 2009-10-18 13:01-0300\n"
|
||||
"Last-Translator: Felipe <felipefpl@ig.com.br>\n"
|
||||
"Language-Team: Felipe\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-Language: Portuguese\n"
|
||||
"X-Poedit-Country: BRAZIL\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
||||
#. Creating the selection window
|
||||
#: ../src/gtk-glade/callbacks.c:91
|
||||
msgid "Open..."
|
||||
msgstr "Abrir..."
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:100
|
||||
msgid "Nds binary (.nds)"
|
||||
msgstr "Binário nds (.nds)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:101
|
||||
msgid "Nds binary with loader (.ds.gba)"
|
||||
msgstr "Binário nds com o loader (.ds.gba)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:102
|
||||
msgid "All files"
|
||||
msgstr "Todos os arquivos"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:117
|
||||
#: ../src/gtk-glade/main.c:532
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Unable to load :\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Incapaz de carregar :\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:291
|
||||
msgid "You don't have any joystick!"
|
||||
msgstr "Você não tem nenhum joystick!"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.c:293
|
||||
msgid "Can't configure joystick while the game is running!"
|
||||
msgstr "Não pode configurar o joystick enquanto o jogo está rodando!"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:64
|
||||
#, c-format
|
||||
msgid "*** Cannot get %s attribute value\n"
|
||||
msgstr "*** Não consegue obter o valor do atributo %s\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:158
|
||||
msgid "*** Failed to create pixmap.\n"
|
||||
msgstr "*** Falhou em criar o pixmap.\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:168
|
||||
msgid "*** No appropriate OpenGL-capable visual found.\n"
|
||||
msgstr "*** Nenhum visual -capaz do OpenGL encontrado.\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:181
|
||||
msgid "Failed to create the GdkGLPixmap\n"
|
||||
msgstr "Falhou em criar o GdkGLPixmap\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.c:191
|
||||
msgid "Cannot create the OpenGL rendering context\n"
|
||||
msgstr "Não pôde criar o contexto de renderização do OpenGL\n"
|
||||
|
||||
#: ../src/gtk-glade/glade-xml.c:113
|
||||
#, c-format
|
||||
msgid "could not find signal handler '%s'."
|
||||
msgstr "não pôde achar o manejador do sinal '%s'."
|
||||
|
||||
#: ../src/gtk-glade/main.c:106
|
||||
#, c-format
|
||||
msgid "USAGE: %s [OPTIONS] [nds-file]\n"
|
||||
msgstr "USO: %s [OPÇÕES] [arquivo-nds]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:107
|
||||
msgid "OPTIONS:\n"
|
||||
msgstr "OPÇÕES:\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:109
|
||||
msgid ""
|
||||
" --soft-convert Use software colour conversion during OpenGL\n"
|
||||
" screen rendering. May produce better or worse\n"
|
||||
" frame rates depending on hardware.\n"
|
||||
" \n"
|
||||
" --disable-3d Disables the 3D emulation\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --soft-convert Usa conversão de cor via software durante a\n"
|
||||
" renderização da tela em OpenGl. Pode produzir melhores ou piores\n"
|
||||
" taxas de frames dependendo do hardware.\n"
|
||||
" \n"
|
||||
" --disable-3d Desativa a emulação 3D\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:116
|
||||
msgid ""
|
||||
" --disable-limiter Disables the 60 fps limiter\n"
|
||||
" \n"
|
||||
" --fwlang=LANG Set the language in the firmware, LANG as follows:\n"
|
||||
" 0 = Japanese\n"
|
||||
" 1 = English\n"
|
||||
" 2 = French\n"
|
||||
" 3 = German\n"
|
||||
" 4 = Italian\n"
|
||||
" 5 = Spanish\n"
|
||||
"\n"
|
||||
" --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n"
|
||||
" --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n"
|
||||
" \n"
|
||||
" --help Display this message\n"
|
||||
msgstr ""
|
||||
" --disable-limiter Desativa o limitador de 60 fps\n"
|
||||
" \n"
|
||||
" --fwlang=LANG Defina o idioma no firmware, LANG como segue:\n"
|
||||
" 0 = Japonês\n"
|
||||
" 1 = Inglês\n"
|
||||
" 2 = Francês\n"
|
||||
" 3 = Alemão\n"
|
||||
" 4 = Italiano\n"
|
||||
" 5 = Espanhol\n"
|
||||
"\n"
|
||||
" --arm9gdb=PORT_NUM Ativa o stub ARM9 GDB na porta dada\n"
|
||||
" --arm7gdb=PORT_NUM Ativa o stub ARM7 GDB na porta dada\n"
|
||||
" \n"
|
||||
" --help Exibir esta mensagem\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:149
|
||||
msgid "Firmware language must be set to a value from 0 to 5.\n"
|
||||
msgstr "O idioma do firmware deve ser definido em um valor de 0 a 5.\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:161
|
||||
msgid "ARM9 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr "A porta stub ARM9 GDB deve estar no alcance de 1 a 65535\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:173
|
||||
msgid "ARM7 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr "A porta stub ARM7 GDB deve estar no alcance de 1 a 65535\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:185
|
||||
#, c-format
|
||||
msgid "NDS file (\"%s\") already set\n"
|
||||
msgstr "Arquivo NDS (\"%s\") já definido\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:198
|
||||
#, c-format
|
||||
msgid "USAGE: %s [options] [nds-file]\n"
|
||||
msgstr "USO: %s [opções] [arquivo-nds]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:199
|
||||
#, c-format
|
||||
msgid "USAGE: %s --help - for help\n"
|
||||
msgstr "USO: %s --help - para ajuda\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:332
|
||||
#, c-format
|
||||
msgid "State %d (empty)"
|
||||
msgstr "Estado %d (vazio)"
|
||||
|
||||
#: ../src/gtk-glade/main.c:459
|
||||
#, c-format
|
||||
msgid "Failed to create ARM9 gdbstub on port %d\n"
|
||||
msgstr "Falhou em criar o gdbstub ARM9 na porta %d\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:470
|
||||
#, c-format
|
||||
msgid "Failed to create ARM7 gdbstub on port %d\n"
|
||||
msgstr "Falhou em criar o gdbstub ARM7 na porta %d\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:479
|
||||
#, c-format
|
||||
msgid "Error trying to initialize SDL: %s\n"
|
||||
msgstr "Erro ao tentar inicializar o SDL: %s\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:551
|
||||
#, c-format
|
||||
msgid "Failed to initialise openGL 3D emulation; removing 3D support\n"
|
||||
msgstr "Falhou em inicializar a emulação 3D no openGL; removendo o suporte 3D\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:557
|
||||
#, c-format
|
||||
msgid "Failed to setup openGL 3D emulation; removing 3D support\n"
|
||||
msgstr "Falhou em configurar a emulação 3D no openGL; removendo o suporte 3D\n"
|
||||
|
||||
#: ../src/gtk-glade/main.c:584
|
||||
#, c-format
|
||||
msgid "Error trying to start FPS limiter timer: %s\n"
|
||||
msgstr "Erro ao tentar iniciar o timer limitador de FPS: %s\n"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:1
|
||||
msgid "0"
|
||||
msgstr "0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:2
|
||||
msgid "1"
|
||||
msgstr "1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:3
|
||||
msgid "1x"
|
||||
msgstr "1x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:4
|
||||
msgid "2"
|
||||
msgstr "2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:5
|
||||
msgid "2x"
|
||||
msgstr "2x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:6
|
||||
msgid "3"
|
||||
msgstr "3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:7
|
||||
msgid "3D operation detected"
|
||||
msgstr "Operação 3D detectada"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:8
|
||||
msgid "3D rom"
|
||||
msgstr "Rom 3D"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:9
|
||||
msgid "3x"
|
||||
msgstr "3x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:10
|
||||
msgid "4"
|
||||
msgstr "4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:11
|
||||
msgid "5"
|
||||
msgstr "5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:12
|
||||
msgid "6"
|
||||
msgstr "6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:13
|
||||
msgid "7"
|
||||
msgstr "7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:14
|
||||
msgid "8"
|
||||
msgstr "8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:15
|
||||
msgid "9"
|
||||
msgstr "9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:16
|
||||
msgid "?"
|
||||
msgstr "?"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:17
|
||||
msgid "A : "
|
||||
msgstr "A : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:18
|
||||
msgid "Audio On"
|
||||
msgstr "Áudio Ligado"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:19
|
||||
msgid "Axis :"
|
||||
msgstr "Eixos : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:20
|
||||
msgid "B : "
|
||||
msgstr "B : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:21
|
||||
msgid "BG0"
|
||||
msgstr "BG0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:22
|
||||
msgid "BG1"
|
||||
msgstr "BG1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:23
|
||||
msgid "BG2"
|
||||
msgstr "BG2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:24
|
||||
msgid "BG3"
|
||||
msgstr "BG3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:25
|
||||
msgid "Boost : "
|
||||
msgstr "Aumentar : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:26
|
||||
msgid "Config"
|
||||
msgstr "Configurar"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:27
|
||||
msgid "DeSmuME"
|
||||
msgstr "DeSmuME"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:28
|
||||
msgid "DeSmuMe"
|
||||
msgstr "DeSmuMe"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:29
|
||||
msgid "Debug : "
|
||||
msgstr "Debug : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:30
|
||||
msgid "Down : "
|
||||
msgstr "Baixo : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:31
|
||||
msgid "FrameSkip"
|
||||
msgstr "FrameSkip"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:32
|
||||
msgid "IO regs"
|
||||
msgstr "IO regs"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:33
|
||||
msgid "Joystick Config"
|
||||
msgstr "Configurar Joystick"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:34
|
||||
msgid "Joystick controls"
|
||||
msgstr "Controles do joystick"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:35
|
||||
msgid "Key definition"
|
||||
msgstr "Definição das teclas"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:36
|
||||
msgid "Keyboard Config"
|
||||
msgstr "Configurar o Teclado"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:37
|
||||
msgid "Keyboard controls"
|
||||
msgstr "Controles do teclado"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:38
|
||||
msgid "L : "
|
||||
msgstr "L : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:39
|
||||
msgid "Layers"
|
||||
msgstr "Camadas"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:40
|
||||
msgid "Left : "
|
||||
msgstr "Esquerda : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:41
|
||||
msgid "Load State"
|
||||
msgstr "Carregar State"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:42
|
||||
msgid "Nintendo DS emulator based on work by Yopyop"
|
||||
msgstr "Emulador de Nintendo DS baseado no trabalho do Yopyop"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:43
|
||||
msgid "OBJ"
|
||||
msgstr "OBJ"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:44
|
||||
msgid "Press a button..."
|
||||
msgstr "Pressione um botão..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:45
|
||||
msgid "Press a key..."
|
||||
msgstr "Pressione uma tecla..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:46
|
||||
msgid "R : "
|
||||
msgstr "R : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:47
|
||||
msgid "Reset"
|
||||
msgstr "Resetar"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:48
|
||||
msgid "Right : "
|
||||
msgstr "Direita : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:49
|
||||
msgid "Right Screen"
|
||||
msgstr "Tela Direita"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:50
|
||||
msgid "Rotate Screen 0"
|
||||
msgstr "Rotacionar a Tela 0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:51
|
||||
msgid "Rotate Screen 180"
|
||||
msgstr "Rotacionar a Tela 180"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:52
|
||||
msgid "Rotate Screen 270"
|
||||
msgstr "Rotacionar a Tela 270"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:53
|
||||
msgid "Rotate Screen 90"
|
||||
msgstr "Rotacionar a Tela 90"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:54
|
||||
msgid "Save State"
|
||||
msgstr "Save State"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:55
|
||||
msgid "Select : "
|
||||
msgstr "Selecione : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:56
|
||||
msgid "Size"
|
||||
msgstr "Tamanho"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:57
|
||||
msgid "Start : "
|
||||
msgstr "Iniciar : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:58
|
||||
msgid "State 1"
|
||||
msgstr "Estado 1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:59
|
||||
msgid "State 10"
|
||||
msgstr "Estado 10"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:60
|
||||
msgid "State 2"
|
||||
msgstr "Estado 2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:61
|
||||
msgid "State 3"
|
||||
msgstr "Estado 3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:62
|
||||
msgid "State 4"
|
||||
msgstr "Estado 4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:63
|
||||
msgid "State 5"
|
||||
msgstr "Estado 5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:64
|
||||
msgid "State 6"
|
||||
msgstr "Estado 6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:65
|
||||
msgid "State 7"
|
||||
msgstr "Estado 7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:66
|
||||
msgid "State 8"
|
||||
msgstr "Estado 8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:67
|
||||
msgid "State 9"
|
||||
msgstr "Estado 9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:68
|
||||
msgid "TYPE: Auto (1B)"
|
||||
msgstr "TIPO: Auto (1B)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:69
|
||||
msgid "TYPE: EEPROM1 (4kB)"
|
||||
msgstr "TIPO: EEPROM1 (4kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:70
|
||||
msgid "TYPE: EEPROM2 (512kB)"
|
||||
msgstr "TIPO: EEPROM2 (512kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:71
|
||||
msgid "TYPE: EEPROM2 (64kB)"
|
||||
msgstr "TIPO: EEPROM2 (64kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:72
|
||||
msgid "TYPE: FLASH (256kB)"
|
||||
msgstr "TIPO: FLASH (256kB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:73
|
||||
msgid "TYPE: FRAM (2MB)"
|
||||
msgstr "TIPO: FRAM (2MB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:74
|
||||
msgid "Tools"
|
||||
msgstr "Ferramentas"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:75
|
||||
msgid "True Gap"
|
||||
msgstr "Lacuna Real"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:76
|
||||
msgid "Up : "
|
||||
msgstr "Cima : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:77
|
||||
msgid "View Memory"
|
||||
msgstr "Visualizar a Memória"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:78
|
||||
msgid "View Palette"
|
||||
msgstr "Visualizar a Paleta"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:79
|
||||
msgid "View Tiles"
|
||||
msgstr "Visualizar os Tiles"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:80
|
||||
msgid "X : "
|
||||
msgstr "X :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:81
|
||||
msgid "Y : "
|
||||
msgstr "Y :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:82
|
||||
msgid "_Emulation"
|
||||
msgstr "_Emulação"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:83
|
||||
msgid "_File"
|
||||
msgstr "_Arquivo"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:84
|
||||
msgid "_PrintScreen"
|
||||
msgstr "_PrintScreen"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:85
|
||||
msgid "_Saves"
|
||||
msgstr "_Saves"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:86
|
||||
msgid "http://desmume.sf.net"
|
||||
msgstr "http://desmume.sf.net"
|
||||
|
||||
#. TRANSLATORS: Replace this string with your names, one name per line.
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:88
|
||||
msgid "translator-credits"
|
||||
msgstr "Dreampeppers99\nFelipe"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1
|
||||
msgid " GoTo: "
|
||||
msgstr " IrPara: "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2
|
||||
msgid " Palette : "
|
||||
msgstr " Paleta : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3
|
||||
msgid "16 bit"
|
||||
msgstr "16 bits"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4
|
||||
msgid "16c"
|
||||
msgstr "16c"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5
|
||||
msgid "256c"
|
||||
msgstr "256c"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6
|
||||
msgid "32 bit"
|
||||
msgstr "32 bits"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7
|
||||
msgid "8 bit"
|
||||
msgstr "8 bits"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8
|
||||
msgid ""
|
||||
"ARM9 cpu\n"
|
||||
"ARM7 cpu"
|
||||
msgstr ""
|
||||
"cpu ARM9\n"
|
||||
"cpu ARM7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10
|
||||
msgid "BMP"
|
||||
msgstr "BMP"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11
|
||||
msgid "Go!"
|
||||
msgstr "Ir!"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12
|
||||
msgid ""
|
||||
"cpu : ARM9\n"
|
||||
"cpu : ARM7"
|
||||
msgstr ""
|
||||
"cpu : ARM9\n"
|
||||
"cpu : ARM7"
|
||||
|
|
@ -0,0 +1,440 @@
|
|||
# Swedish translation for desmume.
|
||||
# Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the desmume package.
|
||||
# Daniel Nylander <po@danielnylander.se>, 2007.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: desmume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2007-05-12 01:00+0200\n"
|
||||
"PO-Revision-Date: 2007-05-12 01:08+0100\n"
|
||||
"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
|
||||
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:1
|
||||
msgid "0"
|
||||
msgstr "0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:2
|
||||
msgid "1"
|
||||
msgstr "1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:3
|
||||
msgid "1x"
|
||||
msgstr "1x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:4
|
||||
msgid "2"
|
||||
msgstr "2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:5
|
||||
msgid "2x"
|
||||
msgstr "2x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:6
|
||||
msgid "3"
|
||||
msgstr "3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:7
|
||||
msgid "3D operation detected"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:8
|
||||
msgid "3D rom"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:9
|
||||
msgid "3x"
|
||||
msgstr "3x"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:10
|
||||
msgid "4"
|
||||
msgstr "4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:11
|
||||
msgid "5"
|
||||
msgstr "5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:12
|
||||
msgid "6"
|
||||
msgstr "6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:13
|
||||
msgid "7"
|
||||
msgstr "7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:14
|
||||
msgid "8"
|
||||
msgstr "8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:15
|
||||
msgid "9"
|
||||
msgstr "9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:16
|
||||
msgid "?"
|
||||
msgstr "?"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:17
|
||||
msgid "A : "
|
||||
msgstr "A : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:18
|
||||
msgid "Audio On"
|
||||
msgstr "Ljud på"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:19
|
||||
msgid "Axis :"
|
||||
msgstr "Axel :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:20
|
||||
msgid "B : "
|
||||
msgstr "B : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:21
|
||||
msgid "BG0"
|
||||
msgstr "BG0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:22
|
||||
msgid "BG1"
|
||||
msgstr "BG1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:23
|
||||
msgid "BG2"
|
||||
msgstr "BG2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:24
|
||||
msgid "BG3"
|
||||
msgstr "BG3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:25
|
||||
msgid "Boost : "
|
||||
msgstr "Boost : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:26
|
||||
msgid "Config"
|
||||
msgstr "Konfiguration"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:27
|
||||
msgid "DeSmuME"
|
||||
msgstr "DeSmuME"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:28
|
||||
msgid "DeSmuMe"
|
||||
msgstr "DeSmuMe"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:29
|
||||
msgid "Debug : "
|
||||
msgstr "Felsökning : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:30
|
||||
msgid "Down : "
|
||||
msgstr "Ner : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:31
|
||||
msgid "FrameSkip"
|
||||
msgstr "Hoppa över bildrutor"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:32
|
||||
msgid "IO regs"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:33
|
||||
msgid "Joystick Config"
|
||||
msgstr "Styrspakskonfiguration"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:34
|
||||
msgid "Joystick controls"
|
||||
msgstr "Styrspakskontroller"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:35
|
||||
msgid "Key definition"
|
||||
msgstr "Tangentdefinition"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:36
|
||||
msgid "Keyboad Config"
|
||||
msgstr "Tangentbordskonfiguration"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:37
|
||||
msgid "Keyboard controls"
|
||||
msgstr "Tangentbordskontroller"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:38
|
||||
msgid "L : "
|
||||
msgstr "V : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:39
|
||||
msgid "Layers"
|
||||
msgstr "Lager"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:40
|
||||
msgid "Left : "
|
||||
msgstr "Vänster : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:41
|
||||
msgid "Load State"
|
||||
msgstr "Läs in"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:42
|
||||
msgid "Nintendo DS emulator based on work by Yopyop"
|
||||
msgstr "Nintendo DS-emulator baserad på Yopyops arbete"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:43
|
||||
msgid "OBJ"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:44
|
||||
msgid "Press a button..."
|
||||
msgstr "Tryck på en knapp..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:45
|
||||
msgid "Press a key..."
|
||||
msgstr "Tryck på en tangent..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:46
|
||||
msgid "R : "
|
||||
msgstr "H : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:47
|
||||
msgid "Reset"
|
||||
msgstr "Nollställ"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:48
|
||||
msgid "Right : "
|
||||
msgstr "Höger : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:49
|
||||
msgid "Right Screen"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:50
|
||||
msgid "Rotate Screen 0"
|
||||
msgstr "Rotera skärmen 0"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:51
|
||||
msgid "Rotate Screen 180"
|
||||
msgstr "Rotera skärmen 180"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:52
|
||||
msgid "Rotate Screen 270"
|
||||
msgstr "Rotera skärmen 270"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:53
|
||||
msgid "Rotate Screen 90"
|
||||
msgstr "Rotera skärmen 90"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:54
|
||||
msgid "Save State"
|
||||
msgstr "Spara"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:55
|
||||
msgid "Select : "
|
||||
msgstr "Välj : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:56
|
||||
msgid "Size"
|
||||
msgstr "Storlek"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:57
|
||||
msgid "Start : "
|
||||
msgstr "Start : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:58
|
||||
msgid "State 1"
|
||||
msgstr "Plats 1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:59
|
||||
msgid "State 10"
|
||||
msgstr "Plats 10"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:60
|
||||
msgid "State 2"
|
||||
msgstr "Plats 2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:61
|
||||
msgid "State 3"
|
||||
msgstr "Plats 3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:62
|
||||
msgid "State 4"
|
||||
msgstr "Plats 4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:63
|
||||
msgid "State 5"
|
||||
msgstr "Plats 5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:64
|
||||
msgid "State 6"
|
||||
msgstr "Plats 6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:65
|
||||
msgid "State 7"
|
||||
msgstr "Plats 7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:66
|
||||
msgid "State 8"
|
||||
msgstr "Plats 8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:67
|
||||
msgid "State 9"
|
||||
msgstr "Plats 9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:68
|
||||
msgid "TYPE: Auto (1B)"
|
||||
msgstr "TYP: Auto (1B)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:69
|
||||
msgid "TYPE: EEPROM1 (4KB)"
|
||||
msgstr "TYP: EEPROM1 (4KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:70
|
||||
msgid "TYPE: EEPROM2 (512KB)"
|
||||
msgstr "TYP: EEPROM2 (512KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:71
|
||||
msgid "TYPE: EEPROM2 (64KB)"
|
||||
msgstr "TYP: EEPROM2 (64KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:72
|
||||
msgid "TYPE: FLASH (256KB)"
|
||||
msgstr "TYP: FLASH (256KB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:73
|
||||
msgid "TYPE: FRAM (2MB)"
|
||||
msgstr "TYP: FRAM (2MB)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:74
|
||||
msgid "Tools"
|
||||
msgstr "Verktyg"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:75
|
||||
msgid "True Gap"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:76
|
||||
msgid "Up : "
|
||||
msgstr "Upp : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:77
|
||||
msgid "View Memory"
|
||||
msgstr "Visa minne"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:78
|
||||
msgid "View Palette"
|
||||
msgstr "Visa palett"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:79
|
||||
msgid "View Tiles"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:80
|
||||
msgid "X : "
|
||||
msgstr "X : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:81
|
||||
msgid "Y : "
|
||||
msgstr "Y : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:82
|
||||
msgid "_Emulation"
|
||||
msgstr "_Emulering"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:83
|
||||
msgid "_File"
|
||||
msgstr "_Arkiv"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:84
|
||||
msgid "_PrintScreen"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:85
|
||||
msgid "_Saves"
|
||||
msgstr "_Sparningar"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:86
|
||||
msgid "http://desmume.sf.net"
|
||||
msgstr "http://desmume.sf.net"
|
||||
|
||||
#. TRANSLATORS: Replace this string with your names, one name per line.
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:88
|
||||
msgid "translator-credits"
|
||||
msgstr "Daniel Nylander <po@danielnylander.se>"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1
|
||||
msgid " GoTo: "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2
|
||||
msgid " Palette : "
|
||||
msgstr " Palett : "
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3
|
||||
msgid "0x00000000"
|
||||
msgstr "0x00000000"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4
|
||||
msgid "16 bit"
|
||||
msgstr "16 bitar"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5
|
||||
msgid "16c"
|
||||
msgstr "16 färger"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6
|
||||
msgid "256c"
|
||||
msgstr "256 färger"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7
|
||||
msgid "32 bit"
|
||||
msgstr "32 bitar"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8
|
||||
msgid "8 bit"
|
||||
msgstr "8 bitar"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:9
|
||||
msgid ""
|
||||
"ARM9 cpu\n"
|
||||
"ARM7 cpu"
|
||||
msgstr ""
|
||||
"ARM9-processor\n"
|
||||
"ARM7-processor"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11
|
||||
msgid "BMP"
|
||||
msgstr "BMP"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12
|
||||
msgid "Go!"
|
||||
msgstr "Kör!"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:13
|
||||
msgid "IO registers"
|
||||
msgstr "IO-register"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:14
|
||||
msgid "Palette Viewer"
|
||||
msgstr "Palettvisare"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:15
|
||||
msgid "Tile viewer"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:16
|
||||
msgid ""
|
||||
"cpu : ARM7\n"
|
||||
"cpu : ARM9"
|
||||
msgstr ""
|
||||
"processor : ARM7\n"
|
||||
"processor : ARM9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:18
|
||||
msgid "memory viewer"
|
||||
msgstr "minnesvisare"
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,270 @@
|
|||
# French translation for the desmume windows UI.
|
||||
# Copyright (C) 2007 The DeSmuME Team.
|
||||
# Luigi__, 2007.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2007-07-17 01:38-0400\n"
|
||||
"PO-Revision-Date: 2007-07-17 05:27-0400\n"
|
||||
"Last-Translator: Luigi__\n"
|
||||
"Language-Team: DeSmuME Team <desmume-devel@lists.sourceforge.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#, c-format
|
||||
|
||||
#: File menu
|
||||
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
msgid "Open ROM..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Recent ROM"
|
||||
msgstr ""
|
||||
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear"
|
||||
msgstr ""
|
||||
|
||||
msgid "ROM info"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save state as..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Load state as..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Save state"
|
||||
msgstr ""
|
||||
|
||||
msgid "Load state"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import backup memory"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save screenshot as..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Quick screenshot"
|
||||
msgstr ""
|
||||
|
||||
msgid "Record AVI"
|
||||
msgstr ""
|
||||
|
||||
msgid "Stop AVI"
|
||||
msgstr ""
|
||||
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
#: Emulation menu
|
||||
|
||||
msgid "Emulation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Pause"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
||||
msgid "Shut up"
|
||||
msgstr ""
|
||||
|
||||
msgid "GBA slot"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cheats"
|
||||
msgstr ""
|
||||
|
||||
msgid "List"
|
||||
msgstr ""
|
||||
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
#: View menu
|
||||
|
||||
msgid "View"
|
||||
msgstr ""
|
||||
|
||||
msgid "Rotation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Window size"
|
||||
msgstr ""
|
||||
|
||||
msgid "Screen separation"
|
||||
msgstr ""
|
||||
|
||||
msgid "None\t(0 px)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Narrow border\t(5 px)"
|
||||
msgstr ""
|
||||
|
||||
msgid "DS\t(64 px)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Force maintain ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Default size"
|
||||
msgstr ""
|
||||
|
||||
msgid "Display frame counter"
|
||||
msgstr ""
|
||||
|
||||
msgid "Display FPS"
|
||||
msgstr ""
|
||||
|
||||
msgid "Display input"
|
||||
msgstr ""
|
||||
|
||||
msgid "Display lag counter"
|
||||
msgstr ""
|
||||
|
||||
#: Config menu
|
||||
|
||||
msgid "Config"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save type"
|
||||
msgstr ""
|
||||
|
||||
msgid "Autodetect"
|
||||
msgstr ""
|
||||
|
||||
msgid "EEPROM 4kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "EEPROM 64kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "EEPROM 512kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "FRAM 256kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "FLASH 2mbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "FLASH 4mbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "3D settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Control config"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hotkey config"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sound settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Wifi settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Firmware settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Emulation settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Frameskip"
|
||||
msgstr ""
|
||||
|
||||
msgid "Limit framerate"
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto"
|
||||
msgstr ""
|
||||
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
|
||||
#: Tools menu
|
||||
|
||||
msgid "Disassembler"
|
||||
msgstr ""
|
||||
|
||||
msgid "View memory"
|
||||
msgstr ""
|
||||
|
||||
msgid "View registers"
|
||||
msgstr ""
|
||||
|
||||
msgid "View palettes"
|
||||
msgstr ""
|
||||
|
||||
msgid "View tiles"
|
||||
msgstr ""
|
||||
|
||||
msgid "View maps"
|
||||
msgstr ""
|
||||
|
||||
msgid "View OAMs"
|
||||
msgstr ""
|
||||
|
||||
msgid "View matrices"
|
||||
msgstr ""
|
||||
|
||||
msgid "View lights"
|
||||
msgstr ""
|
||||
|
||||
msgid "View layers"
|
||||
msgstr ""
|
||||
|
||||
msgid "Main BG 0"
|
||||
msgstr ""
|
||||
|
||||
msgid "Main BG 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "Main BG 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "Main BG 3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 0"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 3"
|
||||
msgstr ""
|
||||
|
||||
#: Help menu
|
||||
|
||||
msgid "Help"
|
||||
msgstr ""
|
||||
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
|
||||
msgid "Forums"
|
||||
msgstr ""
|
||||
|
||||
msgid "Submit a bug report"
|
||||
msgstr ""
|
||||
|
||||
msgid "About"
|
||||
msgstr ""
|
|
@ -0,0 +1,263 @@
|
|||
# French translation for the desmume windows UI.
|
||||
# Copyright (C) 2007 The DeSmuME Team.
|
||||
# Luigi__, 2007.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2007-07-17 01:38-0400\n"
|
||||
"PO-Revision-Date: 2009-04-03 23:53+0100\n"
|
||||
"Last-Translator: Luigi__\n"
|
||||
"Language-Team: DeSmuME Team <desmume-devel@lists.sourceforge.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: File menu
|
||||
#, c-format
|
||||
msgid "File"
|
||||
msgstr "Fichier"
|
||||
|
||||
msgid "Open ROM..."
|
||||
msgstr "Ouvrir une ROM..."
|
||||
|
||||
msgid "Recent ROM"
|
||||
msgstr "ROMs récentes"
|
||||
|
||||
msgid "None"
|
||||
msgstr "Aucune"
|
||||
|
||||
msgid "Clear"
|
||||
msgstr "Vider"
|
||||
|
||||
msgid "ROM info"
|
||||
msgstr "Info ROM"
|
||||
|
||||
msgid "Save state as..."
|
||||
msgstr "Save state as..."
|
||||
|
||||
msgid "Load state as..."
|
||||
msgstr "Load state as..."
|
||||
|
||||
msgid "Save state"
|
||||
msgstr "Save state"
|
||||
|
||||
msgid "Load state"
|
||||
msgstr "Load state"
|
||||
|
||||
msgid "Import backup memory"
|
||||
msgstr "Importer une sauvegarde"
|
||||
|
||||
msgid "Save screenshot as..."
|
||||
msgstr "Capture d'écran..."
|
||||
|
||||
msgid "Quick screenshot"
|
||||
msgstr "Capture d'écran rapide"
|
||||
|
||||
msgid "Record AVI"
|
||||
msgstr "Record AVI"
|
||||
|
||||
msgid "Stop AVI"
|
||||
msgstr "Stop AVI"
|
||||
|
||||
msgid "Quit"
|
||||
msgstr "Quitter"
|
||||
|
||||
#: Emulation menu
|
||||
msgid "Emulation"
|
||||
msgstr "Emulation"
|
||||
|
||||
msgid "Pause"
|
||||
msgstr "Pause"
|
||||
|
||||
msgid "Reset"
|
||||
msgstr "Reset"
|
||||
|
||||
msgid "Shut up"
|
||||
msgstr "Shut up"
|
||||
|
||||
msgid "GBA slot"
|
||||
msgstr "Slot GBA"
|
||||
|
||||
msgid "Cheats"
|
||||
msgstr "Codes de triche"
|
||||
|
||||
msgid "List"
|
||||
msgstr "Liste"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "Recherche"
|
||||
|
||||
#: View menu
|
||||
msgid "View"
|
||||
msgstr "Affichage"
|
||||
|
||||
msgid "Rotation"
|
||||
msgstr "Rotation"
|
||||
|
||||
msgid "Window size"
|
||||
msgstr "Taille fenêtre"
|
||||
|
||||
msgid "Screen separation"
|
||||
msgstr "Séparation écrans"
|
||||
|
||||
msgid "None\t(0 px)"
|
||||
msgstr "Aucune\t(0 px)"
|
||||
|
||||
msgid "Narrow border\t(5 px)"
|
||||
msgstr "Bordure fine\t(5 px)"
|
||||
|
||||
msgid "DS\t(64 px)"
|
||||
msgstr "DS\t(64 px)"
|
||||
|
||||
msgid "Force maintain ratio"
|
||||
msgstr "Conserver le ratio"
|
||||
|
||||
msgid "Default size"
|
||||
msgstr "Taille par défaut"
|
||||
|
||||
msgid "Display frame counter"
|
||||
msgstr "Afficher compteur d'images"
|
||||
|
||||
msgid "Display FPS"
|
||||
msgstr "Afficher FPS"
|
||||
|
||||
msgid "Display input"
|
||||
msgstr "Afficher input"
|
||||
|
||||
msgid "Display lag counter"
|
||||
msgstr "Afficher compteur de lag"
|
||||
|
||||
#: Config menu
|
||||
msgid "Config"
|
||||
msgstr "Config"
|
||||
|
||||
msgid "Save type"
|
||||
msgstr "Type sauvegarde"
|
||||
|
||||
msgid "Autodetect"
|
||||
msgstr "Autodétection"
|
||||
|
||||
msgid "EEPROM 4kbit"
|
||||
msgstr "EEPROM 4kbit"
|
||||
|
||||
msgid "EEPROM 64kbit"
|
||||
msgstr "EEPROM 64kbit"
|
||||
|
||||
msgid "EEPROM 512kbit"
|
||||
msgstr "EEPROM 512kbit"
|
||||
|
||||
msgid "FRAM 256kbit"
|
||||
msgstr "FRAM 256kbit"
|
||||
|
||||
msgid "FLASH 2mbit"
|
||||
msgstr "FLASH 2mbit"
|
||||
|
||||
msgid "FLASH 4mbit"
|
||||
msgstr "FLASH 4mbit"
|
||||
|
||||
msgid "3D settings"
|
||||
msgstr "Config. 3D"
|
||||
|
||||
msgid "Control config"
|
||||
msgstr "Config. contrôles"
|
||||
|
||||
msgid "Hotkey config"
|
||||
msgstr "Config. hotkeys"
|
||||
|
||||
msgid "Sound settings"
|
||||
msgstr "Config. son"
|
||||
|
||||
msgid "Wifi settings"
|
||||
msgstr "Config. wifi"
|
||||
|
||||
msgid "Firmware settings"
|
||||
msgstr "Config. firmware"
|
||||
|
||||
msgid "Emulation settings"
|
||||
msgstr "Config émulation"
|
||||
|
||||
msgid "Frameskip"
|
||||
msgstr "Frameskip"
|
||||
|
||||
msgid "Limit framerate"
|
||||
msgstr "Limiter framerate"
|
||||
|
||||
msgid "Auto"
|
||||
msgstr "Auto"
|
||||
|
||||
msgid "Language"
|
||||
msgstr "Langage"
|
||||
|
||||
#: Tools menu
|
||||
msgid "Disassembler"
|
||||
msgstr "Désassembleur"
|
||||
|
||||
msgid "View memory"
|
||||
msgstr "Visualiser la mémoire"
|
||||
|
||||
msgid "View registers"
|
||||
msgstr "Visualiser les registres"
|
||||
|
||||
msgid "View palettes"
|
||||
msgstr "Visualiser les palettes"
|
||||
|
||||
msgid "View tiles"
|
||||
msgstr "Visualiser les tiles"
|
||||
|
||||
msgid "View maps"
|
||||
msgstr "Visualiser les maps"
|
||||
|
||||
msgid "View OAMs"
|
||||
msgstr "Visualiser les OAMs"
|
||||
|
||||
msgid "View matrices"
|
||||
msgstr "Visualiser les matrices"
|
||||
|
||||
msgid "View lights"
|
||||
msgstr "Visualiser les lights"
|
||||
|
||||
msgid "View layers"
|
||||
msgstr "Voir couches"
|
||||
|
||||
msgid "Main BG 0"
|
||||
msgstr "Main BG 0"
|
||||
|
||||
msgid "Main BG 1"
|
||||
msgstr "Main BG 1"
|
||||
|
||||
msgid "Main BG 2"
|
||||
msgstr "Main BG 2"
|
||||
|
||||
msgid "Main BG 3"
|
||||
msgstr "Main BG 3"
|
||||
|
||||
msgid "Sub BG 0"
|
||||
msgstr "Sub BG 0"
|
||||
|
||||
msgid "Sub BG 1"
|
||||
msgstr "Sub BG 1"
|
||||
|
||||
msgid "Sub BG 2"
|
||||
msgstr "Sub BG 2"
|
||||
|
||||
msgid "Sub BG 3"
|
||||
msgstr "Sub BG 3"
|
||||
|
||||
#: Help menu
|
||||
msgid "Help"
|
||||
msgstr "?"
|
||||
|
||||
msgid "Website"
|
||||
msgstr "Site web"
|
||||
|
||||
msgid "Forums"
|
||||
msgstr "Forums"
|
||||
|
||||
msgid "Submit a bug report"
|
||||
msgstr "Soumettre un report de bug"
|
||||
|
||||
msgid "About"
|
||||
msgstr "A propos"
|
||||
|
|
@ -0,0 +1,265 @@
|
|||
# French translation for the desmume windows UI.
|
||||
# Copyright (C) 2009 The DeSmuME Team.
|
||||
# F.E.Nebula, 2009.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2007-07-17 01:38-0400\n"
|
||||
"PO-Revision-Date: 2009-06-24 11:00+0800\n"
|
||||
"Last-Translator: F.E.Nebula <FENebula@gmail.com>\n"
|
||||
"Language-Team: DeSmuME Team <desmume-devel@lists.sourceforge.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-Language: Chinese\n"
|
||||
"X-Poedit-Country: CHINA\n"
|
||||
|
||||
#: File menu
|
||||
#, c-format
|
||||
msgid "File"
|
||||
msgstr "文件"
|
||||
|
||||
msgid "Open ROM..."
|
||||
msgstr "打开ROM..."
|
||||
|
||||
msgid "Recent ROM"
|
||||
msgstr "最近的ROM"
|
||||
|
||||
msgid "None"
|
||||
msgstr "空"
|
||||
|
||||
msgid "Clear"
|
||||
msgstr "清空"
|
||||
|
||||
msgid "ROM info"
|
||||
msgstr "ROM信息"
|
||||
|
||||
msgid "Save state as..."
|
||||
msgstr "即时存档为..."
|
||||
|
||||
msgid "Load state as..."
|
||||
msgstr "即时读档为..."
|
||||
|
||||
msgid "Save state"
|
||||
msgstr "即时存档"
|
||||
|
||||
msgid "Load state"
|
||||
msgstr "即时读档"
|
||||
|
||||
msgid "Import backup memory"
|
||||
msgstr "导入后备内存"
|
||||
|
||||
msgid "Save screenshot as..."
|
||||
msgstr "另存屏幕截图为"
|
||||
|
||||
msgid "Quick screenshot"
|
||||
msgstr "快速截图"
|
||||
|
||||
msgid "Record AVI"
|
||||
msgstr "录制AVI"
|
||||
|
||||
msgid "Stop AVI"
|
||||
msgstr "停止录制AVI"
|
||||
|
||||
msgid "Quit"
|
||||
msgstr "退出"
|
||||
|
||||
#: Emulation menu
|
||||
msgid "Emulation"
|
||||
msgstr "模拟"
|
||||
|
||||
msgid "Pause"
|
||||
msgstr "暂停"
|
||||
|
||||
msgid "Reset"
|
||||
msgstr "复位"
|
||||
|
||||
msgid "Shut up"
|
||||
msgstr "静音"
|
||||
|
||||
msgid "GBA slot"
|
||||
msgstr "GBA插槽"
|
||||
|
||||
msgid "Cheats"
|
||||
msgstr "金手指"
|
||||
|
||||
msgid "List"
|
||||
msgstr "列表"
|
||||
|
||||
msgid "Search"
|
||||
msgstr "搜索"
|
||||
|
||||
#: View menu
|
||||
msgid "View"
|
||||
msgstr "查看"
|
||||
|
||||
msgid "Rotation"
|
||||
msgstr "旋转"
|
||||
|
||||
msgid "Window size"
|
||||
msgstr "窗口大小"
|
||||
|
||||
msgid "Screen separation"
|
||||
msgstr "分割窗口"
|
||||
|
||||
msgid "None\t(0 px)"
|
||||
msgstr "无\t(0 px)"
|
||||
|
||||
msgid "Narrow border\t(5 px)"
|
||||
msgstr "窄线\t(5 px)"
|
||||
|
||||
msgid "DS\t(64 px)"
|
||||
msgstr "DS实际宽度\t(64 px)"
|
||||
|
||||
msgid "Force maintain ratio"
|
||||
msgstr "强制保持比例"
|
||||
|
||||
msgid "Default size"
|
||||
msgstr "默认大小"
|
||||
|
||||
msgid "Display frame counter"
|
||||
msgstr "显示帧计数器"
|
||||
|
||||
msgid "Display FPS"
|
||||
msgstr "显示FPS"
|
||||
|
||||
msgid "Display input"
|
||||
msgstr "显示输入"
|
||||
|
||||
msgid "Display lag counter"
|
||||
msgstr "显示标志计数器"
|
||||
|
||||
#: Config menu
|
||||
msgid "Config"
|
||||
msgstr "设置"
|
||||
|
||||
msgid "Save type"
|
||||
msgstr "存档类型"
|
||||
|
||||
msgid "Autodetect"
|
||||
msgstr "自动选择"
|
||||
|
||||
msgid "EEPROM 4kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "EEPROM 64kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "EEPROM 512kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "FRAM 256kbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "FLASH 2mbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "FLASH 4mbit"
|
||||
msgstr ""
|
||||
|
||||
msgid "3D settings"
|
||||
msgstr "3D设置"
|
||||
|
||||
msgid "Control config"
|
||||
msgstr "控制器设置"
|
||||
|
||||
msgid "Hotkey config"
|
||||
msgstr "热键设置"
|
||||
|
||||
msgid "Sound settings"
|
||||
msgstr "声音设置"
|
||||
|
||||
msgid "Wifi settings"
|
||||
msgstr "Wifi设置"
|
||||
|
||||
msgid "Firmware settings"
|
||||
msgstr "固件设置"
|
||||
|
||||
msgid "Emulation settings"
|
||||
msgstr "模拟选项设置"
|
||||
|
||||
msgid "Frameskip"
|
||||
msgstr "跳帧"
|
||||
|
||||
msgid "Limit framerate"
|
||||
msgstr "限制帧率"
|
||||
|
||||
msgid "Auto"
|
||||
msgstr "自动"
|
||||
|
||||
msgid "Language"
|
||||
msgstr "语言"
|
||||
|
||||
#: Tools menu
|
||||
msgid "Disassembler"
|
||||
msgstr "反汇编"
|
||||
|
||||
msgid "View memory"
|
||||
msgstr "查看内存"
|
||||
|
||||
msgid "View registers"
|
||||
msgstr "查看寄存器"
|
||||
|
||||
msgid "View palettes"
|
||||
msgstr "查看调色板"
|
||||
|
||||
msgid "View tiles"
|
||||
msgstr "查看Tile"
|
||||
|
||||
msgid "View maps"
|
||||
msgstr "查看映射"
|
||||
|
||||
msgid "View OAMs"
|
||||
msgstr "产看OAM"
|
||||
|
||||
msgid "View matrices"
|
||||
msgstr "查看矩阵"
|
||||
|
||||
msgid "View lights"
|
||||
msgstr "查看光照"
|
||||
|
||||
msgid "View layers"
|
||||
msgstr "查看图层"
|
||||
|
||||
msgid "Main BG 0"
|
||||
msgstr ""
|
||||
|
||||
msgid "Main BG 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "Main BG 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "Main BG 3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 0"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 1"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 2"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sub BG 3"
|
||||
msgstr ""
|
||||
|
||||
#: Help menu
|
||||
msgid "Help"
|
||||
msgstr "帮助"
|
||||
|
||||
msgid "Website"
|
||||
msgstr "主页"
|
||||
|
||||
msgid "Forums"
|
||||
msgstr "论坛"
|
||||
|
||||
msgid "Submit a bug report"
|
||||
msgstr "提交BUG报告"
|
||||
|
||||
msgid "About"
|
||||
msgstr "关于"
|
||||
|
|
@ -0,0 +1,676 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: desmume\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-12-28 15:37+0100\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: Ronmi Ren <ronmi@rmi.twbbs.org>\n"
|
||||
"Language-Team: DeSmuME Team <desmume-devel@lists.sourceforge.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-Language: Chinese\n"
|
||||
"X-Poedit-Country: TAIWAN\n"
|
||||
"X-Poedit-SourceCharset: iso-8859-1\n"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:53
|
||||
#, c-format
|
||||
msgid "State %d (empty)"
|
||||
msgstr "存檔 %d (空的)"
|
||||
|
||||
#. Creating the selection window
|
||||
#: ../src/gtk-glade/callbacks.cpp:166
|
||||
msgid "Open..."
|
||||
msgstr "開啟..."
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:175
|
||||
msgid "Nds binary (.nds)"
|
||||
msgstr "NDS遊戲 (.nds)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:176
|
||||
msgid "Nds binary with loader (.ds.gba)"
|
||||
msgstr "NDS遊戲與載入器 (.ds.gba)"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:177
|
||||
msgid "All files"
|
||||
msgstr "所有檔案"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:192
|
||||
#: ../src/gtk-glade/main.cpp:553
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Unable to load :\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"載入失敗:\n"
|
||||
"%s"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:408
|
||||
msgid "You don't have any joystick!"
|
||||
msgstr "沒有偵測到搖桿"
|
||||
|
||||
#: ../src/gtk-glade/callbacks.cpp:410
|
||||
msgid "Can't configure joystick while the game is running!"
|
||||
msgstr "在遊戲執行時不可以調整搖桿設定"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:66
|
||||
#, c-format
|
||||
msgid "*** Cannot get %s attribute value\n"
|
||||
msgstr "*** 無法取得屬性 %s 的值\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:164
|
||||
#, c-format
|
||||
msgid "*** Failed to create pixmap.\n"
|
||||
msgstr "*** 創造點陣圖失敗\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:174
|
||||
#, c-format
|
||||
msgid "*** No appropriate OpenGL-capable visual found.\n"
|
||||
msgstr "*** 找不到與 OpenGL 相容的可用視覺效果\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:187
|
||||
#, c-format
|
||||
msgid "Failed to create the GdkGLPixmap\n"
|
||||
msgstr "創造 GdkGLPixmap 失敗\n"
|
||||
|
||||
#: ../src/gtk-glade/gdk_3Demu.cpp:197
|
||||
#, c-format
|
||||
msgid "Connot create the OpenGL rendering context\n"
|
||||
msgstr "創造 OpenGL rendering context 失敗\n"
|
||||
|
||||
#: ../src/gtk-glade/glade-xml.cpp:58
|
||||
#, c-format
|
||||
msgid "could not find signal handler '%s'."
|
||||
msgstr "找不到 signal handler '%s'"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:132
|
||||
#, c-format
|
||||
msgid "USAGE: %s [OPTIONS] [nds-file]\n"
|
||||
msgstr "使用方式: %s [選項] [nds檔]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:133
|
||||
#, c-format
|
||||
msgid "OPTIONS:\n"
|
||||
msgstr "可用選項:\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:134
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --load-slot=NUM Load game saved under NUM position.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --load-slot=存檔編號 讀取第幾號的即時存檔\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:137
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --soft-convert Use software colour conversion during OpenGL\n"
|
||||
" screen rendering. May produce better or worse\n"
|
||||
" frame rates depending on hardware.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --soft-convert 在 OpenGL 模式中使用軟體轉換色彩。\n"
|
||||
" 在不同的硬體下,效能可能更好也可能更壞。\n"
|
||||
" \n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:142
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --3d-engine=ENGINE Selects 3D rendering engine\n"
|
||||
" 0 = disabled\n"
|
||||
" 1 = internal desmume rasterizer (default)\n"
|
||||
msgstr ""
|
||||
" --3d-engine=3D引擎 選擇3D引擎\n"
|
||||
" 0 = 不使用3D\n"
|
||||
" 1 = desmume內建的軟體模擬引擎 (預設值)\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:147
|
||||
#, c-format
|
||||
msgid ""
|
||||
" 2 = gtkglext off-screen 3d opengl\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" 2 = gtkglext 於幕後演算的 OpenGL 3D 支援\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:150
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --disable-limiter Disables the 60 fps limiter\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --disable-limiter 取消畫面更新率最高60的上限\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:152
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --save-type=TYPE Selects savetype:\n"
|
||||
" 0 = Autodetect (default)\n"
|
||||
" 1 = EEPROM 4kbit\n"
|
||||
" 2 = EEPROM 64kbit\n"
|
||||
" 3 = EEPROM 512kbit\n"
|
||||
" 4 = FRAM 256kbit\n"
|
||||
" 5 = FLASH 2mbit\n"
|
||||
" 6 = FLASH 4mbit\n"
|
||||
" \n"
|
||||
msgstr ""
|
||||
" --save-type=類型 選擇記憶卡類型:\n"
|
||||
" 0 = 自動選擇 (default)\n"
|
||||
" 1 = EEPROM 4kbit\n"
|
||||
" 2 = EEPROM 64kbit\n"
|
||||
" 3 = EEPROM 512kbit\n"
|
||||
" 4 = FRAM 256kbit\n"
|
||||
" 5 = FLASH 2mbit\n"
|
||||
" 6 = FLASH 4mbit\n"
|
||||
" \n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:162
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --fwlang=LANG Set the language in the firmware, LANG as follows:\n"
|
||||
" 0 = Japanese\n"
|
||||
" 1 = English\n"
|
||||
" 2 = French\n"
|
||||
" 3 = German\n"
|
||||
" 4 = Italian\n"
|
||||
" 5 = Spanish\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
" --fwlang=LANG 設定韌體的語言, 可用的 LANG 設定有:\n"
|
||||
" 0 = 日文\n"
|
||||
" 1 = 英文\n"
|
||||
" 2 = 法文\n"
|
||||
" 3 = 德文\n"
|
||||
" 4 = 義大利文\n"
|
||||
" 5 = 西班牙文\n"
|
||||
"\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:171
|
||||
#, c-format
|
||||
msgid ""
|
||||
" --arm9gdb=PORT_NUM Enable the ARM9 GDB stub on the given port\n"
|
||||
" --arm7gdb=PORT_NUM Enable the ARM7 GDB stub on the given port\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:175
|
||||
#, c-format
|
||||
msgid " --help Display this message\n"
|
||||
msgstr " --help 顯示這份幫助訊息\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:188
|
||||
#, c-format
|
||||
msgid "I only know how to load from slots 1-10.\n"
|
||||
msgstr "即時存檔的編號只能介於 1 到 10 之間\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:212
|
||||
#, c-format
|
||||
msgid "Supported 3d engines: 0, 1, and on some machines 2; use --help option for details\n"
|
||||
msgstr "可用的3D引擎有: 0, 1, 在某些機器上可能可以用2; 你可以用 --help 選項查看詳細說明\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:224
|
||||
#, c-format
|
||||
msgid "select savetype from 0 to 6; use --help option for details\n"
|
||||
msgstr "記憶卡的類型只能介於 0 到 6之間; 你可以用 --help 選項查看詳細說明\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:236
|
||||
#, c-format
|
||||
msgid "Firmware language must be set to a value from 0 to 5.\n"
|
||||
msgstr "韌體語言必須設定 0 到 5 之間的值\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:249
|
||||
#, c-format
|
||||
msgid "ARM9 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:261
|
||||
#, c-format
|
||||
msgid "ARM7 GDB stub port must be in the range 1 to 65535\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:274
|
||||
#, c-format
|
||||
msgid "NDS file (\"%s\") already set\n"
|
||||
msgstr "NDS檔 (\"%s\") 已經設定\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:287
|
||||
#, c-format
|
||||
msgid "USAGE: %s [options] [nds-file]\n"
|
||||
msgstr "使用方式: %s [選項] [nds檔]\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:288
|
||||
#, c-format
|
||||
msgid "USAGE: %s --help - for help\n"
|
||||
msgstr "使用方式: %s --help - 顯示幫助訊息\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:466
|
||||
#, c-format
|
||||
msgid "Failed to create ARM9 gdbstub on port %d\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:477
|
||||
#, c-format
|
||||
msgid "Failed to create ARM7 gdbstub on port %d\n"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:486
|
||||
#, c-format
|
||||
msgid "Error trying to initialize SDL: %s\n"
|
||||
msgstr "SDL 初始化錯誤: %s\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:569
|
||||
#, c-format
|
||||
msgid "Failed to initialise openGL 3D emulation; removing 3D support\n"
|
||||
msgstr "無法初始化 OpenGL 3D 模擬。取消 3D 支援\n"
|
||||
|
||||
#: ../src/gtk-glade/main.cpp:576
|
||||
#, c-format
|
||||
msgid "Failed to setup 3D engine; removing 3D support\n"
|
||||
msgstr "無法設定 OpenGL 3D 模擬; 取消 3D 支援\n"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:1
|
||||
msgid "0"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:2
|
||||
msgid "1"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:3
|
||||
msgid "1x"
|
||||
msgstr "原始大小"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:4
|
||||
msgid "2"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:5
|
||||
msgid "2x"
|
||||
msgstr "2倍"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:6
|
||||
msgid "3"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:7
|
||||
msgid "3D operation detected"
|
||||
msgstr "偵測到 3D 操作"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:8
|
||||
msgid "3D rom"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:9
|
||||
msgid "3x"
|
||||
msgstr "3倍"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:10
|
||||
msgid "4"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:11
|
||||
msgid "5"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:12
|
||||
msgid "6"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:13
|
||||
msgid "7"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:14
|
||||
msgid "8"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:15
|
||||
msgid "9"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:16
|
||||
msgid "?"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:17
|
||||
msgid "A : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:18
|
||||
msgid "Audio On"
|
||||
msgstr "開啟音效"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:19
|
||||
msgid "Axis :"
|
||||
msgstr "方向軸 :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:20
|
||||
msgid "B : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:21
|
||||
msgid "BG0"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:22
|
||||
msgid "BG1"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:23
|
||||
msgid "BG2"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:24
|
||||
msgid "BG3"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:25
|
||||
msgid "Boost : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:26
|
||||
msgid "Config"
|
||||
msgstr "設定"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:27
|
||||
msgid "DeSmuME"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:28
|
||||
msgid "Debug : "
|
||||
msgstr "除錯 :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:29
|
||||
msgid "Down : "
|
||||
msgstr "下 :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:30
|
||||
msgid "FrameSkip"
|
||||
msgstr "畫面跳過"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:31
|
||||
msgid "IO regs"
|
||||
msgstr "IO 暫存器"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:32
|
||||
msgid "Joystick Config"
|
||||
msgstr "搖桿設定"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:33
|
||||
msgid "Joystick controls"
|
||||
msgstr "搖桿控制"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:34
|
||||
msgid "Key definition"
|
||||
msgstr "按鍵定義"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:35
|
||||
msgid "Keyboard Config"
|
||||
msgstr "鍵盤設定"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:36
|
||||
msgid "Keyboard controls"
|
||||
msgstr "鍵盤控制"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:37
|
||||
msgid "L : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:38
|
||||
msgid "Layers"
|
||||
msgstr "圖層"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:39
|
||||
msgid "Left : "
|
||||
msgstr "左 :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:40
|
||||
msgid "Load State"
|
||||
msgstr "讀取即時存檔"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:41
|
||||
msgid "Nintendo DS emulator based on work by Yopyop"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:42
|
||||
msgid "No Gap"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:43
|
||||
msgid "OBJ"
|
||||
msgstr "物件"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:44
|
||||
msgid "Press a button..."
|
||||
msgstr "請按一個按鈕..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:45
|
||||
msgid "Press a key..."
|
||||
msgstr "請按一個按鍵..."
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:46
|
||||
msgid "R : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:47
|
||||
msgid "Reset"
|
||||
msgstr "重新啟動"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:48
|
||||
msgid "Right : "
|
||||
msgstr "右 :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:49
|
||||
msgid "Right Screen"
|
||||
msgstr "視窗水平排列"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:50
|
||||
msgid "Rotate Screen 0"
|
||||
msgstr "螢幕旋轉 0 度"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:51
|
||||
msgid "Rotate Screen 180"
|
||||
msgstr "螢幕旋轉 180 度"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:52
|
||||
msgid "Rotate Screen 270"
|
||||
msgstr "螢幕旋轉 270 度"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:53
|
||||
msgid "Rotate Screen 90"
|
||||
msgstr "螢幕旋轉 90 度"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:54
|
||||
msgid "Save State"
|
||||
msgstr "即時存檔"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:55
|
||||
msgid "Select : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:56
|
||||
msgid "Size"
|
||||
msgstr "大小"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:57
|
||||
msgid "Start : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:58
|
||||
msgid "State 1"
|
||||
msgstr "存檔 1"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:59
|
||||
msgid "State 10"
|
||||
msgstr "存檔 10"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:60
|
||||
msgid "State 2"
|
||||
msgstr "存檔 2"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:61
|
||||
msgid "State 3"
|
||||
msgstr "存檔 3"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:62
|
||||
msgid "State 4"
|
||||
msgstr "存檔 4"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:63
|
||||
msgid "State 5"
|
||||
msgstr "存檔 5"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:64
|
||||
msgid "State 6"
|
||||
msgstr "存檔 6"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:65
|
||||
msgid "State 7"
|
||||
msgstr "存檔 7"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:66
|
||||
msgid "State 8"
|
||||
msgstr "存檔 8"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:67
|
||||
msgid "State 9"
|
||||
msgstr "存檔 9"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:68
|
||||
msgid "TYPE: Auto (1B)"
|
||||
msgstr "TYPE: 自動選擇 (1B)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:69
|
||||
msgid "TYPE: EEPROM1 (4kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:70
|
||||
msgid "TYPE: EEPROM2 (512kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:71
|
||||
msgid "TYPE: EEPROM2 (64kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:72
|
||||
msgid "TYPE: FLASH (256kB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:73
|
||||
msgid "TYPE: FRAM (2MB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:74
|
||||
msgid "TYPE: FRAM (4MB)"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:75
|
||||
msgid "Tools"
|
||||
msgstr "工具"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:76
|
||||
msgid "True Gap"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:77
|
||||
msgid "Up : "
|
||||
msgstr "上 :"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:78
|
||||
msgid "View Memory"
|
||||
msgstr "檢視記憶體"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:79
|
||||
msgid "View Palette"
|
||||
msgstr "檢視調色盤"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:80
|
||||
msgid "View Tiles"
|
||||
msgstr "檢視物件"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:81
|
||||
msgid "X : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:82
|
||||
msgid "Y : "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:83
|
||||
msgid "_Emulation"
|
||||
msgstr "模擬器 (_E)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:84
|
||||
msgid "_File"
|
||||
msgstr "檔案 (_F)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:85
|
||||
msgid "_PrintScreen"
|
||||
msgstr "截圖 (_P)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:86
|
||||
msgid "_Saves"
|
||||
msgstr "存檔 (_S)"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:87
|
||||
msgid "http://desmume.org"
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: Replace this string with your names, one name per line.
|
||||
#: ../src/gtk-glade/glade/DeSmuMe.glade.h:89
|
||||
msgid "translator-credits"
|
||||
msgstr "Ronmi Ren <ronmi@rmi.twbbs.org>"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:1
|
||||
msgid " GoTo: "
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:2
|
||||
msgid " Palette : "
|
||||
msgstr "調色盤:"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:3
|
||||
msgid "16 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:4
|
||||
msgid "16c"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:5
|
||||
msgid "256c"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:6
|
||||
msgid "32 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:7
|
||||
msgid "8 bit"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:8
|
||||
msgid ""
|
||||
"ARM9 cpu\n"
|
||||
"ARM7 cpu"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:10
|
||||
msgid "BMP"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:11
|
||||
msgid "Go!"
|
||||
msgstr "執行"
|
||||
|
||||
#: ../src/gtk-glade/glade/DeSmuMe_Dtools.glade.h:12
|
||||
msgid ""
|
||||
"cpu : ARM9\n"
|
||||
"cpu : ARM7"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Error trying to start FPS limiter timer: %s\n"
|
||||
#~ msgstr "無法啟始 fps 限制的計時器: %s\n"
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = tab
|
|
@ -1,392 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2008-2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "Database.h"
|
||||
#include "retro_miscellaneous.h"
|
||||
|
||||
//------------------------------------------------------------
|
||||
//large databases are first. scroll down to ENDLARGE to find the code
|
||||
|
||||
struct MAKER
|
||||
{
|
||||
u16 code;
|
||||
const char* name;
|
||||
};
|
||||
|
||||
|
||||
static const char regions_index[] = "JPFSEODIRKHXVWUC";
|
||||
static const char *regions[] = {
|
||||
"JPN", // J
|
||||
"EUR", // P
|
||||
"FRA", // F
|
||||
"ESP", // S
|
||||
"USA", // E
|
||||
"INT", // O
|
||||
"NOE", // D
|
||||
"ITA", // I
|
||||
"RUS", // R
|
||||
"KOR", // K
|
||||
"HOL", // H
|
||||
"EUU", // X
|
||||
"EUU", // V
|
||||
"EUU", // W
|
||||
"AUS", // U
|
||||
"CHN", // C
|
||||
};
|
||||
|
||||
static MAKER makerCodes[] = {
|
||||
{ 0x3130, "Nintendo" },
|
||||
{ 0x3230, "Rocket Games, Ajinomoto" },
|
||||
{ 0x3330, "Imagineer-Zoom" },
|
||||
{ 0x3430, "Gray Matter?" },
|
||||
{ 0x3530, "Zamuse" },
|
||||
{ 0x3630, "Falcom" },
|
||||
{ 0x3730, "Enix?" },
|
||||
{ 0x3830, "Capcom" },
|
||||
{ 0x3930, "Hot B Co." },
|
||||
{ 0x4130, "Jaleco" },
|
||||
{ 0x4230, "Coconuts Japan" },
|
||||
{ 0x4330, "Coconuts Japan/G.X.Media" },
|
||||
{ 0x4430, "Micronet?" },
|
||||
{ 0x4530, "Technos" },
|
||||
{ 0x4630, "Mebio Software" },
|
||||
{ 0x4730, "Shouei System" },
|
||||
{ 0x4830, "Starfish" },
|
||||
{ 0x4A30, "Mitsui Fudosan/Dentsu" },
|
||||
{ 0x4C30, "Warashi Inc." },
|
||||
{ 0x4E30, "Nowpro" },
|
||||
{ 0x5030, "Game Village" },
|
||||
{ 0x3031, "?????????????" },
|
||||
{ 0x3231, "Infocom" },
|
||||
{ 0x3331, "Electronic Arts Japan" },
|
||||
{ 0x3531, "Cobra Team" },
|
||||
{ 0x3631, "Human/Field" },
|
||||
{ 0x3731, "KOEI" },
|
||||
{ 0x3831, "Hudson Soft" },
|
||||
{ 0x3931, "S.C.P." },
|
||||
{ 0x4131, "Yanoman" },
|
||||
{ 0x4331, "Tecmo Products" },
|
||||
{ 0x4431, "Japan Glary Business" },
|
||||
{ 0x4531, "Forum/OpenSystem" },
|
||||
{ 0x4631, "Virgin Games" },
|
||||
{ 0x4731, "SMDE" },
|
||||
{ 0x4A31, "Daikokudenki" },
|
||||
{ 0x5031, "Creatures Inc." },
|
||||
{ 0x5131, "TDK Deep Impresion" },
|
||||
{ 0x3032, "Destination Software, KSS" },
|
||||
{ 0x3132, "Sunsoft/Tokai Engineering??" },
|
||||
{ 0x3232, "POW, VR 1 Japan??" },
|
||||
{ 0x3332, "Micro World" },
|
||||
{ 0x3532, "San-X" },
|
||||
{ 0x3632, "Enix" },
|
||||
{ 0x3732, "Loriciel/Electro Brain" },
|
||||
{ 0x3832, "Kemco Japan" },
|
||||
{ 0x3932, "Seta" },
|
||||
{ 0x4132, "Culture Brain" },
|
||||
{ 0x4332, "Palsoft" },
|
||||
{ 0x4432, "Visit Co.,Ltd." },
|
||||
{ 0x4532, "Intec" },
|
||||
{ 0x4632, "System Sacom" },
|
||||
{ 0x4732, "Poppo" },
|
||||
{ 0x4832, "Ubisoft Japan" },
|
||||
{ 0x4A32, "Media Works" },
|
||||
{ 0x4B32, "NEC InterChannel" },
|
||||
{ 0x4C32, "Tam" },
|
||||
{ 0x4D32, "Jordan" },
|
||||
{ 0x4E32, "Smilesoft ???, Rocket ???" },
|
||||
{ 0x5132, "Mediakite" },
|
||||
{ 0x3033, "Viacom" },
|
||||
{ 0x3133, "Carrozzeria" },
|
||||
{ 0x3233, "Dynamic" },
|
||||
{ 0x3433, "Magifact" },
|
||||
{ 0x3533, "Hect" },
|
||||
{ 0x3633, "Codemasters" },
|
||||
{ 0x3733, "Taito/GAGA Communications" },
|
||||
{ 0x3833, "Laguna" },
|
||||
{ 0x3933, "Telstar Fun & Games, Event/Taito" },
|
||||
{ 0x4233, "Arcade Zone Ltd" },
|
||||
{ 0x4333, "Entertainment International/Empire Software?" },
|
||||
{ 0x4433, "Loriciel" },
|
||||
{ 0x4533, "Gremlin Graphics" },
|
||||
{ 0x4633, "K.Amusement Leasing Co." },
|
||||
{ 0x3034, "Seika Corp." },
|
||||
{ 0x3134, "Ubi Soft Entertainment" },
|
||||
{ 0x3234, "Sunsoft US?" },
|
||||
{ 0x3434, "Life Fitness" },
|
||||
{ 0x3634, "System 3" },
|
||||
{ 0x3734, "Spectrum Holobyte" },
|
||||
{ 0x3934, "IREM" },
|
||||
{ 0x4234, "Raya Systems" },
|
||||
{ 0x4334, "Renovation Products" },
|
||||
{ 0x4434, "Malibu Games" },
|
||||
{ 0x4634, "Eidos (was U.S. Gold <=1995)" },
|
||||
{ 0x4734, "Playmates Interactive?" },
|
||||
{ 0x4A34, "Fox Interactive" },
|
||||
{ 0x4B34, "Time Warner Interactive" },
|
||||
{ 0x5134, "Disney Interactive" },
|
||||
{ 0x5334, "Black Pearl" },
|
||||
{ 0x5534, "Advanced Productions" },
|
||||
{ 0x5834, "GT Interactive" },
|
||||
{ 0x5934, "RARE?" },
|
||||
{ 0x5A34, "Crave Entertainment" },
|
||||
{ 0x3035, "Absolute Entertainment" },
|
||||
{ 0x3135, "Acclaim" },
|
||||
{ 0x3235, "Activision" },
|
||||
{ 0x3335, "American Sammy" },
|
||||
{ 0x3435, "Take 2 Interactive (before it was GameTek)" },
|
||||
{ 0x3535, "Hi Tech" },
|
||||
{ 0x3635, "LJN LTD." },
|
||||
{ 0x3835, "Mattel" },
|
||||
{ 0x4135, "Mindscape, Red Orb Entertainment?" },
|
||||
{ 0x4235, "Romstar" },
|
||||
{ 0x4335, "Taxan" },
|
||||
{ 0x4435, "Midway (before it was Tradewest)" },
|
||||
{ 0x4635, "American Softworks" },
|
||||
{ 0x4735, "Majesco Sales Inc" },
|
||||
{ 0x4835, "3DO" },
|
||||
{ 0x4B35, "Hasbro" },
|
||||
{ 0x4C35, "NewKidCo" },
|
||||
{ 0x4D35, "Telegames" },
|
||||
{ 0x4E35, "Metro3D" },
|
||||
{ 0x5035, "Vatical Entertainment" },
|
||||
{ 0x5135, "LEGO Media" },
|
||||
{ 0x5335, "Xicat Interactive" },
|
||||
{ 0x5435, "Cryo Interactive" },
|
||||
{ 0x5735, "Red Storm Entertainment" },
|
||||
{ 0x5835, "Microids" },
|
||||
{ 0x5A35, "Conspiracy/Swing" },
|
||||
{ 0x3036, "Titus" },
|
||||
{ 0x3136, "Virgin Interactive" },
|
||||
{ 0x3236, "Maxis" },
|
||||
{ 0x3436, "LucasArts Entertainment" },
|
||||
{ 0x3736, "Ocean" },
|
||||
{ 0x3936, "Electronic Arts" },
|
||||
{ 0x4236, "Laser Beam" },
|
||||
{ 0x4536, "Elite Systems" },
|
||||
{ 0x4636, "Electro Brain" },
|
||||
{ 0x4736, "The Learning Company" },
|
||||
{ 0x4836, "BBC" },
|
||||
{ 0x4A36, "Software 2000" },
|
||||
{ 0x4C36, "BAM! Entertainment" },
|
||||
{ 0x4D36, "Studio 3" },
|
||||
{ 0x5136, "Classified Games" },
|
||||
{ 0x5336, "TDK Mediactive" },
|
||||
{ 0x5536, "DreamCatcher" },
|
||||
{ 0x5636, "JoWood Produtions" },
|
||||
{ 0x5736, "SEGA" },
|
||||
{ 0x5836, "Wannado Edition" },
|
||||
{ 0x5936, "LSP" },
|
||||
{ 0x5A36, "ITE Media" },
|
||||
{ 0x3037, "Infogrames" },
|
||||
{ 0x3137, "Interplay" },
|
||||
{ 0x3237, "JVC" },
|
||||
{ 0x3337, "Parker Brothers" },
|
||||
{ 0x3537, "Sales Curve" },
|
||||
{ 0x3837, "THQ" },
|
||||
{ 0x3937, "Accolade" },
|
||||
{ 0x4137, "Triffix Entertainment" },
|
||||
{ 0x4337, "Microprose Software" },
|
||||
{ 0x4437, "Universal Interactive, Sierra, Simon & Schuster?" },
|
||||
{ 0x4637, "Kemco" },
|
||||
{ 0x4737, "Rage Software" },
|
||||
{ 0x4837, "Encore" },
|
||||
{ 0x4A37, "Zoo" },
|
||||
{ 0x4B37, "BVM" },
|
||||
{ 0x4C37, "Simon & Schuster Interactive" },
|
||||
{ 0x4D37, "Asmik Ace Entertainment Inc./AIA" },
|
||||
{ 0x4E37, "Empire Interactive?" },
|
||||
{ 0x5137, "Jester Interactive" },
|
||||
{ 0x5437, "Scholastic" },
|
||||
{ 0x5537, "Ignition Entertainment" },
|
||||
{ 0x5737, "Stadlbauer" },
|
||||
{ 0x3038, "Misawa" },
|
||||
{ 0x3138, "Teichiku" },
|
||||
{ 0x3238, "Namco Ltd." },
|
||||
{ 0x3338, "LOZC" },
|
||||
{ 0x3438, "KOEI" },
|
||||
{ 0x3638, "Tokuma Shoten Intermedia" },
|
||||
{ 0x3738, "Tsukuda Original" },
|
||||
{ 0x3838, "DATAM-Polystar" },
|
||||
{ 0x4238, "Bulletproof Software" },
|
||||
{ 0x4338, "Vic Tokai Inc." },
|
||||
{ 0x4538, "Character Soft" },
|
||||
{ 0x4638, "I'Max" },
|
||||
{ 0x4738, "Saurus" },
|
||||
{ 0x4A38, "General Entertainment" },
|
||||
{ 0x4E38, "Success" },
|
||||
{ 0x5038, "SEGA Japan" },
|
||||
{ 0x3039, "Takara Amusement" },
|
||||
{ 0x3139, "Chun Soft" },
|
||||
{ 0x3239, "Video System, McO'River???" },
|
||||
{ 0x3339, "BEC" },
|
||||
{ 0x3539, "Varie" },
|
||||
{ 0x3639, "Yonezawa/S'pal" },
|
||||
{ 0x3739, "Kaneko" },
|
||||
{ 0x3939, "Victor Interactive Software, Pack in Video" },
|
||||
{ 0x4139, "Nichibutsu/Nihon Bussan" },
|
||||
{ 0x4239, "Tecmo" },
|
||||
{ 0x4339, "Imagineer" },
|
||||
{ 0x4639, "Nova" },
|
||||
{ 0x4739, "Den'Z" },
|
||||
{ 0x4839, "Bottom Up" },
|
||||
{ 0x4A39, "TGL" },
|
||||
{ 0x4C39, "Hasbro Japan?" },
|
||||
{ 0x4E39, "Marvelous Entertainment" },
|
||||
{ 0x5039, "Keynet Inc." },
|
||||
{ 0x5139, "Hands-On Entertainment" },
|
||||
{ 0x3041, "Telenet" },
|
||||
{ 0x3141, "Hori" },
|
||||
{ 0x3441, "Konami" },
|
||||
{ 0x3541, "K.Amusement Leasing Co." },
|
||||
{ 0x3641, "Kawada" },
|
||||
{ 0x3741, "Takara" },
|
||||
{ 0x3941, "Technos Japan Corp." },
|
||||
{ 0x4141, "JVC, Victor Musical Indutries" },
|
||||
{ 0x4341, "Toei Animation" },
|
||||
{ 0x4441, "Toho" },
|
||||
{ 0x4641, "Namco" },
|
||||
{ 0x4741, "Media Rings Corporation" },
|
||||
{ 0x4841, "J-Wing" },
|
||||
{ 0x4A41, "Pioneer LDC" },
|
||||
{ 0x4B41, "KID" },
|
||||
{ 0x4C41, "Mediafactory" },
|
||||
{ 0x5041, "Infogrames Hudson" },
|
||||
{ 0x5141, "Kiratto. Ludic Inc" },
|
||||
{ 0x3042, "Acclaim Japan" },
|
||||
{ 0x3142, "ASCII (was Nexoft?)" },
|
||||
{ 0x3242, "Bandai" },
|
||||
{ 0x3442, "Enix" },
|
||||
{ 0x3642, "HAL Laboratory" },
|
||||
{ 0x3742, "SNK" },
|
||||
{ 0x3942, "Pony Canyon" },
|
||||
{ 0x4142, "Culture Brain" },
|
||||
{ 0x4242, "Sunsoft" },
|
||||
{ 0x4342, "Toshiba EMI" },
|
||||
{ 0x4442, "Sony Imagesoft" },
|
||||
{ 0x4642, "Sammy" },
|
||||
{ 0x4742, "Magical" },
|
||||
{ 0x4842, "Visco" },
|
||||
{ 0x4A42, "Compile " },
|
||||
{ 0x4C42, "MTO Inc." },
|
||||
{ 0x4E42, "Sunrise Interactive" },
|
||||
{ 0x5042, "Global A Entertainment" },
|
||||
{ 0x5142, "Fuuki" },
|
||||
{ 0x3043, "Taito" },
|
||||
{ 0x3243, "Kemco" },
|
||||
{ 0x3343, "Square" },
|
||||
{ 0x3443, "Tokuma Shoten" },
|
||||
{ 0x3543, "Data East" },
|
||||
{ 0x3643, "Tonkin House (was Tokyo Shoseki)" },
|
||||
{ 0x3843, "Koei" },
|
||||
{ 0x4143, "Konami/Ultra/Palcom" },
|
||||
{ 0x4243, "NTVIC/VAP" },
|
||||
{ 0x4343, "Use Co.,Ltd." },
|
||||
{ 0x4443, "Meldac" },
|
||||
{ 0x4543, "Pony Canyon" },
|
||||
{ 0x4643, "Angel, Sotsu Agency/Sunrise" },
|
||||
{ 0x4A43, "Boss" },
|
||||
{ 0x4743, "Yumedia/Aroma Co., Ltd" },
|
||||
{ 0x4B43, "Axela/Crea-Tech?" },
|
||||
{ 0x4C43, "Sekaibunka-Sha, Sumire kobo?, Marigul Management Inc.?" },
|
||||
{ 0x4D43, "Konami Computer Entertainment Osaka" },
|
||||
{ 0x5043, "Enterbrain" },
|
||||
{ 0x3044, "Taito/Disco" },
|
||||
{ 0x3144, "Sofel" },
|
||||
{ 0x3244, "Quest, Bothtec" },
|
||||
{ 0x3344, "Sigma, ?????" },
|
||||
{ 0x3444, "Ask Kodansha" },
|
||||
{ 0x3644, "Naxat" },
|
||||
{ 0x3744, "Copya System" },
|
||||
{ 0x3844, "Capcom Co., Ltd." },
|
||||
{ 0x3944, "Banpresto" },
|
||||
{ 0x4144, "TOMY" },
|
||||
{ 0x4244, "LJN Japan" },
|
||||
{ 0x4444, "NCS" },
|
||||
{ 0x4544, "Human Entertainment" },
|
||||
{ 0x4644, "Altron" },
|
||||
{ 0x4744, "Jaleco???" },
|
||||
{ 0x4844, "Gaps Inc." },
|
||||
{ 0x4C44, "????" },
|
||||
{ 0x4E44, "Elf" },
|
||||
{ 0x3045, "Jaleco" },
|
||||
{ 0x3145, "????" },
|
||||
{ 0x3245, "Yutaka" },
|
||||
{ 0x3345, "Varie" },
|
||||
{ 0x3445, "T&ESoft" },
|
||||
{ 0x3545, "Epoch" },
|
||||
{ 0x3745, "Athena" },
|
||||
{ 0x3845, "Asmik" },
|
||||
{ 0x3945, "Natsume" },
|
||||
{ 0x4145, "King Records" },
|
||||
{ 0x4245, "Atlus" },
|
||||
{ 0x4345, "Epic/Sony Records" },
|
||||
{ 0x4545, "IGS" },
|
||||
{ 0x4745, "Chatnoir" },
|
||||
{ 0x4845, "Right Stuff" },
|
||||
{ 0x4C45, "Spike" },
|
||||
{ 0x4D45, "Konami Computer Entertainment Tokyo" },
|
||||
{ 0x4E45, "Alphadream Corporation" },
|
||||
{ 0x3046, "A Wave" },
|
||||
{ 0x3146, "Motown Software" },
|
||||
{ 0x3246, "Left Field Entertainment" },
|
||||
{ 0x3346, "Extreme Ent. Grp." },
|
||||
{ 0x3446, "TecMagik" },
|
||||
{ 0x3946, "Cybersoft" },
|
||||
{ 0x4246, "Psygnosis" },
|
||||
{ 0x4546, "Davidson/Western Tech." },
|
||||
{ 0x3147, "PCCW Japan" },
|
||||
{ 0x3447, "KiKi Co Ltd" },
|
||||
{ 0x3547, "Open Sesame Inc???" },
|
||||
{ 0x3647, "Sims" },
|
||||
{ 0x3747, "Broccoli" },
|
||||
{ 0x3847, "Avex" },
|
||||
{ 0x3947, "D3 Publisher" },
|
||||
{ 0x4247, "Konami Computer Entertainment Japan" },
|
||||
{ 0x4447, "Square-Enix" },
|
||||
{ 0x4849, "Yojigen" },
|
||||
};
|
||||
|
||||
//------------------------------------------------------------
|
||||
//ENDLARGE
|
||||
//------------------------------------------------------------
|
||||
|
||||
namespace Database
|
||||
{
|
||||
const char* RegionXXXForCode(char code, bool unknownAsString)
|
||||
{
|
||||
size_t regions_num = ARRAY_SIZE(regions);
|
||||
|
||||
const char* found = strchr(regions_index,code);
|
||||
if(found && found-regions_index < strlen(regions_index)) return regions[found-regions_index];
|
||||
else return unknownAsString ? "???" : NULL;
|
||||
}
|
||||
|
||||
const char *MakerNameForMakerCode(u16 id, bool unknownAsString)
|
||||
{
|
||||
//too bad these aren't sorted
|
||||
for (size_t i = 0; i < ARRAY_SIZE(makerCodes); i++)
|
||||
{
|
||||
if (makerCodes[i].code == id)
|
||||
return makerCodes[i].name;
|
||||
}
|
||||
|
||||
return unknownAsString ? "Unknown" : NULL;
|
||||
}
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
#ifndef DESMUME_DATABASE_H_
|
||||
#define DESMUME_DATABASE_H_
|
||||
|
||||
namespace Database
|
||||
{
|
||||
const char* RegionXXXForCode(char code, bool unknownAsString);
|
||||
const char* MakerNameForMakerCode(u16 id, bool unknownAsString);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2016 DeSmuME team
|
||||
Copyright (C) 2006-2012 DeSmuME team
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -19,8 +19,7 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "Disassembler.h"
|
||||
#include "utils/bits.h"
|
||||
#include "armcpu.h"
|
||||
#include "bits.h"
|
||||
|
||||
#define ROR(i, j) ((((u32)(i))>>(j)) | (((u32)(i))<<(32-(j))))
|
||||
|
||||
|
@ -93,10 +92,8 @@ const char MSR_FIELD[16][5] = {
|
|||
Registre[REG_POS(i,0)],\
|
||||
tmp);
|
||||
#define DATAPROC_ROR_IMM(nom, s) char tmp[10] = "";\
|
||||
if(((i>>7)&0x1F)==0)\
|
||||
if(((i>>7)&0x1F)!=0)\
|
||||
sprintf(tmp, ", RRX");\
|
||||
else\
|
||||
sprintf(tmp, ", ROR %d", (int)((i>>7)&0x1F));\
|
||||
sprintf(txt, "%s%s%s %s, %s, %s%s",\
|
||||
#nom,\
|
||||
Condition[CONDITION(i)],\
|
||||
|
@ -210,10 +207,8 @@ const char MSR_FIELD[16][5] = {
|
|||
tmp,\
|
||||
op3);
|
||||
#define LDRSTR_ROR_IMM(nom, op, op2, op3) char tmp[10] = "";\
|
||||
if(((i>>7)&0x1F)==0)\
|
||||
if(((i>>7)&0x1F)!=0)\
|
||||
sprintf(tmp, ", RRX");\
|
||||
else\
|
||||
sprintf(tmp, ", ROR %d", (int)((i>>7)&0x1F));\
|
||||
sprintf(txt, "%s%s %s, [%s%s, %s%s%s%s",\
|
||||
#nom,\
|
||||
Condition[CONDITION(i)],\
|
||||
|
@ -2122,17 +2117,17 @@ return txt;}
|
|||
static char * OP_LDR_P_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
if(REG_POS(i,16) == 15)
|
||||
sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 + (int)(i&0xFFF)));
|
||||
sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 + (int)(i&0x7FF)));
|
||||
else
|
||||
sprintf(txt, "LDR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDR_M_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
if(REG_POS(i,16) == 15)
|
||||
sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 - (int)(i&0xFFF)));
|
||||
sprintf(txt, "LDR%s %s, [%08X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], (adr + 8 - (int)(i&0x7FF)));
|
||||
else
|
||||
sprintf(txt, "LDR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDREX(u32 adr, u32 i, char * txt)
|
||||
|
@ -2182,12 +2177,12 @@ return txt;}
|
|||
|
||||
static char * OP_LDR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2232,17 +2227,17 @@ return txt;}
|
|||
|
||||
static char * OP_LDR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDR_P_IMM_OFF_POSTIND2(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2289,12 +2284,12 @@ return txt;}
|
|||
|
||||
static char * OP_LDRB_P_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRB_M_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
|
@ -2339,12 +2334,12 @@ return txt;}
|
|||
|
||||
static char * OP_LDRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2389,12 +2384,12 @@ return txt;}
|
|||
|
||||
static char * OP_LDRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2441,12 +2436,12 @@ return txt;}
|
|||
|
||||
static char * OP_STR_P_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STR%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STR_M_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STR%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STREX(u32 adr, u32 i, char * txt)
|
||||
|
@ -2496,12 +2491,12 @@ return txt;}
|
|||
|
||||
static char * OP_STR_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STR%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STR_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STR%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STR_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2546,12 +2541,12 @@ return txt;}
|
|||
|
||||
static char * OP_STR_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STR%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STR_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STR%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STR_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2598,12 +2593,12 @@ return txt;}
|
|||
|
||||
static char * OP_STRB_P_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRB%s %s, [%s, #%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRB_M_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRB%s %s, [%s, -#%X]", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRB_P_LSL_IMM_OFF(u32 adr, u32 i, char * txt)
|
||||
|
@ -2648,12 +2643,12 @@ return txt;}
|
|||
|
||||
static char * OP_STRB_P_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRB%s %s, [%s, #%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRB_M_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRB%s %s, [%s, -#%X]!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRB_P_LSL_IMM_OFF_PREIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2698,12 +2693,12 @@ return txt;}
|
|||
|
||||
static char * OP_STRB_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRB%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRB_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRB%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRB_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2751,12 +2746,12 @@ return txt;}
|
|||
#if 0
|
||||
static char * OP_LDRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "LDRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "LDRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_LDRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
|
@ -2803,12 +2798,12 @@ return txt;}
|
|||
|
||||
static char * OP_STRBT_P_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRBT%s %s, [%s], #%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRBT_M_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
||||
{
|
||||
sprintf(txt, "STRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0xFFF));
|
||||
sprintf(txt, "STRBT%s %s, [%s], -#%X!", Condition[CONDITION(i)], Registre[REG_POS(i,12)], Registre[REG_POS(i,16)], (int)(i&0x7FF));
|
||||
return txt;}
|
||||
|
||||
static char * OP_STRBT_P_LSL_IMM_OFF_POSTIND(u32 adr, u32 i, char * txt)
|
|
@ -1,31 +1,31 @@
|
|||
/*
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2009 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DISASSEMBLER_H
|
||||
#define DISASSEMBLER_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
typedef char* (* DisasmOpFunc)(u32 adr, u32 i, char * txt);
|
||||
|
||||
extern const DisasmOpFunc des_arm_instructions_set[4096];
|
||||
extern const DisasmOpFunc des_thumb_instructions_set[1024];
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2009 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DISASSEMBLER_H
|
||||
#define DISASSEMBLER_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
typedef char* (* DisasmOpFunc)(u32 adr, u32 i, char * txt);
|
||||
|
||||
extern const DisasmOpFunc des_arm_instructions_set[4096];
|
||||
extern const DisasmOpFunc des_thumb_instructions_set[1024];
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
Copyright 2006 yopyop
|
||||
Copyright 2007 shash
|
||||
Copyright 2007-2024 DeSmuME team
|
||||
Copyright 2007-2012 DeSmuME team
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -18,39 +18,14 @@
|
|||
*/
|
||||
|
||||
#include "FIFO.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "armcpu.h"
|
||||
#include "debug.h"
|
||||
#include "mem.h"
|
||||
#include "MMU.h"
|
||||
#include "registers.h"
|
||||
#include "NDSSystem.h"
|
||||
#include "gfx3d.h"
|
||||
|
||||
#if defined(ENABLE_AVX512_1)
|
||||
#define USEVECTORSIZE_512
|
||||
#define VECTORSIZE 64
|
||||
#elif defined(ENABLE_AVX2)
|
||||
#define USEVECTORSIZE_256
|
||||
#define VECTORSIZE 32
|
||||
#elif defined(ENABLE_SSE2)
|
||||
#define USEVECTORSIZE_128
|
||||
#define VECTORSIZE 16
|
||||
#elif defined(ENABLE_NEON_A64)
|
||||
#define USEVECTORSIZE_128
|
||||
#define VECTORSIZE 16
|
||||
#elif defined(ENABLE_ALTIVEC)
|
||||
#define USEVECTORSIZE_128
|
||||
#define VECTORSIZE 16
|
||||
#endif
|
||||
|
||||
#if defined(USEVECTORSIZE_512) || defined(USEVECTORSIZE_256) || defined(USEVECTORSIZE_128)
|
||||
#define USEMANUALVECTORIZATION
|
||||
#endif
|
||||
|
||||
|
||||
// ========================================================= IPC FIFO
|
||||
IPC_FIFO ipc_fifo[2];
|
||||
|
||||
|
@ -259,15 +234,6 @@ void GFX_FIFOsend(u8 cmd, u32 param)
|
|||
if(IsMatrixStackCommand(cmd))
|
||||
gxFIFO.matrix_stack_op_size++;
|
||||
|
||||
//along the same lines:
|
||||
//american girls julie finds a way will put a bunch of stuff and then a box test into the fifo and then immediately test the busy flag
|
||||
//so we need to set the busy flag here.
|
||||
//does it expect the fifo to be running then? well, it's definitely jammed -- making it unjammed at one point did fix this bug.
|
||||
//it's still not clear whether we're handling the immediate vs fifo commands properly at all :(
|
||||
//anyway, here we go, similar treatment. consider this a hack.
|
||||
if(cmd == 0x70) MMU_new.gxstat.tb = 1; //just set the flag--youre insane if you queue more than one of these anyway
|
||||
if(cmd == 0x71) MMU_new.gxstat.tb = 1;
|
||||
|
||||
if(gxFIFO.size>=HACK_GXIFO_SIZE) {
|
||||
printf("--FIFO FULL-- : %d\n",gxFIFO.size);
|
||||
}
|
||||
|
@ -328,222 +294,32 @@ void GFX_FIFOcnt(u32 val)
|
|||
// val &= 0xFFFF5FFF; // clear reset (bit15) & stack level (bit13)
|
||||
//}
|
||||
|
||||
T1WriteLong(MMU.ARM9_REG, 0x600, val);
|
||||
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600, val);
|
||||
}
|
||||
|
||||
// ========================================================= DISP FIFO
|
||||
DISP_FIFO disp_fifo;
|
||||
DISP_FIFO disp_fifo;
|
||||
|
||||
void DISP_FIFOinit()
|
||||
{
|
||||
memset(&disp_fifo, 0, sizeof(DISP_FIFO));
|
||||
}
|
||||
|
||||
template <typename T, size_t ADDROFFSET>
|
||||
void DISP_FIFOsend(const T val)
|
||||
void DISP_FIFOsend(u32 val)
|
||||
{
|
||||
//INFO("DISP_FIFO send value 0x%08X (head 0x%06X, tail 0x%06X)\n", val, disp_fifo.head, disp_fifo.tail);
|
||||
|
||||
const size_t numBytes = sizeof(T);
|
||||
const size_t baseWriteAddress = disp_fifo.tail * sizeof(u32);
|
||||
const size_t finalWriteAddress = baseWriteAddress + ADDROFFSET;
|
||||
|
||||
switch (numBytes)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
#ifndef MSB_FIRST
|
||||
HostWriteByte((u8 *)disp_fifo.buf, (u32)finalWriteAddress, val);
|
||||
#else
|
||||
switch (ADDROFFSET)
|
||||
{
|
||||
case 0:
|
||||
HostWriteByte((u8 *)disp_fifo.buf, (u32)baseWriteAddress + 2, val);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
HostWriteByte((u8 *)disp_fifo.buf, (u32)baseWriteAddress + 3, val);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
HostWriteByte((u8 *)disp_fifo.buf, (u32)baseWriteAddress + 0, val);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
HostWriteByte((u8 *)disp_fifo.buf, (u32)baseWriteAddress + 1, val);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MSB_FIRST
|
||||
if (ADDROFFSET == 3)
|
||||
#else
|
||||
if (ADDROFFSET == 1)
|
||||
#endif
|
||||
{
|
||||
disp_fifo.tail++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
#ifndef MSB_FIRST
|
||||
HostWriteWord((u8 *)disp_fifo.buf, (u32)finalWriteAddress, val);
|
||||
#else
|
||||
switch (ADDROFFSET)
|
||||
{
|
||||
case 0:
|
||||
HostWriteWord((u8 *)disp_fifo.buf, (u32)baseWriteAddress + 2, val);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
HostWriteWord((u8 *)disp_fifo.buf, (u32)baseWriteAddress + 0, val);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef MSB_FIRST
|
||||
if (ADDROFFSET == 2)
|
||||
#else
|
||||
if (ADDROFFSET == 0)
|
||||
#endif
|
||||
{
|
||||
disp_fifo.tail++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
HostWriteTwoWords((u8 *)disp_fifo.buf, (u32)finalWriteAddress, val);
|
||||
disp_fifo.tail++;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (disp_fifo.tail >= 0x6000)
|
||||
{
|
||||
disp_fifo.buf[disp_fifo.tail] = val;
|
||||
disp_fifo.tail++;
|
||||
if (disp_fifo.tail > 0x5FFF)
|
||||
disp_fifo.tail = 0;
|
||||
}
|
||||
}
|
||||
|
||||
u32 DISP_FIFOrecv_u32()
|
||||
u32 DISP_FIFOrecv()
|
||||
{
|
||||
//if (disp_fifo.tail == disp_fifo.head) return (0); // FIFO is empty
|
||||
u32 val = disp_fifo.buf[disp_fifo.head];
|
||||
|
||||
disp_fifo.head++;
|
||||
if (disp_fifo.head >= 0x6000)
|
||||
{
|
||||
if (disp_fifo.head > 0x5FFF)
|
||||
disp_fifo.head = 0;
|
||||
}
|
||||
|
||||
return val;
|
||||
return (val);
|
||||
}
|
||||
|
||||
static void _DISP_FIFOrecv_LineAdvance()
|
||||
{
|
||||
disp_fifo.head += (GPU_FRAMEBUFFER_NATIVE_WIDTH * sizeof(u16)) / sizeof(u32);
|
||||
if (disp_fifo.head >= 0x6000)
|
||||
{
|
||||
disp_fifo.head -= 0x6000;
|
||||
}
|
||||
}
|
||||
|
||||
void DISP_FIFOrecv_Line16(u16 *__restrict dst)
|
||||
{
|
||||
#ifdef USEMANUALVECTORIZATION
|
||||
if ( (disp_fifo.head + (GPU_FRAMEBUFFER_NATIVE_WIDTH * sizeof(u16)) / sizeof(u32) <= 0x6000) && (disp_fifo.head == (disp_fifo.head & ~(VECTORSIZE - 1))) )
|
||||
{
|
||||
buffer_copy_fast<GPU_FRAMEBUFFER_NATIVE_WIDTH * sizeof(u16)>(dst, disp_fifo.buf + disp_fifo.head);
|
||||
_DISP_FIFOrecv_LineAdvance();
|
||||
}
|
||||
else
|
||||
#endif // USEMANUALVECTORIZATION
|
||||
{
|
||||
for (size_t i = 0; i < GPU_FRAMEBUFFER_NATIVE_WIDTH * sizeof(u16) / sizeof(u32); i++)
|
||||
{
|
||||
const u32 src = DISP_FIFOrecv_u32();
|
||||
((u32 *)dst)[i] = src;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <NDSColorFormat OUTPUTFORMAT>
|
||||
void DISP_FIFOrecv_LineOpaque(u32 *__restrict dst)
|
||||
{
|
||||
#ifdef USEMANUALVECTORIZATION
|
||||
if ( (disp_fifo.head + (GPU_FRAMEBUFFER_NATIVE_WIDTH * sizeof(u16)) / sizeof(u32) <= 0x6000) && (disp_fifo.head == (disp_fifo.head & ~(VECTORSIZE - 1))) )
|
||||
{
|
||||
if (OUTPUTFORMAT == NDSColorFormat_BGR555_Rev)
|
||||
{
|
||||
buffer_copy_or_constant_s16_fast<GPU_FRAMEBUFFER_NATIVE_WIDTH * sizeof(u16), false>(dst, disp_fifo.buf + disp_fifo.head, 0x8000);
|
||||
}
|
||||
else if (OUTPUTFORMAT == NDSColorFormat_BGR666_Rev)
|
||||
{
|
||||
ColorspaceConvertBuffer555xTo6665Opaque<false, false, BESwapDst>((u16 *)(disp_fifo.buf + disp_fifo.head), dst, GPU_FRAMEBUFFER_NATIVE_WIDTH);
|
||||
}
|
||||
else if (OUTPUTFORMAT == NDSColorFormat_BGR888_Rev)
|
||||
{
|
||||
ColorspaceConvertBuffer555xTo8888Opaque<false, false, BESwapDst>((u16 *)(disp_fifo.buf + disp_fifo.head), dst, GPU_FRAMEBUFFER_NATIVE_WIDTH);
|
||||
}
|
||||
|
||||
_DISP_FIFOrecv_LineAdvance();
|
||||
}
|
||||
else
|
||||
#endif // USEMANUALVECTORIZATION
|
||||
{
|
||||
if (OUTPUTFORMAT == NDSColorFormat_BGR555_Rev)
|
||||
{
|
||||
for (size_t i = 0; i < GPU_FRAMEBUFFER_NATIVE_WIDTH * sizeof(u16) / sizeof(u32); i++)
|
||||
{
|
||||
const u32 src = DISP_FIFOrecv_u32();
|
||||
dst[i] = src | 0x80008000;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (size_t i = 0; i < GPU_FRAMEBUFFER_NATIVE_WIDTH; i+=2)
|
||||
{
|
||||
const u32 src = DISP_FIFOrecv_u32();
|
||||
|
||||
if (OUTPUTFORMAT == NDSColorFormat_BGR666_Rev)
|
||||
{
|
||||
dst[i+0] = LE_TO_LOCAL_32( ColorspaceConvert555To6665Opaque<false>((src >> 0) & 0x7FFF) );
|
||||
dst[i+1] = LE_TO_LOCAL_32( ColorspaceConvert555To6665Opaque<false>((src >> 16) & 0x7FFF) );
|
||||
}
|
||||
else if (OUTPUTFORMAT == NDSColorFormat_BGR888_Rev)
|
||||
{
|
||||
dst[i+0] = LE_TO_LOCAL_32( ColorspaceConvert555To8888Opaque<false>((src >> 0) & 0x7FFF) );
|
||||
dst[i+1] = LE_TO_LOCAL_32( ColorspaceConvert555To8888Opaque<false>((src >> 16) & 0x7FFF) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DISP_FIFOreset()
|
||||
{
|
||||
disp_fifo.head = 0;
|
||||
disp_fifo.tail = 0;
|
||||
}
|
||||
|
||||
template void DISP_FIFOsend< u8, 0>(const u8 val);
|
||||
template void DISP_FIFOsend< u8, 1>(const u8 val);
|
||||
template void DISP_FIFOsend< u8, 2>(const u8 val);
|
||||
template void DISP_FIFOsend< u8, 3>(const u8 val);
|
||||
template void DISP_FIFOsend<u16, 0>(const u16 val);
|
||||
template void DISP_FIFOsend<u16, 2>(const u16 val);
|
||||
template void DISP_FIFOsend<u32, 0>(const u32 val);
|
||||
|
||||
template void DISP_FIFOrecv_LineOpaque<NDSColorFormat_BGR555_Rev>(u32 *__restrict dst);
|
||||
template void DISP_FIFOrecv_LineOpaque<NDSColorFormat_BGR666_Rev>(u32 *__restrict dst);
|
||||
template void DISP_FIFOrecv_LineOpaque<NDSColorFormat_BGR888_Rev>(u32 *__restrict dst);
|
||||
|
|
|
@ -1,98 +1,91 @@
|
|||
/*
|
||||
Copyright 2006 yopyop
|
||||
Copyright 2007 shash
|
||||
Copyright 2007-2022 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FIFO_H
|
||||
#define FIFO_H
|
||||
|
||||
#include "types.h"
|
||||
#include "./utils/colorspacehandler/colorspacehandler.h"
|
||||
|
||||
//=================================================== IPC FIFO
|
||||
typedef struct
|
||||
{
|
||||
u32 buf[16];
|
||||
|
||||
u8 head;
|
||||
u8 tail;
|
||||
u8 size;
|
||||
} IPC_FIFO;
|
||||
|
||||
extern IPC_FIFO ipc_fifo[2];
|
||||
extern void IPC_FIFOinit(u8 proc);
|
||||
extern void IPC_FIFOsend(u8 proc, u32 val);
|
||||
extern u32 IPC_FIFOrecv(u8 proc);
|
||||
extern void IPC_FIFOcnt(u8 proc, u16 val);
|
||||
|
||||
//=================================================== GFX FIFO
|
||||
|
||||
//yeah, its oversize for now. thats a simpler solution
|
||||
//moon seems to overdrive the fifo with immediate dmas
|
||||
//i think this might be nintendo code too
|
||||
#define HACK_GXIFO_SIZE 200000
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 cmd[HACK_GXIFO_SIZE];
|
||||
u32 param[HACK_GXIFO_SIZE];
|
||||
|
||||
u32 head; // start position
|
||||
u32 tail; // tail
|
||||
u32 size; // size FIFO buffer
|
||||
u32 matrix_stack_op_size; //number of matrix stack items in the fifo (stack is busy when this is nonzero)
|
||||
} GFX_FIFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 cmd[4];
|
||||
u32 param[4];
|
||||
|
||||
u8 head;
|
||||
u8 tail;
|
||||
u8 size;
|
||||
} GFX_PIPE;
|
||||
|
||||
extern GFX_PIPE gxPIPE;
|
||||
extern GFX_FIFO gxFIFO;
|
||||
void GFX_PIPEclear();
|
||||
void GFX_FIFOclear();
|
||||
void GFX_FIFOsend(u8 cmd, u32 param);
|
||||
BOOL GFX_PIPErecv(u8 *cmd, u32 *param);
|
||||
void GFX_FIFOcnt(u32 val);
|
||||
|
||||
//=================================================== Display memory FIFO
|
||||
typedef struct
|
||||
{
|
||||
CACHE_ALIGN u32 buf[0x6000]; // 256x192 32K color
|
||||
u32 head; // head
|
||||
u32 tail; // tail
|
||||
} DISP_FIFO;
|
||||
|
||||
extern DISP_FIFO disp_fifo;
|
||||
void DISP_FIFOinit();
|
||||
|
||||
template<typename T, size_t ADDROFFSET> void DISP_FIFOsend(const T val);
|
||||
u32 DISP_FIFOrecv_u32();
|
||||
|
||||
void DISP_FIFOrecv_Line16(u16 *__restrict dst);
|
||||
template<NDSColorFormat OUTPUTFORMAT> void DISP_FIFOrecv_LineOpaque(u32 *__restrict dst);
|
||||
|
||||
void DISP_FIFOreset();
|
||||
|
||||
#endif
|
||||
/*
|
||||
Copyright 2006 yopyop
|
||||
Copyright 2007 shash
|
||||
Copyright 2007-2011 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FIFO_H
|
||||
#define FIFO_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
//=================================================== IPC FIFO
|
||||
typedef struct
|
||||
{
|
||||
u32 buf[16];
|
||||
|
||||
u8 head;
|
||||
u8 tail;
|
||||
u8 size;
|
||||
} IPC_FIFO;
|
||||
|
||||
extern IPC_FIFO ipc_fifo[2];
|
||||
extern void IPC_FIFOinit(u8 proc);
|
||||
extern void IPC_FIFOsend(u8 proc, u32 val);
|
||||
extern u32 IPC_FIFOrecv(u8 proc);
|
||||
extern void IPC_FIFOcnt(u8 proc, u16 val);
|
||||
|
||||
//=================================================== GFX FIFO
|
||||
|
||||
//yeah, its oversize for now. thats a simpler solution
|
||||
//moon seems to overdrive the fifo with immediate dmas
|
||||
//i think this might be nintendo code too
|
||||
#define HACK_GXIFO_SIZE 200000
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 cmd[HACK_GXIFO_SIZE];
|
||||
u32 param[HACK_GXIFO_SIZE];
|
||||
|
||||
u32 head; // start position
|
||||
u32 tail; // tail
|
||||
u32 size; // size FIFO buffer
|
||||
u32 matrix_stack_op_size; //number of matrix stack items in the fifo (stack is busy when this is nonzero)
|
||||
} GFX_FIFO;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 cmd[4];
|
||||
u32 param[4];
|
||||
|
||||
u8 head;
|
||||
u8 tail;
|
||||
u8 size;
|
||||
} GFX_PIPE;
|
||||
|
||||
extern GFX_PIPE gxPIPE;
|
||||
extern GFX_FIFO gxFIFO;
|
||||
extern void GFX_PIPEclear();
|
||||
extern void GFX_FIFOclear();
|
||||
extern void GFX_FIFOsend(u8 cmd, u32 param);
|
||||
extern BOOL GFX_PIPErecv(u8 *cmd, u32 *param);
|
||||
extern void GFX_FIFOcnt(u32 val);
|
||||
|
||||
//=================================================== Display memory FIFO
|
||||
typedef struct
|
||||
{
|
||||
u32 buf[0x6000]; // 256x192 32K color
|
||||
u32 head; // head
|
||||
u32 tail; // tail
|
||||
} DISP_FIFO;
|
||||
|
||||
extern DISP_FIFO disp_fifo;
|
||||
extern void DISP_FIFOinit();
|
||||
extern void DISP_FIFOsend(u32 val);
|
||||
extern u32 DISP_FIFOrecv();
|
||||
|
||||
#endif
|
||||
|
|
8294
desmume/src/GPU.cpp
8294
desmume/src/GPU.cpp
File diff suppressed because it is too large
Load Diff
2511
desmume/src/GPU.h
2511
desmume/src/GPU.h
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2021-2023 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GPU_OPERATIONS_H
|
||||
#define GPU_OPERATIONS_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "./utils/colorspacehandler/colorspacehandler.h"
|
||||
|
||||
#include "GPU.h"
|
||||
|
||||
|
||||
template <s32 INTEGERSCALEHINT, bool SCALEVERTICAL, bool USELINEINDEX, bool NEEDENDIANSWAP, size_t ELEMENTSIZE>
|
||||
void CopyLineExpandHinted(const void *__restrict srcBuffer, const size_t srcLineIndex,
|
||||
void *__restrict dstBuffer, const size_t dstLineIndex, const size_t dstLineWidth, const size_t dstLineCount);
|
||||
|
||||
template <s32 INTEGERSCALEHINT, bool SCALEVERTICAL, bool USELINEINDEX, bool NEEDENDIANSWAP, size_t ELEMENTSIZE>
|
||||
void CopyLineExpandHinted(const GPUEngineLineInfo &lineInfo, const void *__restrict srcBuffer, void *__restrict dstBuffer);
|
||||
|
||||
template <s32 INTEGERSCALEHINT, bool USELINEINDEX, bool NEEDENDIANSWAP, size_t ELEMENTSIZE>
|
||||
void CopyLineReduceHinted(const void *__restrict srcBuffer, const size_t srcLineIndex, const size_t srcLineWidth,
|
||||
void *__restrict dstBuffer, const size_t dstLineIndex);
|
||||
|
||||
template <s32 INTEGERSCALEHINT, bool USELINEINDEX, bool NEEDENDIANSWAP, size_t ELEMENTSIZE>
|
||||
void CopyLineReduceHinted(const GPUEngineLineInfo &lineInfo, const void *__restrict srcBuffer, void *__restrict dstBuffer);
|
||||
|
||||
class ColorOperation
|
||||
{
|
||||
public:
|
||||
ColorOperation() {};
|
||||
|
||||
FORCEINLINE u16 blend(const u16 colA, const u16 colB, const u16 blendEVA, const u16 blendEVB) const;
|
||||
FORCEINLINE u16 blend(const u16 colA, const u16 colB, const TBlendTable *blendTable) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE Color4u8 blend(const Color4u8 colA, const Color4u8 colB, const u16 blendEVA, const u16 blendEVB) const;
|
||||
|
||||
FORCEINLINE u16 blend3D(const Color4u8 colA, const u16 colB) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE Color4u8 blend3D(const Color4u8 colA, const Color4u8 colB) const;
|
||||
|
||||
FORCEINLINE u16 increase(const u16 col, const u16 blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE Color4u8 increase(const Color4u8 col, const u16 blendEVY) const;
|
||||
|
||||
FORCEINLINE u16 decrease(const u16 col, const u16 blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE Color4u8 decrease(const Color4u8 col, const u16 blendEVY) const;
|
||||
};
|
||||
|
||||
class PixelOperation
|
||||
{
|
||||
private:
|
||||
template<GPULayerType LAYERTYPE> FORCEINLINE void __selectedEffect(const GPUEngineCompositorInfo &compInfo, const u8 &dstLayerID, const bool enableColorEffect, const u8 spriteAlpha, const OBJMode spriteMode, ColorEffect &selectedEffect, TBlendTable **selectedBlendTable, u8 &blendEVA, u8 &blendEVB) const;
|
||||
|
||||
protected:
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy16(GPUEngineCompositorInfo &compInfo, const u16 srcColor16) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy32(GPUEngineCompositorInfo &compInfo, const Color4u8 srcColor32) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp16(GPUEngineCompositorInfo &compInfo, const u16 srcColor16) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp32(GPUEngineCompositorInfo &compInfo, const Color4u8 srcColor32) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown16(GPUEngineCompositorInfo &compInfo, const u16 srcColor16) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown32(GPUEngineCompositorInfo &compInfo, const Color4u8 srcColor32) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE> FORCEINLINE void _unknownEffect16(GPUEngineCompositorInfo &compInfo, const u16 srcColor16, const bool enableColorEffect, const u8 spriteAlpha, const OBJMode spriteMode) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE> FORCEINLINE void _unknownEffect32(GPUEngineCompositorInfo &compInfo, const Color4u8 srcColor32, const bool enableColorEffect, const u8 spriteAlpha, const OBJMode spriteMode) const;
|
||||
|
||||
public:
|
||||
static CACHE_ALIGN u8 BlendTable555[17][17][32][32];
|
||||
static CACHE_ALIGN u16 BrightnessUpTable555[17][0x8000];
|
||||
static CACHE_ALIGN Color4u8 BrightnessUpTable666[17][0x8000];
|
||||
static CACHE_ALIGN Color4u8 BrightnessUpTable888[17][0x8000];
|
||||
static CACHE_ALIGN u16 BrightnessDownTable555[17][0x8000];
|
||||
static CACHE_ALIGN Color4u8 BrightnessDownTable666[17][0x8000];
|
||||
static CACHE_ALIGN Color4u8 BrightnessDownTable888[17][0x8000];
|
||||
static void InitLUTs();
|
||||
|
||||
PixelOperation() {};
|
||||
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE> FORCEINLINE void Composite16(GPUEngineCompositorInfo &compInfo, const u16 srcColor16, const bool enableColorEffect, const u8 spriteAlpha, const u8 spriteMode) const;
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE> FORCEINLINE void Composite32(GPUEngineCompositorInfo &compInfo, Color4u8 srcColor32, const bool enableColorEffect, const u8 spriteAlpha, const u8 spriteMode) const;
|
||||
};
|
||||
|
||||
#endif // GPU_OPERATIONS_H
|
File diff suppressed because it is too large
Load Diff
|
@ -1,122 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GPU_OPERATIONS_AVX2_H
|
||||
#define GPU_OPERATIONS_AVX2_H
|
||||
|
||||
#include "GPU_Operations.h"
|
||||
|
||||
#ifndef ENABLE_AVX2
|
||||
#warning This header requires AVX2 support.
|
||||
#else
|
||||
|
||||
class ColorOperation_AVX2
|
||||
{
|
||||
public:
|
||||
ColorOperation_AVX2() {};
|
||||
|
||||
FORCEINLINE v256u16 blend(const v256u16 &colA, const v256u16 &colB, const v256u16 &blendEVA, const v256u16 &blendEVB) const;
|
||||
template<NDSColorFormat COLORFORMAT, bool USECONSTANTBLENDVALUESHINT> FORCEINLINE v256u32 blend(const v256u32 &colA, const v256u32 &colB, const v256u16 &blendEVA, const v256u16 &blendEVB) const;
|
||||
|
||||
FORCEINLINE v256u16 blend3D(const v256u32 &colA_Lo, const v256u32 &colA_Hi, const v256u16 &colB) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v256u32 blend3D(const v256u32 &colA, const v256u32 &colB) const;
|
||||
|
||||
FORCEINLINE v256u16 increase(const v256u16 &col, const v256u16 &blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v256u32 increase(const v256u32 &col, const v256u16 &blendEVY) const;
|
||||
|
||||
FORCEINLINE v256u16 decrease(const v256u16 &col, const v256u16 &blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v256u32 decrease(const v256u32 &col, const v256u16 &blendEVY) const;
|
||||
};
|
||||
|
||||
class PixelOperation_AVX2
|
||||
{
|
||||
protected:
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy16(GPUEngineCompositorInfo &compInfo, const v256u8 &srcLayerID, const v256u16 &src1, const v256u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy32(GPUEngineCompositorInfo &compInfo, const v256u8 &srcLayerID, const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copyMask16(GPUEngineCompositorInfo &compInfo, const v256u8 &passMask8, const v256u8 &srcLayerID, const v256u16 &src1, const v256u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copyMask32(GPUEngineCompositorInfo &compInfo, const v256u8 &passMask8, const v256u8 &srcLayerID, const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp16(GPUEngineCompositorInfo &compInfo, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u16 &src1, const v256u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp32(GPUEngineCompositorInfo &compInfo, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUpMask16(GPUEngineCompositorInfo &compInfo, const v256u8 &passMask8, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u16 &src1, const v256u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUpMask32(GPUEngineCompositorInfo &compInfo, const v256u8 &passMask8, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown16(GPUEngineCompositorInfo &compInfo, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u16 &src1, const v256u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown32(GPUEngineCompositorInfo &compInfo, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDownMask16(GPUEngineCompositorInfo &compInfo, const v256u8 &passMask8, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u16 &src1, const v256u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDownMask32(GPUEngineCompositorInfo &compInfo, const v256u8 &passMask8, const v256u16 &evy16, const v256u8 &srcLayerID, const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE>
|
||||
FORCEINLINE void _unknownEffectMask16(GPUEngineCompositorInfo &compInfo,
|
||||
const v256u8 &passMask8,
|
||||
const v256u16 &evy16,
|
||||
const v256u8 &srcLayerID,
|
||||
const v256u16 &src1, const v256u16 &src0,
|
||||
const v256u8 &srcEffectEnableMask,
|
||||
const v256u8 &dstBlendEnableMaskLUT,
|
||||
const v256u8 &enableColorEffectMask,
|
||||
const v256u8 &spriteAlpha,
|
||||
const v256u8 &spriteMode) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE>
|
||||
FORCEINLINE void _unknownEffectMask32(GPUEngineCompositorInfo &compInfo,
|
||||
const v256u8 &passMask8,
|
||||
const v256u16 &evy16,
|
||||
const v256u8 &srcLayerID,
|
||||
const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0,
|
||||
const v256u8 &srcEffectEnableMask,
|
||||
const v256u8 &dstBlendEnableMaskLUT,
|
||||
const v256u8 &enableColorEffectMask,
|
||||
const v256u8 &spriteAlpha,
|
||||
const v256u8 &spriteMode) const;
|
||||
|
||||
public:
|
||||
PixelOperation_AVX2() {};
|
||||
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE, bool WILLPERFORMWINDOWTEST>
|
||||
FORCEINLINE void Composite16(GPUEngineCompositorInfo &compInfo,
|
||||
const bool didAllPixelsPass,
|
||||
const v256u8 &passMask8,
|
||||
const v256u16 &evy16,
|
||||
const v256u8 &srcLayerID,
|
||||
const v256u16 &src1, const v256u16 &src0,
|
||||
const v256u8 &srcEffectEnableMask,
|
||||
const v256u8 &dstBlendEnableMaskLUT,
|
||||
const u8 *__restrict enableColorEffectPtr,
|
||||
const u8 *__restrict sprAlphaPtr,
|
||||
const u8 *__restrict sprModePtr) const;
|
||||
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE, bool WILLPERFORMWINDOWTEST>
|
||||
FORCEINLINE void Composite32(GPUEngineCompositorInfo &compInfo,
|
||||
const bool didAllPixelsPass,
|
||||
const v256u8 &passMask8,
|
||||
const v256u16 &evy16,
|
||||
const v256u8 &srcLayerID,
|
||||
const v256u32 &src3, const v256u32 &src2, const v256u32 &src1, const v256u32 &src0,
|
||||
const v256u8 &srcEffectEnableMask,
|
||||
const v256u8 &dstBlendEnableMaskLUT,
|
||||
const u8 *__restrict enableColorEffectPtr,
|
||||
const u8 *__restrict sprAlphaPtr,
|
||||
const u8 *__restrict sprModePtr) const;
|
||||
};
|
||||
|
||||
#endif // ENABLE_AVX2
|
||||
|
||||
#endif // GPU_OPERATIONS_AVX2_H
|
File diff suppressed because it is too large
Load Diff
|
@ -1,122 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2025 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GPU_OPERATIONS_NEON_H
|
||||
#define GPU_OPERATIONS_NEON_H
|
||||
|
||||
#include "GPU_Operations.h"
|
||||
|
||||
#ifndef ENABLE_NEON_A64
|
||||
#warning This header requires ARM64 NEON support.
|
||||
#else
|
||||
|
||||
class ColorOperation_NEON
|
||||
{
|
||||
public:
|
||||
ColorOperation_NEON() {};
|
||||
|
||||
FORCEINLINE v128u16 blend(const v128u16 &colA, const v128u16 &colB, const v128u16 &blendEVA, const v128u16 &blendEVB) const;
|
||||
template<NDSColorFormat COLORFORMAT, bool USECONSTANTBLENDVALUESHINT> FORCEINLINE v128u32 blend(const v128u32 &colA, const v128u32 &colB, const v128u16 &blendEVA, const v128u16 &blendEVB) const;
|
||||
|
||||
FORCEINLINE v128u16 blend3D(const v128u32 &colA_Lo, const v128u32 &colA_Hi, const v128u16 &colB) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v128u32 blend3D(const v128u32 &colA, const v128u32 &colB) const;
|
||||
|
||||
FORCEINLINE v128u16 increase(const v128u16 &col, const v128u16 &blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v128u32 increase(const v128u32 &col, const v128u16 &blendEVY) const;
|
||||
|
||||
FORCEINLINE v128u16 decrease(const v128u16 &col, const v128u16 &blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v128u32 decrease(const v128u32 &col, const v128u16 &blendEVY) const;
|
||||
};
|
||||
|
||||
class PixelOperation_NEON
|
||||
{
|
||||
protected:
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy16(GPUEngineCompositorInfo &compInfo, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy32(GPUEngineCompositorInfo &compInfo, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copyMask16(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copyMask32(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp16(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp32(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUpMask16(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUpMask32(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown16(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown32(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDownMask16(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDownMask32(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE>
|
||||
FORCEINLINE void _unknownEffectMask16(GPUEngineCompositorInfo &compInfo,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u16 &src1, const v128u16 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const v128u8 &enableColorEffectMask,
|
||||
const v128u8 &spriteAlpha,
|
||||
const v128u8 &spriteMode) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE>
|
||||
FORCEINLINE void _unknownEffectMask32(GPUEngineCompositorInfo &compInfo,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const v128u8 &enableColorEffectMask,
|
||||
const v128u8 &spriteAlpha,
|
||||
const v128u8 &spriteMode) const;
|
||||
|
||||
public:
|
||||
PixelOperation_NEON() {};
|
||||
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE, bool WILLPERFORMWINDOWTEST>
|
||||
FORCEINLINE void Composite16(GPUEngineCompositorInfo &compInfo,
|
||||
const bool didAllPixelsPass,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u16 &src1, const v128u16 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const u8 *__restrict enableColorEffectPtr,
|
||||
const u8 *__restrict sprAlphaPtr,
|
||||
const u8 *__restrict sprModePtr) const;
|
||||
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE, bool WILLPERFORMWINDOWTEST>
|
||||
FORCEINLINE void Composite32(GPUEngineCompositorInfo &compInfo,
|
||||
const bool didAllPixelsPass,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const u8 *__restrict enableColorEffectPtr,
|
||||
const u8 *__restrict sprAlphaPtr,
|
||||
const u8 *__restrict sprModePtr) const;
|
||||
};
|
||||
|
||||
#endif // ENABLE_NEON_A64
|
||||
|
||||
#endif // GPU_OPERATIONS_NEON_H
|
File diff suppressed because it is too large
Load Diff
|
@ -1,122 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GPU_OPERATIONS_SSE2_H
|
||||
#define GPU_OPERATIONS_SSE2_H
|
||||
|
||||
#include "GPU_Operations.h"
|
||||
|
||||
#ifndef ENABLE_SSE2
|
||||
#warning This header requires SSE2 support.
|
||||
#else
|
||||
|
||||
class ColorOperation_SSE2
|
||||
{
|
||||
public:
|
||||
ColorOperation_SSE2() {};
|
||||
|
||||
FORCEINLINE v128u16 blend(const v128u16 &colA, const v128u16 &colB, const v128u16 &blendEVA, const v128u16 &blendEVB) const;
|
||||
template<NDSColorFormat COLORFORMAT, bool USECONSTANTBLENDVALUESHINT> FORCEINLINE v128u32 blend(const v128u32 &colA, const v128u32 &colB, const v128u16 &blendEVA, const v128u16 &blendEVB) const;
|
||||
|
||||
FORCEINLINE v128u16 blend3D(const v128u32 &colA_Lo, const v128u32 &colA_Hi, const v128u16 &colB) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v128u32 blend3D(const v128u32 &colA, const v128u32 &colB) const;
|
||||
|
||||
FORCEINLINE v128u16 increase(const v128u16 &col, const v128u16 &blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v128u32 increase(const v128u32 &col, const v128u16 &blendEVY) const;
|
||||
|
||||
FORCEINLINE v128u16 decrease(const v128u16 &col, const v128u16 &blendEVY) const;
|
||||
template<NDSColorFormat COLORFORMAT> FORCEINLINE v128u32 decrease(const v128u32 &col, const v128u16 &blendEVY) const;
|
||||
};
|
||||
|
||||
class PixelOperation_SSE2
|
||||
{
|
||||
protected:
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy16(GPUEngineCompositorInfo &compInfo, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copy32(GPUEngineCompositorInfo &compInfo, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copyMask16(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT, bool ISDEBUGRENDER> FORCEINLINE void _copyMask32(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp16(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUp32(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUpMask16(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessUpMask32(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown16(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDown32(GPUEngineCompositorInfo &compInfo, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDownMask16(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u16 &src1, const v128u16 &src0) const;
|
||||
template<NDSColorFormat OUTPUTFORMAT> FORCEINLINE void _brightnessDownMask32(GPUEngineCompositorInfo &compInfo, const v128u8 &passMask8, const v128u16 &evy16, const v128u8 &srcLayerID, const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE>
|
||||
FORCEINLINE void _unknownEffectMask16(GPUEngineCompositorInfo &compInfo,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u16 &src1, const v128u16 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const v128u8 &enableColorEffectMask,
|
||||
const v128u8 &spriteAlpha,
|
||||
const v128u8 &spriteMode) const;
|
||||
|
||||
template<NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE>
|
||||
FORCEINLINE void _unknownEffectMask32(GPUEngineCompositorInfo &compInfo,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const v128u8 &enableColorEffectMask,
|
||||
const v128u8 &spriteAlpha,
|
||||
const v128u8 &spriteMode) const;
|
||||
|
||||
public:
|
||||
PixelOperation_SSE2() {};
|
||||
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE, bool WILLPERFORMWINDOWTEST>
|
||||
FORCEINLINE void Composite16(GPUEngineCompositorInfo &compInfo,
|
||||
const bool didAllPixelsPass,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u16 &src1, const v128u16 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const u8 *__restrict enableColorEffectPtr,
|
||||
const u8 *__restrict sprAlphaPtr,
|
||||
const u8 *__restrict sprModePtr) const;
|
||||
|
||||
template <GPUCompositorMode COMPOSITORMODE, NDSColorFormat OUTPUTFORMAT, GPULayerType LAYERTYPE, bool WILLPERFORMWINDOWTEST>
|
||||
FORCEINLINE void Composite32(GPUEngineCompositorInfo &compInfo,
|
||||
const bool didAllPixelsPass,
|
||||
const v128u8 &passMask8,
|
||||
const v128u16 &evy16,
|
||||
const v128u8 &srcLayerID,
|
||||
const v128u32 &src3, const v128u32 &src2, const v128u32 &src1, const v128u32 &src0,
|
||||
const v128u8 &srcEffectEnableMask,
|
||||
const v128u8 &dstBlendEnableMaskLUT,
|
||||
const u8 *__restrict enableColorEffectPtr,
|
||||
const u8 *__restrict sprAlphaPtr,
|
||||
const u8 *__restrict sprModePtr) const;
|
||||
};
|
||||
|
||||
#endif // ENABLE_SSE2
|
||||
|
||||
#endif // GPU_OPERATIONS_SSE2_H
|
|
@ -0,0 +1,749 @@
|
|||
/*
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2011 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "GPU_osd.h"
|
||||
#include "GPU.h"
|
||||
#include "mem.h"
|
||||
#include <string.h> //mem funcs
|
||||
#include <stdarg.h> //va_start, etc
|
||||
#include <sstream>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <glib.h>
|
||||
#include "debug.h"
|
||||
|
||||
#include "aggdraw.h"
|
||||
#include "movie.h"
|
||||
#include "rtc.h"
|
||||
#include "NDSSystem.h"
|
||||
#include "mic.h"
|
||||
#include "saves.h"
|
||||
|
||||
bool HudEditorMode = false;
|
||||
OSDCLASS *osd = NULL;
|
||||
HudStruct Hud;
|
||||
|
||||
//contains a timer to be used for well-timed hud components
|
||||
static s64 hudTimer;
|
||||
|
||||
static void SetHudDummy (HudCoordinates *hud)
|
||||
{
|
||||
hud->x=666;
|
||||
hud->y=666;
|
||||
}
|
||||
|
||||
static bool IsHudDummy (HudCoordinates *hud)
|
||||
{
|
||||
return (hud->x == 666 && hud->y == 666);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static T calcY(T y) // alters a GUI element y coordinate as necessary to obey swapScreens and singleScreen settings
|
||||
{
|
||||
if(osd->singleScreen)
|
||||
{
|
||||
if(y >= 192)
|
||||
y -= 192;
|
||||
if(osd->swapScreens)
|
||||
y += 192;
|
||||
}
|
||||
else if(osd->swapScreens)
|
||||
{
|
||||
if(y >= 192)
|
||||
y -= 192;
|
||||
else
|
||||
y += 192;
|
||||
}
|
||||
return y;
|
||||
}
|
||||
|
||||
void EditHud(s32 x, s32 y, HudStruct *hudstruct) {
|
||||
|
||||
u32 i = 0;
|
||||
|
||||
while (!IsHudDummy(&hudstruct->hud(i))) {
|
||||
HudCoordinates &hud = hudstruct->hud(i);
|
||||
|
||||
//reset
|
||||
if(!hud.clicked) {
|
||||
hud.storedx=0;
|
||||
hud.storedy=0;
|
||||
}
|
||||
|
||||
if((x >= hud.x && x <= hud.x + hud.xsize) &&
|
||||
(calcY(y) >= calcY(hud.y) && calcY(y) <= calcY(hud.y) + hud.ysize) && !hudstruct->clicked ) {
|
||||
|
||||
hud.clicked=1;
|
||||
hud.storedx = x - hud.x;
|
||||
hud.storedy = y - hud.y;
|
||||
}
|
||||
|
||||
if(hud.clicked) {
|
||||
hud.x = x - hud.storedx;
|
||||
hud.y = y - hud.storedy;
|
||||
}
|
||||
|
||||
//sanity checks
|
||||
if(hud.x < 0) hud.x = 0;
|
||||
if(hud.y < 0) hud.y = 0;
|
||||
if(hud.x > 245)hud.x = 245; //margins
|
||||
if(hud.y > 384-16)hud.y = 384-16;
|
||||
|
||||
if(hud.clicked)
|
||||
{
|
||||
hudstruct->clicked = true;
|
||||
break;//prevent items from grouping together
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void HudClickRelease(HudStruct *hudstruct) {
|
||||
|
||||
u32 i = 0;
|
||||
|
||||
while (!IsHudDummy(&hudstruct->hud(i))) {
|
||||
HudCoordinates &hud = hudstruct->hud(i);
|
||||
hud.clicked=0;
|
||||
i++;
|
||||
}
|
||||
|
||||
hudstruct->clicked = false;
|
||||
}
|
||||
|
||||
void HudStruct::reset()
|
||||
{
|
||||
FpsDisplay.x=0;
|
||||
FpsDisplay.y=5;
|
||||
FpsDisplay.xsize=166;
|
||||
FpsDisplay.ysize=10;
|
||||
|
||||
FrameCounter.x=0;
|
||||
FrameCounter.y=25;
|
||||
FrameCounter.xsize=60;
|
||||
FrameCounter.ysize=10;
|
||||
|
||||
InputDisplay.x=0;
|
||||
InputDisplay.y=45;
|
||||
InputDisplay.xsize=220;
|
||||
InputDisplay.ysize=10;
|
||||
|
||||
GraphicalInputDisplay.x=8;
|
||||
GraphicalInputDisplay.y=328;
|
||||
GraphicalInputDisplay.xsize=102;
|
||||
GraphicalInputDisplay.ysize=50;
|
||||
|
||||
LagFrameCounter.x=0;
|
||||
LagFrameCounter.y=65;
|
||||
LagFrameCounter.xsize=30;
|
||||
LagFrameCounter.ysize=10;
|
||||
|
||||
Microphone.x=0;
|
||||
Microphone.y=85;
|
||||
Microphone.xsize=20;
|
||||
Microphone.ysize=10;
|
||||
|
||||
RTCDisplay.x=0;
|
||||
RTCDisplay.y=105;
|
||||
RTCDisplay.xsize=220;
|
||||
RTCDisplay.ysize=10;
|
||||
|
||||
SavestateSlots.x = 8;
|
||||
SavestateSlots.y = 160;
|
||||
SavestateSlots.xsize = 240;
|
||||
SavestateSlots.ysize = 24;
|
||||
|
||||
SetHudDummy(&Dummy);
|
||||
clicked = false;
|
||||
}
|
||||
|
||||
static void joyFill(int n) {
|
||||
|
||||
bool pressedForGame = NDS_getFinalUserInput().buttons.array[n];
|
||||
bool physicallyPressed = NDS_getRawUserInput().buttons.array[n];
|
||||
if(pressedForGame && physicallyPressed)
|
||||
aggDraw.hud->fillColor(0,0,0,255);
|
||||
else if(pressedForGame)
|
||||
aggDraw.hud->fillColor(255,0,0,255);
|
||||
else if(physicallyPressed)
|
||||
aggDraw.hud->fillColor(0,255,0,255);
|
||||
else
|
||||
aggDraw.hud->fillColor(255,255,255,255);
|
||||
}
|
||||
|
||||
static void joyEllipse(double ex, double ey, int xc, int yc, int x, int y, double ratio, double rad, int button) {
|
||||
|
||||
joyFill(button);
|
||||
aggDraw.hud->lineWidth(rad);
|
||||
aggDraw.hud->ellipse(x+((xc*ex)*ratio), y+((yc*ey)*ratio), rad*ratio, rad*ratio);
|
||||
}
|
||||
|
||||
static void joyRoundedRect(double x1, double y1, int x2, int y2, int alpha1, int alpha2, int button)
|
||||
{
|
||||
bool pressedForGame = NDS_getFinalUserInput().buttons.array[button];
|
||||
bool physicallyPressed = NDS_getRawUserInput().buttons.array[button];
|
||||
if(pressedForGame && physicallyPressed)
|
||||
aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,0,0,alpha1), agg::rgba8(0,0,0,alpha2));
|
||||
else if(pressedForGame)
|
||||
aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,0,0,alpha1), agg::rgba8(255,0,0,alpha2));
|
||||
else if(physicallyPressed)
|
||||
aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(0,255,0,alpha1), agg::rgba8(0,255,0,alpha2));
|
||||
else
|
||||
return; //aggDraw.hud->fillLinearGradient(x1,y1,x2,y2,agg::rgba8(255,255,255,alpha1), agg::rgba8(255,255,255,alpha2));
|
||||
|
||||
aggDraw.hud->roundedRect(x1,y1,x2,y2,1);
|
||||
}
|
||||
|
||||
|
||||
static void drawPad(double x, double y, double ratio) {
|
||||
|
||||
// you might notice black/red/green colors used to show what buttons are pressed.
|
||||
// the logic is roughly:
|
||||
// RED == PAST (the button was held last frame)
|
||||
// GREEN == FUTURE (the button is physically held now)
|
||||
// BLACK == PRESENT (the button was held last frame and is still physically held now)
|
||||
|
||||
// aligning to odd half-pixel boundaries prevents agg2d from blurring thin straight lines
|
||||
x = floor(x) + 0.5;
|
||||
y = floor(calcY(y)) + 0.5;
|
||||
double xc = 41 - 0.5;
|
||||
double yc = 20 - 0.5;
|
||||
|
||||
aggDraw.hud->lineColor(128,128,128,255);
|
||||
|
||||
aggDraw.hud->fillLinearGradient(x, y, x+(xc*ratio), y+(yc*ratio), agg::rgba8(222,222,222,128), agg::rgba8(255,255,255,255));
|
||||
|
||||
aggDraw.hud->roundedRect (x, y, floor(x+(xc*ratio))+0.5, floor(y+(yc*ratio))+0.5, 1);
|
||||
|
||||
double screenLeft = x+(xc*.25*ratio);
|
||||
double screenTop = y+(yc*.1*ratio);
|
||||
double screenRight = x+(xc*.745*ratio);
|
||||
double screenBottom = y+(yc*.845*ratio);
|
||||
aggDraw.hud->fillLinearGradient(screenLeft, screenTop, screenRight, screenBottom, agg::rgba8(128,128,128,128), agg::rgba8(255,255,255,255));
|
||||
aggDraw.hud->roundedRect (screenLeft, screenTop, screenRight, screenBottom, 1);
|
||||
|
||||
|
||||
joyEllipse(.89,.45,xc,yc,x,y,ratio,1,6);//B
|
||||
joyEllipse(.89,.22,xc,yc,x,y,ratio,1,3);//X
|
||||
joyEllipse(.83,.34,xc,yc,x,y,ratio,1,4);//Y
|
||||
joyEllipse(.95,.34,xc,yc,x,y,ratio,1,5);//A
|
||||
joyEllipse(.82,.716,xc,yc,x,y,ratio,.5,7);//Start
|
||||
joyEllipse(.82,.842,xc,yc,x,y,ratio,.5,8);//Select
|
||||
|
||||
|
||||
double dpadPoints [][2] = {
|
||||
{.04,.33}, // top-left corner of left button
|
||||
{.08,.33},
|
||||
{.08,.24}, // top-left corner of up button
|
||||
{.13,.24}, // top-right corner of up button
|
||||
{.13,.33},
|
||||
{.17,.33}, // top-right corner of right button
|
||||
{.17,.43}, // bottom-right corner of right button
|
||||
{.13,.43},
|
||||
{.13,.516}, // bottom-right corner of down button
|
||||
{.08,.516}, // bottom-left corner of down button
|
||||
{.08,.43},
|
||||
{.04,.43}, // bottom-left corner of left button
|
||||
};
|
||||
static const int numdpadPoints = sizeof(dpadPoints)/sizeof(dpadPoints[0]);
|
||||
for(int i = 0; i < numdpadPoints; i++)
|
||||
{
|
||||
dpadPoints[i][0] = x+(xc*(dpadPoints[i][0]+.01)*ratio);
|
||||
dpadPoints[i][1] = y+(yc*(dpadPoints[i][1]+.00)*ratio);
|
||||
}
|
||||
|
||||
// dpad outline
|
||||
aggDraw.hud->fillColor(255,255,255,200);
|
||||
aggDraw.hud->polygon((double*)dpadPoints, numdpadPoints);
|
||||
|
||||
aggDraw.hud->noLine();
|
||||
|
||||
// left
|
||||
joyRoundedRect(dpadPoints[0][0], dpadPoints[0][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 11);
|
||||
|
||||
// right
|
||||
joyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[6][0], dpadPoints[6][1], 0, 255, 12);
|
||||
|
||||
// up
|
||||
joyRoundedRect(dpadPoints[2][0], dpadPoints[2][1], dpadPoints[7][0], dpadPoints[7][1], 255, 0, 9);
|
||||
|
||||
// right
|
||||
joyRoundedRect(dpadPoints[1][0], dpadPoints[1][1], dpadPoints[8][0], dpadPoints[8][1], 0, 255, 10);
|
||||
|
||||
// left shoulder
|
||||
joyRoundedRect(x+(xc*.00*ratio), y+(yc*.00*ratio), x+(xc*.15*ratio), y+(yc*.07*ratio), 255, 200, 2);
|
||||
|
||||
// right shoulder
|
||||
joyRoundedRect(x+(xc*.85*ratio), y+(yc*.00*ratio), x+(xc*1.0*ratio), y+(yc*.07*ratio), 200, 255, 1);
|
||||
|
||||
// lid...
|
||||
joyRoundedRect(x+(xc*.4*ratio), y+(yc*.96*ratio), x+(xc*0.6*ratio), y+(yc*1.0*ratio), 200, 200, 13);
|
||||
|
||||
// touch pad
|
||||
{
|
||||
BOOL gameTouchOn = nds.isTouch;
|
||||
double gameTouchX = screenLeft+1 + (nds.scr_touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0;
|
||||
double gameTouchY = screenTop+1 + (nds.scr_touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0;
|
||||
bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch;
|
||||
double physicalTouchX = screenLeft+1 + (NDS_getRawUserInput().touch.touchX * 0.0625) * (screenRight - screenLeft - 2) / 256.0;
|
||||
double physicalTouchY = screenTop+1 + (NDS_getRawUserInput().touch.touchY * 0.0625) * (screenBottom - screenTop - 2) / 192.0;
|
||||
if(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY)
|
||||
{
|
||||
aggDraw.hud->fillColor(0,0,0,255);
|
||||
aggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(physicalTouchOn)
|
||||
{
|
||||
aggDraw.hud->fillColor(0,0,0,128);
|
||||
aggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.5, ratio*0.5);
|
||||
aggDraw.hud->fillColor(0,255,0,255);
|
||||
aggDraw.hud->ellipse(physicalTouchX, physicalTouchY, ratio*0.37, ratio*0.37);
|
||||
}
|
||||
if(gameTouchOn)
|
||||
{
|
||||
aggDraw.hud->fillColor(255,0,0,255);
|
||||
aggDraw.hud->ellipse(gameTouchX, gameTouchY, ratio*0.37, ratio*0.37);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct TouchInfo{
|
||||
u16 X;
|
||||
u16 Y;
|
||||
};
|
||||
static int touchalpha[8]= {31, 63, 95, 127, 159, 191, 223, 255};
|
||||
static TouchInfo temptouch;
|
||||
static const bool touchshadow = false;//true; // sorry, it's cool but also distracting and looks cleaner with it off. maybe if it drew line segments between touch points instead of isolated crosses...
|
||||
static std::vector<TouchInfo> touch (8);
|
||||
|
||||
static void TextualInputDisplay() {
|
||||
|
||||
// drawing the whole string at once looks ugly
|
||||
// (because of variable width font and the "shadow" appearing over blank space)
|
||||
// and can't give us the color-coded effects we want anyway (see drawPad for info)
|
||||
|
||||
const UserButtons& gameButtons = NDS_getFinalUserInput().buttons;
|
||||
const UserButtons& physicalButtons = NDS_getRawUserInput().buttons;
|
||||
|
||||
double x = Hud.InputDisplay.x;
|
||||
|
||||
// from order FRLDUTSBAYXWEG where G is 0
|
||||
static const char* buttonChars = "<^>vABXYLRSsgf";
|
||||
static const int buttonIndex [14] = {11,9,12,10,5,6,3,4,2,1,7,8,0,13};
|
||||
for(int i = 0; i < 14; i++, x+=11.0)
|
||||
{
|
||||
bool pressedForGame = gameButtons.array[buttonIndex[i]];
|
||||
bool physicallyPressed = physicalButtons.array[buttonIndex[i]];
|
||||
if(pressedForGame && physicallyPressed)
|
||||
aggDraw.hud->lineColor(255,255,255,255);
|
||||
else if(pressedForGame)
|
||||
aggDraw.hud->lineColor(255,48,48,255);
|
||||
else if(physicallyPressed)
|
||||
aggDraw.hud->lineColor(0,192,0,255);
|
||||
else
|
||||
continue;
|
||||
|
||||
// cast from char to std::string is a bit awkward
|
||||
std::string str(buttonChars+i, 2);
|
||||
str[1] = '\0';
|
||||
|
||||
aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str);
|
||||
}
|
||||
|
||||
// touch pad
|
||||
{
|
||||
char str [32];
|
||||
BOOL gameTouchOn = nds.isTouch;
|
||||
int gameTouchX = nds.adc_touchX >> 4;
|
||||
int gameTouchY = nds.adc_touchY >> 4;
|
||||
bool physicalTouchOn = NDS_getRawUserInput().touch.isTouch;
|
||||
int physicalTouchX = NDS_getRawUserInput().touch.touchX >> 4;
|
||||
int physicalTouchY = NDS_getRawUserInput().touch.touchY >> 4;
|
||||
if(gameTouchOn && physicalTouchOn && gameTouchX == physicalTouchX && gameTouchY == physicalTouchY)
|
||||
{
|
||||
sprintf(str, "%d,%d", gameTouchX, gameTouchY);
|
||||
aggDraw.hud->lineColor(255,255,255,255);
|
||||
aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y), str);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(gameTouchOn)
|
||||
{
|
||||
sprintf(str, "%d,%d", gameTouchX, gameTouchY);
|
||||
aggDraw.hud->lineColor(255,48,48,255);
|
||||
aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)-(physicalTouchOn?8:0), str);
|
||||
}
|
||||
if(physicalTouchOn)
|
||||
{
|
||||
sprintf(str, "%d,%d", physicalTouchX, physicalTouchY);
|
||||
aggDraw.hud->lineColor(0,192,0,255);
|
||||
aggDraw.hud->renderTextDropshadowed(x, calcY(Hud.InputDisplay.y)+(gameTouchOn?8:0), str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void TouchDisplay() {
|
||||
// note: calcY should not be used in this function.
|
||||
aggDraw.hud->lineWidth(1.0);
|
||||
|
||||
temptouch.X = NDS_getRawUserInput().touch.touchX >> 4;
|
||||
temptouch.Y = NDS_getRawUserInput().touch.touchY >> 4;
|
||||
|
||||
if(touchshadow) {
|
||||
|
||||
touch.push_back(temptouch);
|
||||
if(touch.size() > 8) touch.erase(touch.begin());
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
temptouch = touch[i];
|
||||
if(temptouch.X != 0 || temptouch.Y != 0) {
|
||||
aggDraw.hud->lineColor(0, 255, 0, touchalpha[i]);
|
||||
aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz
|
||||
aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert
|
||||
aggDraw.hud->fillColor(0, 0, 0, touchalpha[i]);
|
||||
aggDraw.hud->rectangle(temptouch.X-1, temptouch.Y + 192-1, temptouch.X+1, temptouch.Y + 192+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if(NDS_getRawUserInput().touch.isTouch) {
|
||||
aggDraw.hud->lineColor(0, 255, 0, 128);
|
||||
aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz
|
||||
aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert
|
||||
}
|
||||
|
||||
if(nds.isTouch)
|
||||
{
|
||||
temptouch.X = nds.scr_touchX / 16;
|
||||
temptouch.Y = nds.scr_touchY / 16;
|
||||
aggDraw.hud->lineColor(255, 0, 0, 128);
|
||||
aggDraw.hud->line(temptouch.X - 256, temptouch.Y + 192, temptouch.X + 256, temptouch.Y + 192); //horiz
|
||||
aggDraw.hud->line(temptouch.X, temptouch.Y - 256, temptouch.X, temptouch.Y + 384); //vert
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int previousslot = 0;
|
||||
static char number[10];
|
||||
static s64 slotTimer=0;
|
||||
|
||||
static void DrawStateSlots(){
|
||||
|
||||
const int yloc = calcY(Hud.SavestateSlots.y); //160
|
||||
const int xloc = Hud.SavestateSlots.x; //8
|
||||
|
||||
s64 fadecounter = 512 - (hudTimer-slotTimer)/4; //change constant to alter fade speed
|
||||
if(fadecounter < 1) fadecounter = 0;
|
||||
if(fadecounter>255) fadecounter = 255;
|
||||
|
||||
int alpha = (int)fadecounter;
|
||||
if(HudEditorMode)
|
||||
alpha = 255;
|
||||
|
||||
if(alpha!=0)
|
||||
{
|
||||
aggDraw.hud->lineWidth(1.0);
|
||||
aggDraw.hud->lineColor(0, 0, 0, alpha);
|
||||
aggDraw.hud->fillColor(255, 255, 255, alpha);
|
||||
|
||||
for ( int i = 0, xpos=0; i < 10; xpos=xpos+24) {
|
||||
|
||||
int yheight=0;
|
||||
|
||||
aggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, xloc + 22 + xpos, yloc + 20 + yheight+20, agg::rgba8(100,200,255,alpha), agg::rgba8(255,255,255,0));
|
||||
|
||||
if(lastSaveState == i) {
|
||||
yheight = 5;
|
||||
aggDraw.hud->fillLinearGradient(xloc + xpos, yloc - yheight, 22 + xloc + xpos, yloc + 20 + yheight+20, agg::rgba8(100,255,255,alpha), agg::rgba8(255,255,255,0));
|
||||
}
|
||||
|
||||
aggDraw.hud->rectangle(xloc + xpos , yloc - yheight, xloc + 22 + xpos , yloc + 20 + yheight);
|
||||
snprintf(number, 10, "%d", i);
|
||||
aggDraw.hud->renderText(xloc + 1 + xpos + 4, yloc+4, std::string(number));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
if(lastSaveState != previousslot)
|
||||
slotTimer = hudTimer;
|
||||
|
||||
previousslot = lastSaveState;
|
||||
}
|
||||
|
||||
static void DrawEditableElementIndicators()
|
||||
{
|
||||
u32 i = 0;
|
||||
while (!IsHudDummy(&Hud.hud(i))) {
|
||||
HudCoordinates &hud = Hud.hud(i);
|
||||
aggDraw.hud->fillColor(0,0,0,0);
|
||||
aggDraw.hud->lineColor(0,0,0,64);
|
||||
aggDraw.hud->lineWidth(2.0);
|
||||
aggDraw.hud->rectangle(hud.x,calcY(hud.y),hud.x+hud.xsize+1.0,calcY(hud.y)+hud.ysize+1.0);
|
||||
aggDraw.hud->lineColor(255,hud.clicked?127:255,0,255);
|
||||
aggDraw.hud->lineWidth(1.0);
|
||||
aggDraw.hud->rectangle(hud.x-0.5,calcY(hud.y)-0.5,hud.x+hud.xsize+0.5,calcY(hud.y)+hud.ysize+0.5);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DrawHUD()
|
||||
{
|
||||
GTimeVal time;
|
||||
g_get_current_time(&time);
|
||||
hudTimer = ((s64)time.tv_sec * 1000) + ((s64)time.tv_usec/1000);
|
||||
|
||||
if (HudEditorMode)
|
||||
{
|
||||
DrawEditableElementIndicators();
|
||||
}
|
||||
|
||||
if (CommonSettings.hud.ShowInputDisplay)
|
||||
{
|
||||
TextualInputDisplay();
|
||||
TouchDisplay();
|
||||
}
|
||||
|
||||
if (CommonSettings.hud.FpsDisplay)
|
||||
{
|
||||
osd->addFixed(Hud.FpsDisplay.x, Hud.FpsDisplay.y, "Fps:%02d/%02d (%02d%%/%02d%%)%s", Hud.fps, Hud.fps3d, Hud.cpuload[0], Hud.cpuload[1], driver->EMU_IsEmulationPaused() ? " (paused)" : "");
|
||||
}
|
||||
|
||||
if (CommonSettings.hud.FrameCounterDisplay)
|
||||
{
|
||||
if(movieMode == MOVIEMODE_RECORD)
|
||||
osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d",currFrameCounter);
|
||||
else if (movieMode == MOVIEMODE_PLAY)
|
||||
osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d/%d",currFrameCounter,currMovieData.records.size());
|
||||
else if (movieMode == MOVIEMODE_FINISHED)
|
||||
osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d/%d (finished)",currFrameCounter,currMovieData.records.size());
|
||||
else
|
||||
osd->addFixed(Hud.FrameCounter.x, Hud.FrameCounter.y, "%d (no movie)",currFrameCounter);
|
||||
}
|
||||
|
||||
if (CommonSettings.hud.ShowLagFrameCounter)
|
||||
{
|
||||
osd->addFixed(Hud.LagFrameCounter.x, Hud.LagFrameCounter.y, "%d",TotalLagFrames);
|
||||
}
|
||||
|
||||
if (CommonSettings.hud.ShowGraphicalInputDisplay)
|
||||
{
|
||||
drawPad(Hud.GraphicalInputDisplay.x, Hud.GraphicalInputDisplay.y, 2.5);
|
||||
}
|
||||
|
||||
#if defined(WIN32) && !defined(WXPORT)
|
||||
if (CommonSettings.hud.ShowMicrophone)
|
||||
{
|
||||
osd->addFixed(Hud.Microphone.x, Hud.Microphone.y, "%03d [%07d]",MicDisplay, Hud.cpuloopIterationCount);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (CommonSettings.hud.ShowRTC)
|
||||
{
|
||||
DateTime tm = rtcGetTime();
|
||||
static const char *wday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
|
||||
osd->addFixed(Hud.RTCDisplay.x, Hud.RTCDisplay.y, "%04d-%03s-%02d %s %02d:%02d:%02d", tm.get_Year(), DateTime::GetNameOfMonth(tm.get_Month()), tm.get_Day(), wday[tm.get_DayOfWeek()%7], tm.get_Hour(), tm.get_Minute(), tm.get_Second());
|
||||
}
|
||||
|
||||
DrawStateSlots();
|
||||
}
|
||||
|
||||
|
||||
|
||||
OSDCLASS::OSDCLASS(u8 core)
|
||||
{
|
||||
memset(name,0,7);
|
||||
|
||||
mode=core;
|
||||
offset=0;
|
||||
|
||||
lastLineText=0;
|
||||
lineText_x = 5;
|
||||
lineText_y = 120;
|
||||
lineText_color = AggColor(255, 255, 255);
|
||||
for (int i=0; i < OSD_MAX_LINES+1; i++)
|
||||
{
|
||||
lineText[i] = new char[1024];
|
||||
memset(lineText[i], 0, 1024);
|
||||
lineTimer[i] = 0;
|
||||
lineColor[i] = lineText_color;
|
||||
}
|
||||
|
||||
rotAngle = 0;
|
||||
|
||||
singleScreen = false;
|
||||
swapScreens = false;
|
||||
|
||||
needUpdate = false;
|
||||
|
||||
if (core==0)
|
||||
strcpy(name,"Core A");
|
||||
else
|
||||
if (core==1)
|
||||
strcpy(name,"Core B");
|
||||
else
|
||||
{
|
||||
strcpy(name,"Main");
|
||||
mode=255;
|
||||
}
|
||||
|
||||
//border(false);
|
||||
|
||||
LOG("OSD_Init (%s)\n",name);
|
||||
}
|
||||
|
||||
OSDCLASS::~OSDCLASS()
|
||||
{
|
||||
LOG("OSD_Deinit (%s)\n",name);
|
||||
|
||||
for (int i=0; i < OSD_MAX_LINES+1; i++)
|
||||
{
|
||||
if (lineText[i])
|
||||
delete [] lineText[i];
|
||||
lineText[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void OSDCLASS::setOffset(u16 ofs)
|
||||
{
|
||||
offset=ofs;
|
||||
}
|
||||
|
||||
void OSDCLASS::setRotate(u16 angle)
|
||||
{
|
||||
rotAngle = angle;
|
||||
}
|
||||
|
||||
void OSDCLASS::clear()
|
||||
{
|
||||
needUpdate=false;
|
||||
}
|
||||
|
||||
bool OSDCLASS::checkTimers()
|
||||
{
|
||||
if (lastLineText == 0) return false;
|
||||
|
||||
time_t tmp_time = time(NULL);
|
||||
|
||||
for (int i=0; i < lastLineText; i++)
|
||||
{
|
||||
if (tmp_time > (lineTimer[i] + OSD_TIMER_SECS) )
|
||||
{
|
||||
if (i < lastLineText)
|
||||
{
|
||||
for (int j=i; j < lastLineText; j++)
|
||||
{
|
||||
strcpy(lineText[j], lineText[j+1]);
|
||||
lineTimer[j] = lineTimer[j+1];
|
||||
lineColor[j] = lineColor[j+1];
|
||||
}
|
||||
}
|
||||
lineTimer[lastLineText] = 0;
|
||||
lastLineText--;
|
||||
if (lastLineText == 0) return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void OSDCLASS::update()
|
||||
{
|
||||
if ( (!needUpdate) && (!lastLineText) ) return; // don't update if buffer empty (speed up)
|
||||
if (lastLineText)
|
||||
{
|
||||
if (checkTimers())
|
||||
{
|
||||
for (int i=0; i < lastLineText; i++)
|
||||
{
|
||||
aggDraw.hud->lineColor(lineColor[i]);
|
||||
aggDraw.hud->renderTextDropshadowed(lineText_x,lineText_y+(i*16),lineText[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!needUpdate) return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OSDCLASS::setListCoord(u16 x, u16 y)
|
||||
{
|
||||
lineText_x = x;
|
||||
lineText_y = y;
|
||||
}
|
||||
|
||||
void OSDCLASS::setLineColor(u8 r=255, u8 g=255, u8 b=255)
|
||||
{
|
||||
lineText_color = AggColor(r,g,b);
|
||||
}
|
||||
|
||||
void OSDCLASS::addLine(const char *fmt, ...)
|
||||
{
|
||||
va_list list;
|
||||
|
||||
if (lastLineText > OSD_MAX_LINES) lastLineText = OSD_MAX_LINES;
|
||||
if (lastLineText == OSD_MAX_LINES) // full
|
||||
{
|
||||
lastLineText--;
|
||||
for (int j=0; j < lastLineText; j++)
|
||||
{
|
||||
strcpy(lineText[j], lineText[j+1]);
|
||||
lineTimer[j] = lineTimer[j+1];
|
||||
lineColor[j] = lineColor[j+1];
|
||||
}
|
||||
}
|
||||
|
||||
va_start(list,fmt);
|
||||
#if defined(_MSC_VER) || defined(__INTEL_COMPILER)
|
||||
_vsnprintf(lineText[lastLineText],1023,fmt,list);
|
||||
#else
|
||||
vsnprintf(lineText[lastLineText],1023,fmt,list);
|
||||
#endif
|
||||
va_end(list);
|
||||
lineColor[lastLineText] = lineText_color;
|
||||
lineTimer[lastLineText] = time(NULL);
|
||||
needUpdate = true;
|
||||
|
||||
lastLineText++;
|
||||
}
|
||||
|
||||
void OSDCLASS::addFixed(u16 x, u16 y, const char *fmt, ...)
|
||||
{
|
||||
va_list list;
|
||||
char msg[1024];
|
||||
|
||||
va_start(list,fmt);
|
||||
vsnprintf(msg,1023,fmt,list);
|
||||
va_end(list);
|
||||
|
||||
aggDraw.hud->lineColor(255,255,255);
|
||||
aggDraw.hud->renderTextDropshadowed(x,calcY(y),msg);
|
||||
|
||||
needUpdate = true;
|
||||
}
|
||||
|
||||
void OSDCLASS::border(bool enabled)
|
||||
{
|
||||
//render51.setTextBoxBorder(enabled);
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2008-2012 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GPU_OSD_
|
||||
#define __GPU_OSD_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef HAVE_LIBAGG
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "aggdraw.h"
|
||||
|
||||
#define OSD_MAX_LINES 4
|
||||
#define OSD_TIMER_SECS 2
|
||||
|
||||
|
||||
struct HudCoordinates{
|
||||
int x;
|
||||
int y;
|
||||
int xsize;
|
||||
int ysize;
|
||||
int storedx;
|
||||
int storedy;
|
||||
int clicked;
|
||||
};
|
||||
|
||||
struct HudStruct
|
||||
{
|
||||
public:
|
||||
HudStruct()
|
||||
{
|
||||
resetTransient();
|
||||
}
|
||||
|
||||
void resetTransient()
|
||||
{
|
||||
fps = 0;
|
||||
fps3d = 0;
|
||||
cpuload[0] = cpuload[1] = 0;
|
||||
cpuloopIterationCount = 0;
|
||||
clicked = false;
|
||||
}
|
||||
|
||||
HudCoordinates SavestateSlots;
|
||||
HudCoordinates FpsDisplay;
|
||||
HudCoordinates FrameCounter;
|
||||
HudCoordinates InputDisplay;
|
||||
HudCoordinates GraphicalInputDisplay;
|
||||
HudCoordinates LagFrameCounter;
|
||||
HudCoordinates Microphone;
|
||||
HudCoordinates RTCDisplay;
|
||||
HudCoordinates Dummy;
|
||||
|
||||
HudCoordinates &hud(int i) { return ((HudCoordinates*)this)[i]; }
|
||||
void reset();
|
||||
|
||||
int fps, fps3d, cpuload[2], cpuloopIterationCount;
|
||||
bool clicked;
|
||||
};
|
||||
|
||||
void EditHud(s32 x, s32 y, HudStruct *hudstruct);
|
||||
void HudClickRelease(HudStruct *hudstruct);
|
||||
|
||||
void DrawHUD();
|
||||
|
||||
extern HudStruct Hud;
|
||||
extern bool HudEditorMode;
|
||||
|
||||
class OSDCLASS
|
||||
{
|
||||
private:
|
||||
u64 offset;
|
||||
u8 mode;
|
||||
|
||||
u16 rotAngle;
|
||||
|
||||
u16 lineText_x;
|
||||
u16 lineText_y;
|
||||
AggColor lineText_color;
|
||||
u8 lastLineText;
|
||||
char *lineText[OSD_MAX_LINES+1];
|
||||
time_t lineTimer[OSD_MAX_LINES+1];
|
||||
AggColor lineColor[OSD_MAX_LINES+1];
|
||||
|
||||
bool needUpdate;
|
||||
|
||||
bool checkTimers();
|
||||
|
||||
public:
|
||||
char name[7]; // for debuging
|
||||
bool singleScreen;
|
||||
bool swapScreens;
|
||||
|
||||
OSDCLASS(u8 core);
|
||||
~OSDCLASS();
|
||||
|
||||
void setOffset(u16 ofs);
|
||||
void setRotate(u16 angle);
|
||||
void update();
|
||||
void clear();
|
||||
void setListCoord(u16 x, u16 y);
|
||||
void setLineColor(u8 r, u8 b, u8 g);
|
||||
void addLine(const char *fmt, ...);
|
||||
void addFixed(u16 x, u16 y, const char *fmt, ...);
|
||||
void border(bool enabled);
|
||||
};
|
||||
|
||||
extern OSDCLASS *osd;
|
||||
#else /* HAVE_LIBAGG */
|
||||
void DrawHUD();
|
||||
|
||||
class OSDCLASS {
|
||||
public:
|
||||
OSDCLASS(u8 core);
|
||||
~OSDCLASS();
|
||||
void update();
|
||||
void clear();
|
||||
void setLineColor(u8 r, u8 b, u8 g);
|
||||
void addLine(const char *fmt, ...);
|
||||
};
|
||||
|
||||
extern OSDCLASS *osd;
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
Copyright (C) 2010 DeSmumE team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "types.h"
|
||||
#include "GPU_osd.h"
|
||||
|
||||
OSDCLASS *osd;
|
||||
|
||||
OSDCLASS::OSDCLASS(u8 core) {}
|
||||
OSDCLASS::~OSDCLASS() {}
|
||||
void OSDCLASS::update() {}
|
||||
void OSDCLASS::clear() {}
|
||||
void OSDCLASS::setLineColor(u8 r, u8 b, u8 g) {}
|
||||
void OSDCLASS::addLine(const char *fmt, ...) {}
|
||||
|
||||
void DrawHUD() {}
|
5603
desmume/src/MMU.cpp
5603
desmume/src/MMU.cpp
File diff suppressed because it is too large
Load Diff
2057
desmume/src/MMU.h
2057
desmume/src/MMU.h
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2007 shash
|
||||
Copyright (C) 2007-2017 DeSmuME team
|
||||
Copyright (C) 2007-2011 DeSmuME team
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -28,7 +28,6 @@
|
|||
#include "readwrite.h"
|
||||
#include "debug.h"
|
||||
#include "NDSSystem.h"
|
||||
#include "emufile.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
// MEMORY TIMING ACCURACY CONFIGURATION
|
||||
|
@ -105,24 +104,24 @@ public:
|
|||
Reset();
|
||||
}
|
||||
|
||||
void savestate(EMUFILE &os, int version)
|
||||
void savestate(EMUFILE* os, int version)
|
||||
{
|
||||
os.write_32LE(m_cacheCache);
|
||||
for (int i = 0; i < NUMBLOCKS; i++)
|
||||
write32le(m_cacheCache, os);
|
||||
for(int i = 0; i < NUMBLOCKS; i++)
|
||||
{
|
||||
for (int j = 0; j < ASSOCIATIVITY; j++)
|
||||
os.write_32LE(m_blocks[i].tag[j]);
|
||||
os.write_32LE(m_blocks[i].nextWay);
|
||||
for(int j = 0; j < ASSOCIATIVITY; j++)
|
||||
write32le(m_blocks[i].tag[j],os);
|
||||
write32le(m_blocks[i].nextWay,os);
|
||||
}
|
||||
}
|
||||
bool loadstate(EMUFILE &is, int version)
|
||||
bool loadstate(EMUFILE* is, int version)
|
||||
{
|
||||
is.read_32LE(m_cacheCache);
|
||||
for (int i = 0; i < NUMBLOCKS; i++)
|
||||
read32le(&m_cacheCache, is);
|
||||
for(int i = 0; i < NUMBLOCKS; i++)
|
||||
{
|
||||
for (int j = 0; j < ASSOCIATIVITY; j++)
|
||||
is.read_32LE(m_blocks[i].tag[j]);
|
||||
is.read_32LE(m_blocks[i].nextWay);
|
||||
for(int j = 0; j < ASSOCIATIVITY; j++)
|
||||
read32le(&m_blocks[i].tag[j],is);
|
||||
read32le(&m_blocks[i].nextWay,is);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -156,8 +155,8 @@ private:
|
|||
enum { ASSOCIATIVITY = 1 << ASSOCIATIVESHIFT };
|
||||
enum { BLOCKSIZE = 1 << BLOCKSIZESHIFT };
|
||||
enum { TAGSHIFT = SIZESHIFT - ASSOCIATIVESHIFT };
|
||||
enum { TAGMASK = (u32)(~0U << TAGSHIFT) };
|
||||
enum { BLOCKMASK = ((u32)~0U >> (32 - TAGSHIFT)) & (u32)(~0U << BLOCKSIZESHIFT) };
|
||||
enum { TAGMASK = (u32)(~0 << TAGSHIFT) };
|
||||
enum { BLOCKMASK = ((u32)~0 >> (32 - TAGSHIFT)) & (u32)(~0 << BLOCKSIZESHIFT) };
|
||||
enum { WORDSIZE = sizeof(u32) };
|
||||
enum { WORDSPERBLOCK = (1 << BLOCKSIZESHIFT) / WORDSIZE };
|
||||
enum { DATAPERWORD = WORDSIZE * ASSOCIATIVITY };
|
||||
|
@ -229,13 +228,13 @@ public:
|
|||
}
|
||||
FetchAccessUnit() { this->Reset(); }
|
||||
|
||||
void savestate(EMUFILE &os, int version)
|
||||
void savestate(EMUFILE* os, int version)
|
||||
{
|
||||
os.write_32LE(m_lastAddress);
|
||||
write32le(m_lastAddress,os);
|
||||
}
|
||||
bool loadstate(EMUFILE &is, int version)
|
||||
bool loadstate(EMUFILE* is, int version)
|
||||
{
|
||||
is.read_32LE(m_lastAddress);
|
||||
read32le(&m_lastAddress,is);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,203 @@
|
|||
include $(top_srcdir)/src/desmume.mk
|
||||
|
||||
AM_CPPFLAGS += $(SDL_CFLAGS) $(GTHREAD_CFLAGS) $(X_CFLAGS) $(ALSA_CFLAGS) $(LIBAGG_CFLAGS) $(LIBSOUNDTOUCH_CFLAGS)
|
||||
|
||||
EXTRA_DIST = build.bat instruction_tabdef.inc thumb_tabdef.inc fs-linux.cpp fs-windows.cpp cocoa
|
||||
if HAVE_GDB_STUB
|
||||
SUBDIRS = . gdbstub $(UI_DIR)
|
||||
else
|
||||
SUBDIRS = . $(UI_DIR)
|
||||
endif
|
||||
DIST_SUBDIRS = . gdbstub cli gtk gtk-glade wx
|
||||
noinst_LIBRARIES = libdesmume.a
|
||||
libdesmume_a_SOURCES = \
|
||||
armcpu.cpp armcpu.h \
|
||||
arm_instructions.cpp \
|
||||
agg2d.h agg2d.inl \
|
||||
bios.cpp bios.h bits.h cp15.cpp cp15.h \
|
||||
commandline.h commandline.cpp \
|
||||
common.cpp common.h \
|
||||
debug.cpp debug.h \
|
||||
Disassembler.cpp Disassembler.h \
|
||||
emufile.h emufile.cpp emufile_types.h FIFO.cpp FIFO.h \
|
||||
firmware.cpp firmware.h GPU.cpp GPU.h \
|
||||
fs.h \
|
||||
GPU_osd.h \
|
||||
instructions.h \
|
||||
mem.h mc.cpp mc.h \
|
||||
path.cpp path.h \
|
||||
readwrite.cpp readwrite.h \
|
||||
wifi.cpp wifi.h \
|
||||
mic.h \
|
||||
MMU.cpp MMU.h MMU_timing.h NDSSystem.cpp NDSSystem.h registers.h \
|
||||
OGLRender.h \
|
||||
ROMReader.cpp ROMReader.h \
|
||||
render3D.cpp render3D.h \
|
||||
rtc.cpp rtc.h \
|
||||
saves.cpp saves.h \
|
||||
slot1.cpp slot1.h \
|
||||
SPU.cpp SPU.h \
|
||||
matrix.cpp matrix.h \
|
||||
gfx3d.cpp gfx3d.h \
|
||||
thumb_instructions.cpp types.h \
|
||||
shaders.h \
|
||||
movie.cpp movie.h \
|
||||
PACKED.h PACKED_END.h \
|
||||
utils/datetime.cpp utils/datetime.h \
|
||||
utils/ConvertUTF.c utils/ConvertUTF.h utils/guid.cpp utils/guid.h \
|
||||
utils/emufat.cpp utils/emufat.h utils/emufat_types.h \
|
||||
utils/md5.cpp utils/md5.h utils/valuearray.h utils/xstring.cpp utils/xstring.h \
|
||||
utils/decrypt/crc.cpp utils/decrypt/crc.h utils/decrypt/decrypt.cpp \
|
||||
utils/decrypt/decrypt.h utils/decrypt/header.cpp utils/decrypt/header.h \
|
||||
utils/task.cpp utils/task.h \
|
||||
utils/vfat.h utils/vfat.cpp \
|
||||
utils/dlditool.cpp \
|
||||
utils/libfat/bit_ops.h \
|
||||
utils/libfat/cache.cpp \
|
||||
utils/libfat/cache.h \
|
||||
utils/libfat/common.h \
|
||||
utils/libfat/directory.cpp \
|
||||
utils/libfat/directory.h \
|
||||
utils/libfat/disc.cpp \
|
||||
utils/libfat/disc.h \
|
||||
utils/libfat/disc_io.h \
|
||||
utils/libfat/fat.h \
|
||||
utils/libfat/fatdir.cpp \
|
||||
utils/libfat/fatdir.h \
|
||||
utils/libfat/fatfile.cpp \
|
||||
utils/libfat/fatfile.h \
|
||||
utils/libfat/filetime.cpp \
|
||||
utils/libfat/filetime.h \
|
||||
utils/libfat/file_allocation_table.cpp \
|
||||
utils/libfat/file_allocation_table.h \
|
||||
utils/libfat/libfat.cpp \
|
||||
utils/libfat/libfat_pc.h \
|
||||
utils/libfat/libfat_public_api.cpp \
|
||||
utils/libfat/libfat_public_api.h \
|
||||
utils/libfat/lock.cpp \
|
||||
utils/libfat/lock.h \
|
||||
utils/libfat/mem_allocate.h \
|
||||
utils/libfat/partition.cpp \
|
||||
utils/libfat/partition.h \
|
||||
utils/tinyxml/tinystr.cpp \
|
||||
utils/tinyxml/tinystr.h \
|
||||
utils/tinyxml/tinyxml.cpp \
|
||||
utils/tinyxml/tinyxml.h \
|
||||
utils/tinyxml/tinyxmlerror.cpp \
|
||||
utils/tinyxml/tinyxmlparser.cpp \
|
||||
addons.cpp addons.h \
|
||||
addons/slot2_mpcf.cpp addons/slot2_paddle.cpp addons/slot2_gbagame.cpp addons/slot2_none.cpp addons/slot2_rumblepak.cpp addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp addons/slot2_piano.cpp addons/slot1_none.cpp addons/slot1_r4.cpp addons/slot1_retail.cpp addons/slot1_retail_nand.cpp \
|
||||
cheatSystem.cpp cheatSystem.h \
|
||||
texcache.cpp texcache.h rasterize.cpp rasterize.h \
|
||||
metaspu/metaspu.cpp metaspu/metaspu.h \
|
||||
filter/2xsai.cpp filter/bilinear.cpp filter/epx.cpp filter/filter.h \
|
||||
filter/hq2x.cpp filter/hq2x.h filter/hq4x.cpp filter/hq4x.dat filter/hq4x.h \
|
||||
filter/interp.h filter/lq2x.cpp filter/lq2x.h filter/scanline.cpp \
|
||||
filter/videofilter.cpp filter/videofilter.h \
|
||||
version.cpp version.h \
|
||||
desmume_config.cpp desmume_config.h
|
||||
|
||||
if HAVE_JIT
|
||||
libdesmume_a_SOURCES += \
|
||||
arm_jit.cpp arm_jit.h instruction_attributes.h \
|
||||
utils/AsmJit/AsmJit.h \
|
||||
utils/AsmJit/Config.h \
|
||||
utils/AsmJit/core.h \
|
||||
utils/AsmJit/x86.h \
|
||||
utils/AsmJit/core/apibegin.h \
|
||||
utils/AsmJit/core/apiend.h \
|
||||
utils/AsmJit/core/assembler.cpp \
|
||||
utils/AsmJit/core/assembler.h \
|
||||
utils/AsmJit/core/assert.cpp \
|
||||
utils/AsmJit/core/assert.h \
|
||||
utils/AsmJit/core/buffer.cpp \
|
||||
utils/AsmJit/core/buffer.h \
|
||||
utils/AsmJit/core/build.h \
|
||||
utils/AsmJit/core/compiler.cpp \
|
||||
utils/AsmJit/core/compiler.h \
|
||||
utils/AsmJit/core/compilercontext.cpp \
|
||||
utils/AsmJit/core/compilercontext.h \
|
||||
utils/AsmJit/core/compilerfunc.cpp \
|
||||
utils/AsmJit/core/compilerfunc.h \
|
||||
utils/AsmJit/core/compileritem.cpp \
|
||||
utils/AsmJit/core/compileritem.h \
|
||||
utils/AsmJit/core/context.cpp \
|
||||
utils/AsmJit/core/context.h \
|
||||
utils/AsmJit/core/cpuinfo.cpp \
|
||||
utils/AsmJit/core/cpuinfo.h \
|
||||
utils/AsmJit/core/defs.cpp \
|
||||
utils/AsmJit/core/defs.h \
|
||||
utils/AsmJit/core/func.cpp \
|
||||
utils/AsmJit/core/func.h \
|
||||
utils/AsmJit/core/intutil.h \
|
||||
utils/AsmJit/core/lock.h \
|
||||
utils/AsmJit/core/logger.cpp \
|
||||
utils/AsmJit/core/logger.h \
|
||||
utils/AsmJit/core/memorymanager.cpp \
|
||||
utils/AsmJit/core/memorymanager.h \
|
||||
utils/AsmJit/core/memorymarker.cpp \
|
||||
utils/AsmJit/core/memorymarker.h \
|
||||
utils/AsmJit/core/operand.cpp \
|
||||
utils/AsmJit/core/operand.h \
|
||||
utils/AsmJit/core/podvector.h \
|
||||
utils/AsmJit/core/stringbuilder.cpp \
|
||||
utils/AsmJit/core/stringbuilder.h \
|
||||
utils/AsmJit/core/stringutil.cpp \
|
||||
utils/AsmJit/core/stringutil.h \
|
||||
utils/AsmJit/core/virtualmemory.cpp \
|
||||
utils/AsmJit/core/virtualmemory.h \
|
||||
utils/AsmJit/core/zonememory.cpp \
|
||||
utils/AsmJit/core/zonememory.h \
|
||||
utils/AsmJit/x86/x86assembler.cpp \
|
||||
utils/AsmJit/x86/x86assembler.h \
|
||||
utils/AsmJit/x86/x86compiler.cpp \
|
||||
utils/AsmJit/x86/x86compiler.h \
|
||||
utils/AsmJit/x86/x86compilercontext.cpp \
|
||||
utils/AsmJit/x86/x86compilercontext.h \
|
||||
utils/AsmJit/x86/x86compilerfunc.cpp \
|
||||
utils/AsmJit/x86/x86compilerfunc.h \
|
||||
utils/AsmJit/x86/x86compileritem.cpp \
|
||||
utils/AsmJit/x86/x86compileritem.h \
|
||||
utils/AsmJit/x86/x86cpuinfo.cpp \
|
||||
utils/AsmJit/x86/x86cpuinfo.h \
|
||||
utils/AsmJit/x86/x86defs.cpp \
|
||||
utils/AsmJit/x86/x86defs.h \
|
||||
utils/AsmJit/x86/x86func.cpp \
|
||||
utils/AsmJit/x86/x86func.h \
|
||||
utils/AsmJit/x86/x86operand.cpp \
|
||||
utils/AsmJit/x86/x86operand.h \
|
||||
utils/AsmJit/x86/x86util.cpp \
|
||||
utils/AsmJit/x86/x86util.h
|
||||
endif
|
||||
|
||||
if HAVE_GL
|
||||
libdesmume_a_SOURCES += OGLRender.cpp
|
||||
endif
|
||||
|
||||
if HAVE_OPENAL
|
||||
libdesmume_a_SOURCES += mic_openal.cpp
|
||||
else
|
||||
if HAVE_ALSA
|
||||
libdesmume_a_SOURCES += mic_alsa.cpp
|
||||
else
|
||||
libdesmume_a_SOURCES += mic.cpp
|
||||
endif
|
||||
endif
|
||||
|
||||
if HAVE_LIBSOUNDTOUCH
|
||||
libdesmume_a_SOURCES += metaspu/SndOut.cpp metaspu/SndOut.h metaspu/Timestretcher.cpp
|
||||
endif
|
||||
|
||||
if HAVE_LIBAGG
|
||||
libdesmume_a_SOURCES += aggdraw.cpp aggdraw.h GPU_osd.cpp
|
||||
else
|
||||
libdesmume_a_SOURCES += GPU_osd_stub.cpp
|
||||
endif
|
||||
if HAVE_LUA
|
||||
AM_CPPFLAGS += $(LUA_CFLAGS)
|
||||
libdesmume_a_SOURCES += lua-engine.cpp
|
||||
endif
|
||||
if HAVE_GDB_STUB
|
||||
libdesmume_a_SOURCES += gdbstub.h
|
||||
endif
|
||||
libdesmume_a_LIBADD = fs-$(desmume_arch).$(OBJEXT)
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
Copyright (C) 2006 yopyop
|
||||
Copyright (C) 2006-2007 shash
|
||||
Copyright (C) 2008-2024 DeSmuME team
|
||||
Copyright (C) 2008-2013 DeSmuME team
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -20,157 +20,67 @@
|
|||
#ifndef OGLRENDER_3_2_H
|
||||
#define OGLRENDER_3_2_H
|
||||
|
||||
#if defined(_WIN32) && !defined(WXPORT)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glcorearb.h>
|
||||
|
||||
#define OGLEXT(procPtr, func) procPtr func = NULL;
|
||||
#define INITOGLEXT(procPtr, func) func = (procPtr)wglGetProcAddress(#func);
|
||||
#define EXTERNOGLEXT(procPtr, func) extern procPtr func;
|
||||
#elif defined(__APPLE__)
|
||||
#include <OpenGL/gl3.h>
|
||||
#include <OpenGL/gl3ext.h>
|
||||
|
||||
// Ignore dynamic linking on Apple OS
|
||||
#define OGLEXT(procPtr, func)
|
||||
#define INITOGLEXT(procPtr, func)
|
||||
#define EXTERNOGLEXT(procPtr, func)
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glcorearb.h>
|
||||
#include <GL/glx.h>
|
||||
|
||||
#define OGLEXT(procPtr, func) procPtr func = NULL;
|
||||
#define INITOGLEXT(procPtr, func) func = (procPtr)glXGetProcAddress((const GLubyte *) #func);
|
||||
#define EXTERNOGLEXT(procPtr, func) extern procPtr func;
|
||||
#endif
|
||||
|
||||
// Check minimum OpenGL header version
|
||||
#if !defined(GL_VERSION_3_2)
|
||||
#error OpenGL requires v3.2 headers or later.
|
||||
#endif
|
||||
|
||||
#include "OGLRender.h"
|
||||
|
||||
#define MAX_CLIPPED_POLY_COUNT_FOR_UBO 16384
|
||||
|
||||
extern const char *GeometryVtxShader_150;
|
||||
extern const char *GeometryFragShader_150;
|
||||
extern const char *GeometryZeroDstAlphaPixelMaskVtxShader_150;
|
||||
extern const char *GeometryZeroDstAlphaPixelMaskFragShader_150;
|
||||
extern const char *MSGeometryZeroDstAlphaPixelMaskFragShader_150;
|
||||
extern const char *ClearImageVtxShader_150;
|
||||
extern const char *ClearImageFragShader_150;
|
||||
extern const char *EdgeMarkVtxShader_150;
|
||||
extern const char *EdgeMarkFragShader_150;
|
||||
extern const char *FogVtxShader_150;
|
||||
extern const char *FogFragShader_150;
|
||||
extern const char *FramebufferOutputVtxShader_150;
|
||||
extern const char *FramebufferOutput6665FragShader_150;
|
||||
|
||||
// A port that wants to use the OpenGL 3.2 renderer must assign the two following functions
|
||||
// to OGLLoadEntryPoints_3_2_Func and OGLCreateRenderer_3_2_Func, respectively.
|
||||
//
|
||||
// In addition, the port must add the following GPU3DInterface objects to core3DList:
|
||||
// - gpu3Dgl: Automatically selects the most fully featured version of standard OpenGL that
|
||||
// is available on the host system, prefering OpenGL 3.2 Core Profile.
|
||||
// - gpu3Dgl_3_2: Selects the OpenGL 3.2 Core Profile renderer, and returns an error if it
|
||||
// is not available on the host system.
|
||||
//
|
||||
// Finally, the port must call GPU->Set3DRendererByID() and pass in the index where
|
||||
// gpu3Dgl_3_2 exists in core3DList so that the emulator can create the appropriate
|
||||
// OpenGLRenderer object.
|
||||
//
|
||||
// Example code:
|
||||
// OGLLoadEntryPoints_3_2_Func = &OGLLoadEntryPoints_3_2;
|
||||
// OGLCreateRenderer_3_2_Func = &OGLCreateRenderer_3_2;
|
||||
// GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, &gpu3Dgl_3_2, NULL };
|
||||
// GPU->Set3DRendererByID(2);
|
||||
|
||||
void OGLLoadEntryPoints_3_2();
|
||||
void OGLCreateRenderer_3_2(OpenGLRenderer **rendererPtr);
|
||||
|
||||
class OpenGLGeometryResource : public Render3DResourceGeometry
|
||||
{
|
||||
protected:
|
||||
GLuint _vboID[3];
|
||||
GLuint _eboID[3];
|
||||
GLuint _vaoID[3];
|
||||
GLuint _uboPolyStatesID[3];
|
||||
GLuint _tboPolyStatesID[3];
|
||||
GLuint _texPolyStatesID[3];
|
||||
GLsync _syncGeometryRender[3];
|
||||
|
||||
u16 *_indexBuffer[3];
|
||||
OGLPolyStates *_polyStatesBuffer[3];
|
||||
|
||||
public:
|
||||
OpenGLGeometryResource(const OpenGLVariantID variantID);
|
||||
~OpenGLGeometryResource();
|
||||
|
||||
size_t BindWrite(const size_t rawVtxCount, const size_t clippedPolyCount);
|
||||
|
||||
size_t BindUsage();
|
||||
size_t UnbindUsage();
|
||||
size_t RebindUsage();
|
||||
|
||||
u16* GetIndexBuffer(const size_t index);
|
||||
OGLPolyStates* GetPolyStatesBuffer(const size_t index);
|
||||
bool IsPolyStatesBufferUBO();
|
||||
bool IsPolyStatesBufferTBO();
|
||||
};
|
||||
|
||||
class OpenGLRenderStatesResource : public Render3DResource
|
||||
{
|
||||
protected:
|
||||
GLsync _sync[3];
|
||||
GLuint _uboRenderStatesID[3];
|
||||
OGLRenderStates *_buffer[3];
|
||||
|
||||
public:
|
||||
OpenGLRenderStatesResource();
|
||||
~OpenGLRenderStatesResource();
|
||||
|
||||
size_t BindWrite();
|
||||
size_t BindUsage();
|
||||
size_t UnbindUsage();
|
||||
|
||||
OGLRenderStates* GetRenderStatesBuffer(const size_t index);
|
||||
};
|
||||
|
||||
class OpenGLRenderer_3_2 : public OpenGLRenderer_2_1
|
||||
{
|
||||
protected:
|
||||
bool _isShaderFixedLocationSupported;
|
||||
bool _isConservativeDepthSupported;
|
||||
bool _isConservativeDepthAMDSupported;
|
||||
|
||||
OpenGLGeometryResource *_gResource;
|
||||
OpenGLRenderStatesResource *_rsResource;
|
||||
|
||||
virtual Render3DError CreateVBOs();
|
||||
virtual Render3DError CreatePBOs();
|
||||
virtual Render3DError InitExtensions();
|
||||
virtual Render3DError CreateFBOs();
|
||||
virtual void DestroyFBOs();
|
||||
virtual Render3DError CreateMultisampledFBO(GLsizei numSamples);
|
||||
virtual Render3DError CreateMultisampledFBO();
|
||||
virtual void DestroyMultisampledFBO();
|
||||
virtual void ResizeMultisampledFBOs(GLsizei numSamples);
|
||||
virtual Render3DError CreateVAOs();
|
||||
virtual void DestroyVAOs();
|
||||
|
||||
virtual Render3DError CreateGeometryPrograms();
|
||||
virtual Render3DError CreateClearImageProgram(const char *vsCString, const char *fsCString);
|
||||
virtual void DestroyClearImageProgram();
|
||||
virtual Render3DError CreateGeometryZeroDstAlphaProgram(const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError CreateMSGeometryZeroDstAlphaProgram(const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual void DestroyMSGeometryZeroDstAlphaProgram();
|
||||
virtual Render3DError CreateEdgeMarkProgram(const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError CreateFramebufferOutput8888Program(const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError LoadShaderPrograms(std::string *outVertexShaderProgram, std::string *outFragmentShaderProgram);
|
||||
virtual Render3DError SetupShaderIO();
|
||||
|
||||
virtual void GetExtensionSet(std::set<std::string> *oglExtensionSet);
|
||||
virtual void _SetupGeometryShaders(const OGLGeometryFlags flags);
|
||||
virtual void _RenderGeometryVertexAttribEnable();
|
||||
virtual void _RenderGeometryVertexAttribDisable();
|
||||
virtual Render3DError ZeroDstAlphaPass(const POLY *rawPolyList, const CPoly *clippedPolyList, const size_t clippedPolyCount, const size_t clippedPolyOpaqueCount, bool enableAlphaBlending, size_t indexOffset, POLYGON_ATTR lastPolyAttr);
|
||||
virtual void _RenderGeometryLoopBegin();
|
||||
virtual void _RenderGeometryLoopEnd();
|
||||
virtual void _ResolveWorkingBackFacing();
|
||||
virtual void _ResolveGeometry();
|
||||
virtual void _ResolveFinalFramebuffer();
|
||||
virtual void _FramebufferProcessVertexAttribEnable();
|
||||
virtual void _FramebufferProcessVertexAttribDisable();
|
||||
virtual Render3DError _FramebufferConvertColorFormat();
|
||||
virtual Render3DError EnableVertexAttributes(const VERTLIST *vertList, const GLushort *indexBuffer, const unsigned int vertIndexCount);
|
||||
virtual Render3DError DisableVertexAttributes();
|
||||
virtual Render3DError SelectRenderingFramebuffer();
|
||||
virtual Render3DError DownsampleFBO();
|
||||
|
||||
virtual Render3DError BeginRender(const GFX3D_State &renderState, const GFX3D_GeometryList &renderGList);
|
||||
virtual Render3DError PostprocessFramebuffer();
|
||||
|
||||
virtual Render3DError ClearUsingImage(const u16 *__restrict colorBuffer, const u32 *__restrict depthBuffer, const u8 *__restrict fogBuffer, const u8 opaquePolyID);
|
||||
virtual Render3DError ClearUsingValues(const Color4u8 &clearColor6665, const FragmentAttributes &clearAttributes);
|
||||
|
||||
virtual void SetPolygonIndex(const size_t index);
|
||||
virtual Render3DError SetupPolygon(const POLY &thePoly, bool treatAsTranslucent, bool willChangeStencilBuffer, bool isBackFacing);
|
||||
virtual Render3DError SetupTexture(const POLY &thePoly, size_t polyRenderIndex);
|
||||
virtual Render3DError ClearUsingImage() const;
|
||||
|
||||
public:
|
||||
OpenGLRenderer_3_2();
|
||||
~OpenGLRenderer_3_2();
|
||||
|
||||
virtual Render3DError InitExtensions();
|
||||
virtual Render3DError RenderFinish();
|
||||
virtual Render3DError RenderPowerOff();
|
||||
virtual Render3DError SetFramebufferSize(size_t w, size_t h);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,963 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2024 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "OGLRender_ES3.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
#include "utils/bits.h"
|
||||
#include "common.h"
|
||||
#include "debug.h"
|
||||
#include "NDSSystem.h"
|
||||
|
||||
|
||||
static const GLenum GeometryDrawBuffersEnumES[8][4] = {
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, GL_NONE, GL_NONE, GL_NONE },
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, GL_NONE, GL_NONE, OGL_FOGATTRIBUTES_ATTACHMENT_ID },
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, GL_NONE, OGL_POLYID_ATTACHMENT_ID, GL_NONE },
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, GL_NONE, OGL_POLYID_ATTACHMENT_ID, OGL_FOGATTRIBUTES_ATTACHMENT_ID },
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, OGL_WORKING_ATTACHMENT_ID, GL_NONE, GL_NONE },
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, OGL_WORKING_ATTACHMENT_ID, GL_NONE, OGL_FOGATTRIBUTES_ATTACHMENT_ID },
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, OGL_WORKING_ATTACHMENT_ID, OGL_POLYID_ATTACHMENT_ID, GL_NONE },
|
||||
{ OGL_COLOROUT_ATTACHMENT_ID, OGL_WORKING_ATTACHMENT_ID, OGL_POLYID_ATTACHMENT_ID, OGL_FOGATTRIBUTES_ATTACHMENT_ID }
|
||||
};
|
||||
|
||||
static const GLint GeometryAttachmentWorkingBufferES[8] = { 1,1,1,1,1,1,1,1 };
|
||||
static const GLint GeometryAttachmentPolyIDES[8] = { 2,2,2,2,2,2,2,2 };
|
||||
static const GLint GeometryAttachmentFogAttributesES[8] = { 3,3,3,3,3,3,3,3 };
|
||||
|
||||
// Vertex shader for geometry, GLSL ES 3.00
|
||||
static const char *GeometryVtxShader_ES300 = {"\
|
||||
IN_VTX_POSITION vec4 inPosition;\n\
|
||||
IN_VTX_TEXCOORD0 vec2 inTexCoord0;\n\
|
||||
IN_VTX_COLOR vec3 inColor; \n\
|
||||
\n\
|
||||
#if IS_USING_UBO_POLY_STATES\n\
|
||||
layout (std140) uniform PolyStates\n\
|
||||
{\n\
|
||||
ivec4 value[4096];\n\
|
||||
} polyState;\n\
|
||||
#elif IS_USING_TBO_POLY_STATES\n\
|
||||
uniform highp isamplerBuffer PolyStates;\n\
|
||||
#else\n\
|
||||
uniform highp isampler2D PolyStates;\n\
|
||||
#endif\n\
|
||||
uniform mediump int polyIndex;\n\
|
||||
uniform bool polyDrawShadow;\n\
|
||||
\n\
|
||||
out vec2 vtxTexCoord;\n\
|
||||
out vec4 vtxColor;\n\
|
||||
flat out lowp int polyID;\n\
|
||||
flat out lowp int polyMode;\n\
|
||||
flat out lowp int polyIsWireframe;\n\
|
||||
flat out lowp int polyEnableFog;\n\
|
||||
flat out lowp int polySetNewDepthForTranslucent;\n\
|
||||
flat out lowp int polyEnableTexture;\n\
|
||||
flat out lowp int texSingleBitAlpha;\n\
|
||||
flat out lowp int polyIsBackFacing;\n\
|
||||
flat out lowp int isPolyDrawable;\n\
|
||||
\n\
|
||||
void main()\n\
|
||||
{\n\
|
||||
#if IS_USING_UBO_POLY_STATES\n\
|
||||
ivec4 polyStateVec = polyState.value[polyIndex >> 2];\n\
|
||||
int polyStateBits = polyStateVec[polyIndex & 0x03];\n\
|
||||
#elif IS_USING_TBO_POLY_STATES\n\
|
||||
int polyStateBits = texelFetch(PolyStates, polyIndex).r;\n\
|
||||
#else\n\
|
||||
int polyStateBits = texelFetch(PolyStates, ivec2(polyIndex & 0x00FF, (polyIndex >> 8) & 0x007F), 0).r;\n\
|
||||
#endif\n\
|
||||
int texSizeShiftS = (polyStateBits >> 18) & 0x07;\n\
|
||||
int texSizeShiftT = (polyStateBits >> 21) & 0x07;\n\
|
||||
\n\
|
||||
float polyAlpha = float((polyStateBits >> 8) & 0x1F) / 31.0;\n\
|
||||
vec2 polyTexScale = vec2(1.0 / float(8 << texSizeShiftS), 1.0 / float(8 << texSizeShiftT));\n\
|
||||
\n\
|
||||
polyID = (polyStateBits >> 0) & 0x3F;\n\
|
||||
polyMode = (polyStateBits >> 6) & 0x03;\n\
|
||||
polyIsWireframe = (polyStateBits >> 13) & 0x01;\n\
|
||||
polyEnableFog = (polyStateBits >> 14) & 0x01;\n\
|
||||
polySetNewDepthForTranslucent = (polyStateBits >> 15) & 0x01;\n\
|
||||
polyEnableTexture = (polyStateBits >> 16) & 0x01;\n\
|
||||
texSingleBitAlpha = (polyStateBits >> 17) & 0x01;\n\
|
||||
polyIsBackFacing = (polyStateBits >> 24) & 0x01;\n\
|
||||
\n\
|
||||
isPolyDrawable = int((polyMode != 3) || polyDrawShadow);\n\
|
||||
\n\
|
||||
mat2 texScaleMtx = mat2( vec2(polyTexScale.x, 0.0), \n\
|
||||
vec2( 0.0, polyTexScale.y)); \n\
|
||||
\n\
|
||||
vtxTexCoord = (texScaleMtx * inTexCoord0) / 16.0;\n\
|
||||
vtxColor = vec4(inColor / 63.0, polyAlpha);\n\
|
||||
gl_Position = vec4(inPosition.x, -inPosition.y, inPosition.z, inPosition.w) / 4096.0;\n\
|
||||
}\n\
|
||||
"};
|
||||
|
||||
// Fragment shader for geometry, GLSL ES 3.00
|
||||
static const char *GeometryFragShader_ES300 = {"\
|
||||
in vec2 vtxTexCoord;\n\
|
||||
in vec4 vtxColor;\n\
|
||||
flat in lowp int polyID;\n\
|
||||
flat in lowp int polyMode;\n\
|
||||
flat in lowp int polyIsWireframe;\n\
|
||||
flat in lowp int polyEnableFog;\n\
|
||||
flat in lowp int polySetNewDepthForTranslucent;\n\
|
||||
flat in lowp int polyEnableTexture;\n\
|
||||
flat in lowp int texSingleBitAlpha;\n\
|
||||
flat in lowp int polyIsBackFacing;\n\
|
||||
flat in lowp int isPolyDrawable;\n\
|
||||
\n\
|
||||
layout (std140) uniform RenderStates\n\
|
||||
{\n\
|
||||
bool enableAntialiasing;\n\
|
||||
bool enableFogAlphaOnly;\n\
|
||||
int clearPolyID;\n\
|
||||
float clearDepth;\n\
|
||||
float alphaTestRef;\n\
|
||||
float fogOffset;\n\
|
||||
float fogStep;\n\
|
||||
float pad_0;\n\
|
||||
vec4 fogColor;\n\
|
||||
vec4 edgeColor[8];\n\
|
||||
vec4 toonColor[32];\n\
|
||||
} state;\n\
|
||||
\n\
|
||||
uniform sampler2D texRenderObject;\n\
|
||||
uniform bool texDrawOpaque;\n\
|
||||
uniform bool drawModeDepthEqualsTest;\n\
|
||||
uniform bool polyDrawShadow;\n\
|
||||
uniform float polyDepthOffset;\n\
|
||||
\n\
|
||||
OUT_COLOR vec4 outFragColor;\n\
|
||||
\n\
|
||||
#if DRAW_MODE_OPAQUE\n\
|
||||
OUT_WORKING_BUFFER vec4 outDstBackFacing;\n\
|
||||
#elif USE_DEPTH_LEQUAL_POLYGON_FACING\n\
|
||||
uniform sampler2D inDstBackFacing;\n\
|
||||
#endif\n\
|
||||
\n\
|
||||
#if ENABLE_EDGE_MARK\n\
|
||||
OUT_POLY_ID vec4 outPolyID;\n\
|
||||
#endif\n\
|
||||
#if ENABLE_FOG\n\
|
||||
OUT_FOG_ATTRIBUTES vec4 outFogAttributes;\n\
|
||||
#endif\n\
|
||||
\n\
|
||||
void main()\n\
|
||||
{\n\
|
||||
#if USE_DEPTH_LEQUAL_POLYGON_FACING && !DRAW_MODE_OPAQUE\n\
|
||||
bool isOpaqueDstBackFacing = bool( texelFetch(inDstBackFacing, ivec2(gl_FragCoord.xy), 0).r );\n\
|
||||
if ( drawModeDepthEqualsTest && (bool(polyIsBackFacing) || !isOpaqueDstBackFacing) )\n\
|
||||
{\n\
|
||||
discard;\n\
|
||||
}\n\
|
||||
#endif\n\
|
||||
\n\
|
||||
vec4 mainTexColor = (ENABLE_TEXTURE_SAMPLING && bool(polyEnableTexture)) ? texture(texRenderObject, vtxTexCoord) : vec4(1.0, 1.0, 1.0, 1.0);\n\
|
||||
\n\
|
||||
if (!bool(texSingleBitAlpha))\n\
|
||||
{\n\
|
||||
if (texDrawOpaque)\n\
|
||||
{\n\
|
||||
if ( (polyMode != 1) && (mainTexColor.a <= 0.999) )\n\
|
||||
{\n\
|
||||
discard;\n\
|
||||
}\n\
|
||||
}\n\
|
||||
else\n\
|
||||
{\n\
|
||||
if ( ((polyMode != 1) && (mainTexColor.a * vtxColor.a > 0.999)) || ((polyMode == 1) && (vtxColor.a > 0.999)) )\n\
|
||||
{\n\
|
||||
discard;\n\
|
||||
}\n\
|
||||
}\n\
|
||||
}\n\
|
||||
#if USE_TEXTURE_SMOOTHING\n\
|
||||
else\n\
|
||||
{\n\
|
||||
if (mainTexColor.a < 0.500)\n\
|
||||
{\n\
|
||||
mainTexColor.a = 0.0;\n\
|
||||
}\n\
|
||||
else\n\
|
||||
{\n\
|
||||
mainTexColor.rgb = mainTexColor.rgb / mainTexColor.a;\n\
|
||||
mainTexColor.a = 1.0;\n\
|
||||
}\n\
|
||||
}\n\
|
||||
#endif\n\
|
||||
\n\
|
||||
outFragColor = mainTexColor * vtxColor;\n\
|
||||
\n\
|
||||
if (polyMode == 1)\n\
|
||||
{\n\
|
||||
outFragColor.rgb = (ENABLE_TEXTURE_SAMPLING && bool(polyEnableTexture)) ? mix(vtxColor.rgb, mainTexColor.rgb, mainTexColor.a) : vtxColor.rgb;\n\
|
||||
outFragColor.a = vtxColor.a;\n\
|
||||
}\n\
|
||||
else if (polyMode == 2)\n\
|
||||
{\n\
|
||||
vec3 newToonColor = state.toonColor[int((vtxColor.r * 31.0) + 0.5)].rgb;\n\
|
||||
#if TOON_SHADING_MODE\n\
|
||||
outFragColor.rgb = min((mainTexColor.rgb * vtxColor.r) + newToonColor.rgb, 1.0);\n\
|
||||
#else\n\
|
||||
outFragColor.rgb = mainTexColor.rgb * newToonColor.rgb;\n\
|
||||
#endif\n\
|
||||
}\n\
|
||||
else if ((polyMode == 3) && polyDrawShadow)\n\
|
||||
{\n\
|
||||
outFragColor = vtxColor;\n\
|
||||
}\n\
|
||||
\n\
|
||||
if ( (isPolyDrawable != 0) && ((outFragColor.a < 0.001) || (ENABLE_ALPHA_TEST && outFragColor.a < state.alphaTestRef)) )\n\
|
||||
{\n\
|
||||
discard;\n\
|
||||
}\n\
|
||||
#if ENABLE_EDGE_MARK\n\
|
||||
outPolyID = (isPolyDrawable != 0) ? vec4( float(polyID)/63.0, float(polyIsWireframe == 1), 0.0, float(outFragColor.a > 0.999) ) : vec4(0.0, 0.0, 0.0, 0.0);\n\
|
||||
#endif\n\
|
||||
#if ENABLE_FOG\n\
|
||||
outFogAttributes = (isPolyDrawable != 0) ? vec4( float(polyEnableFog), 0.0, 0.0, float((outFragColor.a > 0.999) ? 1.0 : 0.5) ) : vec4(0.0, 0.0, 0.0, 0.0);\n\
|
||||
#endif\n\
|
||||
#if DRAW_MODE_OPAQUE\n\
|
||||
outDstBackFacing = vec4(float(polyIsBackFacing), 0.0, 0.0, 1.0);\n\
|
||||
#endif\n\
|
||||
\n\
|
||||
#if USE_NDS_DEPTH_CALCULATION || ENABLE_FOG\n\
|
||||
// It is tempting to perform the NDS depth calculation in the vertex shader rather than in the fragment shader.\n\
|
||||
// Resist this temptation! It is much more reliable to do the depth calculation in the fragment shader due to\n\
|
||||
// subtle interpolation differences between various GPUs and/or drivers. If the depth calculation is not done\n\
|
||||
// here, then it is very possible for the user to experience Z-fighting in certain rendering situations.\n\
|
||||
\n\
|
||||
#if ENABLE_W_DEPTH\n\
|
||||
gl_FragDepth = clamp( ((1.0/gl_FragCoord.w) * (4096.0/16777215.0)) + polyDepthOffset, 0.0, 1.0 );\n\
|
||||
#else\n\
|
||||
// hack: when using z-depth, drop some LSBs so that the overworld map in Dragon Quest IV shows up correctly\n\
|
||||
gl_FragDepth = clamp( (floor(gl_FragCoord.z * 4194303.0) * (4.0/16777215.0)) + polyDepthOffset, 0.0, 1.0 );\n\
|
||||
#endif\n\
|
||||
#endif\n\
|
||||
}\n\
|
||||
"};
|
||||
|
||||
void OGLLoadEntryPoints_ES_3_0()
|
||||
{
|
||||
OGLLoadEntryPoints_3_2();
|
||||
}
|
||||
|
||||
void OGLCreateRenderer_ES_3_0(OpenGLRenderer **rendererPtr)
|
||||
{
|
||||
if (IsOpenGLDriverVersionSupported(3, 0, 0))
|
||||
{
|
||||
*rendererPtr = new OpenGLESRenderer_3_0;
|
||||
(*rendererPtr)->SetVersion(3, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
OpenGLESRenderer_3_0::OpenGLESRenderer_3_0()
|
||||
{
|
||||
_variantID = OpenGLVariantID_ES3_3_0;
|
||||
|
||||
_geometryDrawBuffersEnum = GeometryDrawBuffersEnumES;
|
||||
_geometryAttachmentWorkingBuffer = GeometryAttachmentWorkingBufferES;
|
||||
_geometryAttachmentPolyID = GeometryAttachmentPolyIDES;
|
||||
_geometryAttachmentFogAttributes = GeometryAttachmentFogAttributesES;
|
||||
|
||||
ref->textureSrcTypeCIColor = GL_UNSIGNED_BYTE;
|
||||
ref->textureSrcTypeCIFog = GL_UNSIGNED_BYTE;
|
||||
ref->textureSrcTypeEdgeColor = GL_UNSIGNED_BYTE;
|
||||
ref->textureSrcTypeToonTable = GL_UNSIGNED_BYTE;
|
||||
}
|
||||
|
||||
Render3DError OpenGLESRenderer_3_0::InitExtensions()
|
||||
{
|
||||
OGLRenderRef &OGLRef = *this->ref;
|
||||
Render3DError error = OGLERROR_NOERR;
|
||||
|
||||
// Get OpenGL extensions
|
||||
std::set<std::string> oglExtensionSet;
|
||||
this->GetExtensionSet(&oglExtensionSet);
|
||||
|
||||
// OpenGL ES 3.0 should fully support FBOs, so we don't need the default framebuffer.
|
||||
// However, OpenGL ES has traditionally required some kind of surface buffer attached
|
||||
// to the context before using it. We don't want it, nor would we ever use it here.
|
||||
// Therefore, check if our context supports being surfaceless before doing anything else,
|
||||
// as this works as a kind of compatibility check.
|
||||
if (!this->IsExtensionPresent(&oglExtensionSet, "GL_OES_surfaceless_context"))
|
||||
{
|
||||
INFO("OpenGL ES: Client contexts are not expected to have any surfaces attached\n");
|
||||
INFO(" to the default framebuffer. The fact that the context does not\n");
|
||||
INFO(" work surfaceless may indicate an error in the context creation,\n");
|
||||
INFO(" or that your platform's context creation is too old.\n");
|
||||
error = OGLERROR_FEATURE_UNSUPPORTED;
|
||||
return error;
|
||||
}
|
||||
|
||||
// Mirrored Repeat Mode Support
|
||||
OGLRef.stateTexMirroredRepeat = GL_MIRRORED_REPEAT;
|
||||
|
||||
// Blending Support
|
||||
this->_isBlendFuncSeparateSupported = true;
|
||||
this->_isBlendEquationSeparateSupported = true;
|
||||
|
||||
// Fixed locations in shaders are supported in ES 3.0 by default.
|
||||
this->_isShaderFixedLocationSupported = true;
|
||||
|
||||
GLfloat maxAnisotropyOGL = 1.0f;
|
||||
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropyOGL);
|
||||
this->_deviceInfo.maxAnisotropy = (float)maxAnisotropyOGL;
|
||||
|
||||
// OpenGL ES 3.0 should be able to handle the GL_RGBA format in glReadPixels without any performance penalty.
|
||||
OGLRef.readPixelsBestFormat = GL_RGBA;
|
||||
OGLRef.readPixelsBestDataType = GL_UNSIGNED_BYTE;
|
||||
|
||||
this->_deviceInfo.isEdgeMarkSupported = true;
|
||||
this->_deviceInfo.isFogSupported = true;
|
||||
|
||||
// Need to generate this texture first because FBO creation needs it.
|
||||
// This texture is only required by shaders, and so if shader creation
|
||||
// fails, then we can immediately delete this texture if an error occurs.
|
||||
glGenTextures(1, &OGLRef.texFinalColorID);
|
||||
glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_FinalColor);
|
||||
glBindTexture(GL_TEXTURE_2D, OGLRef.texFinalColorID);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, (GLsizei)this->_framebufferWidth, (GLsizei)this->_framebufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
// OpenGL ES 3.0 should have all the necessary features to be able to flip and convert the framebuffer.
|
||||
this->_willConvertFramebufferOnGPU = true;
|
||||
|
||||
this->_enableTextureSmoothing = CommonSettings.GFX3D_Renderer_TextureSmoothing;
|
||||
this->_emulateShadowPolygon = CommonSettings.OpenGL_Emulation_ShadowPolygon;
|
||||
this->_emulateSpecialZeroAlphaBlending = CommonSettings.OpenGL_Emulation_SpecialZeroAlphaBlending;
|
||||
this->_emulateNDSDepthCalculation = CommonSettings.OpenGL_Emulation_NDSDepthCalculation;
|
||||
this->_emulateDepthLEqualPolygonFacing = CommonSettings.OpenGL_Emulation_DepthLEqualPolygonFacing;
|
||||
|
||||
// Load and create shaders. Return on any error, since ES 3.0 makes shaders mandatory.
|
||||
this->isShaderSupported = true;
|
||||
|
||||
this->_rsResource = new OpenGLRenderStatesResource();
|
||||
|
||||
if (IsOpenGLDriverVersionSupported(3, 2, 0))
|
||||
{
|
||||
this->_gResource = new OpenGLGeometryResource(OpenGLVariantID_ES3_3_2);
|
||||
}
|
||||
else if (IsOpenGLDriverVersionSupported(3, 1, 0))
|
||||
{
|
||||
this->_gResource = new OpenGLGeometryResource(OpenGLVariantID_ES3_3_1);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->_gResource = new OpenGLGeometryResource(OpenGLVariantID_ES3_3_0);
|
||||
}
|
||||
|
||||
error = this->CreateGeometryPrograms();
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryPrograms();
|
||||
this->isShaderSupported = false;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
error = this->CreateClearImageProgram(ClearImageVtxShader_150, ClearImageFragShader_150);
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryPrograms();
|
||||
this->isShaderSupported = false;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
error = this->CreateGeometryZeroDstAlphaProgram(GeometryZeroDstAlphaPixelMaskVtxShader_150, GeometryZeroDstAlphaPixelMaskFragShader_150);
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryPrograms();
|
||||
this->DestroyClearImageProgram();
|
||||
this->isShaderSupported = false;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
INFO("OpenGL ES: Successfully created geometry shaders.\n");
|
||||
error = this->InitPostprocessingPrograms(EdgeMarkVtxShader_150,
|
||||
EdgeMarkFragShader_150,
|
||||
FramebufferOutputVtxShader_150,
|
||||
FramebufferOutput6665FragShader_150,
|
||||
NULL);
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryPrograms();
|
||||
this->DestroyClearImageProgram();
|
||||
this->DestroyGeometryZeroDstAlphaProgram();
|
||||
this->isShaderSupported = false;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
this->isVBOSupported = true;
|
||||
this->CreateVBOs();
|
||||
|
||||
// PBOs are only used when reading back the rendered framebuffer for the emulated
|
||||
// BG0 layer. For desktop-class GPUs, doing an asynchronous glReadPixels() call
|
||||
// is always advantageous since such devices are expected to have their GPUs
|
||||
// connected to a data bus.
|
||||
//
|
||||
// However, many ARM-based mobile devices use integrated GPUs of varying degrees
|
||||
// of memory latency and implementation quality. This means that the performance
|
||||
// of an asynchronous glReadPixels() call is NOT guaranteed on such devices.
|
||||
//
|
||||
// In fact, many ARM-based devices suffer devastating performance drops when trying
|
||||
// to do asynchronous framebuffer reads. Therefore, since most OpenGL ES users will
|
||||
// be running an ARM-based iGPU, we will disable PBOs for OpenGL ES and stick with
|
||||
// a traditional synchronous glReadPixels() call instead.
|
||||
this->isPBOSupported = false;
|
||||
|
||||
this->isVAOSupported = true;
|
||||
this->CreateVAOs();
|
||||
|
||||
// Load and create FBOs. Return on any error, since OpenGL ES 3.0 includes FBOs as core functionality.
|
||||
this->isFBOSupported = true;
|
||||
error = this->CreateFBOs();
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
this->isFBOSupported = false;
|
||||
return error;
|
||||
}
|
||||
|
||||
this->_isFBOBlitSupported = true;
|
||||
this->isMultisampledFBOSupported = true;
|
||||
this->_selectedMultisampleSize = CommonSettings.GFX3D_Renderer_MultisampleSize;
|
||||
|
||||
GLint maxSamplesOGL = 0;
|
||||
glGetIntegerv(GL_MAX_SAMPLES, &maxSamplesOGL);
|
||||
this->_deviceInfo.maxSamples = (u8)maxSamplesOGL;
|
||||
|
||||
if (this->_deviceInfo.maxSamples >= 2)
|
||||
{
|
||||
// Try and initialize the multisampled FBOs with the GFX3D_Renderer_MultisampleSize.
|
||||
// However, if the client has this set to 0, then set sampleSize to 2 in order to
|
||||
// force the generation and the attachments of the buffers at a meaningful sample
|
||||
// size. If GFX3D_Renderer_MultisampleSize is 0, then we can deallocate the buffer
|
||||
// memory afterwards.
|
||||
GLsizei sampleSize = this->GetLimitedMultisampleSize();
|
||||
if (sampleSize == 0)
|
||||
{
|
||||
sampleSize = 2;
|
||||
}
|
||||
|
||||
error = this->CreateMultisampledFBO(sampleSize);
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
this->isMultisampledFBOSupported = false;
|
||||
}
|
||||
|
||||
// If GFX3D_Renderer_MultisampleSize is 0, then we can deallocate the buffers now
|
||||
// in order to save some memory.
|
||||
if (this->_selectedMultisampleSize == 0)
|
||||
{
|
||||
this->ResizeMultisampledFBOs(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this->isMultisampledFBOSupported = false;
|
||||
INFO("OpenGL ES: Driver does not support at least 2x multisampled FBOs.\n");
|
||||
}
|
||||
|
||||
this->_isDepthLEqualPolygonFacingSupported = true;
|
||||
this->_enableMultisampledRendering = ((this->_selectedMultisampleSize >= 2) && this->isMultisampledFBOSupported);
|
||||
|
||||
return OGLERROR_NOERR;
|
||||
}
|
||||
|
||||
Render3DError OpenGLESRenderer_3_0::CreateGeometryPrograms()
|
||||
{
|
||||
Render3DError error = OGLERROR_NOERR;
|
||||
OGLRenderRef &OGLRef = *this->ref;
|
||||
|
||||
// Create shader resources.
|
||||
glGenTextures(1, &OGLRef.texFogDensityTableID);
|
||||
glActiveTexture(GL_TEXTURE0 + OGLTextureUnitID_LookupTable);
|
||||
glBindTexture(GL_TEXTURE_2D, OGLRef.texFogDensityTableID);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 32, 1, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
OGLGeometryFlags programFlags;
|
||||
programFlags.value = 0;
|
||||
|
||||
std::stringstream shaderHeader;
|
||||
shaderHeader << "#version 300 es\n";
|
||||
shaderHeader << "precision highp float;\n";
|
||||
shaderHeader << "precision highp int;\n";
|
||||
shaderHeader << "\n";
|
||||
|
||||
std::stringstream vsHeader;
|
||||
vsHeader << "#define IN_VTX_POSITION layout (location = " << OGLVertexAttributeID_Position << ") in\n";
|
||||
vsHeader << "#define IN_VTX_TEXCOORD0 layout (location = " << OGLVertexAttributeID_TexCoord0 << ") in\n";
|
||||
vsHeader << "#define IN_VTX_COLOR layout (location = " << OGLVertexAttributeID_Color << ") in\n";
|
||||
vsHeader << "\n";
|
||||
vsHeader << "#define IS_USING_UBO_POLY_STATES " << ((this->_gResource->IsPolyStatesBufferUBO()) ? 1 : 0) << "\n";
|
||||
vsHeader << "#define IS_USING_TBO_POLY_STATES " << ((this->_gResource->IsPolyStatesBufferTBO()) ? 1 : 0) << "\n";
|
||||
vsHeader << "#define DEPTH_EQUALS_TEST_TOLERANCE " << DEPTH_EQUALS_TEST_TOLERANCE << ".0\n";
|
||||
vsHeader << "\n";
|
||||
|
||||
std::string vtxShaderCode = shaderHeader.str() + vsHeader.str() + std::string(GeometryVtxShader_ES300);
|
||||
|
||||
for (size_t flagsValue = 0; flagsValue < 128; flagsValue++, programFlags.value++)
|
||||
{
|
||||
std::stringstream shaderFlags;
|
||||
shaderFlags << "#define OUT_COLOR layout (location = 0) out\n";
|
||||
shaderFlags << "#define OUT_WORKING_BUFFER layout (location = " << (OGL_WORKING_ATTACHMENT_ID - GL_COLOR_ATTACHMENT0) << ") out\n";
|
||||
shaderFlags << "#define OUT_POLY_ID layout (location = " << (OGL_POLYID_ATTACHMENT_ID - GL_COLOR_ATTACHMENT0) << ") out\n";
|
||||
shaderFlags << "#define OUT_FOG_ATTRIBUTES layout (location = " << (OGL_FOGATTRIBUTES_ATTACHMENT_ID - GL_COLOR_ATTACHMENT0) << ") out\n";
|
||||
shaderFlags << "\n";
|
||||
shaderFlags << "#define USE_TEXTURE_SMOOTHING " << ((this->_enableTextureSmoothing) ? 1 : 0) << "\n";
|
||||
shaderFlags << "#define USE_NDS_DEPTH_CALCULATION " << ((this->_emulateNDSDepthCalculation) ? 1 : 0) << "\n";
|
||||
shaderFlags << "#define USE_DEPTH_LEQUAL_POLYGON_FACING " << ((this->_emulateDepthLEqualPolygonFacing) ? 1 : 0) << "\n";
|
||||
shaderFlags << "\n";
|
||||
shaderFlags << "#define ENABLE_W_DEPTH " << ((programFlags.EnableWDepth) ? 1 : 0) << "\n";
|
||||
shaderFlags << "#define ENABLE_ALPHA_TEST " << ((programFlags.EnableAlphaTest) ? "true\n" : "false\n");
|
||||
shaderFlags << "#define ENABLE_TEXTURE_SAMPLING " << ((programFlags.EnableTextureSampling) ? "true\n" : "false\n");
|
||||
shaderFlags << "#define TOON_SHADING_MODE " << ((programFlags.ToonShadingMode) ? 1 : 0) << "\n";
|
||||
shaderFlags << "#define ENABLE_FOG " << ((programFlags.EnableFog) ? 1 : 0) << "\n";
|
||||
shaderFlags << "#define ENABLE_EDGE_MARK " << ((programFlags.EnableEdgeMark) ? 1 : 0) << "\n";
|
||||
shaderFlags << "#define DRAW_MODE_OPAQUE " << ((programFlags.OpaqueDrawMode) ? 1 : 0) << "\n";
|
||||
shaderFlags << "\n";
|
||||
|
||||
std::string fragShaderCode = shaderHeader.str() + shaderFlags.str() + std::string(GeometryFragShader_ES300);
|
||||
|
||||
error = this->ShaderProgramCreate(OGLRef.vertexGeometryShaderID,
|
||||
OGLRef.fragmentGeometryShaderID[flagsValue],
|
||||
OGLRef.programGeometryID[flagsValue],
|
||||
vtxShaderCode.c_str(),
|
||||
fragShaderCode.c_str());
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
INFO("OpenGL ES: Failed to create the GEOMETRY shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryPrograms();
|
||||
return error;
|
||||
}
|
||||
|
||||
glLinkProgram(OGLRef.programGeometryID[flagsValue]);
|
||||
if (!this->ValidateShaderProgramLink(OGLRef.programGeometryID[flagsValue]))
|
||||
{
|
||||
INFO("OpenGL ES: Failed to link the GEOMETRY shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryPrograms();
|
||||
return OGLERROR_SHADER_CREATE_ERROR;
|
||||
}
|
||||
|
||||
glValidateProgram(OGLRef.programGeometryID[flagsValue]);
|
||||
glUseProgram(OGLRef.programGeometryID[flagsValue]);
|
||||
|
||||
// Set up render states UBO
|
||||
const GLuint uniformBlockRenderStates = glGetUniformBlockIndex(OGLRef.programGeometryID[flagsValue], "RenderStates");
|
||||
glUniformBlockBinding(OGLRef.programGeometryID[flagsValue], uniformBlockRenderStates, OGLBindingPointID_RenderStates);
|
||||
|
||||
GLint uboSize = 0;
|
||||
glGetActiveUniformBlockiv(OGLRef.programGeometryID[flagsValue], uniformBlockRenderStates, GL_UNIFORM_BLOCK_DATA_SIZE, &uboSize);
|
||||
assert(uboSize == sizeof(OGLRenderStates));
|
||||
|
||||
const GLint uniformTexRenderObject = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "texRenderObject");
|
||||
glUniform1i(uniformTexRenderObject, 0);
|
||||
|
||||
if (this->_gResource->IsPolyStatesBufferUBO())
|
||||
{
|
||||
const GLuint uniformBlockPolyStates = glGetUniformBlockIndex(OGLRef.programGeometryID[flagsValue], "PolyStates");
|
||||
glUniformBlockBinding(OGLRef.programGeometryID[flagsValue], uniformBlockPolyStates, OGLBindingPointID_PolyStates);
|
||||
}
|
||||
else
|
||||
{
|
||||
const GLint uniformTexBufferPolyStates = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "PolyStates");
|
||||
glUniform1i(uniformTexBufferPolyStates, OGLTextureUnitID_PolyStates);
|
||||
}
|
||||
|
||||
if (this->_emulateDepthLEqualPolygonFacing && !programFlags.OpaqueDrawMode)
|
||||
{
|
||||
const GLint uniformTexBackfacing = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "inDstBackFacing");
|
||||
glUniform1i(uniformTexBackfacing, OGLTextureUnitID_FinalColor);
|
||||
}
|
||||
|
||||
OGLRef.uniformTexDrawOpaque[flagsValue] = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "texDrawOpaque");
|
||||
OGLRef.uniformDrawModeDepthEqualsTest[flagsValue] = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "drawModeDepthEqualsTest");
|
||||
OGLRef.uniformPolyDrawShadow[flagsValue] = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "polyDrawShadow");
|
||||
OGLRef.uniformPolyStateIndex[flagsValue] = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "polyIndex");
|
||||
OGLRef.uniformPolyDepthOffset[flagsValue] = glGetUniformLocation(OGLRef.programGeometryID[flagsValue], "polyDepthOffset");
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
Render3DError OpenGLESRenderer_3_0::CreateClearImageProgram(const char *vsCString, const char *fsCString)
|
||||
{
|
||||
Render3DError error = OGLERROR_NOERR;
|
||||
OGLRenderRef &OGLRef = *this->ref;
|
||||
|
||||
std::stringstream shaderHeader;
|
||||
shaderHeader << "#version 300 es\n";
|
||||
shaderHeader << "precision highp float;\n";
|
||||
shaderHeader << "precision highp int;\n";
|
||||
shaderHeader << "\n";
|
||||
|
||||
std::stringstream vsHeader;
|
||||
if (this->_isShaderFixedLocationSupported)
|
||||
{
|
||||
vsHeader << "#define IN_VTX_POSITION layout (location = " << OGLVertexAttributeID_Position << ") in\n";
|
||||
vsHeader << "#define IN_VTX_TEXCOORD0 layout (location = " << OGLVertexAttributeID_TexCoord0 << ") in\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
vsHeader << "#define IN_VTX_POSITION in\n";
|
||||
vsHeader << "#define IN_VTX_TEXCOORD0 in\n";
|
||||
}
|
||||
vsHeader << "\n";
|
||||
|
||||
std::string vtxShaderCode = shaderHeader.str() + vsHeader.str() + std::string(vsCString);
|
||||
std::stringstream fsHeader;
|
||||
if (this->_isShaderFixedLocationSupported)
|
||||
{
|
||||
fsHeader << "#define OUT_COLOR layout (location = 0) out\n";
|
||||
fsHeader << "#define OUT_FOGATTR layout (location = 1) out\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
fsHeader << "#define OUT_COLOR out\n";
|
||||
fsHeader << "#define OUT_FOGATTR out\n";
|
||||
}
|
||||
fsHeader << "\n";
|
||||
|
||||
std::string fragShaderCodeFogColor = shaderHeader.str() + fsHeader.str() + std::string(fsCString);
|
||||
error = this->ShaderProgramCreate(OGLRef.vsClearImageID,
|
||||
OGLRef.fsClearImageID,
|
||||
OGLRef.pgClearImageID,
|
||||
vtxShaderCode.c_str(),
|
||||
fragShaderCodeFogColor.c_str());
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
INFO("OpenGL ES: Failed to create the CLEAR_IMAGE shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyClearImageProgram();
|
||||
return error;
|
||||
}
|
||||
|
||||
glLinkProgram(OGLRef.pgClearImageID);
|
||||
if (!this->ValidateShaderProgramLink(OGLRef.pgClearImageID))
|
||||
{
|
||||
INFO("OpenGL ES: Failed to link the CLEAR_IMAGE shader color/fog program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyClearImageProgram();
|
||||
return OGLERROR_SHADER_CREATE_ERROR;
|
||||
}
|
||||
|
||||
glValidateProgram(OGLRef.pgClearImageID);
|
||||
glUseProgram(OGLRef.pgClearImageID);
|
||||
|
||||
const GLint uniformTexCIColor = glGetUniformLocation(OGLRef.pgClearImageID, "texCIColor");
|
||||
const GLint uniformTexCIFogAttr = glGetUniformLocation(OGLRef.pgClearImageID, "texCIFogAttr");
|
||||
const GLint uniformTexCIDepthCF = glGetUniformLocation(OGLRef.pgClearImageID, "texCIDepth");
|
||||
glUniform1i(uniformTexCIColor, OGLTextureUnitID_CIColor);
|
||||
glUniform1i(uniformTexCIFogAttr, OGLTextureUnitID_CIFogAttr);
|
||||
glUniform1i(uniformTexCIDepthCF, OGLTextureUnitID_CIDepth);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
Render3DError OpenGLESRenderer_3_0::CreateGeometryZeroDstAlphaProgram(const char *vtxShaderCString, const char *fragShaderCString)
|
||||
{
|
||||
Render3DError error = OGLERROR_NOERR;
|
||||
OGLRenderRef &OGLRef = *this->ref;
|
||||
|
||||
if ( (vtxShaderCString == NULL) || (fragShaderCString == NULL) )
|
||||
{
|
||||
return error;
|
||||
}
|
||||
|
||||
std::stringstream shaderHeader;
|
||||
shaderHeader << "#version 300 es\n";
|
||||
shaderHeader << "precision highp float;\n";
|
||||
shaderHeader << "precision highp int;\n";
|
||||
shaderHeader << "\n";
|
||||
|
||||
std::stringstream vsHeader;
|
||||
vsHeader << "#define IN_VTX_POSITION layout (location = " << OGLVertexAttributeID_Position << ") in\n";
|
||||
vsHeader << "#define IN_VTX_TEXCOORD0 layout (location = " << OGLVertexAttributeID_TexCoord0 << ") in\n";
|
||||
vsHeader << "#define IN_VTX_COLOR layout (location = " << OGLVertexAttributeID_Color << ") in\n";
|
||||
|
||||
std::string vtxShaderCode = shaderHeader.str() + vsHeader.str() + std::string(vtxShaderCString);
|
||||
std::string fragShaderCode = shaderHeader.str() + std::string(fragShaderCString);
|
||||
|
||||
error = this->ShaderProgramCreate(OGLRef.vtxShaderGeometryZeroDstAlphaID,
|
||||
OGLRef.fragShaderGeometryZeroDstAlphaID,
|
||||
OGLRef.programGeometryZeroDstAlphaID,
|
||||
vtxShaderCode.c_str(),
|
||||
fragShaderCode.c_str());
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
INFO("OpenGL ES: Failed to create the GEOMETRY ZERO DST ALPHA shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryZeroDstAlphaProgram();
|
||||
return error;
|
||||
}
|
||||
|
||||
glLinkProgram(OGLRef.programGeometryZeroDstAlphaID);
|
||||
if (!this->ValidateShaderProgramLink(OGLRef.programGeometryZeroDstAlphaID))
|
||||
{
|
||||
INFO("OpenGL ES: Failed to link the GEOMETRY ZERO DST ALPHA shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyGeometryZeroDstAlphaProgram();
|
||||
return OGLERROR_SHADER_CREATE_ERROR;
|
||||
}
|
||||
|
||||
glValidateProgram(OGLRef.programGeometryZeroDstAlphaID);
|
||||
glUseProgram(OGLRef.programGeometryZeroDstAlphaID);
|
||||
|
||||
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programGeometryZeroDstAlphaID, "texInFragColor");
|
||||
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
|
||||
|
||||
return OGLERROR_NOERR;
|
||||
}
|
||||
|
||||
Render3DError OpenGLESRenderer_3_0::CreateEdgeMarkProgram(const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString)
|
||||
{
|
||||
Render3DError error = OGLERROR_NOERR;
|
||||
OGLRenderRef &OGLRef = *this->ref;
|
||||
|
||||
if ( (vtxShaderCString == NULL) || (fragShaderCString == NULL) )
|
||||
{
|
||||
return error;
|
||||
}
|
||||
|
||||
std::stringstream shaderHeader;
|
||||
shaderHeader << "#version 300 es\n";
|
||||
shaderHeader << "precision highp float;\n";
|
||||
shaderHeader << "precision highp int;\n";
|
||||
shaderHeader << "\n";
|
||||
shaderHeader << "#define FRAMEBUFFER_SIZE_X " << this->_framebufferWidth << ".0 \n";
|
||||
shaderHeader << "#define FRAMEBUFFER_SIZE_Y " << this->_framebufferHeight << ".0 \n";
|
||||
shaderHeader << "\n";
|
||||
|
||||
std::stringstream vsHeader;
|
||||
vsHeader << "#define IN_VTX_POSITION layout (location = " << OGLVertexAttributeID_Position << ") in\n";
|
||||
vsHeader << "#define IN_VTX_TEXCOORD0 layout (location = " << OGLVertexAttributeID_TexCoord0 << ") in\n";
|
||||
vsHeader << "#define IN_VTX_COLOR layout (location = " << OGLVertexAttributeID_Color << ") in\n";
|
||||
|
||||
std::stringstream fsHeader;
|
||||
fsHeader << "#define OUT_COLOR layout (location = 0) out\n";
|
||||
|
||||
std::string vtxShaderCode = shaderHeader.str() + vsHeader.str() + std::string(vtxShaderCString);
|
||||
std::string fragShaderCode = shaderHeader.str() + fsHeader.str() + std::string(fragShaderCString);
|
||||
|
||||
error = this->ShaderProgramCreate(OGLRef.vertexEdgeMarkShaderID,
|
||||
OGLRef.fragmentEdgeMarkShaderID,
|
||||
OGLRef.programEdgeMarkID,
|
||||
vtxShaderCode.c_str(),
|
||||
fragShaderCode.c_str());
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
INFO("OpenGL ES: Failed to create the EDGE MARK shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyEdgeMarkProgram();
|
||||
return error;
|
||||
}
|
||||
|
||||
glLinkProgram(OGLRef.programEdgeMarkID);
|
||||
if (!this->ValidateShaderProgramLink(OGLRef.programEdgeMarkID))
|
||||
{
|
||||
INFO("OpenGL ES: Failed to link the EDGE MARK shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyEdgeMarkProgram();
|
||||
return OGLERROR_SHADER_CREATE_ERROR;
|
||||
}
|
||||
|
||||
glValidateProgram(OGLRef.programEdgeMarkID);
|
||||
glUseProgram(OGLRef.programEdgeMarkID);
|
||||
|
||||
const GLuint uniformBlockRenderStates = glGetUniformBlockIndex(OGLRef.programEdgeMarkID, "RenderStates");
|
||||
glUniformBlockBinding(OGLRef.programEdgeMarkID, uniformBlockRenderStates, OGLBindingPointID_RenderStates);
|
||||
|
||||
const GLint uniformTexGDepth = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInFragDepth");
|
||||
const GLint uniformTexGPolyID = glGetUniformLocation(OGLRef.programEdgeMarkID, "texInPolyID");
|
||||
glUniform1i(uniformTexGDepth, OGLTextureUnitID_DepthStencil);
|
||||
glUniform1i(uniformTexGPolyID, OGLTextureUnitID_GPolyID);
|
||||
|
||||
return OGLERROR_NOERR;
|
||||
}
|
||||
|
||||
Render3DError OpenGLESRenderer_3_0::CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString)
|
||||
{
|
||||
Render3DError error = OGLERROR_NOERR;
|
||||
OGLRenderRef &OGLRef = *this->ref;
|
||||
|
||||
if (vtxShaderCString == NULL)
|
||||
{
|
||||
INFO("OpenGL ES: The FOG vertex shader is unavailable.\n");
|
||||
error = OGLERROR_VERTEX_SHADER_PROGRAM_LOAD_ERROR;
|
||||
return error;
|
||||
}
|
||||
else if (fragShaderCString == NULL)
|
||||
{
|
||||
INFO("OpenGL ES: The FOG fragment shader is unavailable.\n");
|
||||
error = OGLERROR_FRAGMENT_SHADER_PROGRAM_LOAD_ERROR;
|
||||
return error;
|
||||
}
|
||||
|
||||
const s32 fogOffset = fogProgramKey.offset;
|
||||
const GLfloat fogOffsetf = (GLfloat)fogOffset / 32767.0f;
|
||||
const s32 fogStep = 0x0400 >> fogProgramKey.shift;
|
||||
|
||||
std::stringstream shaderHeader;
|
||||
shaderHeader << "#version 300 es\n";
|
||||
shaderHeader << "precision highp float;\n";
|
||||
shaderHeader << "precision highp int;\n";
|
||||
shaderHeader << "\n";
|
||||
|
||||
std::stringstream vsHeader;
|
||||
vsHeader << "#define IN_VTX_POSITION layout (location = " << OGLVertexAttributeID_Position << ") in\n";
|
||||
vsHeader << "#define IN_VTX_TEXCOORD0 layout (location = " << OGLVertexAttributeID_TexCoord0 << ") in\n";
|
||||
vsHeader << "#define IN_VTX_COLOR layout (location = " << OGLVertexAttributeID_Color << ") in\n";
|
||||
|
||||
std::stringstream fsHeader;
|
||||
fsHeader << "#define FOG_OFFSET " << fogOffset << "\n";
|
||||
fsHeader << "#define FOG_OFFSETF " << fogOffsetf << (((fogOffsetf == 0.0f) || (fogOffsetf == 1.0f)) ? ".0" : "") << "\n";
|
||||
fsHeader << "#define FOG_STEP " << fogStep << "\n";
|
||||
fsHeader << "\n";
|
||||
fsHeader << "#define OUT_COLOR layout (location = 0) out\n";
|
||||
|
||||
std::string vtxShaderCode = shaderHeader.str() + vsHeader.str() + std::string(vtxShaderCString);
|
||||
std::string fragShaderCode = shaderHeader.str() + fsHeader.str() + std::string(fragShaderCString);
|
||||
|
||||
OGLFogShaderID shaderID;
|
||||
shaderID.program = 0;
|
||||
shaderID.fragShader = 0;
|
||||
|
||||
error = this->ShaderProgramCreate(OGLRef.vertexFogShaderID,
|
||||
shaderID.fragShader,
|
||||
shaderID.program,
|
||||
vtxShaderCode.c_str(),
|
||||
fragShaderCode.c_str());
|
||||
|
||||
this->_fogProgramMap[fogProgramKey.key] = shaderID;
|
||||
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
INFO("OpenGL ES: Failed to create the FOG shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyFogProgram(fogProgramKey);
|
||||
return error;
|
||||
}
|
||||
|
||||
glLinkProgram(shaderID.program);
|
||||
if (!this->ValidateShaderProgramLink(shaderID.program))
|
||||
{
|
||||
INFO("OpenGL ES: Failed to link the FOG shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyFogProgram(fogProgramKey);
|
||||
return OGLERROR_SHADER_CREATE_ERROR;
|
||||
}
|
||||
|
||||
glValidateProgram(shaderID.program);
|
||||
glUseProgram(shaderID.program);
|
||||
|
||||
const GLuint uniformBlockRenderStates = glGetUniformBlockIndex(shaderID.program, "RenderStates");
|
||||
glUniformBlockBinding(shaderID.program, uniformBlockRenderStates, OGLBindingPointID_RenderStates);
|
||||
|
||||
const GLint uniformTexGDepth = glGetUniformLocation(shaderID.program, "texInFragDepth");
|
||||
const GLint uniformTexGFog = glGetUniformLocation(shaderID.program, "texInFogAttributes");
|
||||
const GLint uniformTexFogDensityTable = glGetUniformLocation(shaderID.program, "texFogDensityTable");
|
||||
glUniform1i(uniformTexGDepth, OGLTextureUnitID_DepthStencil);
|
||||
glUniform1i(uniformTexGFog, OGLTextureUnitID_FogAttr);
|
||||
glUniform1i(uniformTexFogDensityTable, OGLTextureUnitID_LookupTable);
|
||||
|
||||
return OGLERROR_NOERR;
|
||||
}
|
||||
|
||||
Render3DError OpenGLESRenderer_3_0::CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString)
|
||||
{
|
||||
Render3DError error = OGLERROR_NOERR;
|
||||
OGLRenderRef &OGLRef = *this->ref;
|
||||
|
||||
if ( (vtxShaderCString == NULL) || (fragShaderCString == NULL) )
|
||||
{
|
||||
return error;
|
||||
}
|
||||
|
||||
std::stringstream shaderHeader;
|
||||
shaderHeader << "#version 300 es\n";
|
||||
shaderHeader << "precision highp float;\n";
|
||||
shaderHeader << "precision highp int;\n";
|
||||
shaderHeader << "\n";
|
||||
shaderHeader << "#define FRAMEBUFFER_SIZE_X " << this->_framebufferWidth << ".0 \n";
|
||||
shaderHeader << "#define FRAMEBUFFER_SIZE_Y " << this->_framebufferHeight << ".0 \n";
|
||||
shaderHeader << "\n";
|
||||
|
||||
std::stringstream vsHeader;
|
||||
vsHeader << "#define IN_VTX_POSITION layout (location = " << OGLVertexAttributeID_Position << ") in\n";
|
||||
vsHeader << "#define IN_VTX_TEXCOORD0 layout (location = " << OGLVertexAttributeID_TexCoord0 << ") in\n";
|
||||
vsHeader << "#define IN_VTX_COLOR layout (location = " << OGLVertexAttributeID_Color << ") in\n";
|
||||
|
||||
std::stringstream fsHeader;
|
||||
fsHeader << "#define OUT_COLOR layout (location = " << (OGL_WORKING_ATTACHMENT_ID - GL_COLOR_ATTACHMENT0) << ") out\n";
|
||||
|
||||
std::string vtxShaderCode = shaderHeader.str() + vsHeader.str() + std::string(vtxShaderCString);
|
||||
std::string fragShaderCode = shaderHeader.str() + fsHeader.str() + std::string(fragShaderCString);
|
||||
|
||||
error = this->ShaderProgramCreate(OGLRef.vertexFramebufferOutput6665ShaderID,
|
||||
OGLRef.fragmentFramebufferRGBA6665OutputShaderID,
|
||||
OGLRef.programFramebufferRGBA6665OutputID,
|
||||
vtxShaderCode.c_str(),
|
||||
fragShaderCode.c_str());
|
||||
if (error != OGLERROR_NOERR)
|
||||
{
|
||||
INFO("OpenGL ES: Failed to create the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyFramebufferOutput6665Programs();
|
||||
return error;
|
||||
}
|
||||
|
||||
glLinkProgram(OGLRef.programFramebufferRGBA6665OutputID);
|
||||
if (!this->ValidateShaderProgramLink(OGLRef.programFramebufferRGBA6665OutputID))
|
||||
{
|
||||
INFO("OpenGL ES: Failed to link the FRAMEBUFFER OUTPUT RGBA6665 shader program.\n");
|
||||
glUseProgram(0);
|
||||
this->DestroyFramebufferOutput6665Programs();
|
||||
return OGLERROR_SHADER_CREATE_ERROR;
|
||||
}
|
||||
|
||||
glValidateProgram(OGLRef.programFramebufferRGBA6665OutputID);
|
||||
glUseProgram(OGLRef.programFramebufferRGBA6665OutputID);
|
||||
|
||||
const GLint uniformTexGColor = glGetUniformLocation(OGLRef.programFramebufferRGBA6665OutputID, "texInFragColor");
|
||||
glUniform1i(uniformTexGColor, OGLTextureUnitID_GColor);
|
||||
|
||||
return OGLERROR_NOERR;
|
||||
}
|
|
@ -1,59 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2024 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef OGLRENDER_ES3_H
|
||||
#define OGLRENDER_ES3_H
|
||||
|
||||
#include "OGLRender_3_2.h"
|
||||
|
||||
// A port that wants to use the OpenGL ES renderer must assign the two following functions
|
||||
// to OGLLoadEntryPoints_ES_3_0_Func and OGLCreateRenderer_ES_3_0_Func, respectively.
|
||||
//
|
||||
// In addition, the port must add the following GPU3DInterface objects to core3DList:
|
||||
// - gpu3Dgl_ES_3_0: Selects the OpenGL ES 3.0 renderer, and returns an error if it is
|
||||
// not available on the host system.
|
||||
//
|
||||
// Finally, the port must call GPU->Set3DRendererByID() and pass in the index where
|
||||
// gpu3Dgl_ES_3_0 exists in core3DList so that the emulator can create the appropriate
|
||||
// OpenGLRenderer object.
|
||||
//
|
||||
// Example code:
|
||||
// OGLLoadEntryPoints_ES_3_0_Func = &OGLLoadEntryPoints_ES_3_0;
|
||||
// OGLCreateRenderer_ES_3_0_Func = &OGLCreateRenderer_ES_3_0;
|
||||
// GPU3DInterface *core3DList[] = { &gpu3DNull, &gpu3DRasterize, &gpu3Dgl_ES_3_0, NULL };
|
||||
// GPU->Set3DRendererByID(2);
|
||||
|
||||
void OGLLoadEntryPoints_ES_3_0();
|
||||
void OGLCreateRenderer_ES_3_0(OpenGLRenderer **rendererPtr);
|
||||
|
||||
class OpenGLESRenderer_3_0 : public OpenGLRenderer_3_2
|
||||
{
|
||||
protected:
|
||||
virtual Render3DError CreateGeometryPrograms();
|
||||
virtual Render3DError CreateClearImageProgram(const char *vsCString, const char *fsCString);
|
||||
virtual Render3DError CreateGeometryZeroDstAlphaProgram(const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError CreateEdgeMarkProgram(const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError CreateFogProgram(const OGLFogProgramKey fogProgramKey, const bool isMultisample, const char *vtxShaderCString, const char *fragShaderCString);
|
||||
virtual Render3DError CreateFramebufferOutput6665Program(const char *vtxShaderCString, const char *fragShaderCString);
|
||||
|
||||
public:
|
||||
OpenGLESRenderer_3_0();
|
||||
|
||||
virtual Render3DError InitExtensions();
|
||||
};
|
||||
|
||||
#endif // OGLRENDER_ES3_H
|
|
@ -1,12 +1,12 @@
|
|||
#ifndef __GNUC__
|
||||
#pragma pack(push, 1)
|
||||
#pragma warning(disable : 4103)
|
||||
#endif
|
||||
|
||||
#ifndef __PACKED
|
||||
#ifdef __GNUC__
|
||||
#define __PACKED __attribute__((__packed__))
|
||||
#else
|
||||
#define __PACKED
|
||||
#endif
|
||||
#endif
|
||||
#ifndef __GNUC__
|
||||
#pragma pack(push, 1)
|
||||
#pragma warning(disable : 4103)
|
||||
#endif
|
||||
|
||||
#ifndef __PACKED
|
||||
#ifdef __GNUC__
|
||||
#define __PACKED __attribute__((__packed__))
|
||||
#else
|
||||
#define __PACKED
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#ifndef __GNUC__
|
||||
#pragma pack(pop)
|
||||
#endif
|
||||
#ifndef __GNUC__
|
||||
#pragma pack(pop)
|
||||
#endif
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright 2007 Guillaume Duhamel
|
||||
Copyright 2007-2017 DeSmuME team
|
||||
Copyright 2007-2012 DeSmuME team
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -25,8 +25,6 @@
|
|||
#include <zzip/zzip.h>
|
||||
#endif
|
||||
|
||||
#include "utils/xstring.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#define stat(...) _stat(__VA_ARGS__)
|
||||
#define S_IFMT _S_IFMT
|
||||
|
@ -57,7 +55,6 @@ void STDROMReaderDeInit(void *);
|
|||
u32 STDROMReaderSize(void *);
|
||||
int STDROMReaderSeek(void *, int, int);
|
||||
int STDROMReaderRead(void *, void *, u32);
|
||||
int STDROMReaderWrite(void *, void *, u32);
|
||||
|
||||
ROMReader_struct STDROMReader =
|
||||
{
|
||||
|
@ -67,87 +64,54 @@ ROMReader_struct STDROMReader =
|
|||
STDROMReaderDeInit,
|
||||
STDROMReaderSize,
|
||||
STDROMReaderSeek,
|
||||
STDROMReaderRead,
|
||||
STDROMReaderWrite
|
||||
STDROMReaderRead
|
||||
};
|
||||
|
||||
struct STDROMReaderData
|
||||
void * STDROMReaderInit(const char * filename)
|
||||
{
|
||||
FILE* file;
|
||||
long pos;
|
||||
};
|
||||
|
||||
void* STDROMReaderInit(const char* filename)
|
||||
{
|
||||
#ifndef _MSC_VER
|
||||
#ifdef WIN32
|
||||
struct _stat sb;
|
||||
#else
|
||||
struct stat sb;
|
||||
#endif
|
||||
if (stat(filename, &sb) == -1)
|
||||
return 0;
|
||||
|
||||
if ((sb.st_mode & S_IFMT) != S_IFREG)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
FILE* inf = _wfopen(mbstowcs((std::string)filename).c_str(),L"rb");
|
||||
#else
|
||||
FILE* inf = fopen(filename, "rb");
|
||||
#endif
|
||||
|
||||
if(!inf) return NULL;
|
||||
|
||||
STDROMReaderData* ret = new STDROMReaderData();
|
||||
ret->file = inf;
|
||||
ret->pos = 0;
|
||||
return (void*)ret;
|
||||
return (void *) fopen(filename, "rb");
|
||||
}
|
||||
|
||||
|
||||
void STDROMReaderDeInit(void * file)
|
||||
{
|
||||
if (!file) return ;
|
||||
fclose(((STDROMReaderData*)file)->file);
|
||||
delete ((STDROMReaderData*)file);
|
||||
fclose((FILE*)file);
|
||||
}
|
||||
|
||||
u32 STDROMReaderSize(void * file)
|
||||
{
|
||||
u32 size;
|
||||
|
||||
if (!file) return 0;
|
||||
if (!file) return 0 ;
|
||||
|
||||
FILE* inf = ((STDROMReaderData*)file)->file;
|
||||
|
||||
fseek(inf, 0, SEEK_END);
|
||||
size = ftell(inf);
|
||||
fseek(inf, ((STDROMReaderData*)file)->pos, SEEK_SET);
|
||||
fseek((FILE*)file, 0, SEEK_END);
|
||||
size = ftell((FILE*)file);
|
||||
fseek((FILE*)file, 0, SEEK_SET);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
int STDROMReaderSeek(void * file, int offset, int whence)
|
||||
{
|
||||
//not normal fseek return value meanings. awesome.
|
||||
if (!file) return 0;
|
||||
if(whence == SEEK_SET && offset == ((STDROMReaderData*)file)->pos)
|
||||
return 1;
|
||||
fseek(((STDROMReaderData*)file)->file, offset, whence);
|
||||
((STDROMReaderData*)file)->pos = ftell(((STDROMReaderData*)file)->file);
|
||||
return 1;
|
||||
if (!file) return 0 ;
|
||||
return fseek((FILE*)file, offset, whence);
|
||||
}
|
||||
|
||||
int STDROMReaderRead(void * file, void * buffer, u32 size)
|
||||
{
|
||||
if (!file) return 0;
|
||||
int read = fread(buffer, 1, size, ((STDROMReaderData*)file)->file);
|
||||
((STDROMReaderData*)file)->pos += read;
|
||||
return read;
|
||||
}
|
||||
|
||||
int STDROMReaderWrite(void *, void *, u32)
|
||||
{
|
||||
//not supported, for now
|
||||
return 0;
|
||||
if (!file) return 0 ;
|
||||
return fread(buffer, 1, size, (FILE*)file);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBZ
|
||||
|
@ -156,7 +120,6 @@ void GZIPROMReaderDeInit(void *);
|
|||
u32 GZIPROMReaderSize(void *);
|
||||
int GZIPROMReaderSeek(void *, int, int);
|
||||
int GZIPROMReaderRead(void *, void *, u32);
|
||||
int GZIPROMReaderWrite(void *, void *, u32);
|
||||
|
||||
ROMReader_struct GZIPROMReader =
|
||||
{
|
||||
|
@ -166,8 +129,7 @@ ROMReader_struct GZIPROMReader =
|
|||
GZIPROMReaderDeInit,
|
||||
GZIPROMReaderSize,
|
||||
GZIPROMReaderSeek,
|
||||
GZIPROMReaderRead,
|
||||
GZIPROMReaderWrite
|
||||
GZIPROMReaderRead
|
||||
};
|
||||
|
||||
void * GZIPROMReaderInit(const char * filename)
|
||||
|
@ -204,12 +166,6 @@ int GZIPROMReaderRead(void * file, void * buffer, u32 size)
|
|||
{
|
||||
return gzread((gzFile)file, buffer, size);
|
||||
}
|
||||
|
||||
int GZIPROMReaderWrite(void *, void *, u32)
|
||||
{
|
||||
//not supported, ever
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBZZIP
|
||||
|
@ -218,7 +174,6 @@ void ZIPROMReaderDeInit(void *);
|
|||
u32 ZIPROMReaderSize(void *);
|
||||
int ZIPROMReaderSeek(void *, int, int);
|
||||
int ZIPROMReaderRead(void *, void *, u32);
|
||||
int ZIPROMReaderWrite(void *, void *, u32);
|
||||
|
||||
ROMReader_struct ZIPROMReader =
|
||||
{
|
||||
|
@ -228,8 +183,7 @@ ROMReader_struct ZIPROMReader =
|
|||
ZIPROMReaderDeInit,
|
||||
ZIPROMReaderSize,
|
||||
ZIPROMReaderSeek,
|
||||
ZIPROMReaderRead,
|
||||
ZIPROMReaderWrite
|
||||
ZIPROMReaderRead
|
||||
};
|
||||
|
||||
void * ZIPROMReaderInit(const char * filename)
|
||||
|
@ -238,13 +192,12 @@ void * ZIPROMReaderInit(const char * filename)
|
|||
ZZIP_DIRENT * dirent = zzip_readdir(dir);
|
||||
if (dir != NULL)
|
||||
{
|
||||
char *tmp1;
|
||||
char tmp1[1024];
|
||||
char tmp2[1024];
|
||||
|
||||
memset(tmp1,0,sizeof(tmp1));
|
||||
memset(tmp2,0,sizeof(tmp2));
|
||||
tmp1 = strndup(filename, strlen(filename) - 4);
|
||||
strncpy(tmp1, filename, strlen(filename) - 4);
|
||||
sprintf(tmp2, "%s/%s", tmp1, dirent->d_name);
|
||||
free(tmp1);
|
||||
return zzip_fopen(tmp2, "rb");
|
||||
}
|
||||
return NULL;
|
||||
|
@ -279,97 +232,4 @@ int ZIPROMReaderRead(void * file, void * buffer, u32 size)
|
|||
return zzip_read((ZZIP_FILE*)file, buffer, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
int ZIPROMReaderWrite(void *, void *, u32)
|
||||
{
|
||||
//not supported ever
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct {
|
||||
void* buf;
|
||||
int len;
|
||||
int pos;
|
||||
} mem;
|
||||
|
||||
void * MemROMReaderInit(const char * filename)
|
||||
{
|
||||
return NULL; //dummy
|
||||
}
|
||||
|
||||
void MemROMReaderDeInit(void *)
|
||||
{
|
||||
//nothing to do
|
||||
}
|
||||
u32 MemROMReaderSize(void *)
|
||||
{
|
||||
return (u32)mem.len;
|
||||
}
|
||||
int MemROMReaderSeek(void * file, int offset, int whence)
|
||||
{
|
||||
switch(whence) {
|
||||
case SEEK_SET:
|
||||
mem.pos = offset;
|
||||
break;
|
||||
case SEEK_CUR:
|
||||
mem.pos += offset;
|
||||
break;
|
||||
case SEEK_END:
|
||||
mem.pos = mem.len + offset;
|
||||
break;
|
||||
}
|
||||
return mem.pos;
|
||||
}
|
||||
|
||||
int MemROMReaderRead(void * file, void * buffer, u32 size)
|
||||
{
|
||||
if(mem.pos<0) return 0;
|
||||
|
||||
int todo = (int)size;
|
||||
int remain = mem.len - mem.pos;
|
||||
if(remain<todo)
|
||||
todo = remain;
|
||||
|
||||
if(todo<=0)
|
||||
return 0;
|
||||
else if(todo==1) *(u8*)buffer = ((u8*)mem.buf)[mem.pos];
|
||||
else memcpy(buffer,(u8*)mem.buf + mem.pos, todo);
|
||||
mem.pos += todo;
|
||||
return todo;
|
||||
}
|
||||
|
||||
int MemROMReaderWrite(void * file, void * buffer, u32 size)
|
||||
{
|
||||
if(mem.pos<0) return 0;
|
||||
|
||||
int todo = (int)size;
|
||||
int remain = mem.len - mem.pos;
|
||||
if(remain<todo)
|
||||
todo = remain;
|
||||
|
||||
if (todo == 1) ((u8*)mem.buf)[mem.pos] = *(u8*)buffer;
|
||||
else memcpy((u8*)mem.buf + mem.pos,buffer, todo);
|
||||
mem.pos += todo;
|
||||
return todo;
|
||||
}
|
||||
|
||||
static ROMReader_struct MemROMReader =
|
||||
{
|
||||
ROMREADER_MEM,
|
||||
"Memory ROM Reader",
|
||||
MemROMReaderInit,
|
||||
MemROMReaderDeInit,
|
||||
MemROMReaderSize,
|
||||
MemROMReaderSeek,
|
||||
MemROMReaderRead,
|
||||
MemROMReaderWrite,
|
||||
};
|
||||
|
||||
ROMReader_struct * MemROMReaderRead_TrueInit(void* buf, int length)
|
||||
{
|
||||
mem.buf = buf;
|
||||
mem.len = length;
|
||||
mem.pos = 0;
|
||||
return &MemROMReader;
|
||||
}
|
||||
|
|
|
@ -1,58 +1,50 @@
|
|||
/*
|
||||
Copyright (C) 2007 Guillaume Duhamel
|
||||
Copyright (C) 2007-2022 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _ROMREADER_H_
|
||||
#define _ROMREADER_H_
|
||||
|
||||
#ifdef HAVE_LIBZ
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#define ROMREADER_DEFAULT -1
|
||||
#define ROMREADER_STD 0
|
||||
#define ROMREADER_GZIP 1
|
||||
#define ROMREADER_ZIP 2
|
||||
#define ROMREADER_MEM 3
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int id;
|
||||
const char * Name;
|
||||
void * (*Init)(const char * filename);
|
||||
void (*DeInit)(void * file);
|
||||
u32 (*Size)(void * file);
|
||||
int (*Seek)(void * file, int offset, int whence);
|
||||
int (*Read)(void * file, void * buffer, u32 size);
|
||||
int (*Write)(void * file, void * buffer, u32 size);
|
||||
} ROMReader_struct;
|
||||
|
||||
extern ROMReader_struct STDROMReader;
|
||||
#ifdef HAVE_LIBZ
|
||||
extern ROMReader_struct GZIPROMReader;
|
||||
#endif
|
||||
#ifdef HAVE_LIBZZIP
|
||||
extern ROMReader_struct ZIPROMReader;
|
||||
#endif
|
||||
|
||||
ROMReader_struct * ROMReaderInit(char ** filename);
|
||||
ROMReader_struct * MemROMReaderRead_TrueInit(void* buf, int length);
|
||||
|
||||
#endif // _ROMREADER_H_
|
||||
/*
|
||||
Copyright (C) 2007 Guillaume Duhamel
|
||||
Copyright (C) 2007 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_LIBZ
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#define ROMREADER_DEFAULT -1
|
||||
#define ROMREADER_STD 0
|
||||
#define ROMREADER_GZIP 1
|
||||
#define ROMREADER_ZIP 2
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int id;
|
||||
const char * Name;
|
||||
void * (*Init)(const char * filename);
|
||||
void (*DeInit)(void * file);
|
||||
u32 (*Size)(void * file);
|
||||
int (*Seek)(void * file, int offset, int whence);
|
||||
int (*Read)(void * file, void * buffer, u32 size);
|
||||
} ROMReader_struct;
|
||||
|
||||
extern ROMReader_struct STDROMReader;
|
||||
#ifdef HAVE_LIBZ
|
||||
extern ROMReader_struct GZIPROMReader;
|
||||
#endif
|
||||
#ifdef HAVE_LIBZZIP
|
||||
extern ROMReader_struct ZIPROMReader;
|
||||
#endif
|
||||
|
||||
ROMReader_struct * ROMReaderInit(char ** filename);
|
||||
|
|
1693
desmume/src/SPU.cpp
1693
desmume/src/SPU.cpp
File diff suppressed because it is too large
Load Diff
|
@ -1,305 +1,253 @@
|
|||
/*
|
||||
Copyright 2006 Theo Berkau
|
||||
Copyright (C) 2006-2015 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef SPU_H
|
||||
#define SPU_H
|
||||
|
||||
#include <iosfwd>
|
||||
#include <string>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "matrix.h"
|
||||
#include "metaspu/metaspu.h"
|
||||
|
||||
class EMUFILE;
|
||||
|
||||
#define SNDCORE_DEFAULT -1
|
||||
#define SNDCORE_DUMMY 0
|
||||
|
||||
#define CHANSTAT_STOPPED 0
|
||||
#define CHANSTAT_PLAY 1
|
||||
|
||||
#define SPUINTERPOLATION_TAPS 4 // Must be at least 4 for Catmull-Rom interpolation
|
||||
|
||||
//who made these static? theyre used in multiple places.
|
||||
FORCEINLINE s32 spumuldiv7(s32 val, u8 multiplier) {
|
||||
assert(multiplier <= 127);
|
||||
return (multiplier == 127) ? val : ((val * multiplier) >> 7);
|
||||
}
|
||||
|
||||
enum SPUInterpolationMode
|
||||
{
|
||||
SPUInterpolation_None = 0,
|
||||
SPUInterpolation_Linear = 1,
|
||||
SPUInterpolation_Cosine = 2,
|
||||
SPUInterpolation_CatmullRom = 3
|
||||
};
|
||||
|
||||
struct SoundInterface_struct
|
||||
{
|
||||
int id;
|
||||
const char *Name;
|
||||
int (*Init)(int buffersize);
|
||||
void (*DeInit)();
|
||||
void (*UpdateAudio)(s16 *buffer, u32 num_samples);
|
||||
u32 (*GetAudioSpace)();
|
||||
void (*MuteAudio)();
|
||||
void (*UnMuteAudio)();
|
||||
void (*SetVolume)(int volume);
|
||||
void (*ClearBuffer)();
|
||||
void (*FetchSamples)(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
size_t (*PostProcessSamples)(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
};
|
||||
|
||||
extern SoundInterface_struct SNDDummy;
|
||||
extern SoundInterface_struct SNDFile;
|
||||
extern int SPU_currentCoreNum;
|
||||
|
||||
struct channel_struct
|
||||
{
|
||||
channel_struct() : num(0),
|
||||
vol(0),
|
||||
volumeDiv(0),
|
||||
hold(0),
|
||||
pan(0),
|
||||
waveduty(0),
|
||||
repeat(0),
|
||||
format(0),
|
||||
keyon(0),
|
||||
status(0),
|
||||
pcm16bOffs(0),
|
||||
addr(0),
|
||||
timer(0),
|
||||
loopstart(0),
|
||||
length(0),
|
||||
totlength(0),
|
||||
totlength_shifted(0),
|
||||
sampcntFrac(0),
|
||||
sampcntInt(0),
|
||||
sampincFrac(0),
|
||||
sampincInt(0),
|
||||
loop_pcm16b(0),
|
||||
index(0),
|
||||
loop_index(0),
|
||||
x(0)
|
||||
{}
|
||||
u32 num;
|
||||
u8 vol;
|
||||
u8 volumeDiv;
|
||||
u8 hold;
|
||||
u8 pan;
|
||||
u8 waveduty;
|
||||
u8 repeat;
|
||||
u8 format;
|
||||
u8 keyon;
|
||||
u8 status;
|
||||
u8 pcm16bOffs;
|
||||
u32 addr;
|
||||
u16 timer;
|
||||
u16 loopstart;
|
||||
u32 length;
|
||||
u32 totlength;
|
||||
s32 totlength_shifted;
|
||||
u32 sampcntFrac;
|
||||
s32 sampcntInt;
|
||||
u32 sampincFrac;
|
||||
u32 sampincInt;
|
||||
s16 pcm16b[SPUINTERPOLATION_TAPS];
|
||||
// ADPCM specific
|
||||
s16 loop_pcm16b;
|
||||
s32 index;
|
||||
int loop_index;
|
||||
// PSG noise
|
||||
u16 x;
|
||||
};
|
||||
|
||||
class SPUFifo
|
||||
{
|
||||
public:
|
||||
SPUFifo();
|
||||
void enqueue(s16 val);
|
||||
s16 dequeue();
|
||||
s16 buffer[16];
|
||||
s32 head,tail,size;
|
||||
void save(EMUFILE &fp);
|
||||
bool load(EMUFILE &fp);
|
||||
void reset();
|
||||
};
|
||||
|
||||
class SPU_struct
|
||||
{
|
||||
public:
|
||||
SPU_struct(int buffersize);
|
||||
u32 bufpos;
|
||||
u32 buflength;
|
||||
s32 *sndbuf;
|
||||
s32 lastdata; //the last sample that a channel generated
|
||||
s16 *outbuf;
|
||||
u32 bufsize;
|
||||
channel_struct channels[16];
|
||||
|
||||
//registers
|
||||
struct REGS {
|
||||
REGS()
|
||||
: mastervol(0)
|
||||
, ctl_left(0)
|
||||
, ctl_right(0)
|
||||
, ctl_ch1bypass(0)
|
||||
, ctl_ch3bypass(0)
|
||||
, masteren(0)
|
||||
, soundbias(0)
|
||||
{}
|
||||
|
||||
u8 mastervol;
|
||||
u8 ctl_left, ctl_right;
|
||||
u8 ctl_ch1bypass, ctl_ch3bypass;
|
||||
u8 masteren;
|
||||
u16 soundbias;
|
||||
|
||||
enum LeftOutputMode
|
||||
{
|
||||
LOM_LEFT_MIXER=0, LOM_CH1=1, LOM_CH3=2, LOM_CH1_PLUS_CH3=3
|
||||
};
|
||||
|
||||
enum RightOutputMode
|
||||
{
|
||||
ROM_RIGHT_MIXER=0, ROM_CH1=1, ROM_CH3=2, ROM_CH1_PLUS_CH3=3
|
||||
};
|
||||
|
||||
struct CAP {
|
||||
CAP()
|
||||
: add(0), source(0), oneshot(0), bits8(0), active(0), dad(0), len(0)
|
||||
{}
|
||||
u8 add, source, oneshot, bits8, active;
|
||||
u32 dad;
|
||||
u16 len;
|
||||
struct Runtime {
|
||||
Runtime()
|
||||
: running(0), curdad(0), maxdad(0)
|
||||
{}
|
||||
u8 running;
|
||||
u32 curdad;
|
||||
u32 maxdad;
|
||||
u32 sampcntFrac;
|
||||
u32 sampcntInt;
|
||||
SPUFifo fifo;
|
||||
} runtime;
|
||||
} cap[2];
|
||||
} regs;
|
||||
|
||||
void reset();
|
||||
~SPU_struct();
|
||||
void KeyOff(int channel);
|
||||
void KeyOn(int channel);
|
||||
void KeyProbe(int channel);
|
||||
void ProbeCapture(int which);
|
||||
void WriteByte(u32 addr, u8 val);
|
||||
void WriteWord(u32 addr, u16 val);
|
||||
void WriteLong(u32 addr, u32 val);
|
||||
u8 ReadByte(u32 addr);
|
||||
u16 ReadWord(u32 addr);
|
||||
u32 ReadLong(u32 addr);
|
||||
bool isSPU(u32 addr) { return ((addr >= 0x04000400) && (addr < 0x04000520)); }
|
||||
|
||||
//kills all channels but leaves SPU otherwise running normally
|
||||
void ShutUp();
|
||||
};
|
||||
|
||||
extern SPU_struct *SPU_core, *SPU_user;
|
||||
extern int spu_core_samples;
|
||||
|
||||
int SPU_ChangeSoundCore(int coreid, int newBufferSizeBytes);
|
||||
SoundInterface_struct *SPU_SoundCore();
|
||||
|
||||
void SPU_ReInit(bool fakeBoot = false);
|
||||
int SPU_Init(int coreid, int newBufferSizeBytes);
|
||||
void SPU_Pause(int pause);
|
||||
void SPU_SetVolume(int newVolume);
|
||||
void SPU_SetSynchMode(int mode, int method);
|
||||
void SPU_ClearOutputBuffer(void);
|
||||
void SPU_Reset(void);
|
||||
void SPU_DeInit(void);
|
||||
void SPU_KeyOn(int channel);
|
||||
static FORCEINLINE void SPU_WriteByte(u32 addr, u8 val)
|
||||
{
|
||||
addr &= 0xFFF;
|
||||
|
||||
SPU_core->WriteByte(addr,val);
|
||||
if(SPU_user)
|
||||
SPU_user->WriteByte(addr,val);
|
||||
}
|
||||
static FORCEINLINE void SPU_WriteWord(u32 addr, u16 val)
|
||||
{
|
||||
addr &= 0xFFF;
|
||||
|
||||
SPU_core->WriteWord(addr,val);
|
||||
if(SPU_user)
|
||||
SPU_user->WriteWord(addr,val);
|
||||
}
|
||||
static FORCEINLINE void SPU_WriteLong(u32 addr, u32 val)
|
||||
{
|
||||
addr &= 0xFFF;
|
||||
|
||||
SPU_core->WriteLong(addr,val);
|
||||
if(SPU_user)
|
||||
SPU_user->WriteLong(addr,val);
|
||||
}
|
||||
static FORCEINLINE u8 SPU_ReadByte(u32 addr) { return SPU_core->ReadByte(addr & 0x0FFF); }
|
||||
static FORCEINLINE u16 SPU_ReadWord(u32 addr) { return SPU_core->ReadWord(addr & 0x0FFF); }
|
||||
static FORCEINLINE u32 SPU_ReadLong(u32 addr) { return SPU_core->ReadLong(addr & 0x0FFF); }
|
||||
void SPU_Emulate_core(void);
|
||||
void SPU_Emulate_user(bool mix = true);
|
||||
void SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
size_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
|
||||
void spu_savestate(EMUFILE &os);
|
||||
bool spu_loadstate(EMUFILE &is, int size);
|
||||
|
||||
enum WAVMode
|
||||
{
|
||||
WAVMODE_ANY = -1,
|
||||
WAVMODE_CORE = 0,
|
||||
WAVMODE_USER = 1
|
||||
};
|
||||
|
||||
class WavWriter
|
||||
{
|
||||
public:
|
||||
WavWriter();
|
||||
bool open(const std::string & fname);
|
||||
void close();
|
||||
void update(void* soundData, int numSamples);
|
||||
bool isRecording() const;
|
||||
WAVMode mode;
|
||||
private:
|
||||
FILE *spufp;
|
||||
};
|
||||
|
||||
void WAV_End();
|
||||
bool WAV_Begin(const char* fname, WAVMode mode=WAVMODE_CORE);
|
||||
bool WAV_IsRecording(WAVMode mode=WAVMODE_ANY);
|
||||
void WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode=WAVMODE_CORE);
|
||||
|
||||
// we should make this configurable eventually
|
||||
// but at least defining it somewhere is probably a step in the right direction
|
||||
#define DESMUME_SAMPLE_RATE 44100
|
||||
//#define DESMUME_SAMPLE_RATE 48000
|
||||
|
||||
#endif
|
||||
/*
|
||||
Copyright 2006 Theo Berkau
|
||||
Copyright (C) 2006-2010 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef SPU_H
|
||||
#define SPU_H
|
||||
|
||||
#include <iosfwd>
|
||||
#include <string>
|
||||
#include <assert.h>
|
||||
#include "types.h"
|
||||
#include "matrix.h"
|
||||
#include "emufile.h"
|
||||
#include "metaspu/metaspu.h"
|
||||
|
||||
|
||||
#define SNDCORE_DEFAULT -1
|
||||
#define SNDCORE_DUMMY 0
|
||||
|
||||
#define CHANSTAT_STOPPED 0
|
||||
#define CHANSTAT_PLAY 1
|
||||
|
||||
//who made these static? theyre used in multiple places.
|
||||
FORCEINLINE u32 sputrunc(float f) { return u32floor(f); }
|
||||
FORCEINLINE u32 sputrunc(double d) { return u32floor(d); }
|
||||
FORCEINLINE s32 spumuldiv7(s32 val, u8 multiplier) {
|
||||
assert(multiplier <= 127);
|
||||
return (multiplier == 127) ? val : ((val * multiplier) >> 7);
|
||||
}
|
||||
|
||||
enum SPUInterpolationMode
|
||||
{
|
||||
SPUInterpolation_None = 0,
|
||||
SPUInterpolation_Linear = 1,
|
||||
SPUInterpolation_Cosine = 2
|
||||
};
|
||||
|
||||
struct SoundInterface_struct
|
||||
{
|
||||
int id;
|
||||
const char *Name;
|
||||
int (*Init)(int buffersize);
|
||||
void (*DeInit)();
|
||||
void (*UpdateAudio)(s16 *buffer, u32 num_samples);
|
||||
u32 (*GetAudioSpace)();
|
||||
void (*MuteAudio)();
|
||||
void (*UnMuteAudio)();
|
||||
void (*SetVolume)(int volume);
|
||||
void (*ClearBuffer)();
|
||||
void (*FetchSamples)(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
size_t (*PostProcessSamples)(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
};
|
||||
|
||||
extern SoundInterface_struct SNDDummy;
|
||||
extern SoundInterface_struct SNDFile;
|
||||
extern int SPU_currentCoreNum;
|
||||
|
||||
struct channel_struct
|
||||
{
|
||||
channel_struct()
|
||||
{}
|
||||
u32 num;
|
||||
u8 vol;
|
||||
u8 datashift;
|
||||
u8 hold;
|
||||
u8 pan;
|
||||
u8 waveduty;
|
||||
u8 repeat;
|
||||
u8 format;
|
||||
u8 keyon;
|
||||
u8 status;
|
||||
u32 addr;
|
||||
u16 timer;
|
||||
u16 loopstart;
|
||||
u32 length;
|
||||
u32 totlength;
|
||||
double double_totlength_shifted;
|
||||
double sampcnt;
|
||||
double sampinc;
|
||||
// ADPCM specific
|
||||
u32 lastsampcnt;
|
||||
s16 pcm16b, pcm16b_last;
|
||||
s16 loop_pcm16b;
|
||||
int index;
|
||||
int loop_index;
|
||||
u16 x;
|
||||
s16 psgnoise_last;
|
||||
};
|
||||
|
||||
class SPUFifo
|
||||
{
|
||||
public:
|
||||
SPUFifo();
|
||||
void enqueue(s16 val);
|
||||
s16 dequeue();
|
||||
s16 buffer[16];
|
||||
s32 head,tail,size;
|
||||
void save(EMUFILE* fp);
|
||||
bool load(EMUFILE* fp);
|
||||
void reset();
|
||||
};
|
||||
|
||||
class SPU_struct
|
||||
{
|
||||
public:
|
||||
SPU_struct(int buffersize);
|
||||
u32 bufpos;
|
||||
u32 buflength;
|
||||
s32 *sndbuf;
|
||||
s32 lastdata; //the last sample that a channel generated
|
||||
s16 *outbuf;
|
||||
u32 bufsize;
|
||||
channel_struct channels[16];
|
||||
|
||||
//registers
|
||||
struct REGS {
|
||||
REGS()
|
||||
: mastervol(0)
|
||||
, ctl_left(0)
|
||||
, ctl_right(0)
|
||||
, ctl_ch1bypass(0)
|
||||
, ctl_ch3bypass(0)
|
||||
, masteren(0)
|
||||
, soundbias(0)
|
||||
{}
|
||||
|
||||
u8 mastervol;
|
||||
u8 ctl_left, ctl_right;
|
||||
u8 ctl_ch1bypass, ctl_ch3bypass;
|
||||
u8 masteren;
|
||||
u16 soundbias;
|
||||
|
||||
enum LeftOutputMode
|
||||
{
|
||||
LOM_LEFT_MIXER=0, LOM_CH1=1, LOM_CH3=2, LOM_CH1_PLUS_CH3=3
|
||||
};
|
||||
|
||||
enum RightOutputMode
|
||||
{
|
||||
ROM_RIGHT_MIXER=0, ROM_CH1=1, ROM_CH3=2, ROM_CH1_PLUS_CH3=3
|
||||
};
|
||||
|
||||
struct CAP {
|
||||
CAP()
|
||||
: add(0), source(0), oneshot(0), bits8(0), active(0), dad(0), len(0)
|
||||
{}
|
||||
u8 add, source, oneshot, bits8, active;
|
||||
u32 dad;
|
||||
u16 len;
|
||||
struct Runtime {
|
||||
Runtime()
|
||||
: running(0), curdad(0), maxdad(0)
|
||||
{}
|
||||
u8 running;
|
||||
u32 curdad;
|
||||
u32 maxdad;
|
||||
double sampcnt;
|
||||
SPUFifo fifo;
|
||||
} runtime;
|
||||
} cap[2];
|
||||
} regs;
|
||||
|
||||
void reset();
|
||||
~SPU_struct();
|
||||
void KeyOff(int channel);
|
||||
void KeyOn(int channel);
|
||||
void KeyProbe(int channel);
|
||||
void ProbeCapture(int which);
|
||||
void WriteByte(u32 addr, u8 val);
|
||||
u8 ReadByte(u32 addr);
|
||||
u16 ReadWord(u32 addr);
|
||||
u32 ReadLong(u32 addr);
|
||||
void WriteWord(u32 addr, u16 val);
|
||||
void WriteLong(u32 addr, u32 val);
|
||||
|
||||
//kills all channels but leaves SPU otherwise running normally
|
||||
void ShutUp();
|
||||
};
|
||||
|
||||
int SPU_ChangeSoundCore(int coreid, int buffersize);
|
||||
SoundInterface_struct *SPU_SoundCore();
|
||||
|
||||
void SPU_ReInit();
|
||||
int SPU_Init(int coreid, int buffersize);
|
||||
void SPU_Pause(int pause);
|
||||
void SPU_SetVolume(int volume);
|
||||
void SPU_SetSynchMode(int mode, int method);
|
||||
void SPU_ClearOutputBuffer(void);
|
||||
void SPU_Reset(void);
|
||||
void SPU_DeInit(void);
|
||||
void SPU_KeyOn(int channel);
|
||||
void SPU_WriteByte(u32 addr, u8 val);
|
||||
void SPU_WriteWord(u32 addr, u16 val);
|
||||
void SPU_WriteLong(u32 addr, u32 val);
|
||||
u8 SPU_ReadByte(u32 addr);
|
||||
u16 SPU_ReadWord(u32 addr);
|
||||
u32 SPU_ReadLong(u32 addr);
|
||||
void SPU_Emulate_core(void);
|
||||
void SPU_Emulate_user(bool mix = true);
|
||||
void SPU_DefaultFetchSamples(s16 *sampleBuffer, size_t sampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
size_t SPU_DefaultPostProcessSamples(s16 *postProcessBuffer, size_t requestedSampleCount, ESynchMode synchMode, ISynchronizingAudioBuffer *theSynchronizer);
|
||||
|
||||
extern SPU_struct *SPU_core, *SPU_user;
|
||||
extern int spu_core_samples;
|
||||
|
||||
void spu_savestate(EMUFILE* os);
|
||||
bool spu_loadstate(EMUFILE* is, int size);
|
||||
|
||||
enum WAVMode
|
||||
{
|
||||
WAVMODE_ANY = -1,
|
||||
WAVMODE_CORE = 0,
|
||||
WAVMODE_USER = 1
|
||||
};
|
||||
|
||||
class WavWriter
|
||||
{
|
||||
public:
|
||||
WavWriter();
|
||||
bool open(const std::string & fname);
|
||||
void close();
|
||||
void update(void* soundData, int numSamples);
|
||||
bool isRecording() const;
|
||||
WAVMode mode;
|
||||
private:
|
||||
FILE *spufp;
|
||||
};
|
||||
|
||||
void WAV_End();
|
||||
bool WAV_Begin(const char* fname, WAVMode mode=WAVMODE_CORE);
|
||||
bool WAV_IsRecording(WAVMode mode=WAVMODE_ANY);
|
||||
void WAV_WavSoundUpdate(void* soundData, int numSamples, WAVMode mode=WAVMODE_CORE);
|
||||
|
||||
// we should make this configurable eventually
|
||||
// but at least defining it somewhere is probably a step in the right direction
|
||||
#define DESMUME_SAMPLE_RATE 44100
|
||||
//#define DESMUME_SAMPLE_RATE 48000
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
Copyright (C) 2009-2012 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "addons.h"
|
||||
#include <string>
|
||||
|
||||
//this is the currently-configured cflash mode
|
||||
ADDON_CFLASH_MODE CFlash_Mode;
|
||||
|
||||
//this is the currently-configured path (directory or filename) for cflash.
|
||||
//it should be viewed as a parameter for the above.
|
||||
std::string CFlash_Path;
|
||||
|
||||
char GBAgameName[MAX_PATH];
|
||||
|
||||
extern ADDONINTERFACE addonNone;
|
||||
extern ADDONINTERFACE addonCFlash;
|
||||
extern ADDONINTERFACE addonRumblePak;
|
||||
extern ADDONINTERFACE addonGBAgame;
|
||||
extern ADDONINTERFACE addonGuitarGrip;
|
||||
extern ADDONINTERFACE addonExpMemory;
|
||||
extern ADDONINTERFACE addonPiano;
|
||||
extern ADDONINTERFACE addonPaddle;
|
||||
//extern ADDONINTERFACE addonExternalMic;
|
||||
|
||||
ADDONINTERFACE addonList[NDS_ADDON_COUNT] = {
|
||||
addonNone,
|
||||
addonCFlash,
|
||||
addonRumblePak,
|
||||
addonGBAgame,
|
||||
addonGuitarGrip,
|
||||
addonExpMemory,
|
||||
addonPiano,
|
||||
addonPaddle
|
||||
};
|
||||
|
||||
ADDONINTERFACE addon = addonCFlash; // default none pak
|
||||
NDS_ADDON_TYPE addon_type = NDS_ADDON_CFLASH;
|
||||
|
||||
BOOL addonsInit()
|
||||
{
|
||||
return addon.init();
|
||||
}
|
||||
|
||||
void addonsClose()
|
||||
{
|
||||
addon.close();
|
||||
}
|
||||
|
||||
void addonsReset()
|
||||
{
|
||||
addon.reset();
|
||||
}
|
||||
|
||||
BOOL addonsChangePak(NDS_ADDON_TYPE type)
|
||||
{
|
||||
if (type > NDS_ADDON_COUNT) return FALSE;
|
||||
addon.close();
|
||||
addon = addonList[type];
|
||||
addon_type = type;
|
||||
printf("Slot 2: %s\n", addon.name);
|
||||
return addon.init();
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
Copyright (C) 2009-2011 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __ADDONS_H__
|
||||
#define __ADDONS_H__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "debug.h"
|
||||
|
||||
struct ADDONINTERFACE
|
||||
{
|
||||
// The name of the plugin, this name will appear in the plugins list
|
||||
const char * name;
|
||||
|
||||
//called once when the plugin starts up
|
||||
BOOL (*init)(void);
|
||||
|
||||
//called when the emulator resets
|
||||
void (*reset)(void);
|
||||
|
||||
//called when the plugin shuts down
|
||||
void (*close)(void);
|
||||
|
||||
//called when the user configurating plugin
|
||||
void (*config)(void);
|
||||
|
||||
//called when the emulator write to addon
|
||||
void (*write08)(u32 procnum, u32 adr, u8 val);
|
||||
void (*write16)(u32 procnum, u32 adr, u16 val);
|
||||
void (*write32)(u32 procnum, u32 adr, u32 val);
|
||||
|
||||
//called when the emulator read from addon
|
||||
u8 (*read08)(u32 procnum, u32 adr);
|
||||
u16 (*read16)(u32 procnum, u32 adr);
|
||||
u32 (*read32)(u32 procnum, u32 adr);
|
||||
|
||||
//called when the user get info about addon pak (description)
|
||||
void (*info)(char *info);
|
||||
};
|
||||
|
||||
enum NDS_ADDON_TYPE
|
||||
{
|
||||
NDS_ADDON_NONE,
|
||||
NDS_ADDON_CFLASH, // compact flash
|
||||
NDS_ADDON_RUMBLEPAK, // rumble pack
|
||||
NDS_ADDON_GBAGAME, // gba game in slot
|
||||
NDS_ADDON_GUITARGRIP, // Guitar Grip
|
||||
NDS_ADDON_EXPMEMORY, // Memory Expansion
|
||||
NDS_ADDON_PIANO, // Piano
|
||||
NDS_ADDON_PADDLE,
|
||||
//NDS_ADDON_EXTERNALMIC,
|
||||
NDS_ADDON_COUNT // use for counter addons - MUST TO BE LAST!!!
|
||||
};
|
||||
|
||||
enum ADDON_CFLASH_MODE
|
||||
{
|
||||
ADDON_CFLASH_MODE_Path, ADDON_CFLASH_MODE_File, ADDON_CFLASH_MODE_RomPath
|
||||
};
|
||||
|
||||
extern ADDON_CFLASH_MODE CFlash_Mode;
|
||||
extern std::string CFlash_Path;
|
||||
inline bool CFlash_IsUsingPath() { return CFlash_Mode==ADDON_CFLASH_MODE_Path || CFlash_Mode==ADDON_CFLASH_MODE_RomPath; }
|
||||
|
||||
extern ADDONINTERFACE addon; // current pak
|
||||
extern ADDONINTERFACE addonList[NDS_ADDON_COUNT]; // lists pointer on paks
|
||||
extern NDS_ADDON_TYPE addon_type; // current type pak
|
||||
|
||||
extern char GBAgameName[MAX_PATH]; // file name for GBA game (rom)
|
||||
extern void (*FeedbackON)(BOOL enable); // feedback on/off
|
||||
|
||||
extern BOOL addonsInit(); // Init addons
|
||||
extern void addonsClose(); // Shutdown addons
|
||||
extern void addonsReset(); // Reset addon
|
||||
extern BOOL addonsChangePak(NDS_ADDON_TYPE type); // change current adddon
|
||||
|
||||
extern void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue); // Guitar grip keys
|
||||
extern void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic); //piano keys
|
||||
|
||||
#endif //__ADDONS_H__
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2010-2015 DeSmuME team
|
||||
Copyright (C) 2010-2012 DeSmuME team
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -17,19 +17,44 @@
|
|||
|
||||
#include "../slot1.h"
|
||||
|
||||
class Slot1_None : public ISlot1Interface
|
||||
static void slot1_info(char *info) { strcpy(info, "Slot1 no-card emulation"); }
|
||||
static void slot1_config(void) {}
|
||||
|
||||
static BOOL slot1_init() { return (TRUE); }
|
||||
|
||||
static void slot1_reset() {}
|
||||
|
||||
static void slot1_close() {}
|
||||
|
||||
|
||||
static void slot1_write08(u8 PROCNUM, u32 adr, u8 val) {}
|
||||
static void slot1_write16(u8 PROCNUM, u32 adr, u16 val) {}
|
||||
static void slot1_write32(u8 PROCNUM, u32 adr, u32 val) {}
|
||||
|
||||
static u8 slot1_read08(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
public:
|
||||
virtual Slot1Info const* info()
|
||||
{
|
||||
static Slot1InfoSimple info("None","Slot1 no-card emulation", 0xFF);
|
||||
return &info;
|
||||
}
|
||||
return 0xFF;
|
||||
}
|
||||
static u16 slot1_read16(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFFFF;
|
||||
}
|
||||
static u32 slot1_read32(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
//pretty much every access to the card should just be ignored and reading HIGH-Z off the GC bus.
|
||||
//so, nothing really to do here
|
||||
//(notably, it results in a 0xFFFFFFFF card ID)
|
||||
|
||||
};
|
||||
|
||||
ISlot1Interface* construct_Slot1_None() { return new Slot1_None(); }
|
||||
SLOT1INTERFACE slot1None = {
|
||||
"None",
|
||||
slot1_init,
|
||||
slot1_reset,
|
||||
slot1_close,
|
||||
slot1_config,
|
||||
slot1_write08,
|
||||
slot1_write16,
|
||||
slot1_write32,
|
||||
slot1_read08,
|
||||
slot1_read16,
|
||||
slot1_read32,
|
||||
slot1_info};
|
||||
|
|
|
@ -1,236 +1,237 @@
|
|||
/*
|
||||
Copyright (C) 2010-2021 DeSmuME team
|
||||
/* Copyright (C) 2010-2011 DeSmuME team
|
||||
|
||||
This file 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 file is part of DeSmuME
|
||||
|
||||
This file 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.
|
||||
DeSmuME 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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
DeSmuME 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 DeSmuME; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "slot1comp_protocol.h"
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#include "../slot1.h"
|
||||
#include "../registers.h"
|
||||
#include "../MMU.h"
|
||||
#include "../NDSSystem.h"
|
||||
#include "../emufile.h"
|
||||
|
||||
class Slot1_R4 : public ISlot1Interface, public ISlot1Comp_Protocol_Client
|
||||
static EMUFILE *img = NULL;
|
||||
static u32 write_count = 0;
|
||||
static u32 write_enabled = 0;
|
||||
static void init_r4_flash()
|
||||
{
|
||||
private:
|
||||
EMUFILE *img;
|
||||
Slot1Comp_Protocol protocol;
|
||||
u32 write_count;
|
||||
u32 write_enabled;
|
||||
srand(time(NULL));
|
||||
|
||||
public:
|
||||
Slot1_R4()
|
||||
: img(NULL)
|
||||
, write_count(0)
|
||||
, write_enabled(0)
|
||||
if (!img)
|
||||
img = slot1GetFatImage();
|
||||
|
||||
if(!img)
|
||||
{
|
||||
INFO("slot1 fat not successfully mounted\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void info(char *info) { strcpy(info, "Slot1 R4 Emulation"); }
|
||||
static void config(void) {}
|
||||
|
||||
static BOOL init()
|
||||
{
|
||||
init_r4_flash();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void reset() {
|
||||
init_r4_flash();
|
||||
}
|
||||
|
||||
static void close() {
|
||||
img = NULL;
|
||||
}
|
||||
|
||||
|
||||
static void write08(u8 PROCNUM, u32 adr, u8 val) {}
|
||||
static void write16(u8 PROCNUM, u32 adr, u16 val) {}
|
||||
|
||||
static void write32_GCROMCTRL(u32 val)
|
||||
{
|
||||
nds_dscard& card = MMU.dscard[0];
|
||||
|
||||
switch(card.command[0])
|
||||
{
|
||||
case 0xB0:
|
||||
break;
|
||||
case 0xB9:
|
||||
case 0xBA:
|
||||
card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];
|
||||
img->fseek(card.address,SEEK_SET);
|
||||
break;
|
||||
case 0xBB:
|
||||
write_enabled = 1;
|
||||
write_count = 0x80;
|
||||
case 0xBC:
|
||||
card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];
|
||||
img->fseek(card.address,SEEK_SET);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void write32_GCDATAIN(u32 val)
|
||||
{
|
||||
nds_dscard& card = MMU.dscard[0];
|
||||
//bool log=false;
|
||||
|
||||
memcpy(&card.command[0], &MMU.MMU_MEM[0][0x40][0x1A8], 8);
|
||||
|
||||
//last_write_count = write_count;
|
||||
if(card.command[4])
|
||||
{
|
||||
// transfer is done
|
||||
T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF);
|
||||
|
||||
// if needed, throw irq for the end of transfer
|
||||
if(MMU.AUX_SPI_CNT & 0x4000)
|
||||
NDS_makeIrq(ARMCPU_ARM9, IRQ_BIT_GC_TRANSFER_COMPLETE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
virtual Slot1Info const* info()
|
||||
switch(card.command[0])
|
||||
{
|
||||
static Slot1InfoSimple info("R4", "Slot1 R4 emulation", 0x03);
|
||||
return &info;
|
||||
}
|
||||
|
||||
virtual void connect()
|
||||
{
|
||||
img = slot1_GetFatImage();
|
||||
|
||||
if(!img)
|
||||
INFO("slot1 fat not successfully mounted\n");
|
||||
|
||||
protocol.reset(this);
|
||||
protocol.chipId = 0xFC2;
|
||||
protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0);
|
||||
}
|
||||
|
||||
//called when the emulator disconnects the device
|
||||
virtual void disconnect()
|
||||
{
|
||||
img = NULL;
|
||||
}
|
||||
|
||||
//called when the emulator shuts down, or when the device disappears from existence
|
||||
virtual void shutdown()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
virtual void write_command(u8 PROCNUM, GC_Command command)
|
||||
{
|
||||
protocol.write_command(command);
|
||||
}
|
||||
virtual void write_GCDATAIN(u8 PROCNUM, u32 val)
|
||||
{
|
||||
protocol.write_GCDATAIN(PROCNUM, val);
|
||||
}
|
||||
virtual u32 read_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
return protocol.read_GCDATAIN(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void slot1client_startOperation(eSlot1Operation theOperation)
|
||||
{
|
||||
if (theOperation != eSlot1Operation_Unknown)
|
||||
return;
|
||||
|
||||
u32 address;
|
||||
int cmd = protocol.command.bytes[0];
|
||||
switch(cmd)
|
||||
case 0xBB:
|
||||
{
|
||||
case 0xB0:
|
||||
break;
|
||||
case 0xB9:
|
||||
case 0xBA:
|
||||
address = (protocol.command.bytes[1] << 24) | (protocol.command.bytes[2] << 16) | (protocol.command.bytes[3] << 8) | protocol.command.bytes[4];
|
||||
img->fseek(address,SEEK_SET);
|
||||
break;
|
||||
case 0xBB:
|
||||
write_enabled = 1;
|
||||
write_count = 0x80;
|
||||
//passthrough on purpose?
|
||||
case 0xBC:
|
||||
address = (protocol.command.bytes[1] << 24) | (protocol.command.bytes[2] << 16) | (protocol.command.bytes[3] << 8) | protocol.command.bytes[4];
|
||||
img->fseek(address,SEEK_SET);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virtual u32 slot1client_read_GCDATAIN(eSlot1Operation theOperation)
|
||||
{
|
||||
if (theOperation != eSlot1Operation_Unknown)
|
||||
return 0;
|
||||
|
||||
u32 val = 0;
|
||||
int cmd = protocol.command.bytes[0];
|
||||
switch (cmd)
|
||||
{
|
||||
case 0xB0:
|
||||
val = (img != NULL) ? 0x1F4 : 0x1F2;
|
||||
break;
|
||||
case 0xB9:
|
||||
val = (rand() % 100) ? (img) ? 0x1F4 : 0x1F2 : 0;
|
||||
break;
|
||||
case 0xBB:
|
||||
case 0xBC:
|
||||
val = 0;
|
||||
break;
|
||||
case 0xBA:
|
||||
//INFO("Read from sd at sector %08X at adr %08X ",card.address/512,ftell(img));
|
||||
img->read_32LE(val);
|
||||
//INFO("val %08X\n",val);
|
||||
break;
|
||||
default:
|
||||
val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
void slot1client_write_GCDATAIN(eSlot1Operation theOperation, u32 val)
|
||||
{
|
||||
if (theOperation != eSlot1Operation_Unknown)
|
||||
return;
|
||||
|
||||
int cmd = protocol.command.bytes[0];
|
||||
switch (cmd)
|
||||
{
|
||||
case 0xBB:
|
||||
if(write_count && write_enabled)
|
||||
{
|
||||
if (write_count && write_enabled)
|
||||
{
|
||||
img->write_32LE(val);
|
||||
img->fflush();
|
||||
write_count--;
|
||||
}
|
||||
break;
|
||||
img->fwrite(&val, 4);
|
||||
img->fflush();
|
||||
write_count--;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
virtual void post_fakeboot(int PROCNUM)
|
||||
if(write_count==0)
|
||||
{
|
||||
// The BIOS leaves the card in NORMAL mode
|
||||
protocol.mode = eCardMode_NORMAL;
|
||||
write_enabled = 0;
|
||||
|
||||
// transfer is done
|
||||
T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF);
|
||||
|
||||
// if needed, throw irq for the end of transfer
|
||||
if(MMU.AUX_SPI_CNT & 0x4000)
|
||||
NDS_makeIrq(ARMCPU_ARM9, IRQ_BIT_GC_TRANSFER_COMPLETE);
|
||||
}
|
||||
|
||||
void write32_GCDATAIN(u32 val)
|
||||
/*if(log)
|
||||
{
|
||||
//bool log = false;
|
||||
INFO("WRITE CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t",
|
||||
card.command[0], card.command[1], card.command[2], card.command[3],
|
||||
card.command[4], card.command[5], card.command[6], card.command[7]);
|
||||
INFO("FROM: %08X\t", NDS_ARM9.instruct_adr);
|
||||
INFO("VAL: %08X\n", val);
|
||||
}*/
|
||||
}
|
||||
|
||||
//last_write_count = write_count;
|
||||
static void write32(u8 PROCNUM, u32 adr, u32 val)
|
||||
{
|
||||
switch(adr)
|
||||
{
|
||||
case REG_GCROMCTRL:
|
||||
write32_GCROMCTRL(val);
|
||||
break;
|
||||
case REG_GCDATAIN:
|
||||
write32_GCDATAIN(val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//can someone tell me ... what the hell is this doing, anyway?
|
||||
//seems odd to use card.command[4] for this... isnt it part of the address?
|
||||
if (protocol.command.bytes[4])
|
||||
{
|
||||
// transfer is done
|
||||
//are you SURE this is logical? there doesnt seem to be any way for the card to signal that
|
||||
T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF);
|
||||
static u8 read08(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFF;
|
||||
}
|
||||
static u16 read16(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFFFF;
|
||||
}
|
||||
|
||||
MMU_GC_endTransfer(0);
|
||||
|
||||
return;
|
||||
}
|
||||
static u32 read32_GCDATAIN()
|
||||
{
|
||||
nds_dscard& card = MMU.dscard[0];
|
||||
|
||||
u32 val;
|
||||
|
||||
int cmd = protocol.command.bytes[0];
|
||||
switch (cmd)
|
||||
{
|
||||
case 0xBB:
|
||||
{
|
||||
if (write_count && write_enabled)
|
||||
{
|
||||
img->write_32LE(val);
|
||||
img->fflush();
|
||||
write_count--;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch(card.command[0])
|
||||
{
|
||||
//Get ROM chip ID
|
||||
case 0x90:
|
||||
case 0xB8:
|
||||
val = 0xFC2;
|
||||
break;
|
||||
|
||||
if (write_count == 0)
|
||||
{
|
||||
write_enabled = 0;
|
||||
case 0xB0:
|
||||
val = 0x1F4;
|
||||
break;
|
||||
case 0xB9:
|
||||
val = (rand() % 100) ? 0x1F4 : 0;
|
||||
break;
|
||||
case 0xBB:
|
||||
case 0xBC:
|
||||
val = 0;
|
||||
break;
|
||||
case 0xBA:
|
||||
//INFO("Read from sd at sector %08X at adr %08X ",card.address/512,ftell(img));
|
||||
img->fread(&val, 4);
|
||||
//INFO("val %08X\n",val);
|
||||
break;
|
||||
|
||||
//transfer is done
|
||||
|
||||
//are you SURE this is logical? there doesnt seem to be any way for the card to signal that
|
||||
T1WriteLong(MMU.MMU_MEM[0][0x40], 0x1A4,val & 0x7F7FFFFF);
|
||||
|
||||
//but isnt this a different IRQ? IREQ_MC perhaps
|
||||
MMU_GC_endTransfer(0);
|
||||
}
|
||||
|
||||
/*if(log)
|
||||
{
|
||||
INFO("WRITE CARD command: %02X%02X%02X%02X%02X%02X%02X%02X\t",
|
||||
card.command[0], card.command[1], card.command[2], card.command[3],
|
||||
card.command[4], card.command[5], card.command[6], card.command[7]);
|
||||
INFO("FROM: %08X\t", NDS_ARM9.instruct_adr);
|
||||
INFO("VAL: %08X\n", val);
|
||||
}*/
|
||||
default:
|
||||
val = 0;
|
||||
}
|
||||
|
||||
};
|
||||
/*INFO("READ CARD command: %02X%02X%02X%02X% 02X%02X%02X%02X RET: %08X ",
|
||||
card.command[0], card.command[1], card.command[2], card.command[3],
|
||||
card.command[4], card.command[5], card.command[6], card.command[7],
|
||||
val);
|
||||
INFO("FROM: %08X LR: %08X\n", NDS_ARM9.instruct_adr, NDS_ARM9.R[14]);*/
|
||||
|
||||
ISlot1Interface* construct_Slot1_R4() { return new Slot1_R4(); }
|
||||
|
||||
return val;
|
||||
} //read32_GCDATAIN
|
||||
|
||||
|
||||
static u32 read32(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
switch(adr)
|
||||
{
|
||||
case REG_GCDATAIN:
|
||||
return read32_GCDATAIN();
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
SLOT1INTERFACE slot1R4 = {
|
||||
"R4",
|
||||
init,
|
||||
reset,
|
||||
close,
|
||||
config,
|
||||
write08,
|
||||
write16,
|
||||
write32,
|
||||
read08,
|
||||
read16,
|
||||
read32,
|
||||
info};
|
||||
|
|
|
@ -0,0 +1,288 @@
|
|||
/* Copyright (C) 2010-2011 DeSmuME team
|
||||
|
||||
This file is part of DeSmuME
|
||||
|
||||
DeSmuME 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.
|
||||
|
||||
DeSmuME 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 DeSmuME; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "../slot1.h"
|
||||
#include "../registers.h"
|
||||
#include "../MMU.h"
|
||||
#include "../NDSSystem.h"
|
||||
|
||||
static void info(char *info) { strcpy(info, "Slot1 Retail card emulation"); }
|
||||
static void config(void) {}
|
||||
|
||||
static BOOL init() { return (TRUE); }
|
||||
|
||||
static void reset() {}
|
||||
|
||||
static void close() {}
|
||||
|
||||
|
||||
static void write08(u8 PROCNUM, u32 adr, u8 val) {}
|
||||
static void write16(u8 PROCNUM, u32 adr, u16 val) {}
|
||||
|
||||
static void write32_GCROMCTRL(u8 PROCNUM, u32 val)
|
||||
{
|
||||
nds_dscard& card = MMU.dscard[PROCNUM];
|
||||
|
||||
switch(card.command[0])
|
||||
{
|
||||
case 0x00: //Data read
|
||||
case 0xB7:
|
||||
card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];
|
||||
card.transfer_count = 0x80;
|
||||
break;
|
||||
|
||||
case 0xB8: // Chip ID
|
||||
card.address = 0;
|
||||
card.transfer_count = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
card.address = 0;
|
||||
card.transfer_count = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void write32(u8 PROCNUM, u32 adr, u32 val)
|
||||
{
|
||||
switch(adr)
|
||||
{
|
||||
case REG_GCROMCTRL:
|
||||
write32_GCROMCTRL(PROCNUM, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 read08(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFF;
|
||||
}
|
||||
static u16 read16(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFFFF;
|
||||
}
|
||||
|
||||
static u32 read32_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
nds_dscard& card = MMU.dscard[PROCNUM];
|
||||
|
||||
switch(card.command[0])
|
||||
{
|
||||
//Get ROM chip ID
|
||||
case 0x90:
|
||||
case 0xB8:
|
||||
{
|
||||
// Note: the BIOS stores the chip ID in main memory
|
||||
// Most games continuously compare the chip ID with
|
||||
// the value in memory, probably to know if the card
|
||||
// was removed.
|
||||
// As DeSmuME normally boots directly from the game, the chip
|
||||
// ID in main mem is zero and this value needs to be
|
||||
// zero too.
|
||||
|
||||
//note that even if desmume was booting from firmware, and reading this chip ID to store in main memory,
|
||||
//this still works, since it will have read 00 originally and then read 00 to validate.
|
||||
|
||||
//staff of kings verifies this (it also uses the arm7 IRQ 20)
|
||||
if(nds.cardEjected) //TODO - handle this with ejected card slot1 device (and verify using this case)
|
||||
return 0xFFFFFFFF;
|
||||
else return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
// Data read
|
||||
case 0x00:
|
||||
case 0xB7:
|
||||
{
|
||||
//it seems that etrian odyssey 3 doesnt work unless we mask this to cart size.
|
||||
//but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision
|
||||
//but there is no test case yet
|
||||
u32 address = card.address & (gameInfo.mask);
|
||||
|
||||
// Make sure any reads below 0x8000 redirect to 0x8000+(adr&0x1FF) as on real cart
|
||||
if((card.command[0] == 0xB7) && (address < 0x8000))
|
||||
{
|
||||
//TODO - refactor this to include the PROCNUM, for debugging purposes if nothing else
|
||||
//(can refactor gbaslot also)
|
||||
|
||||
//INFO("Read below 0x8000 (0x%04X) from: ARM%s %08X\n",
|
||||
// card.address, (PROCNUM ? "7":"9"), (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr);
|
||||
|
||||
address = (0x8000 + (address&0x1FF));
|
||||
}
|
||||
|
||||
//as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms)
|
||||
//we need to protect ourselves by returning 0xFF for things still out of range
|
||||
if(address >= gameInfo.romsize)
|
||||
{
|
||||
DEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize);
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
return T1ReadLong(MMU.CART_ROM, address);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
} //switch(card.command[0])
|
||||
} //read32_GCDATAIN
|
||||
|
||||
static u32 read32(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
switch(adr)
|
||||
{
|
||||
case REG_GCDATAIN:
|
||||
return read32_GCDATAIN(PROCNUM);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SLOT1INTERFACE slot1Retail = {
|
||||
"Retail",
|
||||
init,
|
||||
reset,
|
||||
close,
|
||||
config,
|
||||
write08,
|
||||
write16,
|
||||
write32,
|
||||
read08,
|
||||
read16,
|
||||
read32,
|
||||
info
|
||||
};
|
||||
|
||||
|
||||
|
||||
// ///writetoGCControl:
|
||||
//// --- Ninja SD commands -------------------------------------
|
||||
|
||||
// // NJSD init/reset
|
||||
// case 0x20:
|
||||
// {
|
||||
// card.address = 0;
|
||||
// card.transfer_count = 0;
|
||||
// }
|
||||
// break;
|
||||
|
||||
// // NJSD_sendCLK()
|
||||
// case 0xE0:
|
||||
// {
|
||||
// card.address = 0;
|
||||
// card.transfer_count = 0;
|
||||
// NDS_makeInt(PROCNUM, 20);
|
||||
// }
|
||||
// break;
|
||||
|
||||
// // NJSD_sendCMDN() / NJSD_sendCMDR()
|
||||
// case 0xF0:
|
||||
// case 0xF1:
|
||||
// switch (card.command[2])
|
||||
// {
|
||||
// // GO_IDLE_STATE
|
||||
// case 0x40:
|
||||
// card.address = 0;
|
||||
// card.transfer_count = 0;
|
||||
// NDS_makeInt(PROCNUM, 20);
|
||||
// break;
|
||||
|
||||
// case 0x42: // ALL_SEND_CID
|
||||
// case 0x43: // SEND_RELATIVE_ADDR
|
||||
// case 0x47: // SELECT_CARD
|
||||
// case 0x49: // SEND_CSD
|
||||
// case 0x4D:
|
||||
// case 0x77: // APP_CMD
|
||||
// case 0x69: // SD_APP_OP_COND
|
||||
// card.address = 0;
|
||||
// card.transfer_count = 6;
|
||||
// NDS_makeInt(PROCNUM, 20);
|
||||
// break;
|
||||
|
||||
// // SET_BLOCKLEN
|
||||
// case 0x50:
|
||||
// card.address = 0;
|
||||
// card.transfer_count = 6;
|
||||
// card.blocklen = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24);
|
||||
// NDS_makeInt(PROCNUM, 20);
|
||||
// break;
|
||||
|
||||
// // READ_SINGLE_BLOCK
|
||||
// case 0x51:
|
||||
// card.address = card.command[6] | (card.command[5] << 8) | (card.command[4] << 16) | (card.command[3] << 24);
|
||||
// card.transfer_count = (card.blocklen + 3) >> 2;
|
||||
// NDS_makeInt(PROCNUM, 20);
|
||||
// break;
|
||||
// }
|
||||
// break;
|
||||
|
||||
// // --- Ninja SD commands end ---------------------------------
|
||||
|
||||
|
||||
|
||||
// //GCDATAIN:
|
||||
// // --- Ninja SD commands -------------------------------------
|
||||
|
||||
// // NJSD_sendCMDN() / NJSD_sendCMDR()
|
||||
// case 0xF0:
|
||||
// case 0xF1:
|
||||
// switch (card.command[2])
|
||||
// {
|
||||
// // ALL_SEND_CID
|
||||
// case 0x42:
|
||||
// if (card.transfer_count == 2) val = 0x44534A4E;
|
||||
// else val = 0x00000000;
|
||||
|
||||
// // SEND_RELATIVE_ADDR
|
||||
// case 0x43:
|
||||
// case 0x47:
|
||||
// case 0x49:
|
||||
// case 0x50:
|
||||
// val = 0x00000000;
|
||||
// break;
|
||||
|
||||
// case 0x4D:
|
||||
// if (card.transfer_count == 2) val = 0x09000000;
|
||||
// else val = 0x00000000;
|
||||
// break;
|
||||
|
||||
// // APP_CMD
|
||||
// case 0x77:
|
||||
// if (card.transfer_count == 2) val = 0x00000037;
|
||||
// else val = 0x00000000;
|
||||
// break;
|
||||
|
||||
// // SD_APP_OP_COND
|
||||
// case 0x69:
|
||||
// if (card.transfer_count == 2) val = 0x00008000;
|
||||
// else val = 0x00000000;
|
||||
// break;
|
||||
|
||||
// // READ_SINGLE_BLOCK
|
||||
// case 0x51:
|
||||
// val = 0x00000000;
|
||||
// break;
|
||||
// }
|
||||
// break;
|
||||
|
||||
// // --- Ninja SD commands end ---------------------------------
|
||||
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2013-2015 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../slot1.h"
|
||||
#include "../NDSSystem.h"
|
||||
|
||||
class Slot1_Retail_Auto : public ISlot1Interface
|
||||
{
|
||||
private:
|
||||
ISlot1Interface *mSelectedImplementation;
|
||||
|
||||
public:
|
||||
Slot1_Retail_Auto()
|
||||
: mSelectedImplementation(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
virtual Slot1Info const* info()
|
||||
{
|
||||
static Slot1InfoSimple info("Retail (Auto)","Slot1 Retail (auto-selection) card emulation", 0xFE);
|
||||
return &info;
|
||||
}
|
||||
|
||||
virtual void connect()
|
||||
{
|
||||
|
||||
NDS_SLOT1_TYPE selection = NDS_SLOT1_RETAIL_MCROM;
|
||||
|
||||
//check game ID in core emulator and select right implementation
|
||||
//gamehack: definitely not a game hack, just a lazy way of selecting the right equipment for the game
|
||||
if(gameInfo.IsCode("UOR") || // WarioWare - D.I.Y. (U)(E)(EUR) / Made in Ore (J)
|
||||
gameInfo.IsCode("UXBP") || // Jam with the Band (EUR)
|
||||
gameInfo.IsCode("AXBJ") // Daigassou! Band-Brothers DX (J)
|
||||
)
|
||||
selection = NDS_SLOT1_RETAIL_NAND;
|
||||
|
||||
slot1_selected_type = selection;
|
||||
mSelectedImplementation = slot1_List[selection];
|
||||
mSelectedImplementation->connect();
|
||||
printf("Slot1 auto-selected device type: %s\n",mSelectedImplementation->info()->name());
|
||||
}
|
||||
|
||||
virtual void disconnect()
|
||||
{
|
||||
if(mSelectedImplementation) mSelectedImplementation->disconnect();
|
||||
mSelectedImplementation = NULL;
|
||||
}
|
||||
|
||||
virtual void write_command(u8 PROCNUM, GC_Command command)
|
||||
{
|
||||
mSelectedImplementation->write_command(PROCNUM, command);
|
||||
}
|
||||
|
||||
virtual void write_GCDATAIN(u8 PROCNUM, u32 val)
|
||||
{
|
||||
mSelectedImplementation->write_GCDATAIN(PROCNUM, val);
|
||||
}
|
||||
|
||||
virtual u32 read_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
return mSelectedImplementation->read_GCDATAIN(PROCNUM);
|
||||
}
|
||||
|
||||
virtual u8 auxspi_transaction(int PROCNUM, u8 value)
|
||||
{
|
||||
return mSelectedImplementation->auxspi_transaction(PROCNUM, value);
|
||||
}
|
||||
|
||||
virtual void auxspi_reset(int PROCNUM)
|
||||
{
|
||||
mSelectedImplementation->auxspi_reset(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void post_fakeboot(int PROCNUM)
|
||||
{
|
||||
mSelectedImplementation->post_fakeboot(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void savestate(EMUFILE &os)
|
||||
{
|
||||
mSelectedImplementation->savestate(os);
|
||||
}
|
||||
|
||||
virtual void loadstate(EMUFILE &is)
|
||||
{
|
||||
mSelectedImplementation->loadstate(is);
|
||||
}
|
||||
};
|
||||
|
||||
ISlot1Interface* construct_Slot1_Retail_Auto() { return new Slot1_Retail_Auto(); }
|
|
@ -1,107 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2010-2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "slot1comp_mc.h"
|
||||
#include "slot1comp_rom.h"
|
||||
#include "slot1comp_protocol.h"
|
||||
|
||||
#include "../slot1.h"
|
||||
#include "../NDSSystem.h"
|
||||
|
||||
//quick architecture overview:
|
||||
//MCROM receives GC bus commands from MMU.cpp
|
||||
//those are passed on to the protocol component for parsing
|
||||
//protocol calls back into MCROM via ISlot1Comp_Protocol_Client interface for things the protocol doesnt know about (the contents of the rom, chiefly)
|
||||
//MCROM utilizes the rom component for address logic and delivering data
|
||||
|
||||
class Slot1_Retail_MCROM : public ISlot1Interface, public ISlot1Comp_Protocol_Client
|
||||
{
|
||||
private:
|
||||
Slot1Comp_Protocol protocol;
|
||||
Slot1Comp_Rom rom;
|
||||
|
||||
public:
|
||||
|
||||
virtual Slot1Info const* info()
|
||||
{
|
||||
static Slot1InfoSimple info("Retail MC+ROM", "Slot1 Retail MC+ROM (standard) card emulation", 0x01);
|
||||
return &info;
|
||||
}
|
||||
|
||||
virtual void connect()
|
||||
{
|
||||
protocol.reset(this);
|
||||
protocol.chipId = gameInfo.chipID;
|
||||
protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0);
|
||||
g_Slot1Comp_MC.connect();
|
||||
}
|
||||
|
||||
virtual u8 auxspi_transaction(int PROCNUM, u8 value)
|
||||
{
|
||||
return g_Slot1Comp_MC.auxspi_transaction(PROCNUM,value);
|
||||
}
|
||||
|
||||
virtual void auxspi_reset(int PROCNUM)
|
||||
{
|
||||
g_Slot1Comp_MC.auxspi_reset(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void write_command(u8 PROCNUM, GC_Command command)
|
||||
{
|
||||
protocol.write_command(command);
|
||||
}
|
||||
virtual void write_GCDATAIN(u8 PROCNUM, u32 val)
|
||||
{
|
||||
protocol.write_GCDATAIN(PROCNUM, val);
|
||||
}
|
||||
virtual u32 read_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
return protocol.read_GCDATAIN(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void slot1client_startOperation(eSlot1Operation theOperation)
|
||||
{
|
||||
rom.start(theOperation,protocol.address);
|
||||
}
|
||||
|
||||
virtual void post_fakeboot(int PROCNUM)
|
||||
{
|
||||
// The BIOS leaves the card in NORMAL mode
|
||||
protocol.mode = eCardMode_NORMAL;
|
||||
}
|
||||
|
||||
virtual void savestate(EMUFILE &os)
|
||||
{
|
||||
protocol.savestate(os);
|
||||
rom.savestate(os);
|
||||
}
|
||||
|
||||
virtual void loadstate(EMUFILE &is)
|
||||
{
|
||||
protocol.loadstate(is);
|
||||
rom.loadstate(is);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
u32 slot1client_read_GCDATAIN(eSlot1Operation operation)
|
||||
{
|
||||
return rom.read();
|
||||
}
|
||||
};
|
||||
|
||||
ISlot1Interface* construct_Slot1_Retail_MCROM() { return new Slot1_Retail_MCROM(); }
|
|
@ -1,214 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2013-2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
//This module implements a device which is capable of building a nitro FS on the fly
|
||||
//(and REBUILDING it! -- Q: under what conditions?)
|
||||
//so that you can test your homebrew games and patches without having to rebuild the ROM and restart it.
|
||||
//Q. can it handle resized files?
|
||||
|
||||
#include "slot1comp_mc.h"
|
||||
#include "slot1comp_rom.h"
|
||||
#include "slot1comp_protocol.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
|
||||
#include "../slot1.h"
|
||||
#include "../path.h"
|
||||
#include "../NDSSystem.h"
|
||||
#include "../utils/fsnitro.h"
|
||||
|
||||
class Slot1_Retail_DEBUG : public ISlot1Interface, public ISlot1Comp_Protocol_Client
|
||||
{
|
||||
private:
|
||||
Slot1Comp_Protocol protocol;
|
||||
Slot1Comp_Rom rom;
|
||||
FILE *fpROM;
|
||||
FS_NITRO *fs;
|
||||
u16 curr_file_id;
|
||||
std::string pathData;
|
||||
|
||||
public:
|
||||
|
||||
virtual Slot1Info const* info()
|
||||
{
|
||||
static Slot1InfoSimple info("Retail DEBUG","Slot1 Retail (standard) card emulation + FS Nitro DEBUG", 0x04);
|
||||
return &info;
|
||||
}
|
||||
|
||||
virtual void connect()
|
||||
{
|
||||
protocol.reset(this);
|
||||
protocol.chipId = gameInfo.chipID;
|
||||
protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0);
|
||||
|
||||
curr_file_id = 0xFFFF;
|
||||
fpROM = NULL;
|
||||
fs = NULL;
|
||||
|
||||
pathData = path.getpath(path.SLOT1D) + path.GetRomNameWithoutExtension();
|
||||
printf("Path to Slot1 data: %s\n", pathData.c_str());
|
||||
|
||||
fs = new FS_NITRO();
|
||||
fs->rebuildFAT(pathData);
|
||||
}
|
||||
|
||||
virtual u8 auxspi_transaction(int PROCNUM, u8 value)
|
||||
{
|
||||
return g_Slot1Comp_MC.auxspi_transaction(PROCNUM,value);
|
||||
}
|
||||
|
||||
virtual void auxspi_reset(int PROCNUM)
|
||||
{
|
||||
g_Slot1Comp_MC.auxspi_reset(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void write_command(u8 PROCNUM, GC_Command command)
|
||||
{
|
||||
protocol.write_command(command);
|
||||
}
|
||||
virtual void write_GCDATAIN(u8 PROCNUM, u32 val)
|
||||
{
|
||||
protocol.write_GCDATAIN(PROCNUM, val);
|
||||
}
|
||||
virtual u32 read_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
return protocol.read_GCDATAIN(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void post_fakeboot(int PROCNUM)
|
||||
{
|
||||
// The BIOS leaves the card in NORMAL mode
|
||||
protocol.mode = eCardMode_NORMAL;
|
||||
}
|
||||
|
||||
virtual void savestate(EMUFILE &os)
|
||||
{
|
||||
protocol.savestate(os);
|
||||
rom.savestate(os);
|
||||
}
|
||||
|
||||
virtual void loadstate(EMUFILE &is)
|
||||
{
|
||||
protocol.loadstate(is);
|
||||
rom.loadstate(is);
|
||||
}
|
||||
|
||||
virtual void slot1client_startOperation(eSlot1Operation theOperation)
|
||||
{
|
||||
if (protocol.operation == eSlot1Operation_B7_Read)
|
||||
{
|
||||
u16 file_id = 0xFFFF; u32 offset = 0;
|
||||
bool bFromFile = false;
|
||||
|
||||
if (fs && fs->isFAT(protocol.address))
|
||||
{
|
||||
fs->rebuildFAT(protocol.address, protocol.length, pathData);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fs && fs->getFileIdByAddr(protocol.address, file_id, offset))
|
||||
{
|
||||
if (file_id != curr_file_id)
|
||||
{
|
||||
std::string tmp = fs->getFullPathByFileID(file_id);
|
||||
printf("%04X:[%08X, ofs %08X] %s\n", file_id, protocol.address, offset, tmp.c_str());
|
||||
|
||||
if (fpROM)
|
||||
{
|
||||
fclose(fpROM);
|
||||
fpROM = NULL;
|
||||
}
|
||||
tmp = pathData + tmp;
|
||||
|
||||
fpROM = fopen(tmp.c_str(), "rb");
|
||||
if (fpROM)
|
||||
{
|
||||
bFromFile = true;
|
||||
printf("\t * found at disk, offset %08X\n", offset);
|
||||
if (fseek(fpROM, offset, SEEK_SET) != 0)
|
||||
{
|
||||
printf("\t\t - ERROR seek file position\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fpROM)
|
||||
{
|
||||
bFromFile = true;
|
||||
if (ftell(fpROM) != offset)
|
||||
{
|
||||
printf("\t * new file seek %08Xh\n", offset);
|
||||
fseek(fpROM, offset, SEEK_SET);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!bFromFile && fpROM)
|
||||
{
|
||||
fclose(fpROM);
|
||||
fpROM = NULL;
|
||||
}
|
||||
|
||||
curr_file_id = file_id;
|
||||
}
|
||||
rom.start(theOperation, protocol.address);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
u32 slot1client_read_GCDATAIN(eSlot1Operation operation)
|
||||
{
|
||||
if (protocol.operation == eSlot1Operation_B7_Read)
|
||||
{
|
||||
|
||||
u32 address = rom.getAddress();
|
||||
|
||||
if (fs && fs->isFAT(address))
|
||||
{
|
||||
u32 res = fs->getFATRecord(address);
|
||||
if (res != 0xFFFFFFFF)
|
||||
{
|
||||
rom.incAddress();
|
||||
return res;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (fpROM)
|
||||
{
|
||||
u32 data = 0;
|
||||
u32 readed = fread(&data, 1, 4, fpROM);
|
||||
if (readed)
|
||||
{
|
||||
rom.incAddress();
|
||||
if (readed < 4)
|
||||
data |= ((u32)0xFFFFFFFF << (readed * 8));
|
||||
return data;
|
||||
}
|
||||
|
||||
fclose(fpROM);
|
||||
fpROM = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return rom.read();
|
||||
}
|
||||
};
|
||||
|
||||
ISlot1Interface* construct_Slot1_Retail_DEBUG() { return new Slot1_Retail_DEBUG(); }
|
|
@ -1,327 +1,205 @@
|
|||
/*
|
||||
Copyright (C) 2010-2021 DeSmuME team
|
||||
/* Copyright (C) 2011 DeSmuME team
|
||||
|
||||
This file 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 file is part of DeSmuME
|
||||
|
||||
This file 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.
|
||||
DeSmuME 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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
DeSmuME 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 DeSmuME; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
// Games with NAND Flash:
|
||||
// Ore/WarioWare D.I.Y. - chip: SAMSUNG 004
|
||||
// KLC2811ANB-P204
|
||||
// NTR-UORE-0
|
||||
// - 128Mbit
|
||||
|
||||
#include "slot1comp_rom.h"
|
||||
#include "slot1comp_protocol.h"
|
||||
|
||||
#include "../slot1.h"
|
||||
#include "../registers.h"
|
||||
#include "../MMU.h"
|
||||
#include "../NDSSystem.h"
|
||||
#include "../emufile.h"
|
||||
|
||||
//quick architecture overview:
|
||||
//NAND receives GC bus commands from MMU.cpp
|
||||
//those are passed on to the protocol component for parsing
|
||||
//protocol calls back into NAND via ISlot1Comp_Protocol_Client interface for things the protocol doesn't know about (the contents of the rom, chiefly)
|
||||
//NAND utilizes the rom component for address logic and delivering data.
|
||||
//it also processes some commands itself which aren't rom-related (the NANDy stuff)
|
||||
static void info(char *info) { strcpy(info, "Slot1 Retail NAND card emulation"); }
|
||||
static void config(void) {}
|
||||
|
||||
class Slot1_Retail_NAND : public ISlot1Interface, public ISlot1Comp_Protocol_Client
|
||||
static BOOL init() { return (TRUE); }
|
||||
|
||||
static void reset() {}
|
||||
|
||||
static void close() {}
|
||||
|
||||
|
||||
static void write08(u8 PROCNUM, u32 adr, u8 val) {}
|
||||
static void write16(u8 PROCNUM, u32 adr, u16 val) {}
|
||||
|
||||
static void write32_GCROMCTRL(u8 PROCNUM, u32 val)
|
||||
{
|
||||
private:
|
||||
u32 subAdr;
|
||||
nds_dscard& card = MMU.dscard[PROCNUM];
|
||||
|
||||
Slot1Comp_Protocol protocol;
|
||||
Slot1Comp_Rom rom;
|
||||
|
||||
u32 mode;
|
||||
u32 handle_save;
|
||||
|
||||
//current NAND read/write start position
|
||||
//when this is changed, the read/write cursor will be reset to it
|
||||
//when it is set to the same value, the read/write cursor will NOT be reset
|
||||
//(this is since some value must necessarily come in on the protocol address, so the 'current save_start' is used as a special 'dont change' value
|
||||
u32 save_start;
|
||||
|
||||
//current NAND read/write cursor
|
||||
u32 save_adr;
|
||||
|
||||
public:
|
||||
virtual Slot1Info const* info()
|
||||
switch(card.command[0])
|
||||
{
|
||||
static Slot1InfoSimple info("Retail NAND","Slot1 retail NAND card emulation", 0x02);
|
||||
return &info;
|
||||
}
|
||||
case 0x00: //Data read
|
||||
case 0xB7:
|
||||
card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];
|
||||
card.transfer_count = 0x80;
|
||||
break;
|
||||
|
||||
virtual void connect()
|
||||
{
|
||||
protocol.reset(this);
|
||||
protocol.chipId = gameInfo.chipID;
|
||||
protocol.gameCode = T1ReadLong((u8*)gameInfo.header.gameCode,0);
|
||||
case 0xB8: // Chip ID
|
||||
card.address = 0;
|
||||
card.transfer_count = 1;
|
||||
break;
|
||||
|
||||
save_adr = 0;
|
||||
handle_save = 0;
|
||||
mode = 0;
|
||||
subAdr = T1ReadWord(gameInfo.header.reserved2, 0x6) << 17;
|
||||
}
|
||||
// Nand Init
|
||||
case 0x94:
|
||||
card.address = 0;
|
||||
card.transfer_count = 0x80;
|
||||
break;
|
||||
|
||||
virtual void write_command(u8 PROCNUM, GC_Command command)
|
||||
{
|
||||
protocol.write_command(command);
|
||||
}
|
||||
|
||||
virtual void write_GCDATAIN(u8 PROCNUM, u32 val)
|
||||
{
|
||||
protocol.write_GCDATAIN(PROCNUM, val);
|
||||
}
|
||||
virtual u32 read_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
return protocol.read_GCDATAIN(PROCNUM);
|
||||
}
|
||||
|
||||
virtual void slot1client_startOperation(eSlot1Operation theOperation)
|
||||
{
|
||||
//INFO("Start command: %02X%02X%02X%02X%02X%02X%02X%02X\t",
|
||||
// protocol.command.bytes[0], protocol.command.bytes[1], protocol.command.bytes[2], protocol.command.bytes[3],
|
||||
// protocol.command.bytes[4], protocol.command.bytes[5], protocol.command.bytes[6], protocol.command.bytes[7]);
|
||||
//INFO("FROM: %08X\n", NDS_ARM9.instruct_adr);
|
||||
|
||||
u32 addressFromProtocol = (protocol.command.bytes[1] << 24) | (protocol.command.bytes[2] << 16) | (protocol.command.bytes[3] << 8) | protocol.command.bytes[4];
|
||||
|
||||
//pass the normal rom operations along to the rom component
|
||||
switch (theOperation)
|
||||
{
|
||||
case eSlot1Operation_00_ReadHeader_Unencrypted:
|
||||
rom.start(theOperation, addressFromProtocol);
|
||||
return;
|
||||
|
||||
case eSlot1Operation_2x_SecureAreaLoad:
|
||||
rom.start(theOperation, protocol.address);
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//handle special commands ourselves
|
||||
int cmd = protocol.command.bytes[0];
|
||||
switch(cmd)
|
||||
{
|
||||
// Nand Init
|
||||
case 0x94:
|
||||
mode = cmd;
|
||||
break;
|
||||
|
||||
// Nand Error?
|
||||
case 0xD6:
|
||||
break;
|
||||
|
||||
//Nand Write Page
|
||||
case 0x81:
|
||||
mode = cmd;
|
||||
if(addressFromProtocol != save_start)
|
||||
{
|
||||
save_start = addressFromProtocol;
|
||||
save_adr = (addressFromProtocol & gameInfo.mask) - subAdr;
|
||||
}
|
||||
handle_save = 1;
|
||||
break;
|
||||
|
||||
case 0x84: //Write disable
|
||||
case 0x85: //Write enable
|
||||
mode = cmd;
|
||||
break;
|
||||
case 0x8B:
|
||||
mode = cmd;
|
||||
handle_save = 0;
|
||||
MMU_new.backupDevice.flushBackup();
|
||||
break;
|
||||
|
||||
//Start read mode
|
||||
case 0xB7:
|
||||
if (handle_save)
|
||||
{
|
||||
mode = cmd;
|
||||
if(addressFromProtocol != save_start)
|
||||
{
|
||||
save_start = addressFromProtocol;
|
||||
save_adr = (addressFromProtocol & gameInfo.mask) - subAdr;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rom.start(theOperation, addressFromProtocol);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xB2: //Set save position
|
||||
mode = cmd;
|
||||
save_start = addressFromProtocol;
|
||||
//cursor resets regardless of whether save_start changed, that's what makes this special.
|
||||
//the cursor could be reset to the beginning of the previous save_start region
|
||||
save_adr = (addressFromProtocol & gameInfo.mask) - subAdr;
|
||||
handle_save = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virtual u32 slot1client_read_GCDATAIN(eSlot1Operation operation)
|
||||
{
|
||||
//pass the normal rom operations along to the rom component
|
||||
switch(operation)
|
||||
{
|
||||
case eSlot1Operation_00_ReadHeader_Unencrypted:
|
||||
case eSlot1Operation_2x_SecureAreaLoad:
|
||||
//case eSlot1Operation_B7_Read:
|
||||
return rom.read();
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//handle special commands ourselves
|
||||
int cmd = protocol.command.bytes[0];
|
||||
int val = 0;
|
||||
switch(cmd)
|
||||
{
|
||||
// Nand Init?
|
||||
case 0x94:
|
||||
val = 0;
|
||||
mode = 0;
|
||||
break;
|
||||
|
||||
//Rom/Save Read
|
||||
case 0xB7:
|
||||
{
|
||||
if(handle_save)
|
||||
{
|
||||
MMU_new.backupDevice.ensure(save_adr+4, (u8)0);
|
||||
|
||||
val = MMU_new.backupDevice.readLong(save_adr, 0);
|
||||
|
||||
save_adr += 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
val = rom.read();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// Nand Status?
|
||||
case 0xD6:
|
||||
//0x80 == busy
|
||||
//0x40 == ??
|
||||
//0x20 == ready?
|
||||
//0x10 == write enabled?
|
||||
switch (mode)
|
||||
{
|
||||
case 0x84: //Write disable
|
||||
val = 0x20202020;
|
||||
break;
|
||||
case 0x85: //Write enable
|
||||
val = 0x20202020 | 0x10101010;
|
||||
break;
|
||||
case 0x8B:
|
||||
val = 0x60606060 | 0x10101010;
|
||||
break;
|
||||
case 0xB2: //Set save position
|
||||
val = 0x20202020;
|
||||
break;
|
||||
default:
|
||||
val = 0x60606060; //0x20 == ready
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Nand Error?
|
||||
case 0xD6:
|
||||
card.address = 0;
|
||||
card.transfer_count = 1;
|
||||
break;
|
||||
|
||||
return val;
|
||||
}
|
||||
// Nand Write? ---- PROGRAM for INTERNAL DATA MOVE/RANDOM DATA INPUT
|
||||
//case 0x8B:
|
||||
case 0x85:
|
||||
card.address = 0;
|
||||
card.transfer_count = 0x80;
|
||||
break;
|
||||
|
||||
virtual void slot1client_write_GCDATAIN(eSlot1Operation operation, u32 val)
|
||||
default:
|
||||
card.address = 0;
|
||||
card.transfer_count = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void write32(u8 PROCNUM, u32 adr, u32 val)
|
||||
{
|
||||
switch(adr)
|
||||
{
|
||||
//pass the normal rom operations along to the rom component
|
||||
switch(operation)
|
||||
{
|
||||
case eSlot1Operation_00_ReadHeader_Unencrypted:
|
||||
case eSlot1Operation_B7_Read:
|
||||
case eSlot1Operation_2x_SecureAreaLoad:
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//handle special commands ourselves
|
||||
int cmd = protocol.command.bytes[0];
|
||||
u32 value = val;
|
||||
u32 adr = save_adr;
|
||||
switch(cmd)
|
||||
{
|
||||
case 0x81: //Nand Write
|
||||
|
||||
MMU_new.backupDevice.ensure(adr+4, (u8)0);
|
||||
MMU_new.backupDevice.writeLong(adr, val);
|
||||
|
||||
save_adr += 4;
|
||||
break;
|
||||
}
|
||||
case REG_GCROMCTRL:
|
||||
write32_GCROMCTRL(PROCNUM, val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void post_fakeboot(int PROCNUM)
|
||||
static u8 read08(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFF;
|
||||
}
|
||||
static u16 read16(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
return 0xFFFF;
|
||||
}
|
||||
|
||||
static u32 read32_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
nds_dscard& card = MMU.dscard[PROCNUM];
|
||||
|
||||
switch(card.command[0])
|
||||
{
|
||||
// The BIOS leaves the card in NORMAL mode
|
||||
protocol.mode = eCardMode_NORMAL;
|
||||
}
|
||||
//Get ROM chip ID
|
||||
case 0x90:
|
||||
case 0xB8:
|
||||
{
|
||||
// Note: the BIOS stores the chip ID in main memory
|
||||
// Most games continuously compare the chip ID with
|
||||
// the value in memory, probably to know if the card
|
||||
// was removed.
|
||||
// As DeSmuME boots directly from the game, the chip
|
||||
// ID in main mem is zero and this value needs to be
|
||||
// zero too.
|
||||
|
||||
virtual void savestate(EMUFILE &os)
|
||||
//note that even if desmume was booting from firmware, and reading this chip ID to store in main memory,
|
||||
//this still works, since it will have read 00 originally and then read 00 to validate.
|
||||
|
||||
//staff of kings verifies this (it also uses the arm7 IRQ 20)
|
||||
if(nds.cardEjected) //TODO - handle this with ejected card slot1 device (and verify using this case)
|
||||
return 0xFFFFFFFF;
|
||||
else return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
// Data read
|
||||
case 0x00:
|
||||
case 0xB7:
|
||||
{
|
||||
// Make sure any reads below 0x8000 redirect to 0x8000+(adr&0x1FF) as on real cart
|
||||
if((card.command[0] == 0xB7) && (card.address < 0x8000))
|
||||
{
|
||||
//TODO - refactor this to include the PROCNUM, for debugging purposes if nothing else
|
||||
//(can refactor gbaslot also)
|
||||
|
||||
//INFO("Read below 0x8000 (0x%04X) from: ARM%s %08X\n",
|
||||
// card.address, (PROCNUM ? "7":"9"), (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr);
|
||||
|
||||
card.address = (0x8000 + (card.address&0x1FF));
|
||||
}
|
||||
|
||||
//it seems that etrian odyssey 3 doesnt work unless we mask this to cart size.
|
||||
//but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision
|
||||
//but there is no test case yet
|
||||
u32 address = card.address & (gameInfo.mask);
|
||||
|
||||
//as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms)
|
||||
//we need to protect ourselves by returning 0xFF for things still out of range
|
||||
if(address >= gameInfo.romsize)
|
||||
{
|
||||
DEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize);
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
return T1ReadLong(MMU.CART_ROM, address);
|
||||
}
|
||||
break;
|
||||
|
||||
// Nand Init?
|
||||
case 0x94:
|
||||
return 0; //Unsure what to return here so return 0 for now
|
||||
|
||||
// Nand Status?
|
||||
case 0xD6:
|
||||
//0x80 == busy
|
||||
// Made in Ore/WariWare D.I.Y. need set value to 0x80
|
||||
return 0x80; //0x20 == ready
|
||||
|
||||
default:
|
||||
return 0;
|
||||
} //switch(card.command[0])
|
||||
} //read32_GCDATAIN
|
||||
|
||||
static u32 read32(u8 PROCNUM, u32 adr)
|
||||
{
|
||||
switch(adr)
|
||||
{
|
||||
s32 version = 0;
|
||||
|
||||
protocol.savestate(os);
|
||||
rom.savestate(os);
|
||||
|
||||
os.write_32LE(version);
|
||||
|
||||
os.write_32LE(mode);
|
||||
os.write_32LE(handle_save);
|
||||
os.write_32LE(save_adr);
|
||||
os.write_32LE(save_start);
|
||||
os.write_32LE(subAdr);
|
||||
}
|
||||
|
||||
virtual void loadstate(EMUFILE &is)
|
||||
{
|
||||
s32 version = 0;
|
||||
|
||||
protocol.loadstate(is);
|
||||
rom.loadstate(is);
|
||||
|
||||
is.read_32LE(version);
|
||||
|
||||
// version 0
|
||||
if (version >= 0)
|
||||
{
|
||||
is.read_32LE(mode);
|
||||
is.read_32LE(handle_save);
|
||||
is.read_32LE(save_adr);
|
||||
is.read_32LE(save_start);
|
||||
is.read_32LE(subAdr);
|
||||
}
|
||||
case REG_GCDATAIN:
|
||||
return read32_GCDATAIN(PROCNUM);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SLOT1INTERFACE slot1Retail_NAND = {
|
||||
"Retail with NAND Flash",
|
||||
init,
|
||||
reset,
|
||||
close,
|
||||
config,
|
||||
write08,
|
||||
write16,
|
||||
write32,
|
||||
read08,
|
||||
read16,
|
||||
read32,
|
||||
info
|
||||
};
|
||||
|
||||
ISlot1Interface* construct_Slot1_Retail_NAND() { return new Slot1_Retail_NAND(); }
|
||||
|
||||
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2013-2017 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
//this file contains the components used for emulating standard gamecard "MC" devices (eeprom, fram, flash)
|
||||
//this is largely done by accessing the BackupDevice resources in the core emulator
|
||||
|
||||
#include "slot1comp_mc.h"
|
||||
|
||||
#include "../MMU.h"
|
||||
#include "../NDSSystem.h"
|
||||
|
||||
Slot1Comp_MC g_Slot1Comp_MC;
|
||||
|
||||
u8 Slot1Comp_MC::auxspi_transaction(int PROCNUM, u8 value)
|
||||
{
|
||||
return MMU_new.backupDevice.data_command(value, PROCNUM);
|
||||
}
|
||||
|
||||
void Slot1Comp_MC::auxspi_reset(int PROCNUM)
|
||||
{
|
||||
MMU_new.backupDevice.reset_command();
|
||||
}
|
||||
|
||||
void Slot1Comp_MC::connect()
|
||||
{
|
||||
//gamehack: not really a game hack
|
||||
if(gameInfo.IsCode("AXBJ"))
|
||||
MMU_new.backupDevice.uninitializedValue = 0x00; // Daigassou! Band Brothers DX (JP)
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2013-2015 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
//this file contains the components used for emulating standard gamecard "MC" devices (eeprom, fram, flash)
|
||||
|
||||
#ifndef _SLOT1COMP_MC_H
|
||||
#define _SLOT1COMP_MC_H
|
||||
|
||||
#include "../types.h"
|
||||
|
||||
class Slot1Comp_MC
|
||||
{
|
||||
public:
|
||||
u8 auxspi_transaction(int PROCNUM, u8 value);
|
||||
void auxspi_reset(int PROCNUM);
|
||||
void connect();
|
||||
};
|
||||
|
||||
extern Slot1Comp_MC g_Slot1Comp_MC;
|
||||
|
||||
#endif
|
|
@ -1,262 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2012-2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "slot1comp_protocol.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "../armcpu.h"
|
||||
#include "../encrypt.h"
|
||||
#include "../emufile.h"
|
||||
#include "../utils/decrypt/decrypt.h"
|
||||
|
||||
static _KEY1 key1((const u8*)arm7_key);
|
||||
|
||||
void Slot1Comp_Protocol::reset(ISlot1Comp_Protocol_Client* theClient)
|
||||
{
|
||||
this->client = theClient;
|
||||
|
||||
//we have to initialize this to something.. lets use dummy.
|
||||
//(need to clean this up...)
|
||||
memcpy(&command,"\x9F\0\0\0\0\0\0\0",8);
|
||||
operation = eSlot1Operation_9F_Dummy;
|
||||
|
||||
length = 0;
|
||||
delay = 0;
|
||||
mode = eCardMode_RAW;
|
||||
}
|
||||
|
||||
void Slot1Comp_Protocol::write_command_RAW(GC_Command theCommand)
|
||||
{
|
||||
int cmd = theCommand.bytes[0];
|
||||
if(cmd == 0x9F)
|
||||
{
|
||||
operation = eSlot1Operation_9F_Dummy;
|
||||
length = 0x2000;
|
||||
}
|
||||
if(cmd == 0x90)
|
||||
{
|
||||
operation = eSlot1Operation_90_ChipID;
|
||||
length = 4;
|
||||
//we handle this operation ourselves
|
||||
}
|
||||
if(cmd == 0x3C)
|
||||
{
|
||||
//switch to KEY1
|
||||
length = 0;
|
||||
mode = eCardMode_KEY1;
|
||||
|
||||
//defer initialization of KEY1 until we know we need it, just to save some CPU time.
|
||||
//TODO - some information about these parameters
|
||||
//level == 2
|
||||
//modulo == 8
|
||||
key1.init(gameCode, 2, 0x08);
|
||||
GCLOG("[GC] KEY1 ACTIVATED\n");
|
||||
}
|
||||
if(cmd == 0x00)
|
||||
{
|
||||
operation = eSlot1Operation_00_ReadHeader_Unencrypted;
|
||||
client->slot1client_startOperation(operation);
|
||||
}
|
||||
}
|
||||
|
||||
void Slot1Comp_Protocol::write_command_KEY1(GC_Command theCommand)
|
||||
{
|
||||
//decrypt the KEY1-format command
|
||||
u32 temp[2];
|
||||
theCommand.toCryptoBuffer(temp);
|
||||
key1.decrypt(temp);
|
||||
theCommand.fromCryptoBuffer(temp);
|
||||
GCLOG("[GC] (key1-decrypted):"); theCommand.print();
|
||||
|
||||
//and process it:
|
||||
int cmd = theCommand.bytes[0];
|
||||
switch(cmd&0xF0)
|
||||
{
|
||||
case 0x10:
|
||||
operation = eSlot1Operation_1x_ChipID;
|
||||
delay = 0x910, length = 4;
|
||||
//we handle this operation ourselves
|
||||
break;
|
||||
|
||||
case 0x20:
|
||||
operation = eSlot1Operation_2x_SecureAreaLoad;
|
||||
delay = 0x910, length = 0x11A8;
|
||||
|
||||
//TODO - more endian-safe way of doing this (theres examples in R4)
|
||||
{
|
||||
#ifdef MSB_FIRST
|
||||
u64 cmd64 = *(u64*)theCommand.bytes;
|
||||
#else
|
||||
u64 cmd64 = bswap64(*(u64*)theCommand.bytes);
|
||||
#endif
|
||||
//todo - parse into blocknumber
|
||||
u32 blocknumber = (cmd64>>44)&0xFFFF;
|
||||
if(blocknumber<4||blocknumber>7)
|
||||
printf("SLOT1 WARNING: INVALID BLOCKNUMBER FOR \"Get Secure Area Block\": 0x%04X\n",blocknumber);
|
||||
address = blocknumber*0x1000;
|
||||
}
|
||||
client->slot1client_startOperation(operation);
|
||||
break;
|
||||
|
||||
case 0x40:
|
||||
//switch to KEY2
|
||||
delay = 0x910, length = 0;
|
||||
//well.. not really... yet.
|
||||
GCLOG("[GC] KEY2 ACTIVATED\n");
|
||||
break;
|
||||
|
||||
case 0x60:
|
||||
//KEY2 disable? any info?
|
||||
break;
|
||||
|
||||
case 0xA0:
|
||||
delay = 0x910, length = 0;
|
||||
mode = eCardMode_NORMAL;
|
||||
GCLOG("[GC] NORMAL MODE ACTIVATED\n");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void Slot1Comp_Protocol::write_command_NORMAL(GC_Command theCommand)
|
||||
{
|
||||
switch(command.bytes[0])
|
||||
{
|
||||
case 0xB7:
|
||||
{
|
||||
operation = eSlot1Operation_B7_Read;
|
||||
|
||||
//TODO - more endian-safe way of doing this (theres examples in R4)
|
||||
#ifdef MSB_FIRST
|
||||
u64 cmd64 = *(u64*)theCommand.bytes;
|
||||
#else
|
||||
u64 cmd64 = bswap64(*(u64*)theCommand.bytes);
|
||||
#endif
|
||||
address = (u32)((cmd64 >> 24));
|
||||
length = 0x200;
|
||||
|
||||
client->slot1client_startOperation(operation);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xB8:
|
||||
operation = eSlot1Operation_B8_ChipID;
|
||||
delay = 0, length = 4;
|
||||
//we handle this operation ourselves
|
||||
break;
|
||||
|
||||
default:
|
||||
operation = eSlot1Operation_Unknown;
|
||||
client->slot1client_startOperation(operation);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Slot1Comp_Protocol::write_command(GC_Command theCommand)
|
||||
{
|
||||
this->command = theCommand;
|
||||
|
||||
//unrecognized commands will do something depending on the current state of the card
|
||||
delay = 0;
|
||||
length = 0;
|
||||
address = 0;
|
||||
|
||||
switch(mode)
|
||||
{
|
||||
case eCardMode_RAW:
|
||||
write_command_RAW(theCommand);
|
||||
break;
|
||||
|
||||
case eCardMode_KEY1:
|
||||
write_command_KEY1(theCommand);
|
||||
break;
|
||||
|
||||
case eCardMode_NORMAL:
|
||||
write_command_NORMAL(theCommand);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Slot1Comp_Protocol::write_GCDATAIN(u8 PROCNUM, u32 val)
|
||||
{
|
||||
switch(operation)
|
||||
{
|
||||
case eSlot1Operation_Unknown:
|
||||
client->slot1client_write_GCDATAIN(operation,val);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
u32 Slot1Comp_Protocol::read_GCDATAIN(u8 PROCNUM)
|
||||
{
|
||||
switch(operation)
|
||||
{
|
||||
default:
|
||||
return client->slot1client_read_GCDATAIN(operation);
|
||||
|
||||
case eSlot1Operation_9F_Dummy:
|
||||
return 0xFFFFFFFF;
|
||||
|
||||
case eSlot1Operation_1x_ChipID:
|
||||
return chipId;
|
||||
|
||||
case eSlot1Operation_90_ChipID:
|
||||
case eSlot1Operation_B8_ChipID:
|
||||
|
||||
//Most games continuously compare the current chipId with the value in
|
||||
//stored in memory at boot-up, probably to know if the card was removed.
|
||||
|
||||
//staff of kings verifies this (it also uses the arm7 IRQ 20 to detect card ejects)
|
||||
return chipId;
|
||||
}
|
||||
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
void Slot1Comp_Protocol::savestate(EMUFILE &os)
|
||||
{
|
||||
s32 version = 0;
|
||||
os.write_32LE(version);
|
||||
os.write_32LE((s32)mode);
|
||||
os.write_32LE((s32)operation);
|
||||
os.fwrite(command.bytes,8);
|
||||
os.write_32LE(address);
|
||||
os.write_32LE(length);
|
||||
os.write_32LE(delay);
|
||||
os.write_32LE(chipId);
|
||||
os.write_32LE(gameCode);
|
||||
}
|
||||
|
||||
void Slot1Comp_Protocol::loadstate(EMUFILE &is)
|
||||
{
|
||||
s32 version = is.read_s32LE();
|
||||
mode = (eCardMode)is.read_s32LE();
|
||||
operation = (eSlot1Operation)is.read_s32LE();
|
||||
is.fread(command.bytes,8);
|
||||
is.read_32LE(address);
|
||||
is.read_32LE(length);
|
||||
is.read_32LE(delay);
|
||||
is.read_32LE(chipId);
|
||||
is.read_32LE(gameCode);
|
||||
}
|
|
@ -1,114 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2013-2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
//this file contains the components used for emulating standard gamecard protocol.
|
||||
//this largely means the complex boot-up process.
|
||||
//i think there's no reason why proprietary cards couldn't speak any protocol they wish, as long as they didn't mind being unbootable.
|
||||
//TODO - could this be refactored into a base class? that's probably more reasonable. but we've gone with this modular mix-in architecture so... not yet.
|
||||
|
||||
#ifndef _SLOT1COMP_PROTOCOL_H
|
||||
#define _SLOT1COMP_PROTOCOL_H
|
||||
|
||||
#include "../types.h"
|
||||
#include "../MMU.h"
|
||||
|
||||
class EMUFILE;
|
||||
|
||||
enum eSlot1Operation
|
||||
{
|
||||
//----------
|
||||
//RAW mode operations
|
||||
//before encrypted communications can be established, some values from the rom header must be read.
|
||||
//this is the only way to read the header, actually, since the only reading commands available to games (after KEY2 mode is set) are
|
||||
eSlot1Operation_00_ReadHeader_Unencrypted,
|
||||
//it's not clear why this exists
|
||||
eSlot1Operation_9F_Dummy,
|
||||
eSlot1Operation_90_ChipID,
|
||||
//----------
|
||||
|
||||
//----------
|
||||
//KEY1 mode operations
|
||||
eSlot1Operation_1x_ChipID,
|
||||
eSlot1Operation_2x_SecureAreaLoad,
|
||||
//----------
|
||||
|
||||
//----------
|
||||
//NORMAL mode operations
|
||||
//the main rom data reading command
|
||||
eSlot1Operation_B7_Read,
|
||||
eSlot1Operation_B8_ChipID,
|
||||
//----------
|
||||
|
||||
eSlot1Operation_Unknown
|
||||
};
|
||||
|
||||
class ISlot1Comp_Protocol_Client
|
||||
{
|
||||
public:
|
||||
virtual void slot1client_startOperation(eSlot1Operation theOperation) {}
|
||||
virtual u32 slot1client_read_GCDATAIN(eSlot1Operation theOperation) = 0;
|
||||
virtual void slot1client_write_GCDATAIN(eSlot1Operation theOperation, u32 val) {}
|
||||
};
|
||||
|
||||
|
||||
class Slot1Comp_Protocol
|
||||
{
|
||||
public:
|
||||
|
||||
void savestate(EMUFILE &os);
|
||||
void loadstate(EMUFILE &is);
|
||||
|
||||
//set some kind of protocol/hardware reset state
|
||||
void reset(ISlot1Comp_Protocol_Client* theClient);
|
||||
|
||||
//signals from the GC bus
|
||||
void write_command(GC_Command theCommand);
|
||||
void write_GCDATAIN(u8 PROCNUM, u32 val);
|
||||
u32 read_GCDATAIN(u8 PROCNUM);
|
||||
|
||||
//helpers for write_command()
|
||||
void write_command_RAW(GC_Command theCommand);
|
||||
void write_command_KEY1(GC_Command theCommand);
|
||||
void write_command_NORMAL(GC_Command theCommand);
|
||||
|
||||
//operations not related to obscurities of the protocol or otherwise unknown are passed through to the client here
|
||||
ISlot1Comp_Protocol_Client* client;
|
||||
|
||||
//--state--
|
||||
|
||||
//the major operational mode. the protocol shifts modes and interprets commands into operations differently depending on the mode
|
||||
eCardMode mode;
|
||||
|
||||
//the current operational state
|
||||
eSlot1Operation operation;
|
||||
|
||||
//the command we're currently crunching on
|
||||
GC_Command command;
|
||||
|
||||
//most operations are defined in terms of returning a series of bytes
|
||||
//the meaning of these varies by operation. they are provided publicly as a service to clients
|
||||
u32 address;
|
||||
s32 length, delay; //the expected length and delay of this state
|
||||
|
||||
//chipId which should be returned by the various chipId commands
|
||||
u32 chipId;
|
||||
|
||||
//gameCode used by the protocol KEY1 crypto
|
||||
u32 gameCode;
|
||||
};
|
||||
|
||||
#endif //_SLOT1COMP_PROTOCOL_H
|
|
@ -1,123 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2010-2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "slot1comp_rom.h"
|
||||
|
||||
#include "../NDSSystem.h"
|
||||
#include "../emufile.h"
|
||||
|
||||
|
||||
void Slot1Comp_Rom::start(eSlot1Operation operation, u32 addr)
|
||||
{
|
||||
this->_operation = operation;
|
||||
this->_address = addr;
|
||||
}
|
||||
|
||||
u32 Slot1Comp_Rom::read()
|
||||
{
|
||||
switch(this->_operation)
|
||||
{
|
||||
case eSlot1Operation_00_ReadHeader_Unencrypted:
|
||||
{
|
||||
u32 ret = gameInfo.readROM(this->_address);
|
||||
this->_address = (this->_address + 4) & 0xFFF;
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
|
||||
case eSlot1Operation_2x_SecureAreaLoad:
|
||||
{
|
||||
//see B7 for details
|
||||
|
||||
//zero 15-sep-2014 - this is meaningless. newer mask is actually reasonable
|
||||
//address &= gameInfo.mask; //sanity check
|
||||
u32 secureAreaAddress = (this->_address - 0x4000);
|
||||
secureAreaAddress &= 0x3FFF; //memory safe sanity test
|
||||
u32 ret = LE_TO_LOCAL_32(*(u32*)(gameInfo.secureArea + secureAreaAddress));
|
||||
this->_address = (this->_address&~0xFFF) + ((this->_address+4)&0xFFF);
|
||||
return ret;
|
||||
}
|
||||
|
||||
case eSlot1Operation_B7_Read:
|
||||
{
|
||||
//TODO - check about non-4-byte aligned addresses
|
||||
|
||||
//it seems that etrian odyssey 3 doesnt work unless we mask this to cart size.
|
||||
//but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision
|
||||
//but there is no test case yet
|
||||
this->_address &= gameInfo.mask;
|
||||
|
||||
//feature of retail carts:
|
||||
//B7 "Can be used only for addresses 8000h and up, smaller addresses will be silently redirected to address `8000h+(addr AND 1FFh)`"
|
||||
if(CommonSettings.RetailCardProtection8000)
|
||||
if(this->_address < 0x8000)
|
||||
this->_address = (0x8000 + (this->_address & 0x1FF));
|
||||
|
||||
//1. as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms) we need to protect ourselves by returning 0xFF for things still out of range.
|
||||
//2. this isnt right, unless someone documents otherwise:
|
||||
//if (address > gameInfo.header.endROMoffset)
|
||||
// ... the cart hardware doesnt know anything about the rom header. if it has a totally bogus endROMoffset, the cart will probably work just fine. and, the +4 is missing anyway:
|
||||
//3. this is better: it just allows us to read 0xFF anywhere we dont have rom data. forget what the header says
|
||||
//note: we allow the reading to proceed anyway, because the readROM method is built to allow jaggedy reads off the end of the rom to support trimmed roms
|
||||
if(this->_address+4 > gameInfo.romsize)
|
||||
{
|
||||
DEBUG_Notify.ReadBeyondEndOfCart(this->_address,gameInfo.romsize);
|
||||
}
|
||||
|
||||
//actually read from the ROM provider
|
||||
u32 ret = gameInfo.readROM(this->_address);
|
||||
|
||||
//"However, the datastream wraps to the begin of the current 4K block when address+length crosses a 4K boundary (1000h bytes)"
|
||||
this->_address = (this->_address&~0xFFF) + ((this->_address+4)&0xFFF);
|
||||
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
|
||||
} //switch(operation)
|
||||
} //Slot1Comp_Rom::read()
|
||||
|
||||
u32 Slot1Comp_Rom::getAddress()
|
||||
{
|
||||
return this->_address & gameInfo.mask;
|
||||
} //Slot1Comp_Rom::getAddress()
|
||||
|
||||
u32 Slot1Comp_Rom::incAddress()
|
||||
{
|
||||
this->_address &= gameInfo.mask;
|
||||
this->_address = (this->_address&~0xFFF) + ((this->_address+4)&0xFFF);
|
||||
return this->_address;
|
||||
}
|
||||
|
||||
|
||||
void Slot1Comp_Rom::savestate(EMUFILE &os)
|
||||
{
|
||||
s32 version = 0;
|
||||
os.write_32LE(version);
|
||||
os.write_32LE((s32)this->_operation);
|
||||
os.write_32LE(this->_address);
|
||||
}
|
||||
|
||||
void Slot1Comp_Rom::loadstate(EMUFILE &is)
|
||||
{
|
||||
s32 version = is.read_s32LE();
|
||||
this->_operation = (eSlot1Operation)is.read_s32LE();
|
||||
this->_address = is.read_u32LE();
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2010-2021 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
//this file contains the components used for emulating standard gamecard ROMs
|
||||
//this is largely done by accessing the rom provided in the core emulator
|
||||
|
||||
#ifndef _SLOT1COMP_ROM_H
|
||||
#define _SLOT1COMP_ROM_H
|
||||
|
||||
#include "slot1comp_protocol.h"
|
||||
#include "../types.h"
|
||||
|
||||
class EMUFILE;
|
||||
|
||||
class Slot1Comp_Rom
|
||||
{
|
||||
public:
|
||||
void start(eSlot1Operation operation, u32 addr);
|
||||
u32 read();
|
||||
u32 getAddress();
|
||||
u32 incAddress();
|
||||
|
||||
void savestate(EMUFILE &os);
|
||||
void loadstate(EMUFILE &is);
|
||||
|
||||
private:
|
||||
u32 _address;
|
||||
eSlot1Operation _operation;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,72 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2013-2015 DeSmuME team
|
||||
|
||||
This file 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 file 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 the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "../slot2.h"
|
||||
|
||||
class Slot2_Auto : public ISlot2Interface
|
||||
{
|
||||
private:
|
||||
ISlot2Interface *mSelectedImplementation;
|
||||
|
||||
public:
|
||||
Slot2_Auto()
|
||||
: mSelectedImplementation(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
virtual Slot2Info const* info()
|
||||
{
|
||||
static Slot2InfoSimple info("Auto","Slot2 (auto-selection) device emulation", 0xFE);
|
||||
return &info;
|
||||
}
|
||||
|
||||
virtual void connect()
|
||||
{
|
||||
slot2_selected_type = slot2_DetermineType();
|
||||
mSelectedImplementation = slot2_List[slot2_selected_type];
|
||||
mSelectedImplementation->connect();
|
||||
printf("Slot2 auto-selected device type: %s (0x%02X)\n", mSelectedImplementation->info()->name(), mSelectedImplementation->info()->id());
|
||||
}
|
||||
|
||||
virtual void disconnect()
|
||||
{
|
||||
if(mSelectedImplementation) mSelectedImplementation->disconnect();
|
||||
mSelectedImplementation = NULL;
|
||||
}
|
||||
|
||||
virtual void writeByte(u8 PROCNUM, u32 addr, u8 val) { mSelectedImplementation->writeByte(PROCNUM, addr, val); }
|
||||
virtual void writeWord(u8 PROCNUM, u32 addr, u16 val) { mSelectedImplementation->writeWord(PROCNUM, addr, val); }
|
||||
virtual void writeLong(u8 PROCNUM, u32 addr, u32 val) { mSelectedImplementation->writeLong(PROCNUM, addr, val); }
|
||||
|
||||
virtual u8 readByte(u8 PROCNUM, u32 addr) { return mSelectedImplementation->readByte(PROCNUM, addr); }
|
||||
virtual u16 readWord(u8 PROCNUM, u32 addr) { return mSelectedImplementation->readWord(PROCNUM, addr); }
|
||||
virtual u32 readLong(u8 PROCNUM, u32 addr) { return mSelectedImplementation->readLong(PROCNUM, addr); }
|
||||
|
||||
virtual void savestate(EMUFILE &os)
|
||||
{
|
||||
mSelectedImplementation->savestate(os);
|
||||
}
|
||||
|
||||
virtual void loadstate(EMUFILE &is)
|
||||
{
|
||||
mSelectedImplementation->loadstate(is);
|
||||
}
|
||||
};
|
||||
|
||||
ISlot2Interface* construct_Slot2_Auto() { return new Slot2_Auto(); }
|
|
@ -1,24 +1,29 @@
|
|||
/*
|
||||
Copyright (C) 2009 CrazyMax
|
||||
Copyright (C) 2009-2017 DeSmuME team
|
||||
/* Copyright (C) 2009-2010 DeSmuME team
|
||||
|
||||
This file 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 file is part of DeSmuME
|
||||
|
||||
This file 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.
|
||||
DeSmuME 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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||
DeSmuME 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 DeSmuME; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "../slot2.h"
|
||||
#include "../emufile.h"
|
||||
#include "../addons.h"
|
||||
#include "../mem.h"
|
||||
#include <string.h>
|
||||
#include "../MMU.h"
|
||||
|
||||
u8 *expMemory = NULL;
|
||||
u32 expMemSize = 8 * 1024 * 1024; // 8Mb
|
||||
|
||||
#if 0
|
||||
#define EXPINFO(...) INFO(__VA_ARGS__)
|
||||
|
@ -26,7 +31,57 @@
|
|||
#define EXPINFO(...)
|
||||
#endif
|
||||
|
||||
#define EXPANSION_MEMORY_SIZE (8 * 1024 * 1024)
|
||||
static BOOL ExpMemory_init(void) { return (TRUE); }
|
||||
static void ExpMemory_reset(void)
|
||||
{
|
||||
if (expMemory)
|
||||
{
|
||||
delete [] expMemory;
|
||||
expMemory = NULL;
|
||||
}
|
||||
expMemory = new u8 [expMemSize];
|
||||
memset(expMemory, 0xFF, expMemSize);
|
||||
}
|
||||
static void ExpMemory_close(void)
|
||||
{
|
||||
if (expMemory)
|
||||
{
|
||||
delete [] expMemory;
|
||||
expMemory = NULL;
|
||||
}
|
||||
}
|
||||
static void ExpMemory_config(void) {}
|
||||
static void ExpMemory_write08(u32 procnum, u32 adr, u8 val)
|
||||
{
|
||||
if (adr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (adr - 0x09000000);
|
||||
if (offs >= expMemSize) return;
|
||||
T1WriteByte(expMemory, offs, val);
|
||||
}
|
||||
EXPINFO("ExpMemory: write 08 at 0x%08X = 0x%02X\n", adr, val);
|
||||
}
|
||||
static void ExpMemory_write16(u32 procnum, u32 adr, u16 val)
|
||||
{
|
||||
if (adr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (adr - 0x09000000);
|
||||
if (offs >= expMemSize) return;
|
||||
T1WriteWord(expMemory, offs, val);
|
||||
}
|
||||
EXPINFO("ExpMemory: write 16 at 0x%08X = 0x%04X\n", adr, val);
|
||||
}
|
||||
static void ExpMemory_write32(u32 procnum, u32 adr, u32 val)
|
||||
{
|
||||
|
||||
if (adr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (adr - 0x09000000);
|
||||
if (offs >= expMemSize) return;
|
||||
T1WriteLong(expMemory, offs, val);
|
||||
}
|
||||
EXPINFO("ExpMemory: write 32 at 0x%08X = 0x%08X\n", adr, val);
|
||||
}
|
||||
|
||||
static u8 header_0x00B0[] =
|
||||
{ 0xFF, 0xFF, 0x96, 0x00, //this 0x96 is strange. it can't be read from the pak when it boots, it must appear later
|
||||
|
@ -35,162 +90,67 @@ static u8 header_0x00B0[] =
|
|||
0xFF, 0xFF, 0xFF, 0x7F
|
||||
};
|
||||
|
||||
class Slot2_ExpansionPak : public ISlot2Interface
|
||||
static u8 ExpMemory_read08(u32 procnum, u32 adr)
|
||||
{
|
||||
private:
|
||||
u8 *expMemory;
|
||||
bool ext_ram_lock;
|
||||
public:
|
||||
EXPINFO("ExpMemory: read 08 at 0x%08X\n", adr);
|
||||
|
||||
Slot2_ExpansionPak()
|
||||
if(adr>=0x080000B0 && adr<0x080000C0)
|
||||
return T1ReadByte(header_0x00B0,adr-0x080000B0);
|
||||
|
||||
if (adr >= 0x09000000)
|
||||
{
|
||||
expMemory = NULL;
|
||||
ext_ram_lock = true;
|
||||
}
|
||||
|
||||
virtual Slot2Info const* info()
|
||||
{
|
||||
static Slot2InfoSimple info("Memory Expansion Pak", "Official RAM expansion for Opera browser", 0x05);
|
||||
return &info;
|
||||
u32 offs = (adr - 0x09000000);
|
||||
if (offs >= expMemSize) return (0xFF);
|
||||
return T1ReadByte(expMemory, offs);
|
||||
}
|
||||
|
||||
virtual void connect()
|
||||
return 0xFF;
|
||||
}
|
||||
static u16 ExpMemory_read16(u32 procnum, u32 adr)
|
||||
{
|
||||
if(adr>=0x080000B0 && adr<0x080000C0)
|
||||
return T1ReadWord(header_0x00B0,adr-0x080000B0);
|
||||
|
||||
if (adr == 0x0801FFFC) return 0x7FFF;
|
||||
if (adr == 0x08240002) return 0; //this can't be 0xFFFF. dunno why, we just guessed 0
|
||||
|
||||
if (adr >= 0x09000000)
|
||||
{
|
||||
if (expMemory == NULL)
|
||||
{
|
||||
expMemory = new u8[EXPANSION_MEMORY_SIZE];
|
||||
}
|
||||
memset(expMemory, 0xFF, EXPANSION_MEMORY_SIZE);
|
||||
ext_ram_lock = true;
|
||||
u32 offs = (adr - 0x09000000);
|
||||
if (offs >= expMemSize) return (0xFFFF);
|
||||
return T1ReadWord(expMemory, offs);
|
||||
}
|
||||
|
||||
virtual void disconnect()
|
||||
EXPINFO("ExpMemory: read 16 at 0x%08X\n", adr);
|
||||
return 0xFFFF;
|
||||
}
|
||||
static u32 ExpMemory_read32(u32 procnum, u32 adr)
|
||||
{
|
||||
if(adr>=0x080000B0 && adr<0x080000C0)
|
||||
return T1ReadLong(header_0x00B0,adr-0x080000B0);
|
||||
|
||||
if (adr >= 0x09000000)
|
||||
{
|
||||
delete[] expMemory;
|
||||
expMemory = NULL;
|
||||
u32 offs = (adr - 0x09000000);
|
||||
if (offs >= expMemSize) return 0xFFFFFFFF;
|
||||
return T1ReadLong(expMemory, offs);
|
||||
}
|
||||
|
||||
virtual void writeByte(u8 PROCNUM, u32 addr, u8 val)
|
||||
{
|
||||
if (ext_ram_lock) return;
|
||||
EXPINFO("ExpMemory: read 32 at 0x%08X\n", adr);
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
static void ExpMemory_info(char *info) { strcpy(info, "Memory Expansion Pak"); }
|
||||
|
||||
if (addr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (addr - 0x09000000);
|
||||
if (offs >= EXPANSION_MEMORY_SIZE) return;
|
||||
T1WriteByte(expMemory, offs, val);
|
||||
}
|
||||
EXPINFO("ExpMemory: write 08 at 0x%08X = 0x%02X\n", addr, val);
|
||||
}
|
||||
virtual void writeWord(u8 PROCNUM, u32 addr, u16 val)
|
||||
{
|
||||
if (addr == 0x08240000)
|
||||
{
|
||||
if (val == 0)
|
||||
ext_ram_lock = true;
|
||||
else
|
||||
if (val == 1)
|
||||
ext_ram_lock = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ext_ram_lock) return;
|
||||
|
||||
if (addr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (addr - 0x09000000);
|
||||
if (offs >= EXPANSION_MEMORY_SIZE) return;
|
||||
T1WriteWord(expMemory, offs, val);
|
||||
}
|
||||
EXPINFO("ExpMemory: write 16 at 0x%08X = 0x%04X\n", addr, val);
|
||||
}
|
||||
virtual void writeLong(u8 PROCNUM, u32 addr, u32 val)
|
||||
{
|
||||
if (ext_ram_lock) return;
|
||||
|
||||
if (addr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (addr - 0x09000000);
|
||||
if (offs >= EXPANSION_MEMORY_SIZE) return;
|
||||
T1WriteLong(expMemory, offs, val);
|
||||
}
|
||||
EXPINFO("ExpMemory: write 32 at 0x%08X = 0x%08X\n", addr, val);
|
||||
}
|
||||
|
||||
virtual u8 readByte(u8 PROCNUM, u32 addr)
|
||||
{
|
||||
EXPINFO("ExpMemory: read 08 at 0x%08X\n", addr);
|
||||
|
||||
if ((addr >= 0x080000B0) && (addr < 0x080000C0))
|
||||
return T1ReadByte(header_0x00B0, (addr - 0x080000B0));
|
||||
|
||||
if (addr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (addr - 0x09000000);
|
||||
if (offs >= EXPANSION_MEMORY_SIZE) return (0xFF);
|
||||
return T1ReadByte(expMemory, offs);
|
||||
}
|
||||
|
||||
return 0xFF;
|
||||
}
|
||||
virtual u16 readWord(u8 PROCNUM, u32 addr)
|
||||
{
|
||||
EXPINFO("ExpMemory: read 16 at 0x%08X\n", addr);
|
||||
|
||||
if ((addr >= 0x080000B0) && (addr < 0x080000C0))
|
||||
return T1ReadWord(header_0x00B0, (addr - 0x080000B0));
|
||||
|
||||
if (addr == 0x0801FFFC) return 0x7FFF;
|
||||
if (addr == 0x08240002) return 0; //this can't be 0xFFFF. dunno why, we just guessed 0
|
||||
|
||||
if (addr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (addr - 0x09000000);
|
||||
if (offs >= EXPANSION_MEMORY_SIZE) return (0xFFFF);
|
||||
return T1ReadWord(expMemory, offs);
|
||||
}
|
||||
|
||||
return 0xFFFF;
|
||||
}
|
||||
virtual u32 readLong(u8 PROCNUM, u32 addr)
|
||||
{
|
||||
EXPINFO("ExpMemory: read 32 at 0x%08X\n", addr);
|
||||
|
||||
if((addr >= 0x080000B0) && (addr < 0x080000C0))
|
||||
return T1ReadLong(header_0x00B0, (addr - 0x080000B0));
|
||||
|
||||
if (addr >= 0x09000000)
|
||||
{
|
||||
u32 offs = (addr - 0x09000000);
|
||||
if (offs >= EXPANSION_MEMORY_SIZE) return 0xFFFFFFFF;
|
||||
return T1ReadLong(expMemory, offs);
|
||||
}
|
||||
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
virtual void savestate(EMUFILE &os)
|
||||
{
|
||||
s32 version = 0;
|
||||
EMUFILE_MEMORY ram = EMUFILE_MEMORY(expMemory, EXPANSION_MEMORY_SIZE);
|
||||
os.write_32LE(version);
|
||||
os.write_bool32(ext_ram_lock);
|
||||
os.write_MemoryStream(ram);
|
||||
}
|
||||
|
||||
virtual void loadstate(EMUFILE &is)
|
||||
{
|
||||
EMUFILE_MEMORY ram = EMUFILE_MEMORY();
|
||||
|
||||
s32 version = is.read_s32LE();
|
||||
|
||||
if (version >= 0)
|
||||
{
|
||||
is.read_bool32(ext_ram_lock);
|
||||
is.read_MemoryStream(ram);
|
||||
memcpy(expMemory, ram.buf(), std::min(EXPANSION_MEMORY_SIZE, ram.size()));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ISlot2Interface* construct_Slot2_ExpansionPak() { return new Slot2_ExpansionPak(); }
|
||||
ADDONINTERFACE addonExpMemory = {
|
||||
"Memory Expansion Pak",
|
||||
ExpMemory_init,
|
||||
ExpMemory_reset,
|
||||
ExpMemory_close,
|
||||
ExpMemory_config,
|
||||
ExpMemory_write08,
|
||||
ExpMemory_write16,
|
||||
ExpMemory_write32,
|
||||
ExpMemory_read08,
|
||||
ExpMemory_read16,
|
||||
ExpMemory_read32,
|
||||
ExpMemory_info};
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue