emoemu 0.1.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 (213) hide show
  1. package/.claude/settings.local.json +77 -0
  2. package/.node-version +1 -0
  3. package/CLAUDE.md +435 -0
  4. package/README.md +404 -0
  5. package/TODO.md +655 -0
  6. package/dist/index.cjs +25108 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +25085 -0
  9. package/docs/building-libretro-cores-arm-mac.md +237 -0
  10. package/docs/config-file-format.md +488 -0
  11. package/docs/cores-trd.md +425 -0
  12. package/docs/headless-hardware-rendering-trd.md +676 -0
  13. package/docs/libretro-cores-trd.md +997 -0
  14. package/docs/mupen64-software-rendering-trd.md +751 -0
  15. package/docs/n64-support-trd.md +306 -0
  16. package/docs/native-rendering-trd.md +540 -0
  17. package/docs/native-ui-rendering-trd.md +1195 -0
  18. package/docs/netplay-trd.md +665 -0
  19. package/docs/retroarch-netplay-docs.md +277 -0
  20. package/docs/save-state-format.md +666 -0
  21. package/eslint.config.js +111 -0
  22. package/icon/icon.png +0 -0
  23. package/icon/icon.pxd +0 -0
  24. package/package.json +63 -0
  25. package/pnpm-workspace.yaml +10 -0
  26. package/src/Emulator/consts.ts +14 -0
  27. package/src/Emulator/index.ts +2496 -0
  28. package/src/Emulator/saveState/index.ts +155 -0
  29. package/src/Emulator/screenshot/index.ts +160 -0
  30. package/src/Emulator/terminalDimensions/index.ts +79 -0
  31. package/src/Emulator/types.ts +83 -0
  32. package/src/cli/commands/consts.ts +10 -0
  33. package/src/cli/commands/index.ts +462 -0
  34. package/src/cli/parseArgs/consts.ts +17 -0
  35. package/src/cli/parseArgs/index.ts +457 -0
  36. package/src/cli/parseArgs/types.ts +61 -0
  37. package/src/cli/runEmulator/index.ts +406 -0
  38. package/src/cli/runEmulator/types.ts +7 -0
  39. package/src/consts.ts +19 -0
  40. package/src/core/button/consts.ts +35 -0
  41. package/src/core/button/index.ts +123 -0
  42. package/src/core/core.ts +300 -0
  43. package/src/core/index.ts +19 -0
  44. package/src/cores/libretro/api/index.ts +334 -0
  45. package/src/cores/libretro/api/types.ts +148 -0
  46. package/src/cores/libretro/callbacks/consts.ts +41 -0
  47. package/src/cores/libretro/callbacks/index.ts +456 -0
  48. package/src/cores/libretro/consts.ts +45 -0
  49. package/src/cores/libretro/coreOptions/consts.ts +36 -0
  50. package/src/cores/libretro/coreOptions/index.ts +222 -0
  51. package/src/cores/libretro/environment/consts.ts +118 -0
  52. package/src/cores/libretro/environment/index.ts +1095 -0
  53. package/src/cores/libretro/index.ts +937 -0
  54. package/src/cores/libretro/loader/index.ts +496 -0
  55. package/src/cores/libretro/pixelFormat/consts.ts +43 -0
  56. package/src/cores/libretro/pixelFormat/index.ts +397 -0
  57. package/src/cores/libretro/types.ts +339 -0
  58. package/src/frontend/AudioManager/index.ts +420 -0
  59. package/src/frontend/SettingsManager/index.ts +250 -0
  60. package/src/frontend/config/index.ts +608 -0
  61. package/src/frontend/config/tests.ts +354 -0
  62. package/src/frontend/config/types.ts +36 -0
  63. package/src/frontend/consts.ts +114 -0
  64. package/src/frontend/coreBuilder/index.ts +644 -0
  65. package/src/frontend/coreBuilder/types.ts +15 -0
  66. package/src/frontend/coreDownloader/index.ts +620 -0
  67. package/src/frontend/coreDownloader/types.ts +17 -0
  68. package/src/frontend/corePreferences/index.ts +69 -0
  69. package/src/frontend/coreRegistry/index.ts +276 -0
  70. package/src/frontend/directoryCache/index.ts +75 -0
  71. package/src/frontend/index.ts +79 -0
  72. package/src/frontend/notifications/consts.ts +14 -0
  73. package/src/frontend/notifications/index.ts +250 -0
  74. package/src/frontend/playlist/consts.ts +168 -0
  75. package/src/frontend/playlist/index.ts +899 -0
  76. package/src/frontend/playlist/labelFormatter/consts.ts +15 -0
  77. package/src/frontend/playlist/labelFormatter/index.ts +155 -0
  78. package/src/frontend/playlist/labelFormatter/tests.ts +153 -0
  79. package/src/frontend/playlist/reader/index.ts +559 -0
  80. package/src/frontend/playlist/sync/index.ts +511 -0
  81. package/src/frontend/playlist/systemLookup/index.ts +233 -0
  82. package/src/frontend/playlist/utils/index.ts +50 -0
  83. package/src/frontend/romScanner/consts.ts +348 -0
  84. package/src/frontend/romScanner/index.ts +1957 -0
  85. package/src/frontend/saveServices/consts.ts +2 -0
  86. package/src/frontend/saveServices/index.ts +313 -0
  87. package/src/frontend/serviceProvider/index.ts +108 -0
  88. package/src/frontend/serviceProvider/types.ts +13 -0
  89. package/src/index.ts +428 -0
  90. package/src/input/Controller/consts.ts +50 -0
  91. package/src/input/Controller/index.ts +81 -0
  92. package/src/input/GamepadManager/consts.ts +22 -0
  93. package/src/input/GamepadManager/index.ts +418 -0
  94. package/src/input/InputManager/consts.ts +86 -0
  95. package/src/input/InputManager/index.ts +593 -0
  96. package/src/input/InputMapper/consts.ts +33 -0
  97. package/src/input/InputMapper/index.ts +436 -0
  98. package/src/input/consts.ts +410 -0
  99. package/src/input/gamepadProfiles/index.ts +1100 -0
  100. package/src/input/index.ts +38 -0
  101. package/src/input/inputUtils/index.ts +31 -0
  102. package/src/netplay/FrameBuffer/consts.ts +2 -0
  103. package/src/netplay/FrameBuffer/index.ts +364 -0
  104. package/src/netplay/FrameBuffer/tests.ts +286 -0
  105. package/src/netplay/InputBuffer/consts.ts +7 -0
  106. package/src/netplay/InputBuffer/index.ts +347 -0
  107. package/src/netplay/InputBuffer/tests.ts +166 -0
  108. package/src/netplay/NetplayClient/index.ts +976 -0
  109. package/src/netplay/NetplayConnection/index.ts +536 -0
  110. package/src/netplay/NetplayDiscovery/consts.ts +41 -0
  111. package/src/netplay/NetplayDiscovery/index.ts +525 -0
  112. package/src/netplay/NetplayServer/index.ts +1407 -0
  113. package/src/netplay/SyncManager/index.ts +984 -0
  114. package/src/netplay/SyncManager/tests.ts +419 -0
  115. package/src/netplay/consts.ts +371 -0
  116. package/src/netplay/crc32/consts.ts +14 -0
  117. package/src/netplay/crc32/index.ts +97 -0
  118. package/src/netplay/crc32/tests.ts +40 -0
  119. package/src/netplay/index.ts +41 -0
  120. package/src/netplay/netplayLogger/consts.ts +30 -0
  121. package/src/netplay/netplayLogger/index.ts +345 -0
  122. package/src/netplay/protocol/consts.ts +86 -0
  123. package/src/netplay/protocol/index.ts +1280 -0
  124. package/src/netplay/protocol/tests.ts +606 -0
  125. package/src/netplay/protocol/types.ts +20 -0
  126. package/src/netplay/types.ts +395 -0
  127. package/src/rendering/KittyRenderer/index.ts +616 -0
  128. package/src/rendering/NativeRenderer/index.ts +279 -0
  129. package/src/rendering/NativeRenderer/tests.ts +133 -0
  130. package/src/rendering/TerminalRenderer/index.ts +770 -0
  131. package/src/rendering/consts.ts +401 -0
  132. package/src/rendering/fonts/CozetteVector.ttf +0 -0
  133. package/src/rendering/index.ts +26 -0
  134. package/src/rendering/nativeUi/NativeWindowManager/index.ts +158 -0
  135. package/src/rendering/nativeUi/NativeWindowManager/tests.ts +81 -0
  136. package/src/rendering/nativeUi/consts.ts +6 -0
  137. package/src/rendering/nativeUi/index.ts +20 -0
  138. package/src/rendering/postProcessing/consts.ts +38 -0
  139. package/src/rendering/postProcessing/index.ts +923 -0
  140. package/src/rendering/shared/ansi/consts.ts +12 -0
  141. package/src/rendering/shared/ansi/index.ts +104 -0
  142. package/src/rendering/shared/consts.ts +2 -0
  143. package/src/rendering/shared/fitToTerminal/index.ts +67 -0
  144. package/src/ui/AddRomsPrompt/consts.ts +13 -0
  145. package/src/ui/AddRomsPrompt/index.tsx +781 -0
  146. package/src/ui/App/consts.ts +2 -0
  147. package/src/ui/App/index.tsx +456 -0
  148. package/src/ui/AppCapabilities/index.tsx +67 -0
  149. package/src/ui/ConfigContext/index.tsx +56 -0
  150. package/src/ui/CoreManager/consts.ts +11 -0
  151. package/src/ui/CoreManager/index.tsx +779 -0
  152. package/src/ui/CoreSelector/consts.ts +2 -0
  153. package/src/ui/CoreSelector/index.tsx +251 -0
  154. package/src/ui/DialogContainer/index.tsx +42 -0
  155. package/src/ui/DialogOptionsList/index.tsx +61 -0
  156. package/src/ui/DuplicateCrcPrompt/consts.ts +5 -0
  157. package/src/ui/DuplicateCrcPrompt/index.tsx +146 -0
  158. package/src/ui/GamepadContext/consts.ts +15 -0
  159. package/src/ui/GamepadContext/index.tsx +295 -0
  160. package/src/ui/NativeDialog/index.tsx +120 -0
  161. package/src/ui/NetplayDisconnectedDialog/index.tsx +93 -0
  162. package/src/ui/NetplayPauseMenu/consts.ts +2 -0
  163. package/src/ui/NetplayPauseMenu/index.tsx +97 -0
  164. package/src/ui/RomBrowser/NetplayPanel/consts.ts +24 -0
  165. package/src/ui/RomBrowser/NetplayPanel/index.tsx +520 -0
  166. package/src/ui/RomBrowser/SettingsPanel/index.tsx +478 -0
  167. package/src/ui/RomBrowser/consts.ts +61 -0
  168. package/src/ui/RomBrowser/index.tsx +1164 -0
  169. package/src/ui/RomBrowser/settingsConfig/index.ts +320 -0
  170. package/src/ui/RomBrowser/types.ts +67 -0
  171. package/src/ui/SaveStateDialog/consts.ts +2 -0
  172. package/src/ui/SaveStateDialog/index.tsx +225 -0
  173. package/src/ui/WarningDialog/index.tsx +113 -0
  174. package/src/ui/consts.ts +27 -0
  175. package/src/ui/hooks/useClearTerminal/consts.ts +2 -0
  176. package/src/ui/hooks/useClearTerminal/index.ts +37 -0
  177. package/src/ui/hooks/useDialogNavigation/index.ts +99 -0
  178. package/src/ui/hooks/useGamepad/consts.ts +21 -0
  179. package/src/ui/hooks/useGamepad/index.ts +194 -0
  180. package/src/ui/index.ts +27 -0
  181. package/src/utils/buffer/consts.ts +17 -0
  182. package/src/utils/buffer/index.ts +129 -0
  183. package/src/utils/color/consts.ts +58 -0
  184. package/src/utils/color/index.ts +183 -0
  185. package/src/utils/compression/consts.ts +50 -0
  186. package/src/utils/compression/index.ts +101 -0
  187. package/src/utils/consts.ts +2 -0
  188. package/src/utils/crc32/consts.ts +22 -0
  189. package/src/utils/crc32/index.ts +83 -0
  190. package/src/utils/ensureDirectory/index.ts +10 -0
  191. package/src/utils/format/consts.ts +8 -0
  192. package/src/utils/format/index.ts +53 -0
  193. package/src/utils/getErrorMessage/index.ts +10 -0
  194. package/src/utils/index.ts +113 -0
  195. package/src/utils/ini/index.ts +200 -0
  196. package/src/utils/kitty/consts.ts +13 -0
  197. package/src/utils/kitty/index.ts +181 -0
  198. package/src/utils/logger/consts.ts +35 -0
  199. package/src/utils/logger/index.ts +217 -0
  200. package/src/utils/paths/consts.ts +18 -0
  201. package/src/utils/paths/index.ts +151 -0
  202. package/src/utils/png/consts.ts +34 -0
  203. package/src/utils/png/index.ts +131 -0
  204. package/src/utils/readJsonFile/index.ts +16 -0
  205. package/src/utils/rotateLogFile/index.ts +44 -0
  206. package/src/utils/safeClose/index.ts +10 -0
  207. package/src/utils/terminal/consts.ts +8 -0
  208. package/src/utils/terminal/index.ts +102 -0
  209. package/src/utils/thumbnailRenderer/consts.ts +2 -0
  210. package/src/utils/thumbnailRenderer/index.ts +147 -0
  211. package/src/utils/typedError/index.ts +26 -0
  212. package/tsconfig.json +31 -0
  213. package/vitest.config.ts +13 -0
