gemba 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/THIRD_PARTY_NOTICES +37 -2
- data/assets/placeholder_boxart.png +0 -0
- data/bin/gemba +2 -2
- data/ext/gemba/extconf.rb +23 -1
- data/ext/gemba/gemba_ext.c +436 -2
- data/ext/gemba/gemba_ext.h +2 -0
- data/gemba.gemspec +5 -3
- data/lib/gemba/achievements/achievement.rb +23 -0
- data/lib/gemba/achievements/backend.rb +186 -0
- data/lib/gemba/achievements/cache.rb +70 -0
- data/lib/gemba/achievements/credentials_presenter.rb +142 -0
- data/lib/gemba/achievements/fake_backend.rb +205 -0
- data/lib/gemba/achievements/null_backend.rb +11 -0
- data/lib/gemba/achievements/offline_backend.rb +168 -0
- data/lib/gemba/achievements/retro_achievements/backend.rb +453 -0
- data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
- data/lib/gemba/achievements/retro_achievements/ping_worker.rb +27 -0
- data/lib/gemba/achievements.rb +19 -0
- data/lib/gemba/achievements_window.rb +556 -0
- data/lib/gemba/app_controller.rb +1015 -0
- data/lib/gemba/bios.rb +54 -0
- data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
- data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
- data/lib/gemba/boxart_fetcher.rb +79 -0
- data/lib/gemba/bus_emitter.rb +13 -0
- data/lib/gemba/child_window.rb +24 -1
- data/lib/gemba/cli/commands/config_cmd.rb +83 -0
- data/lib/gemba/cli/commands/decode.rb +154 -0
- data/lib/gemba/cli/commands/patch.rb +78 -0
- data/lib/gemba/cli/commands/play.rb +78 -0
- data/lib/gemba/cli/commands/record.rb +114 -0
- data/lib/gemba/cli/commands/replay.rb +161 -0
- data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
- data/lib/gemba/cli/commands/version.rb +22 -0
- data/lib/gemba/cli.rb +52 -364
- data/lib/gemba/config.rb +134 -1
- data/lib/gemba/data/gb_games.json +1 -0
- data/lib/gemba/data/gb_md5.json +1 -0
- data/lib/gemba/data/gba_games.json +1 -0
- data/lib/gemba/data/gba_md5.json +1 -0
- data/lib/gemba/data/gbc_games.json +1 -0
- data/lib/gemba/data/gbc_md5.json +1 -0
- data/lib/gemba/emulator_frame.rb +1060 -0
- data/lib/gemba/event_bus.rb +48 -0
- data/lib/gemba/frame_stack.rb +60 -0
- data/lib/gemba/game_index.rb +84 -0
- data/lib/gemba/game_picker_frame.rb +268 -0
- data/lib/gemba/gamepad_map.rb +103 -0
- data/lib/gemba/headless.rb +6 -5
- data/lib/gemba/headless_player.rb +33 -3
- data/lib/gemba/help_window.rb +61 -0
- data/lib/gemba/hotkey_map.rb +3 -1
- data/lib/gemba/input_recorder.rb +107 -0
- data/lib/gemba/input_replayer.rb +119 -0
- data/lib/gemba/keyboard_map.rb +90 -0
- data/lib/gemba/locales/en.yml +97 -5
- data/lib/gemba/locales/ja.yml +97 -5
- data/lib/gemba/main_window.rb +56 -0
- data/lib/gemba/modal_stack.rb +81 -0
- data/lib/gemba/patcher_window.rb +223 -0
- data/lib/gemba/platform/gb.rb +21 -0
- data/lib/gemba/platform/gba.rb +21 -0
- data/lib/gemba/platform/gbc.rb +23 -0
- data/lib/gemba/platform.rb +20 -0
- data/lib/gemba/platform_open.rb +19 -0
- data/lib/gemba/recorder.rb +4 -3
- data/lib/gemba/replay_player.rb +691 -0
- data/lib/gemba/rom_info.rb +57 -0
- data/lib/gemba/rom_info_window.rb +16 -3
- data/lib/gemba/rom_library.rb +106 -0
- data/lib/gemba/rom_overrides.rb +47 -0
- data/lib/gemba/rom_patcher/bps.rb +161 -0
- data/lib/gemba/rom_patcher/ips.rb +101 -0
- data/lib/gemba/rom_patcher/ups.rb +118 -0
- data/lib/gemba/rom_patcher.rb +109 -0
- data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
- data/lib/gemba/runtime.rb +59 -26
- data/lib/gemba/save_state_manager.rb +4 -7
- data/lib/gemba/save_state_picker.rb +17 -4
- data/lib/gemba/session_logger.rb +64 -0
- data/lib/gemba/settings/audio_tab.rb +77 -0
- data/lib/gemba/settings/gamepad_tab.rb +351 -0
- data/lib/gemba/settings/hotkeys_tab.rb +259 -0
- data/lib/gemba/settings/paths.rb +11 -0
- data/lib/gemba/settings/recording_tab.rb +83 -0
- data/lib/gemba/settings/save_states_tab.rb +91 -0
- data/lib/gemba/settings/system_tab.rb +362 -0
- data/lib/gemba/settings/video_tab.rb +318 -0
- data/lib/gemba/settings_window.rb +162 -1036
- data/lib/gemba/version.rb +1 -1
- data/lib/gemba/virtual_keyboard.rb +19 -0
- data/lib/gemba.rb +2 -12
- data/test/achievements_window/test_bulk_sync.rb +218 -0
- data/test/achievements_window/test_bus_events.rb +125 -0
- data/test/achievements_window/test_close_confirmation.rb +201 -0
- data/test/achievements_window/test_initial_state.rb +164 -0
- data/test/achievements_window/test_sorting.rb +227 -0
- data/test/achievements_window/test_tree_rendering.rb +133 -0
- data/test/fixtures/fake_bios.bin +0 -0
- data/test/fixtures/pong.gba +0 -0
- data/test/fixtures/test.gb +0 -0
- data/test/fixtures/test.gbc +0 -0
- data/test/fixtures/test_quicksave.ss +0 -0
- data/test/screenshots/no_focus.png +0 -0
- data/test/shared/teek_test_worker.rb +17 -1
- data/test/shared/tk_test_helper.rb +91 -4
- data/test/support/achievements_window_helpers.rb +18 -0
- data/test/support/fake_core.rb +25 -0
- data/test/support/fake_ra_runtime.rb +74 -0
- data/test/support/fake_requester.rb +68 -0
- data/test/support/player_helpers.rb +20 -5
- data/test/test_achievement.rb +32 -0
- data/test/{test_player.rb → test_app_controller.rb} +353 -85
- data/test/test_bios.rb +123 -0
- data/test/test_boxart_fetcher.rb +150 -0
- data/test/test_cli.rb +17 -265
- data/test/test_cli_config.rb +64 -0
- data/test/test_cli_decode.rb +97 -0
- data/test/test_cli_patch.rb +58 -0
- data/test/test_cli_play.rb +213 -0
- data/test/test_cli_ra.rb +175 -0
- data/test/test_cli_record.rb +69 -0
- data/test/test_cli_replay.rb +72 -0
- data/test/test_cli_sync_requester.rb +152 -0
- data/test/test_cli_version.rb +27 -0
- data/test/test_config.rb +2 -3
- data/test/test_config_ra.rb +69 -0
- data/test/test_core.rb +62 -1
- data/test/test_credentials_presenter.rb +192 -0
- data/test/test_event_bus.rb +100 -0
- data/test/test_fake_backend_achievements.rb +130 -0
- data/test/test_fake_backend_auth.rb +68 -0
- data/test/test_game_index.rb +77 -0
- data/test/test_game_picker_frame.rb +310 -0
- data/test/test_gamepad_map.rb +1 -3
- data/test/test_headless_player.rb +17 -3
- data/test/test_help_window.rb +82 -0
- data/test/test_hotkey_map.rb +22 -1
- data/test/test_input_recorder.rb +179 -0
- data/test/test_input_replay_determinism.rb +113 -0
- data/test/test_input_replayer.rb +162 -0
- data/test/test_keyboard_map.rb +1 -3
- data/test/test_libretro_backend.rb +41 -0
- data/test/test_locale.rb +1 -1
- data/test/test_logging.rb +123 -0
- data/test/test_null_backend.rb +42 -0
- data/test/test_offline_backend.rb +116 -0
- data/test/test_overlay_renderer.rb +1 -1
- data/test/test_platform.rb +149 -0
- data/test/test_ra_backend.rb +313 -0
- data/test/test_ra_backend_unlock_gate.rb +56 -0
- data/test/test_recorder.rb +0 -3
- data/test/test_replay_player.rb +316 -0
- data/test/test_rom_info.rb +149 -0
- data/test/test_rom_overrides.rb +86 -0
- data/test/test_rom_patcher.rb +382 -0
- data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
- data/test/test_save_state_manager.rb +2 -4
- data/test/test_settings_audio.rb +107 -0
- data/test/test_settings_hotkeys.rb +83 -66
- data/test/test_settings_recording.rb +49 -0
- data/test/test_settings_save_states.rb +97 -0
- data/test/test_settings_system.rb +133 -0
- data/test/test_settings_video.rb +450 -0
- data/test/test_settings_window.rb +76 -507
- data/test/test_tip_service.rb +6 -6
- data/test/test_toast_overlay.rb +1 -1
- data/test/test_virtual_events.rb +156 -0
- data/test/test_virtual_keyboard.rb +1 -1
- data/vendor/rcheevos/CHANGELOG.md +495 -0
- data/vendor/rcheevos/LICENSE +21 -0
- data/vendor/rcheevos/Package.swift +33 -0
- data/vendor/rcheevos/README.md +67 -0
- data/vendor/rcheevos/include/module.modulemap +70 -0
- data/vendor/rcheevos/include/rc_api_editor.h +296 -0
- data/vendor/rcheevos/include/rc_api_info.h +280 -0
- data/vendor/rcheevos/include/rc_api_request.h +77 -0
- data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
- data/vendor/rcheevos/include/rc_api_user.h +262 -0
- data/vendor/rcheevos/include/rc_client.h +877 -0
- data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
- data/vendor/rcheevos/include/rc_consoles.h +138 -0
- data/vendor/rcheevos/include/rc_error.h +59 -0
- data/vendor/rcheevos/include/rc_export.h +100 -0
- data/vendor/rcheevos/include/rc_hash.h +200 -0
- data/vendor/rcheevos/include/rc_runtime.h +148 -0
- data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
- data/vendor/rcheevos/include/rc_util.h +51 -0
- data/vendor/rcheevos/include/rcheevos.h +8 -0
- data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
- data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
- data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
- data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
- data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
- data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
- data/vendor/rcheevos/src/rc_client.c +6941 -0
- data/vendor/rcheevos/src/rc_client_external.c +281 -0
- data/vendor/rcheevos/src/rc_client_external.h +177 -0
- data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
- data/vendor/rcheevos/src/rc_client_internal.h +409 -0
- data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
- data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
- data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
- data/vendor/rcheevos/src/rc_compat.c +251 -0
- data/vendor/rcheevos/src/rc_compat.h +121 -0
- data/vendor/rcheevos/src/rc_libretro.c +915 -0
- data/vendor/rcheevos/src/rc_libretro.h +98 -0
- data/vendor/rcheevos/src/rc_util.c +199 -0
- data/vendor/rcheevos/src/rc_version.c +11 -0
- data/vendor/rcheevos/src/rc_version.h +32 -0
- data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
- data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
- data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
- data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
- data/vendor/rcheevos/src/rcheevos/format.c +330 -0
- data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
- data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
- data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
- data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
- data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
- data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
- data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
- data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
- data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
- data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
- data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
- data/vendor/rcheevos/src/rcheevos/value.c +935 -0
- data/vendor/rcheevos/src/rhash/aes.c +480 -0
- data/vendor/rcheevos/src/rhash/aes.h +49 -0
- data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
- data/vendor/rcheevos/src/rhash/hash.c +1402 -0
- data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
- data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
- data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
- data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
- data/vendor/rcheevos/src/rhash/md5.c +382 -0
- data/vendor/rcheevos/src/rhash/md5.h +91 -0
- data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
- data/vendor/rcheevos/test/libretro.h +205 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
- data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
- data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
- data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
- data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
- data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
- data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
- data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
- data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
- data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
- data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
- data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
- data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
- data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
- data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
- data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
- data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
- data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
- data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
- data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
- data/vendor/rcheevos/test/rhash/data.c +657 -0
- data/vendor/rcheevos/test/rhash/data.h +32 -0
- data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
- data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
- data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
- data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
- data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
- data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
- data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
- data/vendor/rcheevos/test/test.c +113 -0
- data/vendor/rcheevos/test/test_framework.h +205 -0
- data/vendor/rcheevos/test/test_rc_client.c +10509 -0
- data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
- data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
- data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
- data/vendor/rcheevos/test/test_types.natvis +9 -0
- data/vendor/rcheevos/validator/validator.c +658 -0
- data/vendor/rcheevos/validator/validator.vcxproj +152 -0
- data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
- metadata +274 -11
- data/lib/gemba/input_mappings.rb +0 -214
- data/lib/gemba/player.rb +0 -1525
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provides copies of structures and constants from
|
|
3
|
+
* https://github.com/libretro/RetroArch/blob/master/libretro-common/include/libretro.h
|
|
4
|
+
* for unit testing without pulling in the entire libretro project.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#ifndef LIBRETRO_H__
|
|
8
|
+
#define LIBRETRO_H__
|
|
9
|
+
|
|
10
|
+
#include <stdint.h>
|
|
11
|
+
#include <stddef.h>
|
|
12
|
+
#include <stdlib.h>
|
|
13
|
+
#include <limits.h>
|
|
14
|
+
|
|
15
|
+
#ifdef __cplusplus
|
|
16
|
+
extern "C" {
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
/* Regular save RAM. This RAM is usually found on a game cartridge,
|
|
20
|
+
* backed up by a battery.
|
|
21
|
+
* If save game data is too complex for a single memory buffer,
|
|
22
|
+
* the SAVE_DIRECTORY (preferably) or SYSTEM_DIRECTORY environment
|
|
23
|
+
* callback can be used. */
|
|
24
|
+
#define RETRO_MEMORY_SAVE_RAM 0
|
|
25
|
+
|
|
26
|
+
/* Some games have a built-in clock to keep track of time.
|
|
27
|
+
* This memory is usually just a couple of bytes to keep track of time.
|
|
28
|
+
*/
|
|
29
|
+
#define RETRO_MEMORY_RTC 1
|
|
30
|
+
|
|
31
|
+
/* System ram lets a frontend peek into a game systems main RAM. */
|
|
32
|
+
#define RETRO_MEMORY_SYSTEM_RAM 2
|
|
33
|
+
|
|
34
|
+
/* Video ram lets a frontend peek into a game systems video RAM (VRAM). */
|
|
35
|
+
#define RETRO_MEMORY_VIDEO_RAM 3
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#define RETRO_MEMDESC_CONST (1 << 0) /* The frontend will never change this memory area once retro_load_game has returned. */
|
|
39
|
+
#define RETRO_MEMDESC_BIGENDIAN (1 << 1) /* The memory area contains big endian data. Default is little endian. */
|
|
40
|
+
#define RETRO_MEMDESC_SYSTEM_RAM (1 << 2) /* The memory area is system RAM. This is main RAM of the gaming system. */
|
|
41
|
+
#define RETRO_MEMDESC_SAVE_RAM (1 << 3) /* The memory area is save RAM. This RAM is usually found on a game cartridge, backed up by a battery. */
|
|
42
|
+
#define RETRO_MEMDESC_VIDEO_RAM (1 << 4) /* The memory area is video RAM (VRAM) */
|
|
43
|
+
#define RETRO_MEMDESC_ALIGN_2 (1 << 16) /* All memory access in this area is aligned to their own size, or 2, whichever is smaller. */
|
|
44
|
+
#define RETRO_MEMDESC_ALIGN_4 (2 << 16)
|
|
45
|
+
#define RETRO_MEMDESC_ALIGN_8 (3 << 16)
|
|
46
|
+
#define RETRO_MEMDESC_MINSIZE_2 (1 << 24) /* All memory in this region is accessed at least 2 bytes at the time. */
|
|
47
|
+
#define RETRO_MEMDESC_MINSIZE_4 (2 << 24)
|
|
48
|
+
#define RETRO_MEMDESC_MINSIZE_8 (3 << 24)
|
|
49
|
+
struct retro_memory_descriptor
|
|
50
|
+
{
|
|
51
|
+
uint64_t flags;
|
|
52
|
+
|
|
53
|
+
/* Pointer to the start of the relevant ROM or RAM chip.
|
|
54
|
+
* It's strongly recommended to use 'offset' if possible, rather than
|
|
55
|
+
* doing math on the pointer.
|
|
56
|
+
*
|
|
57
|
+
* If the same byte is mapped my multiple descriptors, their descriptors
|
|
58
|
+
* must have the same pointer.
|
|
59
|
+
* If 'start' does not point to the first byte in the pointer, put the
|
|
60
|
+
* difference in 'offset' instead.
|
|
61
|
+
*
|
|
62
|
+
* May be NULL if there's nothing usable here (e.g. hardware registers and
|
|
63
|
+
* open bus). No flags should be set if the pointer is NULL.
|
|
64
|
+
* It's recommended to minimize the number of descriptors if possible,
|
|
65
|
+
* but not mandatory. */
|
|
66
|
+
void *ptr;
|
|
67
|
+
size_t offset;
|
|
68
|
+
|
|
69
|
+
/* This is the location in the emulated address space
|
|
70
|
+
* where the mapping starts. */
|
|
71
|
+
size_t start;
|
|
72
|
+
|
|
73
|
+
/* Which bits must be same as in 'start' for this mapping to apply.
|
|
74
|
+
* The first memory descriptor to claim a certain byte is the one
|
|
75
|
+
* that applies.
|
|
76
|
+
* A bit which is set in 'start' must also be set in this.
|
|
77
|
+
* Can be zero, in which case each byte is assumed mapped exactly once.
|
|
78
|
+
* In this case, 'len' must be a power of two. */
|
|
79
|
+
size_t select;
|
|
80
|
+
|
|
81
|
+
/* If this is nonzero, the set bits are assumed not connected to the
|
|
82
|
+
* memory chip's address pins. */
|
|
83
|
+
size_t disconnect;
|
|
84
|
+
|
|
85
|
+
/* This one tells the size of the current memory area.
|
|
86
|
+
* If, after start+disconnect are applied, the address is higher than
|
|
87
|
+
* this, the highest bit of the address is cleared.
|
|
88
|
+
*
|
|
89
|
+
* If the address is still too high, the next highest bit is cleared.
|
|
90
|
+
* Can be zero, in which case it's assumed to be infinite (as limited
|
|
91
|
+
* by 'select' and 'disconnect'). */
|
|
92
|
+
size_t len;
|
|
93
|
+
|
|
94
|
+
/* To go from emulated address to physical address, the following
|
|
95
|
+
* order applies:
|
|
96
|
+
* Subtract 'start', pick off 'disconnect', apply 'len', add 'offset'. */
|
|
97
|
+
|
|
98
|
+
/* The address space name must consist of only a-zA-Z0-9_-,
|
|
99
|
+
* should be as short as feasible (maximum length is 8 plus the NUL),
|
|
100
|
+
* and may not be any other address space plus one or more 0-9A-F
|
|
101
|
+
* at the end.
|
|
102
|
+
* However, multiple memory descriptors for the same address space is
|
|
103
|
+
* allowed, and the address space name can be empty. NULL is treated
|
|
104
|
+
* as empty.
|
|
105
|
+
*
|
|
106
|
+
* Address space names are case sensitive, but avoid lowercase if possible.
|
|
107
|
+
* The same pointer may exist in multiple address spaces.
|
|
108
|
+
*
|
|
109
|
+
* Examples:
|
|
110
|
+
* blank+blank - valid (multiple things may be mapped in the same namespace)
|
|
111
|
+
* 'Sp'+'Sp' - valid (multiple things may be mapped in the same namespace)
|
|
112
|
+
* 'A'+'B' - valid (neither is a prefix of each other)
|
|
113
|
+
* 'S'+blank - valid ('S' is not in 0-9A-F)
|
|
114
|
+
* 'a'+blank - valid ('a' is not in 0-9A-F)
|
|
115
|
+
* 'a'+'A' - valid (neither is a prefix of each other)
|
|
116
|
+
* 'AR'+blank - valid ('R' is not in 0-9A-F)
|
|
117
|
+
* 'ARB'+blank - valid (the B can't be part of the address either, because
|
|
118
|
+
* there is no namespace 'AR')
|
|
119
|
+
* blank+'B' - not valid, because it's ambigous which address space B1234
|
|
120
|
+
* would refer to.
|
|
121
|
+
* The length can't be used for that purpose; the frontend may want
|
|
122
|
+
* to append arbitrary data to an address, without a separator. */
|
|
123
|
+
const char *addrspace;
|
|
124
|
+
|
|
125
|
+
/* TODO: When finalizing this one, add a description field, which should be
|
|
126
|
+
* "WRAM" or something roughly equally long. */
|
|
127
|
+
|
|
128
|
+
/* TODO: When finalizing this one, replace 'select' with 'limit', which tells
|
|
129
|
+
* which bits can vary and still refer to the same address (limit = ~select).
|
|
130
|
+
* TODO: limit? range? vary? something else? */
|
|
131
|
+
|
|
132
|
+
/* TODO: When finalizing this one, if 'len' is above what 'select' (or
|
|
133
|
+
* 'limit') allows, it's bankswitched. Bankswitched data must have both 'len'
|
|
134
|
+
* and 'select' != 0, and the mappings don't tell how the system switches the
|
|
135
|
+
* banks. */
|
|
136
|
+
|
|
137
|
+
/* TODO: When finalizing this one, fix the 'len' bit removal order.
|
|
138
|
+
* For len=0x1800, pointer 0x1C00 should go to 0x1400, not 0x0C00.
|
|
139
|
+
* Algorithm: Take bits highest to lowest, but if it goes above len, clear
|
|
140
|
+
* the most recent addition and continue on the next bit.
|
|
141
|
+
* TODO: Can the above be optimized? Is "remove the lowest bit set in both
|
|
142
|
+
* pointer and 'len'" equivalent? */
|
|
143
|
+
|
|
144
|
+
/* TODO: Some emulators (MAME?) emulate big endian systems by only accessing
|
|
145
|
+
* the emulated memory in 32-bit chunks, native endian. But that's nothing
|
|
146
|
+
* compared to Darek Mihocka <http://www.emulators.com/docs/nx07_vm101.htm>
|
|
147
|
+
* (section Emulation 103 - Nearly Free Byte Reversal) - he flips the ENTIRE
|
|
148
|
+
* RAM backwards! I'll want to represent both of those, via some flags.
|
|
149
|
+
*
|
|
150
|
+
* I suspect MAME either didn't think of that idea, or don't want the #ifdef.
|
|
151
|
+
* Not sure which, nor do I really care. */
|
|
152
|
+
|
|
153
|
+
/* TODO: Some of those flags are unused and/or don't really make sense. Clean
|
|
154
|
+
* them up. */
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/* The frontend may use the largest value of 'start'+'select' in a
|
|
158
|
+
* certain namespace to infer the size of the address space.
|
|
159
|
+
*
|
|
160
|
+
* If the address space is larger than that, a mapping with .ptr=NULL
|
|
161
|
+
* should be at the end of the array, with .select set to all ones for
|
|
162
|
+
* as long as the address space is big.
|
|
163
|
+
*
|
|
164
|
+
* Sample descriptors (minus .ptr, and RETRO_MEMFLAG_ on the flags):
|
|
165
|
+
* SNES WRAM:
|
|
166
|
+
* .start=0x7E0000, .len=0x20000
|
|
167
|
+
* (Note that this must be mapped before the ROM in most cases; some of the
|
|
168
|
+
* ROM mappers
|
|
169
|
+
* try to claim $7E0000, or at least $7E8000.)
|
|
170
|
+
* SNES SPC700 RAM:
|
|
171
|
+
* .addrspace="S", .len=0x10000
|
|
172
|
+
* SNES WRAM mirrors:
|
|
173
|
+
* .flags=MIRROR, .start=0x000000, .select=0xC0E000, .len=0x2000
|
|
174
|
+
* .flags=MIRROR, .start=0x800000, .select=0xC0E000, .len=0x2000
|
|
175
|
+
* SNES WRAM mirrors, alternate equivalent descriptor:
|
|
176
|
+
* .flags=MIRROR, .select=0x40E000, .disconnect=~0x1FFF
|
|
177
|
+
* (Various similar constructions can be created by combining parts of
|
|
178
|
+
* the above two.)
|
|
179
|
+
* SNES LoROM (512KB, mirrored a couple of times):
|
|
180
|
+
* .flags=CONST, .start=0x008000, .select=0x408000, .disconnect=0x8000, .len=512*1024
|
|
181
|
+
* .flags=CONST, .start=0x400000, .select=0x400000, .disconnect=0x8000, .len=512*1024
|
|
182
|
+
* SNES HiROM (4MB):
|
|
183
|
+
* .flags=CONST, .start=0x400000, .select=0x400000, .len=4*1024*1024
|
|
184
|
+
* .flags=CONST, .offset=0x8000, .start=0x008000, .select=0x408000, .len=4*1024*1024
|
|
185
|
+
* SNES ExHiROM (8MB):
|
|
186
|
+
* .flags=CONST, .offset=0, .start=0xC00000, .select=0xC00000, .len=4*1024*1024
|
|
187
|
+
* .flags=CONST, .offset=4*1024*1024, .start=0x400000, .select=0xC00000, .len=4*1024*1024
|
|
188
|
+
* .flags=CONST, .offset=0x8000, .start=0x808000, .select=0xC08000, .len=4*1024*1024
|
|
189
|
+
* .flags=CONST, .offset=4*1024*1024+0x8000, .start=0x008000, .select=0xC08000, .len=4*1024*1024
|
|
190
|
+
* Clarify the size of the address space:
|
|
191
|
+
* .ptr=NULL, .select=0xFFFFFF
|
|
192
|
+
* .len can be implied by .select in many of them, but was included for clarity.
|
|
193
|
+
*/
|
|
194
|
+
|
|
195
|
+
struct retro_memory_map
|
|
196
|
+
{
|
|
197
|
+
const struct retro_memory_descriptor *descriptors;
|
|
198
|
+
unsigned num_descriptors;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
#ifdef __cplusplus
|
|
202
|
+
}
|
|
203
|
+
#endif
|
|
204
|
+
|
|
205
|
+
#endif
|