gemba 0.1.0 → 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.
Files changed (285) hide show
  1. checksums.yaml +4 -4
  2. data/THIRD_PARTY_NOTICES +37 -2
  3. data/assets/placeholder_boxart.png +0 -0
  4. data/bin/gemba +2 -2
  5. data/ext/gemba/extconf.rb +24 -1
  6. data/ext/gemba/gemba_ext.c +436 -2
  7. data/ext/gemba/gemba_ext.h +2 -0
  8. data/gemba.gemspec +5 -3
  9. data/lib/gemba/achievements/achievement.rb +23 -0
  10. data/lib/gemba/achievements/backend.rb +186 -0
  11. data/lib/gemba/achievements/cache.rb +70 -0
  12. data/lib/gemba/achievements/credentials_presenter.rb +142 -0
  13. data/lib/gemba/achievements/fake_backend.rb +205 -0
  14. data/lib/gemba/achievements/null_backend.rb +11 -0
  15. data/lib/gemba/achievements/offline_backend.rb +168 -0
  16. data/lib/gemba/achievements/retro_achievements/backend.rb +453 -0
  17. data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
  18. data/lib/gemba/achievements/retro_achievements/ping_worker.rb +27 -0
  19. data/lib/gemba/achievements.rb +19 -0
  20. data/lib/gemba/achievements_window.rb +556 -0
  21. data/lib/gemba/app_controller.rb +1015 -0
  22. data/lib/gemba/bios.rb +54 -0
  23. data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
  24. data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
  25. data/lib/gemba/boxart_fetcher.rb +79 -0
  26. data/lib/gemba/bus_emitter.rb +13 -0
  27. data/lib/gemba/child_window.rb +24 -1
  28. data/lib/gemba/cli/commands/config_cmd.rb +83 -0
  29. data/lib/gemba/cli/commands/decode.rb +154 -0
  30. data/lib/gemba/cli/commands/patch.rb +78 -0
  31. data/lib/gemba/cli/commands/play.rb +78 -0
  32. data/lib/gemba/cli/commands/record.rb +114 -0
  33. data/lib/gemba/cli/commands/replay.rb +161 -0
  34. data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
  35. data/lib/gemba/cli/commands/version.rb +22 -0
  36. data/lib/gemba/cli.rb +52 -364
  37. data/lib/gemba/config.rb +135 -1
  38. data/lib/gemba/data/gb_games.json +1 -0
  39. data/lib/gemba/data/gb_md5.json +1 -0
  40. data/lib/gemba/data/gba_games.json +1 -0
  41. data/lib/gemba/data/gba_md5.json +1 -0
  42. data/lib/gemba/data/gbc_games.json +1 -0
  43. data/lib/gemba/data/gbc_md5.json +1 -0
  44. data/lib/gemba/emulator_frame.rb +1060 -0
  45. data/lib/gemba/event_bus.rb +48 -0
  46. data/lib/gemba/frame_stack.rb +60 -0
  47. data/lib/gemba/game_index.rb +84 -0
  48. data/lib/gemba/game_picker_frame.rb +268 -0
  49. data/lib/gemba/gamepad_map.rb +103 -0
  50. data/lib/gemba/headless.rb +6 -5
  51. data/lib/gemba/headless_player.rb +33 -3
  52. data/lib/gemba/help_window.rb +61 -0
  53. data/lib/gemba/hotkey_map.rb +3 -1
  54. data/lib/gemba/input_recorder.rb +107 -0
  55. data/lib/gemba/input_replayer.rb +119 -0
  56. data/lib/gemba/keyboard_map.rb +90 -0
  57. data/lib/gemba/locales/en.yml +97 -5
  58. data/lib/gemba/locales/ja.yml +97 -5
  59. data/lib/gemba/main_window.rb +56 -0
  60. data/lib/gemba/modal_stack.rb +81 -0
  61. data/lib/gemba/patcher_window.rb +223 -0
  62. data/lib/gemba/platform/gb.rb +21 -0
  63. data/lib/gemba/platform/gba.rb +21 -0
  64. data/lib/gemba/platform/gbc.rb +23 -0
  65. data/lib/gemba/platform.rb +20 -0
  66. data/lib/gemba/platform_open.rb +19 -0
  67. data/lib/gemba/recorder.rb +4 -3
  68. data/lib/gemba/replay_player.rb +691 -0
  69. data/lib/gemba/rom_info.rb +57 -0
  70. data/lib/gemba/rom_info_window.rb +16 -3
  71. data/lib/gemba/rom_library.rb +106 -0
  72. data/lib/gemba/rom_overrides.rb +47 -0
  73. data/lib/gemba/rom_patcher/bps.rb +161 -0
  74. data/lib/gemba/rom_patcher/ips.rb +101 -0
  75. data/lib/gemba/rom_patcher/ups.rb +118 -0
  76. data/lib/gemba/rom_patcher.rb +109 -0
  77. data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
  78. data/lib/gemba/runtime.rb +59 -26
  79. data/lib/gemba/save_state_manager.rb +4 -7
  80. data/lib/gemba/save_state_picker.rb +17 -4
  81. data/lib/gemba/session_logger.rb +64 -0
  82. data/lib/gemba/settings/audio_tab.rb +77 -0
  83. data/lib/gemba/settings/gamepad_tab.rb +351 -0
  84. data/lib/gemba/settings/hotkeys_tab.rb +259 -0
  85. data/lib/gemba/settings/paths.rb +11 -0
  86. data/lib/gemba/settings/recording_tab.rb +83 -0
  87. data/lib/gemba/settings/save_states_tab.rb +91 -0
  88. data/lib/gemba/settings/system_tab.rb +362 -0
  89. data/lib/gemba/settings/video_tab.rb +318 -0
  90. data/lib/gemba/settings_window.rb +162 -1036
  91. data/lib/gemba/version.rb +1 -1
  92. data/lib/gemba/virtual_keyboard.rb +19 -0
  93. data/lib/gemba.rb +2 -12
  94. data/test/achievements_window/test_bulk_sync.rb +218 -0
  95. data/test/achievements_window/test_bus_events.rb +125 -0
  96. data/test/achievements_window/test_close_confirmation.rb +201 -0
  97. data/test/achievements_window/test_initial_state.rb +164 -0
  98. data/test/achievements_window/test_sorting.rb +227 -0
  99. data/test/achievements_window/test_tree_rendering.rb +133 -0
  100. data/test/fixtures/fake_bios.bin +0 -0
  101. data/test/fixtures/pong.gba +0 -0
  102. data/test/fixtures/test.gb +0 -0
  103. data/test/fixtures/test.gbc +0 -0
  104. data/test/fixtures/test_quicksave.ss +0 -0
  105. data/test/screenshots/no_focus.png +0 -0
  106. data/test/shared/teek_test_worker.rb +17 -1
  107. data/test/shared/tk_test_helper.rb +91 -4
  108. data/test/support/achievements_window_helpers.rb +18 -0
  109. data/test/support/fake_core.rb +25 -0
  110. data/test/support/fake_ra_runtime.rb +74 -0
  111. data/test/support/fake_requester.rb +68 -0
  112. data/test/support/player_helpers.rb +20 -5
  113. data/test/test_achievement.rb +32 -0
  114. data/test/{test_player.rb → test_app_controller.rb} +353 -85
  115. data/test/test_bios.rb +123 -0
  116. data/test/test_boxart_fetcher.rb +150 -0
  117. data/test/test_cli.rb +17 -265
  118. data/test/test_cli_config.rb +64 -0
  119. data/test/test_cli_decode.rb +97 -0
  120. data/test/test_cli_patch.rb +58 -0
  121. data/test/test_cli_play.rb +213 -0
  122. data/test/test_cli_ra.rb +175 -0
  123. data/test/test_cli_record.rb +69 -0
  124. data/test/test_cli_replay.rb +72 -0
  125. data/test/test_cli_sync_requester.rb +152 -0
  126. data/test/test_cli_version.rb +27 -0
  127. data/test/test_config.rb +2 -3
  128. data/test/test_config_ra.rb +69 -0
  129. data/test/test_core.rb +62 -1
  130. data/test/test_credentials_presenter.rb +192 -0
  131. data/test/test_event_bus.rb +100 -0
  132. data/test/test_fake_backend_achievements.rb +130 -0
  133. data/test/test_fake_backend_auth.rb +68 -0
  134. data/test/test_game_index.rb +77 -0
  135. data/test/test_game_picker_frame.rb +310 -0
  136. data/test/test_gamepad_map.rb +1 -3
  137. data/test/test_headless_player.rb +17 -3
  138. data/test/test_help_window.rb +82 -0
  139. data/test/test_hotkey_map.rb +22 -1
  140. data/test/test_input_recorder.rb +179 -0
  141. data/test/test_input_replay_determinism.rb +113 -0
  142. data/test/test_input_replayer.rb +162 -0
  143. data/test/test_keyboard_map.rb +1 -3
  144. data/test/test_libretro_backend.rb +41 -0
  145. data/test/test_locale.rb +1 -1
  146. data/test/test_logging.rb +123 -0
  147. data/test/test_null_backend.rb +42 -0
  148. data/test/test_offline_backend.rb +116 -0
  149. data/test/test_overlay_renderer.rb +1 -1
  150. data/test/test_platform.rb +149 -0
  151. data/test/test_ra_backend.rb +313 -0
  152. data/test/test_ra_backend_unlock_gate.rb +56 -0
  153. data/test/test_recorder.rb +0 -3
  154. data/test/test_replay_player.rb +316 -0
  155. data/test/test_rom_info.rb +149 -0
  156. data/test/test_rom_overrides.rb +86 -0
  157. data/test/test_rom_patcher.rb +382 -0
  158. data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
  159. data/test/test_save_state_manager.rb +2 -4
  160. data/test/test_settings_audio.rb +107 -0
  161. data/test/test_settings_hotkeys.rb +83 -66
  162. data/test/test_settings_recording.rb +49 -0
  163. data/test/test_settings_save_states.rb +97 -0
  164. data/test/test_settings_system.rb +133 -0
  165. data/test/test_settings_video.rb +450 -0
  166. data/test/test_settings_window.rb +76 -507
  167. data/test/test_tip_service.rb +6 -6
  168. data/test/test_toast_overlay.rb +1 -1
  169. data/test/test_virtual_events.rb +156 -0
  170. data/test/test_virtual_keyboard.rb +1 -1
  171. data/vendor/rcheevos/CHANGELOG.md +495 -0
  172. data/vendor/rcheevos/LICENSE +21 -0
  173. data/vendor/rcheevos/Package.swift +33 -0
  174. data/vendor/rcheevos/README.md +67 -0
  175. data/vendor/rcheevos/include/module.modulemap +70 -0
  176. data/vendor/rcheevos/include/rc_api_editor.h +296 -0
  177. data/vendor/rcheevos/include/rc_api_info.h +280 -0
  178. data/vendor/rcheevos/include/rc_api_request.h +77 -0
  179. data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
  180. data/vendor/rcheevos/include/rc_api_user.h +262 -0
  181. data/vendor/rcheevos/include/rc_client.h +877 -0
  182. data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
  183. data/vendor/rcheevos/include/rc_consoles.h +138 -0
  184. data/vendor/rcheevos/include/rc_error.h +59 -0
  185. data/vendor/rcheevos/include/rc_export.h +100 -0
  186. data/vendor/rcheevos/include/rc_hash.h +200 -0
  187. data/vendor/rcheevos/include/rc_runtime.h +148 -0
  188. data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
  189. data/vendor/rcheevos/include/rc_util.h +51 -0
  190. data/vendor/rcheevos/include/rcheevos.h +8 -0
  191. data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
  192. data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
  193. data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
  194. data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
  195. data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
  196. data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
  197. data/vendor/rcheevos/src/rc_client.c +6941 -0
  198. data/vendor/rcheevos/src/rc_client_external.c +281 -0
  199. data/vendor/rcheevos/src/rc_client_external.h +177 -0
  200. data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
  201. data/vendor/rcheevos/src/rc_client_internal.h +409 -0
  202. data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
  203. data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
  204. data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
  205. data/vendor/rcheevos/src/rc_compat.c +251 -0
  206. data/vendor/rcheevos/src/rc_compat.h +121 -0
  207. data/vendor/rcheevos/src/rc_libretro.c +915 -0
  208. data/vendor/rcheevos/src/rc_libretro.h +98 -0
  209. data/vendor/rcheevos/src/rc_util.c +199 -0
  210. data/vendor/rcheevos/src/rc_version.c +11 -0
  211. data/vendor/rcheevos/src/rc_version.h +32 -0
  212. data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
  213. data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
  214. data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
  215. data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
  216. data/vendor/rcheevos/src/rcheevos/format.c +330 -0
  217. data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
  218. data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
  219. data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
  220. data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
  221. data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
  222. data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
  223. data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
  224. data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
  225. data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
  226. data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
  227. data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
  228. data/vendor/rcheevos/src/rcheevos/value.c +935 -0
  229. data/vendor/rcheevos/src/rhash/aes.c +480 -0
  230. data/vendor/rcheevos/src/rhash/aes.h +49 -0
  231. data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
  232. data/vendor/rcheevos/src/rhash/hash.c +1402 -0
  233. data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
  234. data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
  235. data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
  236. data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
  237. data/vendor/rcheevos/src/rhash/md5.c +382 -0
  238. data/vendor/rcheevos/src/rhash/md5.h +91 -0
  239. data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
  240. data/vendor/rcheevos/test/libretro.h +205 -0
  241. data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
  242. data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
  243. data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
  244. data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
  245. data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
  246. data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
  247. data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
  248. data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
  249. data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
  250. data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
  251. data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
  252. data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
  253. data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
  254. data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
  255. data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
  256. data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
  257. data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
  258. data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
  259. data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
  260. data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
  261. data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
  262. data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
  263. data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
  264. data/vendor/rcheevos/test/rhash/data.c +657 -0
  265. data/vendor/rcheevos/test/rhash/data.h +32 -0
  266. data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
  267. data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
  268. data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
  269. data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
  270. data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
  271. data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
  272. data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
  273. data/vendor/rcheevos/test/test.c +113 -0
  274. data/vendor/rcheevos/test/test_framework.h +205 -0
  275. data/vendor/rcheevos/test/test_rc_client.c +10509 -0
  276. data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
  277. data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
  278. data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
  279. data/vendor/rcheevos/test/test_types.natvis +9 -0
  280. data/vendor/rcheevos/validator/validator.c +658 -0
  281. data/vendor/rcheevos/validator/validator.vcxproj +152 -0
  282. data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
  283. metadata +274 -11
  284. data/lib/gemba/input_mappings.rb +0 -214
  285. data/lib/gemba/player.rb +0 -1515