@@ -0,0 +1,237 @@
1
+ # Building Libretro Cores for ARM Macs
2
+
3
+ This guide explains how to build libretro cores from source for Apple Silicon (M1/M2/M3/M4) Macs.
4
+
5
+ ## Automatic Building
6
+
7
+ **emoemu automatically builds certain cores from source on ARM Macs.** When you try to download a core that requires building (like `mupen64plus_next` for N64), emoemu will:
8
+
9
+ 1. Detect that you're on ARM macOS
10
+ 2. Clone the source repository
11
+ 3. Build with the correct flags for software rendering
12
+ 4. Install the built core to your cores directory
13
+
14
+ This happens transparently through the Core Manager UI or when the core is needed.
15
+
16
+ **Requirements for automatic building:**
17
+ - Xcode command-line tools (`xcode-select --install`)
18
+ - Git (included with Xcode CLI tools)
19
+
20
+ ---
21
+
22
+ ## Why Build From Source?
23
+
24
+ ### Pre-built Core Availability
25
+
26
+ The libretro/RetroArch project provides pre-built cores, but **ARM64 macOS cores are not officially distributed**. The buildbot only provides:
27
+
28
+ | Platform | Architecture | Pre-built Available |
29
+ |----------|--------------|---------------------|
30
+ | macOS | x86_64 (Intel) | Yes |
31
+ | macOS | arm64 (Apple Silicon) | **No** |
32
+ | Linux | x86_64, arm64 | Yes |
33
+ | Windows | x86_64 | Yes |
34
+
35
+ This means ARM Mac users must either:
36
+ 1. Run x86_64 cores under Rosetta 2 (slower, compatibility issues)
37
+ 2. Build cores from source natively (recommended)
38
+
39
+ ### Software Rendering Requirement
40
+
41
+ For emoemu specifically, we need cores that can render without OpenGL/Vulkan since terminal output doesn't have GPU acceleration. The N64 core (mupen64plus-next) defaults to GlideN64 which requires OpenGL. Building from source ensures we have the Angrylion software renderer available.
42
+
43
+ ---
44
+
45
+ ## Prerequisites
46
+
47
+ Install Xcode command-line tools and build dependencies:
48
+
49
+ ```bash
50
+ # Xcode CLI tools
51
+ xcode-select --install
52
+
53
+ # Build tools (via Homebrew)
54
+ brew install cmake nasm pkg-config
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Building Mupen64Plus-Next (N64)
60
+
61
+ The mupen64plus-next core is the recommended N64 emulator. It includes multiple RDP plugins, including Angrylion for software-only rendering.
62
+
63
+ ### Clone and Build
64
+
65
+ ```bash
66
+ # Clone the repository
67
+ git clone https://github.com/libretro/mupen64plus-libretro-nx.git
68
+ cd mupen64plus-libretro-nx
69
+
70
+ # Build for ARM64 macOS
71
+ # HAVE_PARALLEL_RDP=0 disables Vulkan-dependent ParaLLEl RDP
72
+ # WITH_DYNAREC=aarch64 enables the ARM64 dynamic recompiler
73
+ make -j$(sysctl -n hw.ncpu) platform=osx HAVE_PARALLEL_RDP=0 WITH_DYNAREC=aarch64
74
+ ```
75
+
76
+ ### Build Output
77
+
78
+ The build produces:
79
+ ```
80
+ mupen64plus_next_libretro.dylib
81
+ ```
82
+
83
+ ### Install the Core
84
+
85
+ Copy to emoemu's cores directory:
86
+
87
+ ```bash
88
+ # Create cores directory if needed
89
+ mkdir -p ~/.config/emoemu/cores
90
+
91
+ # Copy the built core
92
+ cp mupen64plus_next_libretro.dylib ~/.config/emoemu/cores/
93
+ ```
94
+
95
+ Or to the system-wide RetroArch location (if using RetroArch as well):
96
+
97
+ ```bash
98
+ cp mupen64plus_next_libretro.dylib ~/Library/Application\ Support/RetroArch/cores/
99
+ ```
100
+
101
+ ---
102
+
103
+ ## Core Configuration for Software Rendering
104
+
105
+ After building, configure the core to use software rendering. Create or edit the core options file:
106
+
107
+ **Global options** (`~/.config/emoemu/retroarch-core-options.cfg`):
108
+ ```ini
109
+ mupen64plus-rdp-plugin = "angrylion"
110
+ mupen64plus-rsp-plugin = "parallel"
111
+ mupen64plus-cpucore = "dynamic_recompiler"
112
+ mupen64plus-angrylion-multithread = "all threads"
113
+ ```
114
+
115
+ Or use emoemu's built-in preset:
116
+
117
+ ```bash
118
+ # emoemu automatically applies software rendering settings for N64
119
+ emoemu game.z64 --core libretro-mupen64plus-next
120
+ ```
121
+
122
+ ### Plugin Options Explained
123
+
124
+ | Option | Value | Purpose |
125
+ |--------|-------|---------|
126
+ | `rdp-plugin` | `angrylion` | Software RDP renderer (no GPU needed) |
127
+ | `rsp-plugin` | `parallel` | Fast RSP with ARM64 dynarec |
128
+ | `cpucore` | `dynamic_recompiler` | ARM64 CPU dynarec for performance |
129
+ | `angrylion-multithread` | `all threads` | Use all CPU cores for rendering |
130
+
131
+ ---
132
+
133
+ ## Building Other Cores
134
+
135
+ ### General Build Process
136
+
137
+ Most libretro cores follow a similar pattern:
138
+
139
+ ```bash
140
+ git clone https://github.com/libretro/<core-name>.git
141
+ cd <core-name>
142
+ make -j$(sysctl -n hw.ncpu) platform=osx
143
+ ```
144
+
145
+ ### Common Build Variables
146
+
147
+ | Variable | Purpose | Example |
148
+ |----------|---------|---------|
149
+ | `platform=osx` | Target macOS | Required |
150
+ | `ARCH=arm64` | Force ARM64 (usually auto-detected) | Optional |
151
+ | `-j$(sysctl -n hw.ncpu)` | Parallel build with all cores | Recommended |
152
+
153
+ ### Cores Tested on ARM Mac
154
+
155
+ | Core | Repository | Notes |
156
+ |------|------------|-------|
157
+ | mupen64plus-next | `libretro/mupen64plus-libretro-nx` | N64, use `HAVE_PARALLEL_RDP=0` |
158
+ | snes9x | `libretro/snes9x` | SNES, builds cleanly |
159
+ | genesis-plus-gx | `libretro/Genesis-Plus-GX` | Genesis/Mega Drive |
160
+ | mgba | `libretro/mgba` | GBA |
161
+ | nestopia | `libretro/nestopia` | NES (alternative to native) |
162
+
163
+ ---
164
+
165
+ ## Troubleshooting
166
+
167
+ ### "OpenGL support required" Error
168
+
169
+ If you see this error at runtime:
170
+ ```
171
+ mupen64plus: libretro frontend doesn't have OpenGL support
172
+ ```
173
+
174
+ The core is trying to use GlideN64 (OpenGL-based renderer). Solutions:
175
+
176
+ 1. **Set core options before loading**: Ensure `mupen64plus-rdp-plugin = "angrylion"` is set
177
+ 2. **Check option file location**: Options must be in the correct config path
178
+ 3. **Verify GET_VARIABLE works**: The frontend must properly return option values to the core
179
+
180
+ ### Build Fails with ARM64 Errors
181
+
182
+ If the build fails on ARM64-specific code:
183
+
184
+ ```bash
185
+ # Explicitly set architecture
186
+ make platform=osx ARCH=arm64
187
+ ```
188
+
189
+ ### Missing Dependencies
190
+
191
+ ```bash
192
+ # Install common build dependencies
193
+ brew install cmake nasm pkg-config zlib libpng
194
+ ```
195
+
196
+ ### Core Crashes on Load
197
+
198
+ 1. Verify the `.dylib` is ARM64:
199
+ ```bash
200
+ file mupen64plus_next_libretro.dylib
201
+ # Should show: Mach-O 64-bit dynamically linked shared library arm64
202
+ ```
203
+
204
+ 2. Check for missing symbols:
205
+ ```bash
206
+ nm -u mupen64plus_next_libretro.dylib
207
+ ```
208
+
209
+ ---
210
+
211
+ ## Performance Notes
212
+
213
+ ### ARM64 Advantages
214
+
215
+ Apple Silicon provides excellent single-threaded performance, which benefits:
216
+ - CPU emulation (dynamic recompiler)
217
+ - Angrylion multi-threaded rendering
218
+
219
+ ### Expected N64 Performance
220
+
221
+ | Chip | Angrylion Performance |
222
+ |------|----------------------|
223
+ | M1 | 45-60 FPS (most games) |
224
+ | M1 Pro/Max | 60 FPS (consistent) |
225
+ | M2/M3/M4 | 60 FPS (all games) |
226
+
227
+ Performance depends on:
228
+ - Game complexity (Zelda OoT is demanding)
229
+ - `angrylion-multithread` setting
230
+ - Background system load
231
+
232
+ ---
233
+
234
+ ## Related Documentation
235
+
236
+ - [N64 Support TRD](n64-support-trd.md) - Detailed N64 emulation requirements
237
+ - [Libretro Cores TRD](libretro-cores-trd.md) - General libretro integration