@@ -0,0 +1,692 @@
1
+ #include "rc_internal.h"
2
+
3
+ #include "../test_framework.h"
4
+ #include "mock_memory.h"
5
+
6
+ static void _assert_parse_operand(rc_operand_t* self, char* buffer, const char** memaddr) {
7
+ rc_parse_state_t parse;
8
+ rc_memrefs_t memrefs;
9
+ int ret;
10
+
11
+ rc_init_parse_state(&parse, buffer);
12
+ rc_init_parse_state_memrefs(&parse, &memrefs);
13
+ ret = rc_parse_operand(self, memaddr, &parse);
14
+ rc_destroy_parse_state(&parse);
15
+
16
+ ASSERT_NUM_GREATER_EQUALS(ret, 0);
17
+ ASSERT_NUM_EQUALS(**memaddr, 0);
18
+ }
19
+ #define assert_parse_operand(operand, buffer, memaddr_out) ASSERT_HELPER(_assert_parse_operand(operand, buffer, memaddr_out), "assert_parse_operand")
20
+
21
+ static void _assert_operand(rc_operand_t* self, uint8_t expected_type, uint8_t expected_size, uint32_t expected_address) {
22
+ ASSERT_NUM_EQUALS(expected_type, self->type);
23
+ switch (expected_type) {
24
+ case RC_OPERAND_ADDRESS:
25
+ case RC_OPERAND_DELTA:
26
+ case RC_OPERAND_PRIOR:
27
+ ASSERT_NUM_EQUALS(expected_size, self->size);
28
+ ASSERT_UNUM_EQUALS(expected_address, self->value.memref->address);
29
+ break;
30
+
31
+ case RC_OPERAND_CONST:
32
+ ASSERT_UNUM_EQUALS(expected_address, self->value.num);
33
+ break;
34
+ }
35
+ }
36
+ #define assert_operand(operand, expected_type, expected_size, expected_address) ASSERT_HELPER(_assert_operand(operand, expected_type, expected_size, expected_address), "assert_operand")
37
+
38
+ static void test_parse_operand(const char* memaddr, uint8_t expected_type, uint8_t expected_size, uint32_t expected_value) {
39
+ char buffer[256];
40
+ rc_operand_t self;
41
+ assert_parse_operand(&self, buffer, &memaddr);
42
+ assert_operand(&self, expected_type, expected_size, expected_value);
43
+ }
44
+
45
+ static void test_parse_operand_fp(const char* memaddr, uint8_t expected_type, double expected_value) {
46
+ char buffer[256];
47
+ rc_operand_t self;
48
+ assert_parse_operand(&self, buffer, &memaddr);
49
+
50
+ ASSERT_NUM_EQUALS(expected_type, self.type);
51
+ switch (expected_type) {
52
+ case RC_OPERAND_CONST:
53
+ ASSERT_DBL_EQUALS(expected_value, self.value.num);
54
+ break;
55
+ case RC_OPERAND_FP:
56
+ ASSERT_DBL_EQUALS(expected_value, self.value.dbl);
57
+ break;
58
+ }
59
+ }
60
+
61
+ static void test_parse_error_operand(const char* memaddr, int valid_chars, int expected_error) {
62
+ rc_operand_t self;
63
+ rc_parse_state_t parse;
64
+ int ret;
65
+ const char* begin = memaddr;
66
+ rc_memrefs_t memrefs;
67
+
68
+ rc_init_parse_state(&parse, 0);
69
+ rc_init_parse_state_memrefs(&parse, &memrefs);
70
+ ret = rc_parse_operand(&self, &memaddr, &parse);
71
+ rc_destroy_parse_state(&parse);
72
+
73
+ ASSERT_NUM_EQUALS(expected_error, ret);
74
+ ASSERT_NUM_EQUALS(memaddr - begin, valid_chars);
75
+ }
76
+
77
+ static uint32_t evaluate_operand(rc_operand_t* op, memory_t* memory, rc_memrefs_t* memrefs)
78
+ {
79
+ rc_eval_state_t eval_state;
80
+ rc_typed_value_t value;
81
+
82
+ memset(&eval_state, 0, sizeof(eval_state));
83
+ eval_state.peek = peek;
84
+ eval_state.peek_userdata = memory;
85
+
86
+ rc_update_memref_values(memrefs, peek, memory);
87
+ rc_evaluate_operand(&value, op, &eval_state);
88
+ return value.value.u32;
89
+ }
90
+
91
+ static void test_evaluate_operand(const char* memaddr, memory_t* memory, uint32_t expected_value) {
92
+ rc_operand_t self;
93
+ rc_parse_state_t parse;
94
+ rc_memrefs_t memrefs;
95
+ char buffer[512];
96
+ uint32_t value;
97
+
98
+ rc_init_parse_state(&parse, buffer);
99
+ rc_init_parse_state_memrefs(&parse, &memrefs);
100
+ rc_parse_operand(&self, &memaddr, &parse);
101
+ rc_destroy_parse_state(&parse);
102
+
103
+ value = evaluate_operand(&self, memory, &memrefs);
104
+ ASSERT_NUM_EQUALS(value, expected_value);
105
+ }
106
+
107
+ static float evaluate_operand_float(rc_operand_t* op, memory_t* memory, rc_memrefs_t* memrefs) {
108
+ rc_eval_state_t eval_state;
109
+ rc_typed_value_t value;
110
+
111
+ memset(&eval_state, 0, sizeof(eval_state));
112
+ eval_state.peek = peek;
113
+ eval_state.peek_userdata = memory;
114
+
115
+ rc_update_memref_values(memrefs, peek, memory);
116
+ rc_evaluate_operand(&value, op, &eval_state);
117
+ return value.value.f32;
118
+ }
119
+
120
+ static void test_evaluate_operand_float(const char* memaddr, memory_t* memory, double expected_value) {
121
+ rc_operand_t self;
122
+ rc_parse_state_t parse;
123
+ rc_memrefs_t memrefs;
124
+ char buffer[512];
125
+ float value;
126
+
127
+ rc_init_parse_state(&parse, buffer);
128
+ rc_init_parse_state_memrefs(&parse, &memrefs);
129
+ rc_parse_operand(&self, &memaddr, &parse);
130
+ rc_destroy_parse_state(&parse);
131
+
132
+ value = evaluate_operand_float(&self, memory, &memrefs);
133
+ ASSERT_FLOAT_EQUALS(value, expected_value);
134
+ }
135
+ static void test_parse_memory_references() {
136
+ /* sizes */
137
+ TEST_PARAMS4(test_parse_operand, "0xH1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x1234U);
138
+ TEST_PARAMS4(test_parse_operand, "0xH1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x1234U);
139
+ TEST_PARAMS4(test_parse_operand, "0x 1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_16_BITS, 0x1234U);
140
+ TEST_PARAMS4(test_parse_operand, "0x1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_16_BITS, 0x1234U);
141
+ TEST_PARAMS4(test_parse_operand, "0xW1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_24_BITS, 0x1234U);
142
+ TEST_PARAMS4(test_parse_operand, "0xX1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_32_BITS, 0x1234U);
143
+ TEST_PARAMS4(test_parse_operand, "0xL1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_LOW, 0x1234U);
144
+ TEST_PARAMS4(test_parse_operand, "0xU1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_HIGH, 0x1234U);
145
+ TEST_PARAMS4(test_parse_operand, "0xM1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_0, 0x1234U);
146
+ TEST_PARAMS4(test_parse_operand, "0xN1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_1, 0x1234U);
147
+ TEST_PARAMS4(test_parse_operand, "0xO1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_2, 0x1234U);
148
+ TEST_PARAMS4(test_parse_operand, "0xP1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_3, 0x1234U);
149
+ TEST_PARAMS4(test_parse_operand, "0xQ1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_4, 0x1234U);
150
+ TEST_PARAMS4(test_parse_operand, "0xR1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_5, 0x1234U);
151
+ TEST_PARAMS4(test_parse_operand, "0xS1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_6, 0x1234U);
152
+ TEST_PARAMS4(test_parse_operand, "0xT1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_7, 0x1234U);
153
+ TEST_PARAMS4(test_parse_operand, "0xK1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BITCOUNT, 0x1234U);
154
+ TEST_PARAMS4(test_parse_operand, "0xI1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_16_BITS_BE, 0x1234U);
155
+ TEST_PARAMS4(test_parse_operand, "0xJ1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_24_BITS_BE, 0x1234U);
156
+ TEST_PARAMS4(test_parse_operand, "0xG1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_32_BITS_BE, 0x1234U);
157
+ TEST_PARAMS4(test_parse_operand, "fF1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_FLOAT, 0x1234U);
158
+ TEST_PARAMS4(test_parse_operand, "fB1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_FLOAT_BE, 0x1234U);
159
+ TEST_PARAMS4(test_parse_operand, "fM1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_MBF32, 0x1234U);
160
+ TEST_PARAMS4(test_parse_operand, "fL1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_MBF32_LE, 0x1234U);
161
+
162
+ /* sizes (ignore case) */
163
+ TEST_PARAMS4(test_parse_operand, "0Xh1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x1234U);
164
+ TEST_PARAMS4(test_parse_operand, "0xx1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_32_BITS, 0x1234U);
165
+ TEST_PARAMS4(test_parse_operand, "0xl1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_LOW, 0x1234U);
166
+ TEST_PARAMS4(test_parse_operand, "0xu1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_HIGH, 0x1234U);
167
+ TEST_PARAMS4(test_parse_operand, "0xm1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_0, 0x1234U);
168
+ TEST_PARAMS4(test_parse_operand, "0xn1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_1, 0x1234U);
169
+ TEST_PARAMS4(test_parse_operand, "0xo1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_2, 0x1234U);
170
+ TEST_PARAMS4(test_parse_operand, "0xp1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_3, 0x1234U);
171
+ TEST_PARAMS4(test_parse_operand, "0xq1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_4, 0x1234U);
172
+ TEST_PARAMS4(test_parse_operand, "0xr1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_5, 0x1234U);
173
+ TEST_PARAMS4(test_parse_operand, "0xs1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_6, 0x1234U);
174
+ TEST_PARAMS4(test_parse_operand, "0xt1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BIT_7, 0x1234U);
175
+ TEST_PARAMS4(test_parse_operand, "0xk1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_BITCOUNT, 0x1234U);
176
+ TEST_PARAMS4(test_parse_operand, "0xi1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_16_BITS_BE, 0x1234U);
177
+ TEST_PARAMS4(test_parse_operand, "0xj1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_24_BITS_BE, 0x1234U);
178
+ TEST_PARAMS4(test_parse_operand, "0xg1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_32_BITS_BE, 0x1234U);
179
+ TEST_PARAMS4(test_parse_operand, "ff1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_FLOAT, 0x1234U);
180
+ TEST_PARAMS4(test_parse_operand, "fb1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_FLOAT_BE, 0x1234U);
181
+ TEST_PARAMS4(test_parse_operand, "fm1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_MBF32, 0x1234U);
182
+ TEST_PARAMS4(test_parse_operand, "fl1234", RC_OPERAND_ADDRESS, RC_MEMSIZE_MBF32_LE, 0x1234U);
183
+
184
+ /* addresses */
185
+ TEST_PARAMS4(test_parse_operand, "0xH0000", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x0000U);
186
+ TEST_PARAMS4(test_parse_operand, "0xH12345678", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0x12345678U);
187
+ TEST_PARAMS4(test_parse_operand, "0xHABCD", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0xABCDU);
188
+ TEST_PARAMS4(test_parse_operand, "0xhabcd", RC_OPERAND_ADDRESS, RC_MEMSIZE_8_BITS, 0xABCDU);
189
+ TEST_PARAMS4(test_parse_operand, "fFABCD", RC_OPERAND_ADDRESS, RC_MEMSIZE_FLOAT, 0xABCDU);
190
+
191
+ /* doubled up prefix */
192
+ TEST_PARAMS3(test_parse_error_operand, "0x0xH1234", 0, RC_INVALID_MEMORY_OPERAND);
193
+ }
194
+
195
+ static void test_parse_delta_memory_references() {
196
+ /* sizes */
197
+ TEST_PARAMS4(test_parse_operand, "d0xH1234", RC_OPERAND_DELTA, RC_MEMSIZE_8_BITS, 0x1234U);
198
+ TEST_PARAMS4(test_parse_operand, "d0x 1234", RC_OPERAND_DELTA, RC_MEMSIZE_16_BITS, 0x1234U);
199
+ TEST_PARAMS4(test_parse_operand, "d0x1234", RC_OPERAND_DELTA, RC_MEMSIZE_16_BITS, 0x1234U);
200
+ TEST_PARAMS4(test_parse_operand, "d0xW1234", RC_OPERAND_DELTA, RC_MEMSIZE_24_BITS, 0x1234U);
201
+ TEST_PARAMS4(test_parse_operand, "d0xX1234", RC_OPERAND_DELTA, RC_MEMSIZE_32_BITS, 0x1234U);
202
+ TEST_PARAMS4(test_parse_operand, "d0xL1234", RC_OPERAND_DELTA, RC_MEMSIZE_LOW, 0x1234U);
203
+ TEST_PARAMS4(test_parse_operand, "d0xU1234", RC_OPERAND_DELTA, RC_MEMSIZE_HIGH, 0x1234U);
204
+ TEST_PARAMS4(test_parse_operand, "d0xM1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_0, 0x1234U);
205
+ TEST_PARAMS4(test_parse_operand, "d0xN1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_1, 0x1234U);
206
+ TEST_PARAMS4(test_parse_operand, "d0xO1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_2, 0x1234U);
207
+ TEST_PARAMS4(test_parse_operand, "d0xP1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_3, 0x1234U);
208
+ TEST_PARAMS4(test_parse_operand, "d0xQ1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_4, 0x1234U);
209
+ TEST_PARAMS4(test_parse_operand, "d0xR1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_5, 0x1234U);
210
+ TEST_PARAMS4(test_parse_operand, "d0xS1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_6, 0x1234U);
211
+ TEST_PARAMS4(test_parse_operand, "d0xT1234", RC_OPERAND_DELTA, RC_MEMSIZE_BIT_7, 0x1234U);
212
+ TEST_PARAMS4(test_parse_operand, "d0xK1234", RC_OPERAND_DELTA, RC_MEMSIZE_BITCOUNT, 0x1234U);
213
+ TEST_PARAMS4(test_parse_operand, "d0xI1234", RC_OPERAND_DELTA, RC_MEMSIZE_16_BITS_BE, 0x1234U);
214
+ TEST_PARAMS4(test_parse_operand, "d0xJ1234", RC_OPERAND_DELTA, RC_MEMSIZE_24_BITS_BE, 0x1234U);
215
+ TEST_PARAMS4(test_parse_operand, "d0xG1234", RC_OPERAND_DELTA, RC_MEMSIZE_32_BITS_BE, 0x1234U);
216
+ TEST_PARAMS4(test_parse_operand, "dfF1234", RC_OPERAND_DELTA, RC_MEMSIZE_FLOAT, 0x1234U);
217
+ TEST_PARAMS4(test_parse_operand, "dfB1234", RC_OPERAND_DELTA, RC_MEMSIZE_FLOAT_BE, 0x1234U);
218
+ TEST_PARAMS4(test_parse_operand, "dfM1234", RC_OPERAND_DELTA, RC_MEMSIZE_MBF32, 0x1234U);
219
+ TEST_PARAMS4(test_parse_operand, "dfL1234", RC_OPERAND_DELTA, RC_MEMSIZE_MBF32_LE, 0x1234U);
220
+
221
+ /* ignores case */
222
+ TEST_PARAMS4(test_parse_operand, "D0Xh1234", RC_OPERAND_DELTA, RC_MEMSIZE_8_BITS, 0x1234U);
223
+
224
+ /* addresses */
225
+ TEST_PARAMS4(test_parse_operand, "d0xH0000", RC_OPERAND_DELTA, RC_MEMSIZE_8_BITS, 0x0000U);
226
+ TEST_PARAMS4(test_parse_operand, "d0xH12345678", RC_OPERAND_DELTA, RC_MEMSIZE_8_BITS, 0x12345678U);
227
+ TEST_PARAMS4(test_parse_operand, "d0xHABCD", RC_OPERAND_DELTA, RC_MEMSIZE_8_BITS, 0xABCDU);
228
+ TEST_PARAMS4(test_parse_operand, "d0xhabcd", RC_OPERAND_DELTA, RC_MEMSIZE_8_BITS, 0xABCDU);
229
+ }
230
+
231
+ static void test_parse_prior_memory_references() {
232
+ /* sizes */
233
+ TEST_PARAMS4(test_parse_operand, "p0xH1234", RC_OPERAND_PRIOR, RC_MEMSIZE_8_BITS, 0x1234U);
234
+ TEST_PARAMS4(test_parse_operand, "p0x 1234", RC_OPERAND_PRIOR, RC_MEMSIZE_16_BITS, 0x1234U);
235
+ TEST_PARAMS4(test_parse_operand, "p0x1234", RC_OPERAND_PRIOR, RC_MEMSIZE_16_BITS, 0x1234U);
236
+ TEST_PARAMS4(test_parse_operand, "p0xW1234", RC_OPERAND_PRIOR, RC_MEMSIZE_24_BITS, 0x1234U);
237
+ TEST_PARAMS4(test_parse_operand, "p0xX1234", RC_OPERAND_PRIOR, RC_MEMSIZE_32_BITS, 0x1234U);
238
+ TEST_PARAMS4(test_parse_operand, "p0xL1234", RC_OPERAND_PRIOR, RC_MEMSIZE_LOW, 0x1234U);
239
+ TEST_PARAMS4(test_parse_operand, "p0xU1234", RC_OPERAND_PRIOR, RC_MEMSIZE_HIGH, 0x1234U);
240
+ TEST_PARAMS4(test_parse_operand, "p0xM1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_0, 0x1234U);
241
+ TEST_PARAMS4(test_parse_operand, "p0xN1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_1, 0x1234U);
242
+ TEST_PARAMS4(test_parse_operand, "p0xO1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_2, 0x1234U);
243
+ TEST_PARAMS4(test_parse_operand, "p0xP1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_3, 0x1234U);
244
+ TEST_PARAMS4(test_parse_operand, "p0xQ1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_4, 0x1234U);
245
+ TEST_PARAMS4(test_parse_operand, "p0xR1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_5, 0x1234U);
246
+ TEST_PARAMS4(test_parse_operand, "p0xS1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_6, 0x1234U);
247
+ TEST_PARAMS4(test_parse_operand, "p0xT1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BIT_7, 0x1234U);
248
+ TEST_PARAMS4(test_parse_operand, "p0xK1234", RC_OPERAND_PRIOR, RC_MEMSIZE_BITCOUNT, 0x1234U);
249
+ TEST_PARAMS4(test_parse_operand, "p0xI1234", RC_OPERAND_PRIOR, RC_MEMSIZE_16_BITS_BE, 0x1234U);
250
+ TEST_PARAMS4(test_parse_operand, "p0xJ1234", RC_OPERAND_PRIOR, RC_MEMSIZE_24_BITS_BE, 0x1234U);
251
+ TEST_PARAMS4(test_parse_operand, "p0xG1234", RC_OPERAND_PRIOR, RC_MEMSIZE_32_BITS_BE, 0x1234U);
252
+ TEST_PARAMS4(test_parse_operand, "pfF1234", RC_OPERAND_PRIOR, RC_MEMSIZE_FLOAT, 0x1234U);
253
+ TEST_PARAMS4(test_parse_operand, "pfB1234", RC_OPERAND_PRIOR, RC_MEMSIZE_FLOAT_BE, 0x1234U);
254
+ TEST_PARAMS4(test_parse_operand, "pfM1234", RC_OPERAND_PRIOR, RC_MEMSIZE_MBF32, 0x1234U);
255
+ TEST_PARAMS4(test_parse_operand, "pfL1234", RC_OPERAND_PRIOR, RC_MEMSIZE_MBF32_LE, 0x1234U);
256
+
257
+ /* ignores case */
258
+ TEST_PARAMS4(test_parse_operand, "P0Xh1234", RC_OPERAND_PRIOR, RC_MEMSIZE_8_BITS, 0x1234U);
259
+
260
+ /* addresses */
261
+ TEST_PARAMS4(test_parse_operand, "p0xH0000", RC_OPERAND_PRIOR, RC_MEMSIZE_8_BITS, 0x0000U);
262
+ TEST_PARAMS4(test_parse_operand, "p0xH12345678", RC_OPERAND_PRIOR, RC_MEMSIZE_8_BITS, 0x12345678U);
263
+ TEST_PARAMS4(test_parse_operand, "p0xHABCD", RC_OPERAND_PRIOR, RC_MEMSIZE_8_BITS, 0xABCDU);
264
+ TEST_PARAMS4(test_parse_operand, "p0xhabcd", RC_OPERAND_PRIOR, RC_MEMSIZE_8_BITS, 0xABCDU);
265
+ }
266
+
267
+ static void test_parse_bcd_memory_references() {
268
+ /* sizes */
269
+ TEST_PARAMS4(test_parse_operand, "b0xH1234", RC_OPERAND_BCD, RC_MEMSIZE_8_BITS, 0x1234U);
270
+ TEST_PARAMS4(test_parse_operand, "b0x 1234", RC_OPERAND_BCD, RC_MEMSIZE_16_BITS, 0x1234U);
271
+ TEST_PARAMS4(test_parse_operand, "b0x1234", RC_OPERAND_BCD, RC_MEMSIZE_16_BITS, 0x1234U);
272
+ TEST_PARAMS4(test_parse_operand, "b0xW1234", RC_OPERAND_BCD, RC_MEMSIZE_24_BITS, 0x1234U);
273
+ TEST_PARAMS4(test_parse_operand, "b0xX1234", RC_OPERAND_BCD, RC_MEMSIZE_32_BITS, 0x1234U);
274
+ TEST_PARAMS4(test_parse_operand, "b0xI1234", RC_OPERAND_BCD, RC_MEMSIZE_16_BITS_BE, 0x1234U);
275
+ TEST_PARAMS4(test_parse_operand, "b0xJ1234", RC_OPERAND_BCD, RC_MEMSIZE_24_BITS_BE, 0x1234U);
276
+ TEST_PARAMS4(test_parse_operand, "b0xG1234", RC_OPERAND_BCD, RC_MEMSIZE_32_BITS_BE, 0x1234U);
277
+ TEST_PARAMS4(test_parse_operand, "bfF1234", RC_OPERAND_BCD, RC_MEMSIZE_FLOAT, 0x1234U);
278
+ TEST_PARAMS4(test_parse_operand, "bfB1234", RC_OPERAND_BCD, RC_MEMSIZE_FLOAT_BE, 0x1234U);
279
+ TEST_PARAMS4(test_parse_operand, "bfM1234", RC_OPERAND_BCD, RC_MEMSIZE_MBF32, 0x1234U);
280
+ TEST_PARAMS4(test_parse_operand, "bfL1234", RC_OPERAND_BCD, RC_MEMSIZE_MBF32_LE, 0x1234U);
281
+
282
+ /* sizes less than 8-bit technically don't need a BCD conversion */
283
+ TEST_PARAMS4(test_parse_operand, "b0xL1234", RC_OPERAND_BCD, RC_MEMSIZE_LOW, 0x1234U);
284
+ TEST_PARAMS4(test_parse_operand, "b0xU1234", RC_OPERAND_BCD, RC_MEMSIZE_HIGH, 0x1234U);
285
+ TEST_PARAMS4(test_parse_operand, "b0xM1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_0, 0x1234U);
286
+ TEST_PARAMS4(test_parse_operand, "b0xN1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_1, 0x1234U);
287
+ TEST_PARAMS4(test_parse_operand, "b0xO1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_2, 0x1234U);
288
+ TEST_PARAMS4(test_parse_operand, "b0xP1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_3, 0x1234U);
289
+ TEST_PARAMS4(test_parse_operand, "b0xQ1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_4, 0x1234U);
290
+ TEST_PARAMS4(test_parse_operand, "b0xR1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_5, 0x1234U);
291
+ TEST_PARAMS4(test_parse_operand, "b0xS1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_6, 0x1234U);
292
+ TEST_PARAMS4(test_parse_operand, "b0xT1234", RC_OPERAND_BCD, RC_MEMSIZE_BIT_7, 0x1234U);
293
+ }
294
+
295
+ static void test_parse_inverted_memory_references() {
296
+ TEST_PARAMS4(test_parse_operand, "~0xH1234", RC_OPERAND_INVERTED, RC_MEMSIZE_8_BITS, 0x1234U);
297
+ TEST_PARAMS4(test_parse_operand, "~0x 1234", RC_OPERAND_INVERTED, RC_MEMSIZE_16_BITS, 0x1234U);
298
+ TEST_PARAMS4(test_parse_operand, "~0x1234", RC_OPERAND_INVERTED, RC_MEMSIZE_16_BITS, 0x1234U);
299
+ TEST_PARAMS4(test_parse_operand, "~0xW1234", RC_OPERAND_INVERTED, RC_MEMSIZE_24_BITS, 0x1234U);
300
+ TEST_PARAMS4(test_parse_operand, "~0xX1234", RC_OPERAND_INVERTED, RC_MEMSIZE_32_BITS, 0x1234U);
301
+ TEST_PARAMS4(test_parse_operand, "~0xI1234", RC_OPERAND_INVERTED, RC_MEMSIZE_16_BITS_BE, 0x1234U);
302
+ TEST_PARAMS4(test_parse_operand, "~0xJ1234", RC_OPERAND_INVERTED, RC_MEMSIZE_24_BITS_BE, 0x1234U);
303
+ TEST_PARAMS4(test_parse_operand, "~0xG1234", RC_OPERAND_INVERTED, RC_MEMSIZE_32_BITS_BE, 0x1234U);
304
+ TEST_PARAMS4(test_parse_operand, "~fF1234", RC_OPERAND_INVERTED, RC_MEMSIZE_FLOAT, 0x1234U);
305
+ TEST_PARAMS4(test_parse_operand, "~fB1234", RC_OPERAND_INVERTED, RC_MEMSIZE_FLOAT_BE, 0x1234U);
306
+ TEST_PARAMS4(test_parse_operand, "~fM1234", RC_OPERAND_INVERTED, RC_MEMSIZE_MBF32, 0x1234U);
307
+ TEST_PARAMS4(test_parse_operand, "~fL1234", RC_OPERAND_INVERTED, RC_MEMSIZE_MBF32_LE, 0x1234U);
308
+
309
+ TEST_PARAMS4(test_parse_operand, "~0xL1234", RC_OPERAND_INVERTED, RC_MEMSIZE_LOW, 0x1234U);
310
+ TEST_PARAMS4(test_parse_operand, "~0xU1234", RC_OPERAND_INVERTED, RC_MEMSIZE_HIGH, 0x1234U);
311
+ TEST_PARAMS4(test_parse_operand, "~0xM1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_0, 0x1234U);
312
+ TEST_PARAMS4(test_parse_operand, "~0xN1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_1, 0x1234U);
313
+ TEST_PARAMS4(test_parse_operand, "~0xO1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_2, 0x1234U);
314
+ TEST_PARAMS4(test_parse_operand, "~0xP1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_3, 0x1234U);
315
+ TEST_PARAMS4(test_parse_operand, "~0xQ1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_4, 0x1234U);
316
+ TEST_PARAMS4(test_parse_operand, "~0xR1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_5, 0x1234U);
317
+ TEST_PARAMS4(test_parse_operand, "~0xS1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_6, 0x1234U);
318
+ TEST_PARAMS4(test_parse_operand, "~0xT1234", RC_OPERAND_INVERTED, RC_MEMSIZE_BIT_7, 0x1234U);
319
+ }
320
+
321
+ static void test_parse_unsigned_values() {
322
+ /* unsigned integers - no prefix */
323
+ /* values don't actually have size, default is RC_MEMSIZE_8_BITS */
324
+ TEST_PARAMS4(test_parse_operand, "123", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 123U);
325
+ TEST_PARAMS4(test_parse_operand, "123456", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 123456U);
326
+ TEST_PARAMS4(test_parse_operand, "0", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0U);
327
+ TEST_PARAMS4(test_parse_operand, "0000000000", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0U);
328
+ TEST_PARAMS4(test_parse_operand, "0123456", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 123456U);
329
+ TEST_PARAMS4(test_parse_operand, "4294967295", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 4294967295U);
330
+
331
+ /* more than 32-bits (error), will be constrained to 32-bits */
332
+ TEST_PARAMS4(test_parse_operand, "4294967296", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 4294967295U);
333
+ }
334
+
335
+ static void test_parse_signed_values() {
336
+ /* signed integers - 'V' prefix */
337
+ TEST_PARAMS4(test_parse_operand, "v100", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 100);
338
+ TEST_PARAMS4(test_parse_operand, "V100", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 100);
339
+ TEST_PARAMS4(test_parse_operand, "V+1", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 1);
340
+ TEST_PARAMS4(test_parse_operand, "V-1", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0xFFFFFFFFU);
341
+ TEST_PARAMS4(test_parse_operand, "V-2", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0xFFFFFFFEU);
342
+ TEST_PARAMS4(test_parse_operand, "V9876543210", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0x7FFFFFFFU);
343
+ TEST_PARAMS4(test_parse_operand, "V-9876543210", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0x80000001U);
344
+
345
+ /* no prefix, sign */
346
+ TEST_PARAMS4(test_parse_operand, "-1", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 4294967295U);
347
+ TEST_PARAMS4(test_parse_operand, "+1", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 1);
348
+ TEST_PARAMS4(test_parse_operand, "+9876543210", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0x7FFFFFFFU);
349
+ TEST_PARAMS4(test_parse_operand, "-9876543210", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0x80000001U);
350
+
351
+ /* prefix, no value */
352
+ TEST_PARAMS3(test_parse_error_operand, "v", 0, RC_INVALID_CONST_OPERAND);
353
+
354
+ /* signed integer prefix, hex value */
355
+ TEST_PARAMS3(test_parse_error_operand, "vabcd", 0, RC_INVALID_CONST_OPERAND);
356
+ }
357
+
358
+ static void test_parse_hex_values() {
359
+ /* hex - 'H' prefix, not '0x'! */
360
+ TEST_PARAMS4(test_parse_operand, "H123", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0x123U);
361
+ TEST_PARAMS4(test_parse_operand, "HABCD", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0xABCDU);
362
+ TEST_PARAMS4(test_parse_operand, "h123", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0x123U);
363
+ TEST_PARAMS4(test_parse_operand, "habcd", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 0xABCDU);
364
+ TEST_PARAMS4(test_parse_operand, "HFFFFFFFF", RC_OPERAND_CONST, RC_MEMSIZE_8_BITS, 4294967295U);
365
+
366
+ /* hex without prefix */
367
+ TEST_PARAMS3(test_parse_error_operand, "ABCD", 0, RC_INVALID_MEMORY_OPERAND);
368
+
369
+ /* '0x' is an address */
370
+ TEST_PARAMS4(test_parse_operand, "0x123", RC_OPERAND_ADDRESS, RC_MEMSIZE_16_BITS, 0x123U);
371
+ }
372
+
373
+ static void test_parse_float_values() {
374
+ /* floating point - 'F' prefix */
375
+ TEST_PARAMS3(test_parse_operand_fp, "f0.5", RC_OPERAND_FP, 0.5);
376
+ TEST_PARAMS3(test_parse_operand_fp, "F0.5", RC_OPERAND_FP, 0.5);
377
+ TEST_PARAMS3(test_parse_operand_fp, "f+0.5", RC_OPERAND_FP, 0.5);
378
+ TEST_PARAMS3(test_parse_operand_fp, "f-0.5", RC_OPERAND_FP, -0.5);
379
+ TEST_PARAMS3(test_parse_operand_fp, "f1.0", RC_OPERAND_FP, 1.0);
380
+ TEST_PARAMS3(test_parse_operand_fp, "f1.000000", RC_OPERAND_FP, 1.0);
381
+ TEST_PARAMS3(test_parse_operand_fp, "f1.000001", RC_OPERAND_FP, 1.000001);
382
+ TEST_PARAMS3(test_parse_operand_fp, "f1", RC_OPERAND_CONST, 1.0);
383
+ TEST_PARAMS3(test_parse_operand_fp, "f0.666666", RC_OPERAND_FP, 0.666666);
384
+ TEST_PARAMS3(test_parse_operand_fp, "f0.001", RC_OPERAND_FP, 0.001);
385
+ TEST_PARAMS3(test_parse_operand_fp, "f0.100", RC_OPERAND_FP, 0.1);
386
+ TEST_PARAMS3(test_parse_operand_fp, "f.12345", RC_OPERAND_FP, 0.12345);
387
+
388
+ /* prefix, no value */
389
+ TEST_PARAMS3(test_parse_error_operand, "f", 0, RC_INVALID_FP_OPERAND);
390
+
391
+ /* float prefix, hex value */
392
+ TEST_PARAMS3(test_parse_error_operand, "fabcd", 0, RC_INVALID_FP_OPERAND);
393
+
394
+ /* float prefix, hex value, no period, parser will stop after valid numbers */
395
+ TEST_PARAMS3(test_parse_error_operand, "f1d", 2, RC_OK);
396
+
397
+ /* non-numeric decimal part */
398
+ TEST_PARAMS3(test_parse_error_operand, "f1.d", 0, RC_INVALID_FP_OPERAND);
399
+ TEST_PARAMS3(test_parse_error_operand, "f1..0", 0, RC_INVALID_FP_OPERAND);
400
+
401
+ /* non-C locale - parser will stop at comma */
402
+ TEST_PARAMS3(test_parse_error_operand, "f1,23", 2, RC_OK);
403
+ TEST_PARAMS3(test_parse_error_operand, "f-1,23", 3, RC_OK);
404
+
405
+ /* no prefix - parser will stop at period */
406
+ TEST_PARAMS3(test_parse_error_operand, "0.5", 1, RC_OK);
407
+ TEST_PARAMS3(test_parse_error_operand, "-0.5", 2, RC_OK);
408
+ }
409
+
410
+ static void test_evaluate_memory_references() {
411
+ uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
412
+ memory_t memory;
413
+ memory.ram = ram;
414
+ memory.size = sizeof(ram);
415
+
416
+ /* value */
417
+ TEST_PARAMS3(test_evaluate_operand, "0", &memory, 0x00U);
418
+
419
+ /* eight-bit */
420
+ TEST_PARAMS3(test_evaluate_operand, "0xh0", &memory, 0x00U);
421
+ TEST_PARAMS3(test_evaluate_operand, "0xh1", &memory, 0x12U);
422
+ TEST_PARAMS3(test_evaluate_operand, "0xh4", &memory, 0x56U);
423
+ TEST_PARAMS3(test_evaluate_operand, "0xh5", &memory, 0x00U); /* out of range */
424
+ TEST_PARAMS3(test_evaluate_operand, "~0xh4", &memory, 0xA9U);
425
+
426
+ /* sixteen-bit */
427
+ TEST_PARAMS3(test_evaluate_operand, "0x 0", &memory, 0x1200U);
428
+ TEST_PARAMS3(test_evaluate_operand, "0x 3", &memory, 0x56ABU);
429
+ TEST_PARAMS3(test_evaluate_operand, "0x 4", &memory, 0x0056U); /* out of range */
430
+ TEST_PARAMS3(test_evaluate_operand, "~0x 3", &memory, 0xA954U);
431
+
432
+ /* twenty-four-bit */
433
+ TEST_PARAMS3(test_evaluate_operand, "0xw0", &memory, 0x341200U);
434
+ TEST_PARAMS3(test_evaluate_operand, "0xw2", &memory, 0x56AB34U);
435
+ TEST_PARAMS3(test_evaluate_operand, "0xw3", &memory, 0x0056ABU); /* out of range */
436
+ TEST_PARAMS3(test_evaluate_operand, "~0xw2", &memory, 0xA954CBU);
437
+
438
+ /* thirty-two-bit */
439
+ TEST_PARAMS3(test_evaluate_operand, "0xx0", &memory, 0xAB341200U);
440
+ TEST_PARAMS3(test_evaluate_operand, "0xx1", &memory, 0x56AB3412U);
441
+ TEST_PARAMS3(test_evaluate_operand, "0xx3", &memory, 0x000056ABU); /* out of range */
442
+ TEST_PARAMS3(test_evaluate_operand, "~0xx1", &memory, 0xA954CBEDU);
443
+ TEST_PARAMS3(test_evaluate_operand, "~0xx3", &memory, 0xFFFFA954U); /* out of range */
444
+
445
+ /* sixteen-bit big endian*/
446
+ TEST_PARAMS3(test_evaluate_operand, "0xi0", &memory, 0x0012U);
447
+ TEST_PARAMS3(test_evaluate_operand, "0xi3", &memory, 0xAB56U);
448
+ TEST_PARAMS3(test_evaluate_operand, "0xi4", &memory, 0x5600U); /* out of range */
449
+ TEST_PARAMS3(test_evaluate_operand, "~0xi3", &memory, 0x54A9U);
450
+
451
+ /* twenty-four-bit big endian */
452
+ TEST_PARAMS3(test_evaluate_operand, "0xj0", &memory, 0x001234U);
453
+ TEST_PARAMS3(test_evaluate_operand, "0xj1", &memory, 0x1234ABU);
454
+ TEST_PARAMS3(test_evaluate_operand, "0xj3", &memory, 0xAB5600U); /* out of range */
455
+ TEST_PARAMS3(test_evaluate_operand, "~0xj1", &memory, 0xEDCB54U);
456
+ TEST_PARAMS3(test_evaluate_operand, "~0xj3", &memory, 0x54A9FFU); /* out of range */
457
+
458
+ /* thirty-two-bit big endian */
459
+ TEST_PARAMS3(test_evaluate_operand, "0xg0", &memory, 0x001234ABU);
460
+ TEST_PARAMS3(test_evaluate_operand, "0xg1", &memory, 0x1234AB56U);
461
+ TEST_PARAMS3(test_evaluate_operand, "0xg3", &memory, 0xAB560000U); /* out of range */
462
+ TEST_PARAMS3(test_evaluate_operand, "~0xg1", &memory, 0xEDCB54A9U);
463
+ TEST_PARAMS3(test_evaluate_operand, "~0xg3", &memory, 0x54A9FFFFU); /* out of range */
464
+
465
+ /* nibbles */
466
+ TEST_PARAMS3(test_evaluate_operand, "0xu0", &memory, 0x0U);
467
+ TEST_PARAMS3(test_evaluate_operand, "0xu1", &memory, 0x1U);
468
+ TEST_PARAMS3(test_evaluate_operand, "0xu4", &memory, 0x5U);
469
+ TEST_PARAMS3(test_evaluate_operand, "0xu5", &memory, 0x0U); /* out of range */
470
+ TEST_PARAMS3(test_evaluate_operand, "~0xu4", &memory, 0xAU);
471
+
472
+ TEST_PARAMS3(test_evaluate_operand, "0xl0", &memory, 0x0U);
473
+ TEST_PARAMS3(test_evaluate_operand, "0xl1", &memory, 0x2U);
474
+ TEST_PARAMS3(test_evaluate_operand, "0xl4", &memory, 0x6U);
475
+ TEST_PARAMS3(test_evaluate_operand, "0xl5", &memory, 0x0U); /* out of range */
476
+ TEST_PARAMS3(test_evaluate_operand, "~0xl4", &memory, 0x9U);
477
+
478
+ /* bits */
479
+ TEST_PARAMS3(test_evaluate_operand, "0xm0", &memory, 0x0U);
480
+ TEST_PARAMS3(test_evaluate_operand, "0xm3", &memory, 0x1U);
481
+ TEST_PARAMS3(test_evaluate_operand, "0xn3", &memory, 0x1U);
482
+ TEST_PARAMS3(test_evaluate_operand, "0xo3", &memory, 0x0U);
483
+ TEST_PARAMS3(test_evaluate_operand, "0xp3", &memory, 0x1U);
484
+ TEST_PARAMS3(test_evaluate_operand, "0xq3", &memory, 0x0U);
485
+ TEST_PARAMS3(test_evaluate_operand, "0xr3", &memory, 0x1U);
486
+ TEST_PARAMS3(test_evaluate_operand, "0xs3", &memory, 0x0U);
487
+ TEST_PARAMS3(test_evaluate_operand, "0xt3", &memory, 0x1U);
488
+ TEST_PARAMS3(test_evaluate_operand, "0xm5", &memory, 0x0U); /* out of range */
489
+ TEST_PARAMS3(test_evaluate_operand, "~0xm0", &memory, 0x1U);
490
+ TEST_PARAMS3(test_evaluate_operand, "~0xm3", &memory, 0x0U);
491
+ TEST_PARAMS3(test_evaluate_operand, "~0xn3", &memory, 0x0U);
492
+ TEST_PARAMS3(test_evaluate_operand, "~0xo3", &memory, 0x1U);
493
+ TEST_PARAMS3(test_evaluate_operand, "~0xp3", &memory, 0x0U);
494
+ TEST_PARAMS3(test_evaluate_operand, "~0xq3", &memory, 0x1U);
495
+ TEST_PARAMS3(test_evaluate_operand, "~0xr3", &memory, 0x0U);
496
+ TEST_PARAMS3(test_evaluate_operand, "~0xs3", &memory, 0x1U);
497
+ TEST_PARAMS3(test_evaluate_operand, "~0xt3", &memory, 0x0U);
498
+
499
+ /* bit count */
500
+ TEST_PARAMS3(test_evaluate_operand, "0xk00", &memory, 0U); /* 0 bits in 0x00 */
501
+ TEST_PARAMS3(test_evaluate_operand, "0xk01", &memory, 2U); /* 2 bits in 0x12 */
502
+ TEST_PARAMS3(test_evaluate_operand, "0xk02", &memory, 3U); /* 3 bits in 0x34 */
503
+ TEST_PARAMS3(test_evaluate_operand, "0xk03", &memory, 5U); /* 5 bits in 0xAB */
504
+ TEST_PARAMS3(test_evaluate_operand, "0xk04", &memory, 4U); /* 4 bits in 0x56 */
505
+
506
+ /* BCD */
507
+ TEST_PARAMS3(test_evaluate_operand, "b0xh3", &memory, 111U); /* 0xAB not technically valid in BCD */
508
+
509
+ ram[3] = 0x56; /* 0xAB not valid in BCD */
510
+ ram[4] = 0x78;
511
+ TEST_PARAMS3(test_evaluate_operand, "b0xh0", &memory, 00U);
512
+ TEST_PARAMS3(test_evaluate_operand, "b0xh1", &memory, 12U);
513
+ TEST_PARAMS3(test_evaluate_operand, "b0x 1", &memory, 3412U);
514
+ TEST_PARAMS3(test_evaluate_operand, "b0xw1", &memory, 563412U);
515
+ TEST_PARAMS3(test_evaluate_operand, "b0xx1", &memory, 78563412U);
516
+ TEST_PARAMS3(test_evaluate_operand, "b0xi1", &memory, 1234U);
517
+ TEST_PARAMS3(test_evaluate_operand, "b0xj1", &memory, 123456U);
518
+ TEST_PARAMS3(test_evaluate_operand, "b0xg1", &memory, 12345678U);
519
+ }
520
+
521
+ static void test_evaluate_delta_memory_reference() {
522
+ uint8_t ram[] = {0x00, 0x12, 0x34, 0xAB, 0x56};
523
+ memory_t memory;
524
+ rc_operand_t op;
525
+ const char* memaddr;
526
+ rc_parse_state_t parse;
527
+ char buffer[256];
528
+ rc_memrefs_t memrefs;
529
+
530
+ memory.ram = ram;
531
+ memory.size = sizeof(ram);
532
+
533
+ memaddr = "d0xh1";
534
+ rc_init_parse_state(&parse, buffer);
535
+ rc_init_parse_state_memrefs(&parse, &memrefs);
536
+ rc_parse_operand(&op, &memaddr, &parse);
537
+ rc_destroy_parse_state(&parse);
538
+
539
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x00); /* first call gets uninitialized value */
540
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x12); /* second gets current value */
541
+
542
+ /* RC_OPERAND_DELTA is always one frame behind */
543
+ ram[1] = 0x13;
544
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x12U);
545
+
546
+ ram[1] = 0x14;
547
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x13U);
548
+
549
+ ram[1] = 0x15;
550
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x14U);
551
+
552
+ ram[1] = 0x16;
553
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x15U);
554
+
555
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x16U);
556
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x16U);
557
+ }
558
+
559
+ void test_evaluate_prior_memory_reference() {
560
+ uint8_t ram[] = { 0x00, 0x12, 0x34, 0xAB, 0x56 };
561
+ memory_t memory;
562
+ rc_operand_t op;
563
+ const char* memaddr;
564
+ rc_parse_state_t parse;
565
+ char buffer[256];
566
+ rc_memrefs_t memrefs;
567
+
568
+ memory.ram = ram;
569
+ memory.size = sizeof(ram);
570
+
571
+ memaddr = "p0xh1";
572
+ rc_init_parse_state(&parse, buffer);
573
+ rc_init_parse_state_memrefs(&parse, &memrefs);
574
+ rc_parse_operand(&op, &memaddr, &parse);
575
+ rc_destroy_parse_state(&parse);
576
+
577
+ /* RC_OPERAND_PRIOR only updates when the memory value changes */
578
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x00); /* first call gets uninitialized value */
579
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x00); /* value only changes when memory changes */
580
+
581
+ ram[1] = 0x13;
582
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x12U);
583
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x12U);
584
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x12U);
585
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x12U);
586
+
587
+ ram[1] = 0x14;
588
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x13U);
589
+
590
+ ram[1] = 0x15;
591
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x14U);
592
+
593
+ ram[1] = 0x16;
594
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x15U);
595
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x15U);
596
+ ASSERT_UNUM_EQUALS(evaluate_operand(&op, &memory, &memrefs), 0x15U);
597
+ }
598
+
599
+ static void test_evaluate_memory_references_float() {
600
+ uint8_t ram[] = {0x00, 0x00, 0x80, 0x3F, 0x81, 0x00, 0x00, 0x00, 0x00, 0x81};
601
+ memory_t memory;
602
+ memory.ram = ram;
603
+ memory.size = sizeof(ram);
604
+
605
+ TEST_PARAMS3(test_evaluate_operand_float, "fF0", &memory, 1.0); /* IEE754 float */
606
+ TEST_PARAMS3(test_evaluate_operand_float, "fM4", &memory, 1.0); /* MBF32 float */
607
+ TEST_PARAMS3(test_evaluate_operand_float, "fL6", &memory, 1.0); /* MBF32_LE float */
608
+
609
+ /* BCD and inversion are not supported for floats - behaves as if the prefix wasn't present */
610
+ TEST_PARAMS3(test_evaluate_operand_float, "bfF0", &memory, 1.0); /* IEE754 float */
611
+ TEST_PARAMS3(test_evaluate_operand_float, "bfM4", &memory, 1.0); /* MBF32 float */
612
+ TEST_PARAMS3(test_evaluate_operand_float, "bfL6", &memory, 1.0); /* MBF32_LE float */
613
+ TEST_PARAMS3(test_evaluate_operand_float, "~fF0", &memory, 1.0); /* IEE754 float */
614
+ TEST_PARAMS3(test_evaluate_operand_float, "~fM4", &memory, 1.0); /* MBF32 float */
615
+ TEST_PARAMS3(test_evaluate_operand_float, "~fL6", &memory, 1.0); /* MBF32_LE float */
616
+
617
+ ram[2] = 0x00; ram[3] = 0x40; /* set IEE754 float to 2.0 */
618
+ ram[4] = 0x83; ram[5] = 0x40; /* set MBF32 float to 6.0 */
619
+ ram[9] = 0x83; ram[8] = 0x00; /* set MBF32_LE float to 4.0 */
620
+
621
+ TEST_PARAMS3(test_evaluate_operand_float, "fF0", &memory, 2.0); /* IEE754 float */
622
+ TEST_PARAMS3(test_evaluate_operand_float, "fM4", &memory, 6.0); /* MBF32 float */
623
+ TEST_PARAMS3(test_evaluate_operand_float, "fL6", &memory, 4.0); /* MBF32_LE float */
624
+ TEST_PARAMS3(test_evaluate_operand_float, "bfF0", &memory, 2.0); /* IEE754 float */
625
+ TEST_PARAMS3(test_evaluate_operand_float, "bfM4", &memory, 6.0); /* MBF32 float */
626
+ TEST_PARAMS3(test_evaluate_operand_float, "bfL6", &memory, 4.0); /* MBF32_LE float */
627
+ TEST_PARAMS3(test_evaluate_operand_float, "~fF0", &memory, 2.0); /* IEE754 float */
628
+ TEST_PARAMS3(test_evaluate_operand_float, "~fM4", &memory, 6.0); /* MBF32 float */
629
+ TEST_PARAMS3(test_evaluate_operand_float, "~fL6", &memory, 4.0); /* MBF32_LE float */
630
+ }
631
+
632
+ static void test_evaluate_delta_memory_reference_float() {
633
+ uint8_t ram[] = {0x00, 0x00, 0x80, 0x3F};
634
+ memory_t memory;
635
+ rc_operand_t op;
636
+ const char* memaddr;
637
+ rc_parse_state_t parse;
638
+ char buffer[256];
639
+ rc_memrefs_t memrefs;
640
+
641
+ memory.ram = ram;
642
+ memory.size = sizeof(ram);
643
+
644
+ memaddr = "dff0";
645
+ rc_init_parse_state(&parse, buffer);
646
+ rc_init_parse_state_memrefs(&parse, &memrefs);
647
+ rc_parse_operand(&op, &memaddr, &parse);
648
+ rc_destroy_parse_state(&parse);
649
+
650
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 0.0); /* first call gets uninitialized value */
651
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 1.0); /* second gets current value */
652
+
653
+ /* RC_OPERAND_DELTA is always one frame behind */
654
+ ram[3] = 0x40;
655
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 1.0);
656
+
657
+ ram[3] = 0x41;
658
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 4.0);
659
+
660
+ ram[3] = 0x42;
661
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 16.0);
662
+
663
+ ram[3] = 0x43;
664
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 64.0);
665
+
666
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 256.0);
667
+ ASSERT_NUM_EQUALS(evaluate_operand_float(&op, &memory, &memrefs), 256.0);
668
+ }
669
+
670
+ void test_operand(void) {
671
+ TEST_SUITE_BEGIN();
672
+
673
+ test_parse_memory_references();
674
+ test_parse_delta_memory_references();
675
+ test_parse_prior_memory_references();
676
+ test_parse_bcd_memory_references();
677
+ test_parse_inverted_memory_references();
678
+
679
+ test_parse_unsigned_values();
680
+ test_parse_signed_values();
681
+ test_parse_hex_values();
682
+ test_parse_float_values();
683
+
684
+ test_evaluate_memory_references();
685
+ TEST(test_evaluate_delta_memory_reference);
686
+ TEST(test_evaluate_prior_memory_reference);
687
+
688
+ test_evaluate_memory_references_float();
689
+ TEST(test_evaluate_delta_memory_reference_float);
690
+
691
+ TEST_SUITE_END();
692
+ }