web-a2e 1.0.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 (295) hide show
  1. package/.clangd +5 -0
  2. package/.mcp.json +12 -0
  3. package/CLAUDE.md +362 -0
  4. package/CMakeLists.txt +774 -0
  5. package/LICENSE +21 -0
  6. package/README.md +392 -0
  7. package/build-wasm/generated/roms.cpp +2447 -0
  8. package/docker-compose.staging.yml +9 -0
  9. package/docs/basic-rom-disassembly.md +6663 -0
  10. package/docs/softswitch-comparison.md +273 -0
  11. package/docs/thunderclock-debug.md +89 -0
  12. package/examples/cube.bas +72 -0
  13. package/examples/hello.s +55 -0
  14. package/examples/scroll.s +140 -0
  15. package/package.json +18 -0
  16. package/public/assets/apple-logo-old.png +0 -0
  17. package/public/assets/apple-logo.png +0 -0
  18. package/public/assets/drive-closed-light-on.png +0 -0
  19. package/public/assets/drive-closed.png +0 -0
  20. package/public/assets/drive-open-light-on.png +0 -0
  21. package/public/assets/drive-open.png +0 -0
  22. package/public/audio-worklet.js +82 -0
  23. package/public/disks/Apple DOS 3.3 January 1983.dsk +0 -0
  24. package/public/disks/ProDOS 2.4.3.po +0 -0
  25. package/public/disks/h32mb.2mg +0 -0
  26. package/public/disks/library.json +26 -0
  27. package/public/docs/llms/llm-assembler.txt +90 -0
  28. package/public/docs/llms/llm-basic-program.txt +256 -0
  29. package/public/docs/llms/llm-disk-drives.txt +72 -0
  30. package/public/docs/llms/llm-file-explorer.txt +50 -0
  31. package/public/docs/llms/llm-hard-drives.txt +80 -0
  32. package/public/docs/llms/llm-main.txt +51 -0
  33. package/public/docs/llms/llm-slot-configuration.txt +66 -0
  34. package/public/icons/icon-192.svg +4 -0
  35. package/public/icons/icon-512.svg +4 -0
  36. package/public/index.html +661 -0
  37. package/public/llms.txt +49 -0
  38. package/public/manifest.json +29 -0
  39. package/public/shaders/burnin.glsl +22 -0
  40. package/public/shaders/crt.glsl +706 -0
  41. package/public/shaders/edge.glsl +109 -0
  42. package/public/shaders/vertex.glsl +8 -0
  43. package/public/sw.js +186 -0
  44. package/roms/341-0027.bin +0 -0
  45. package/roms/341-0160-A-US-UK.bin +0 -0
  46. package/roms/341-0160-A.bin +0 -0
  47. package/roms/342-0273-A-US-UK.bin +0 -0
  48. package/roms/342-0349-B-C0-FF.bin +0 -0
  49. package/roms/Apple Mouse Interface Card ROM - 342-0270-C.bin +0 -0
  50. package/roms/Thunderclock Plus ROM.bin +0 -0
  51. package/scripts/generate_roms.sh +69 -0
  52. package/src/bindings/wasm_interface.cpp +1940 -0
  53. package/src/core/assembler/assembler.cpp +1239 -0
  54. package/src/core/assembler/assembler.hpp +115 -0
  55. package/src/core/audio/audio.cpp +160 -0
  56. package/src/core/audio/audio.hpp +81 -0
  57. package/src/core/basic/basic_detokenizer.cpp +436 -0
  58. package/src/core/basic/basic_detokenizer.hpp +41 -0
  59. package/src/core/basic/basic_tokenizer.cpp +286 -0
  60. package/src/core/basic/basic_tokenizer.hpp +26 -0
  61. package/src/core/basic/basic_tokens.hpp +295 -0
  62. package/src/core/cards/disk2_card.cpp +568 -0
  63. package/src/core/cards/disk2_card.hpp +316 -0
  64. package/src/core/cards/expansion_card.hpp +185 -0
  65. package/src/core/cards/mockingboard/ay8910.cpp +616 -0
  66. package/src/core/cards/mockingboard/ay8910.hpp +159 -0
  67. package/src/core/cards/mockingboard/via6522.cpp +530 -0
  68. package/src/core/cards/mockingboard/via6522.hpp +163 -0
  69. package/src/core/cards/mockingboard_card.cpp +312 -0
  70. package/src/core/cards/mockingboard_card.hpp +159 -0
  71. package/src/core/cards/mouse_card.cpp +654 -0
  72. package/src/core/cards/mouse_card.hpp +190 -0
  73. package/src/core/cards/smartport/block_device.cpp +202 -0
  74. package/src/core/cards/smartport/block_device.hpp +60 -0
  75. package/src/core/cards/smartport/smartport_card.cpp +603 -0
  76. package/src/core/cards/smartport/smartport_card.hpp +120 -0
  77. package/src/core/cards/thunderclock_card.cpp +237 -0
  78. package/src/core/cards/thunderclock_card.hpp +122 -0
  79. package/src/core/cpu/cpu6502.cpp +1609 -0
  80. package/src/core/cpu/cpu6502.hpp +203 -0
  81. package/src/core/debug/condition_evaluator.cpp +470 -0
  82. package/src/core/debug/condition_evaluator.hpp +87 -0
  83. package/src/core/disassembler/disassembler.cpp +552 -0
  84. package/src/core/disassembler/disassembler.hpp +171 -0
  85. package/src/core/disk-image/disk_image.hpp +267 -0
  86. package/src/core/disk-image/dsk_disk_image.cpp +827 -0
  87. package/src/core/disk-image/dsk_disk_image.hpp +204 -0
  88. package/src/core/disk-image/gcr_encoding.cpp +147 -0
  89. package/src/core/disk-image/gcr_encoding.hpp +78 -0
  90. package/src/core/disk-image/woz_disk_image.cpp +1049 -0
  91. package/src/core/disk-image/woz_disk_image.hpp +343 -0
  92. package/src/core/emulator.cpp +2126 -0
  93. package/src/core/emulator.hpp +434 -0
  94. package/src/core/filesystem/dos33.cpp +178 -0
  95. package/src/core/filesystem/dos33.hpp +66 -0
  96. package/src/core/filesystem/pascal.cpp +262 -0
  97. package/src/core/filesystem/pascal.hpp +87 -0
  98. package/src/core/filesystem/prodos.cpp +369 -0
  99. package/src/core/filesystem/prodos.hpp +119 -0
  100. package/src/core/input/keyboard.cpp +227 -0
  101. package/src/core/input/keyboard.hpp +111 -0
  102. package/src/core/mmu/mmu.cpp +1387 -0
  103. package/src/core/mmu/mmu.hpp +236 -0
  104. package/src/core/types.hpp +196 -0
  105. package/src/core/video/video.cpp +680 -0
  106. package/src/core/video/video.hpp +156 -0
  107. package/src/css/assembler-editor.css +1617 -0
  108. package/src/css/base.css +470 -0
  109. package/src/css/basic-debugger.css +791 -0
  110. package/src/css/basic-editor.css +792 -0
  111. package/src/css/controls.css +783 -0
  112. package/src/css/cpu-debugger.css +1413 -0
  113. package/src/css/debug-base.css +160 -0
  114. package/src/css/debug-windows.css +6455 -0
  115. package/src/css/disk-drives.css +406 -0
  116. package/src/css/documentation.css +392 -0
  117. package/src/css/file-explorer.css +867 -0
  118. package/src/css/hard-drive.css +180 -0
  119. package/src/css/layout.css +217 -0
  120. package/src/css/memory-windows.css +798 -0
  121. package/src/css/modals.css +510 -0
  122. package/src/css/monitor.css +425 -0
  123. package/src/css/release-notes.css +101 -0
  124. package/src/css/responsive.css +400 -0
  125. package/src/css/rule-builder.css +340 -0
  126. package/src/css/save-states.css +201 -0
  127. package/src/css/settings-windows.css +1231 -0
  128. package/src/css/window-switcher.css +150 -0
  129. package/src/js/agent/agent-manager.js +643 -0
  130. package/src/js/agent/agent-tools.js +293 -0
  131. package/src/js/agent/agent-version-tools.js +131 -0
  132. package/src/js/agent/assembler-tools.js +357 -0
  133. package/src/js/agent/basic-program-tools.js +894 -0
  134. package/src/js/agent/disk-tools.js +417 -0
  135. package/src/js/agent/file-explorer-tools.js +269 -0
  136. package/src/js/agent/index.js +13 -0
  137. package/src/js/agent/main-tools.js +222 -0
  138. package/src/js/agent/slot-tools.js +303 -0
  139. package/src/js/agent/smartport-tools.js +257 -0
  140. package/src/js/agent/window-tools.js +80 -0
  141. package/src/js/audio/audio-driver.js +417 -0
  142. package/src/js/audio/audio-worklet.js +85 -0
  143. package/src/js/audio/index.js +8 -0
  144. package/src/js/config/default-layout.js +34 -0
  145. package/src/js/config/version.js +8 -0
  146. package/src/js/data/apple2-rom-routines.js +577 -0
  147. package/src/js/debug/assembler-editor-window.js +2993 -0
  148. package/src/js/debug/basic-breakpoint-manager.js +529 -0
  149. package/src/js/debug/basic-program-parser.js +436 -0
  150. package/src/js/debug/basic-program-window.js +2594 -0
  151. package/src/js/debug/basic-variable-inspector.js +447 -0
  152. package/src/js/debug/breakpoint-manager.js +472 -0
  153. package/src/js/debug/cpu-debugger-window.js +2396 -0
  154. package/src/js/debug/index.js +22 -0
  155. package/src/js/debug/label-manager.js +238 -0
  156. package/src/js/debug/memory-browser-window.js +416 -0
  157. package/src/js/debug/memory-heat-map-window.js +481 -0
  158. package/src/js/debug/memory-map-window.js +206 -0
  159. package/src/js/debug/mockingboard-window.js +882 -0
  160. package/src/js/debug/mouse-card-window.js +355 -0
  161. package/src/js/debug/rule-builder-window.js +648 -0
  162. package/src/js/debug/soft-switch-window.js +458 -0
  163. package/src/js/debug/stack-viewer-window.js +221 -0
  164. package/src/js/debug/symbols.js +416 -0
  165. package/src/js/debug/trace-panel.js +291 -0
  166. package/src/js/debug/zero-page-watch-window.js +297 -0
  167. package/src/js/disk-manager/disk-drives-window.js +212 -0
  168. package/src/js/disk-manager/disk-operations.js +284 -0
  169. package/src/js/disk-manager/disk-persistence.js +301 -0
  170. package/src/js/disk-manager/disk-surface-renderer.js +388 -0
  171. package/src/js/disk-manager/drive-sounds.js +139 -0
  172. package/src/js/disk-manager/hard-drive-manager.js +481 -0
  173. package/src/js/disk-manager/hard-drive-persistence.js +187 -0
  174. package/src/js/disk-manager/hard-drive-window.js +57 -0
  175. package/src/js/disk-manager/index.js +890 -0
  176. package/src/js/display/display-settings-window.js +383 -0
  177. package/src/js/display/index.js +10 -0
  178. package/src/js/display/screen-window.js +342 -0
  179. package/src/js/display/webgl-renderer.js +705 -0
  180. package/src/js/file-explorer/disassembler.js +574 -0
  181. package/src/js/file-explorer/dos33.js +266 -0
  182. package/src/js/file-explorer/file-viewer.js +359 -0
  183. package/src/js/file-explorer/index.js +1261 -0
  184. package/src/js/file-explorer/prodos.js +549 -0
  185. package/src/js/file-explorer/utils.js +67 -0
  186. package/src/js/help/documentation-window.js +1096 -0
  187. package/src/js/help/index.js +10 -0
  188. package/src/js/help/release-notes-window.js +85 -0
  189. package/src/js/help/release-notes.js +612 -0
  190. package/src/js/input/gamepad-handler.js +176 -0
  191. package/src/js/input/index.js +12 -0
  192. package/src/js/input/input-handler.js +396 -0
  193. package/src/js/input/joystick-window.js +404 -0
  194. package/src/js/input/mouse-handler.js +99 -0
  195. package/src/js/input/text-selection.js +462 -0
  196. package/src/js/main.js +653 -0
  197. package/src/js/state/index.js +15 -0
  198. package/src/js/state/save-states-window.js +393 -0
  199. package/src/js/state/state-manager.js +409 -0
  200. package/src/js/state/state-persistence.js +218 -0
  201. package/src/js/ui/confirm.js +43 -0
  202. package/src/js/ui/disk-drive-positioner.js +347 -0
  203. package/src/js/ui/reminder-controller.js +129 -0
  204. package/src/js/ui/slot-configuration-window.js +560 -0
  205. package/src/js/ui/theme-manager.js +61 -0
  206. package/src/js/ui/toast.js +44 -0
  207. package/src/js/ui/ui-controller.js +897 -0
  208. package/src/js/ui/window-switcher.js +275 -0
  209. package/src/js/utils/basic-autocomplete.js +832 -0
  210. package/src/js/utils/basic-highlighting.js +473 -0
  211. package/src/js/utils/basic-tokenizer.js +153 -0
  212. package/src/js/utils/basic-tokens.js +117 -0
  213. package/src/js/utils/constants.js +28 -0
  214. package/src/js/utils/indexeddb-helper.js +225 -0
  215. package/src/js/utils/merlin-editor-support.js +905 -0
  216. package/src/js/utils/merlin-highlighting.js +551 -0
  217. package/src/js/utils/storage.js +125 -0
  218. package/src/js/utils/string-utils.js +19 -0
  219. package/src/js/utils/wasm-memory.js +54 -0
  220. package/src/js/windows/base-window.js +690 -0
  221. package/src/js/windows/index.js +9 -0
  222. package/src/js/windows/window-manager.js +375 -0
  223. package/tests/catch2/catch.hpp +17976 -0
  224. package/tests/common/basic_program_builder.cpp +119 -0
  225. package/tests/common/basic_program_builder.hpp +209 -0
  226. package/tests/common/disk_image_builder.cpp +444 -0
  227. package/tests/common/disk_image_builder.hpp +141 -0
  228. package/tests/common/test_helpers.hpp +118 -0
  229. package/tests/gcr/gcr-test.cpp +142 -0
  230. package/tests/integration/check-rom.js +70 -0
  231. package/tests/integration/compare-boot.js +239 -0
  232. package/tests/integration/crash-trace.js +102 -0
  233. package/tests/integration/disk-boot-test.js +264 -0
  234. package/tests/integration/memory-crash.js +108 -0
  235. package/tests/integration/nibble-read-test.js +249 -0
  236. package/tests/integration/phase-test.js +159 -0
  237. package/tests/integration/test_emulator.cpp +291 -0
  238. package/tests/integration/test_emulator_basic.cpp +91 -0
  239. package/tests/integration/test_emulator_debug.cpp +344 -0
  240. package/tests/integration/test_emulator_disk.cpp +153 -0
  241. package/tests/integration/test_emulator_state.cpp +163 -0
  242. package/tests/klaus/6502_functional_test.bin +0 -0
  243. package/tests/klaus/65C02_extended_opcodes_test.bin +0 -0
  244. package/tests/klaus/klaus_6502_test.cpp +184 -0
  245. package/tests/klaus/klaus_65c02_test.cpp +197 -0
  246. package/tests/thunderclock/thunderclock_mmu_test.cpp +304 -0
  247. package/tests/thunderclock/thunderclock_test.cpp +550 -0
  248. package/tests/unit/test_assembler.cpp +521 -0
  249. package/tests/unit/test_audio.cpp +196 -0
  250. package/tests/unit/test_ay8910.cpp +311 -0
  251. package/tests/unit/test_basic_detokenizer.cpp +265 -0
  252. package/tests/unit/test_basic_tokenizer.cpp +382 -0
  253. package/tests/unit/test_block_device.cpp +259 -0
  254. package/tests/unit/test_condition_evaluator.cpp +219 -0
  255. package/tests/unit/test_cpu6502.cpp +1301 -0
  256. package/tests/unit/test_cpu_addressing.cpp +361 -0
  257. package/tests/unit/test_cpu_cycle_counts.cpp +409 -0
  258. package/tests/unit/test_cpu_decimal.cpp +166 -0
  259. package/tests/unit/test_cpu_interrupts.cpp +285 -0
  260. package/tests/unit/test_disassembler.cpp +323 -0
  261. package/tests/unit/test_disk2_card.cpp +330 -0
  262. package/tests/unit/test_dos33.cpp +273 -0
  263. package/tests/unit/test_dsk_disk_image.cpp +315 -0
  264. package/tests/unit/test_expansion_card.cpp +178 -0
  265. package/tests/unit/test_gcr_encoding.cpp +232 -0
  266. package/tests/unit/test_keyboard.cpp +262 -0
  267. package/tests/unit/test_mmu.cpp +555 -0
  268. package/tests/unit/test_mmu_slots.cpp +323 -0
  269. package/tests/unit/test_mockingboard.cpp +352 -0
  270. package/tests/unit/test_mouse_card.cpp +386 -0
  271. package/tests/unit/test_pascal.cpp +248 -0
  272. package/tests/unit/test_prodos.cpp +259 -0
  273. package/tests/unit/test_smartport_card.cpp +321 -0
  274. package/tests/unit/test_thunderclock.cpp +354 -0
  275. package/tests/unit/test_via6522.cpp +323 -0
  276. package/tests/unit/test_video.cpp +319 -0
  277. package/tests/unit/test_woz_disk_image.cpp +257 -0
  278. package/vite.config.js +96 -0
  279. package/wiki/AI-Agent.md +372 -0
  280. package/wiki/Architecture-Overview.md +303 -0
  281. package/wiki/Audio-System.md +449 -0
  282. package/wiki/CPU-Emulation.md +477 -0
  283. package/wiki/Debugger.md +516 -0
  284. package/wiki/Disk-Drives.md +161 -0
  285. package/wiki/Disk-System-Internals.md +547 -0
  286. package/wiki/Display-Settings.md +88 -0
  287. package/wiki/Expansion-Slots.md +187 -0
  288. package/wiki/File-Explorer.md +259 -0
  289. package/wiki/Getting-Started.md +156 -0
  290. package/wiki/Home.md +69 -0
  291. package/wiki/Input-Devices.md +183 -0
  292. package/wiki/Keyboard-Shortcuts.md +158 -0
  293. package/wiki/Memory-System.md +364 -0
  294. package/wiki/Save-States.md +172 -0
  295. package/wiki/Video-Rendering.md +658 -0
package/CMakeLists.txt ADDED
@@ -0,0 +1,774 @@
1
+ cmake_minimum_required(VERSION 3.20)
2
+ project(web-a2e VERSION 1.0.0 LANGUAGES CXX)
3
+
4
+ set(CMAKE_CXX_STANDARD 20)
5
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
6
+ set(CMAKE_CXX_EXTENSIONS OFF)
7
+
8
+ # Generate compile_commands.json for clangd
9
+ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
10
+
11
+ # Source files
12
+ set(CORE_SOURCES
13
+ src/core/emulator.cpp
14
+ src/core/cpu/cpu6502.cpp
15
+ src/core/mmu/mmu.cpp
16
+ src/core/video/video.cpp
17
+ src/core/audio/audio.cpp
18
+ src/core/disk-image/dsk_disk_image.cpp
19
+ src/core/disk-image/woz_disk_image.cpp
20
+ src/core/disk-image/gcr_encoding.cpp
21
+ src/core/input/keyboard.cpp
22
+ src/core/disassembler/disassembler.cpp
23
+ src/core/cards/mockingboard/ay8910.cpp
24
+ src/core/cards/mockingboard/via6522.cpp
25
+ src/core/cards/disk2_card.cpp
26
+ src/core/cards/mockingboard_card.cpp
27
+ src/core/cards/thunderclock_card.cpp
28
+ src/core/cards/mouse_card.cpp
29
+ src/core/cards/smartport/block_device.cpp
30
+ src/core/cards/smartport/smartport_card.cpp
31
+ src/core/debug/condition_evaluator.cpp
32
+ src/core/filesystem/dos33.cpp
33
+ src/core/filesystem/prodos.cpp
34
+ src/core/filesystem/pascal.cpp
35
+ src/core/basic/basic_detokenizer.cpp
36
+ src/core/basic/basic_tokenizer.cpp
37
+ src/core/assembler/assembler.cpp
38
+ src/bindings/wasm_interface.cpp
39
+ )
40
+
41
+ # ROM embedding - generate C arrays from ROM files
42
+ set(ROM_FILES
43
+ roms/342-0349-B-C0-FF.bin # Combined 16KB system ROM (C0-FF)
44
+ roms/342-0273-A-US-UK.bin # Character ROM (Apple IIe Enhanced)
45
+ roms/341-0027.bin # Disk II ROM
46
+ "roms/Thunderclock Plus ROM.bin" # Thunderclock card ROM
47
+ "roms/Apple Mouse Interface Card ROM - 342-0270-C.bin" # Mouse Interface Card ROM
48
+ )
49
+
50
+ # Custom command to generate ROM header
51
+ add_custom_command(
52
+ OUTPUT ${CMAKE_BINARY_DIR}/generated/roms.cpp
53
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/generated
54
+ COMMAND ${CMAKE_SOURCE_DIR}/scripts/generate_roms.sh ${CMAKE_SOURCE_DIR}/roms ${CMAKE_BINARY_DIR}/generated/roms.cpp
55
+ DEPENDS ${ROM_FILES} ${CMAKE_SOURCE_DIR}/scripts/generate_roms.sh
56
+ COMMENT "Generating ROM data arrays"
57
+ )
58
+
59
+ if(EMSCRIPTEN)
60
+ add_executable(a2e
61
+ ${CORE_SOURCES}
62
+ )
63
+
64
+ # Ensure roms.cpp is generated before building
65
+ add_custom_target(generate_roms DEPENDS ${CMAKE_BINARY_DIR}/generated/roms.cpp)
66
+ add_dependencies(a2e generate_roms)
67
+
68
+ target_include_directories(a2e PRIVATE
69
+ ${CMAKE_SOURCE_DIR}/src/core
70
+ ${CMAKE_SOURCE_DIR}/src/core/cpu
71
+ ${CMAKE_BINARY_DIR}/generated
72
+ )
73
+
74
+ # Emscripten-specific flags
75
+ set_target_properties(a2e PROPERTIES
76
+ SUFFIX ".js"
77
+ LINK_FLAGS "\
78
+ -s WASM=1 \
79
+ -s MODULARIZE=1 \
80
+ -s EXPORT_NAME='createA2EModule' \
81
+ -s EXPORTED_FUNCTIONS='[ \
82
+ \"_init\", \
83
+ \"_reset\", \
84
+ \"_warmReset\", \
85
+ \"_runCycles\", \
86
+ \"_consumeFrameSamples\", \
87
+ \"_getFramebuffer\", \
88
+ \"_getFramebufferSize\", \
89
+ \"_forceRenderFrame\", \
90
+ \"_isFrameReady\", \
91
+ \"_keyDown\", \
92
+ \"_keyUp\", \
93
+ \"_handleRawKeyDown\", \
94
+ \"_handleRawKeyUp\", \
95
+ \"_charToAppleKey\", \
96
+ \"_insertDisk\", \
97
+ \"_insertBlankDisk\", \
98
+ \"_ejectDisk\", \
99
+ \"_getDiskData\", \
100
+ \"_addBreakpoint\", \
101
+ \"_removeBreakpoint\", \
102
+ \"_enableBreakpoint\", \
103
+ \"_isBreakpointHit\", \
104
+ \"_getBreakpointAddress\", \
105
+ \"_addBasicBreakpoint\", \
106
+ \"_removeBasicBreakpoint\", \
107
+ \"_clearBasicBreakpoints\", \
108
+ \"_clearBasicBreakpointHit\", \
109
+ \"_addBasicConditionRule\", \
110
+ \"_removeBasicConditionRule\", \
111
+ \"_clearBasicConditionRules\", \
112
+ \"_getBasicConditionRuleHitId\", \
113
+ \"_hasBasicBreakpoints\", \
114
+ \"_isBasicBreakpointHit\", \
115
+ \"_getBasicBreakLine\", \
116
+ \"_isBasicProgramRunning\", \
117
+ \"_stepBasicLine\", \
118
+ \"_stepBasicStatement\", \
119
+ \"_getBasicTxtptr\", \
120
+ \"_getBasicStatementIndex\", \
121
+ \"_setBasicHeatMapEnabled\", \
122
+ \"_clearBasicHeatMap\", \
123
+ \"_getBasicHeatMapSize\", \
124
+ \"_getBasicHeatMapData\", \
125
+ \"_getBasicLineBytes\", \
126
+ \"_getPC\", \
127
+ \"_getSP\", \
128
+ \"_getA\", \
129
+ \"_getX\", \
130
+ \"_getY\", \
131
+ \"_getP\", \
132
+ \"_getTotalCycles\", \
133
+ \"_isPaused\", \
134
+ \"_setPaused\", \
135
+ \"_stepInstruction\", \
136
+ \"_readMemory\", \
137
+ \"_writeMemory\", \
138
+ \"_disassembleAt\", \
139
+ \"_getSoftSwitchState\", \
140
+ \"_screenCodeToAscii\", \
141
+ \"_readScreenText\", \
142
+ \"_getDiskTrack\", \
143
+ \"_getDiskPhase\", \
144
+ \"_getDiskMotorOn\", \
145
+ \"_getDiskWriteMode\", \
146
+ \"_getDiskHeadPosition\", \
147
+ \"_getSelectedDrive\", \
148
+ \"_isDiskInserted\", \
149
+ \"_isDiskModified\", \
150
+ \"_getDiskFilename\", \
151
+ \"_getLastDiskByte\", \
152
+ \"_exportState\", \
153
+ \"_importState\", \
154
+ \"_setMonochrome\", \
155
+ \"_isMonochrome\", \
156
+ \"_disassembleRawData\", \
157
+ \"_getDisasmInstructions\", \
158
+ \"_getDisasmInstructionLength\", \
159
+ \"_malloc\", \
160
+ \"_free\", \
161
+ \"_getSlotCard\", \
162
+ \"_setSlotCard\", \
163
+ \"_isSlotEmpty\", \
164
+ \"_getMockingboardWaveform\", \
165
+ \"_setMockingboardChannelMute\", \
166
+ \"_getMockingboardChannelMute\", \
167
+ \"_isKeyboardReady\", \
168
+ \"_setSpeedMultiplier\", \
169
+ \"_getSpeedMultiplier\", \
170
+ \"_mouseMove\", \
171
+ \"_mouseButton\", \
172
+ \"_isMouseCardInstalled\", \
173
+ \"_getMouseCardState\", \
174
+ \"_getMouseCardPIARegister\", \
175
+ \"_isIRQPending\", \
176
+ \"_isNMIPending\", \
177
+ \"_isNMIEdge\", \
178
+ \"_setRegA\", \
179
+ \"_setRegX\", \
180
+ \"_setRegY\", \
181
+ \"_setRegSP\", \
182
+ \"_setRegPC\", \
183
+ \"_setRegP\", \
184
+ \"_peekMemory\", \
185
+ \"_readMainRAM\", \
186
+ \"_addWatchpoint\", \
187
+ \"_removeWatchpoint\", \
188
+ \"_clearWatchpoints\", \
189
+ \"_isWatchpointHit\", \
190
+ \"_getWatchpointAddress\", \
191
+ \"_getWatchpointValue\", \
192
+ \"_isWatchpointWrite\", \
193
+ \"_setTraceEnabled\", \
194
+ \"_clearTrace\", \
195
+ \"_getTraceCount\", \
196
+ \"_getTraceHead\", \
197
+ \"_getTraceBuffer\", \
198
+ \"_getTraceCapacity\", \
199
+ \"_setProfileEnabled\", \
200
+ \"_clearProfile\", \
201
+ \"_getProfileCycles\", \
202
+ \"_addBeamBreakpoint\", \
203
+ \"_removeBeamBreakpoint\", \
204
+ \"_enableBeamBreakpoint\", \
205
+ \"_clearAllBeamBreakpoints\", \
206
+ \"_isBeamBreakpointHit\", \
207
+ \"_getBeamBreakpointHitId\", \
208
+ \"_getBeamBreakScanline\", \
209
+ \"_getBeamBreakHPos\", \
210
+ \"_getFrameCycle\", \
211
+ \"_getBeamScanline\", \
212
+ \"_getBeamHPos\", \
213
+ \"_getBeamColumn\", \
214
+ \"_isInVBL\", \
215
+ \"_isInHBLANK\", \
216
+ \"_stepOver\", \
217
+ \"_stepOut\", \
218
+ \"_clearTempBreakpoint\", \
219
+ \"_isTempBreakpointHit\", \
220
+ \"_getOpcodeMnemonic\", \
221
+ \"_getOpcodeAddressingMode\", \
222
+ \"_getCallStack\", \
223
+ \"_getCallStackBuffer\", \
224
+ \"_isLikelyReturnAddress\", \
225
+ \"_evaluateCondition\", \
226
+ \"_evaluateExpression\", \
227
+ \"_getConditionError\", \
228
+ \"_isDOS33Format\", \
229
+ \"_getDOS33Catalog\", \
230
+ \"_getDOS33CatalogBuffer\", \
231
+ \"_getDOS33CatalogEntrySize\", \
232
+ \"_getDOS33EntryFilename\", \
233
+ \"_getDOS33EntryFileType\", \
234
+ \"_getDOS33EntryFileTypeName\", \
235
+ \"_getDOS33EntryIsLocked\", \
236
+ \"_getDOS33EntrySectorCount\", \
237
+ \"_readDOS33File\", \
238
+ \"_getDOS33FileBuffer\", \
239
+ \"_isProDOSFormat\", \
240
+ \"_getProDOSVolumeInfo\", \
241
+ \"_getProDOSVolumeName\", \
242
+ \"_getProDOSTotalBlocks\", \
243
+ \"_getProDOSCatalog\", \
244
+ \"_getProDOSEntryFilename\", \
245
+ \"_getProDOSEntryPath\", \
246
+ \"_getProDOSEntryFileType\", \
247
+ \"_getProDOSEntryFileTypeName\", \
248
+ \"_getProDOSEntryStorageType\", \
249
+ \"_getProDOSEntryEOF\", \
250
+ \"_getProDOSEntryAuxType\", \
251
+ \"_getProDOSEntryIsLocked\", \
252
+ \"_getProDOSEntryBlocksUsed\", \
253
+ \"_getProDOSEntryIsDirectory\", \
254
+ \"_getProDOSEntryKeyPointer\", \
255
+ \"_getProDOSDirectory\", \
256
+ \"_readProDOSFile\", \
257
+ \"_getProDOSFileBuffer\", \
258
+ \"_mapProDOSFileType\", \
259
+ \"_isPascalFormat\", \
260
+ \"_getPascalVolumeInfo\", \
261
+ \"_getPascalVolumeName\", \
262
+ \"_getPascalTotalBlocks\", \
263
+ \"_getPascalCatalog\", \
264
+ \"_getPascalEntryFilename\", \
265
+ \"_getPascalEntryFileType\", \
266
+ \"_getPascalEntryFileTypeName\", \
267
+ \"_getPascalEntryFileSize\", \
268
+ \"_getPascalEntryBlocksUsed\", \
269
+ \"_readPascalFile\", \
270
+ \"_getPascalFileBuffer\", \
271
+ \"_mapPascalFileType\", \
272
+ \"_detokenizeApplesoft\", \
273
+ \"_detokenizeIntegerBasic\", \
274
+ \"_assembleSource\", \
275
+ \"_getAsmOutputSize\", \
276
+ \"_getAsmOutputBuffer\", \
277
+ \"_getAsmOrigin\", \
278
+ \"_getAsmErrorCount\", \
279
+ \"_getAsmErrorLine\", \
280
+ \"_getAsmErrorMessage\", \
281
+ \"_loadAsmIntoMemory\", \
282
+ \"_getAsmSymbolCount\", \
283
+ \"_getAsmSymbolName\", \
284
+ \"_getAsmSymbolValue\", \
285
+ \"_isBasicErrorHit\", \
286
+ \"_getBasicErrorLine\", \
287
+ \"_getBasicErrorTxtptr\", \
288
+ \"_getBasicErrorCode\", \
289
+ \"_clearBasicError\", \
290
+ \"_insertSmartPortImage\", \
291
+ \"_ejectSmartPortImage\", \
292
+ \"_isSmartPortImageInserted\", \
293
+ \"_getSmartPortImageFilename\", \
294
+ \"_isSmartPortImageModified\", \
295
+ \"_getSmartPortImageData\", \
296
+ \"_isSmartPortCardInstalled\", \
297
+ \"_getSmartPortBlockData\", \
298
+ \"_getSmartPortActivity\", \
299
+ \"_getSmartPortActivityWrite\", \
300
+ \"_clearSmartPortActivity\", \
301
+ \"_loadBasicProgram\", \
302
+ \"_generateStereoAudioSamples\", \
303
+ \"_setAudioVolume\", \
304
+ \"_setAudioMuted\", \
305
+ \"_setButton\", \
306
+ \"_setPaddleValue\", \
307
+ \"_getPaddleValue\", \
308
+ \"_getDiskSectorData\", \
309
+ \"_stopDiskMotor\", \
310
+ \"_getTrackNibble\", \
311
+ \"_getTrackNibbleCount\", \
312
+ \"_getCurrentNibblePosition\", \
313
+ \"_peekAuxMemory\", \
314
+ \"_enableMemoryTracking\", \
315
+ \"_clearMemoryTracking\", \
316
+ \"_decayMemoryTracking\", \
317
+ \"_getMemoryReadCounts\", \
318
+ \"_getMemoryWriteCounts\", \
319
+ \"_getMainRAM\", \
320
+ \"_getAuxRAM\", \
321
+ \"_getSystemROM\", \
322
+ \"_setUKCharacterSet\", \
323
+ \"_isUKCharacterSet\", \
324
+ \"_getSoftSwitchStateHigh\", \
325
+ \"_disassembleWithFlowAnalysis\", \
326
+ \"_disassembleWithFlowAnalysisMultiEntry\", \
327
+ \"_getBasicDebugInfo\", \
328
+ \"_isMockingboardEnabled\", \
329
+ \"_getMockingboardPSGRegister\", \
330
+ \"_getMockingboardPSGRegisters\", \
331
+ \"_getMockingboardVIAIRQ\", \
332
+ \"_getMockingboardVIAPort\", \
333
+ \"_getMockingboardPSGWriteInfo\", \
334
+ \"_getMockingboardVIATimerInfo\", \
335
+ \"_setMockingboardDebugLogging\" \
336
+ ]' \
337
+ -s EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\", \"UTF8ToString\", \"stringToUTF8\", \"HEAPU8\", \"HEAPF32\"]' \
338
+ -s ALLOW_MEMORY_GROWTH=1 \
339
+ -s INITIAL_MEMORY=33554432 \
340
+ -s MAXIMUM_MEMORY=268435456 \
341
+ -s NO_EXIT_RUNTIME=1 \
342
+ -s ASYNCIFY=0 \
343
+ --no-entry \
344
+ -O3 \
345
+ -flto \
346
+ "
347
+ )
348
+
349
+ # Copy output to public directory
350
+ add_custom_command(TARGET a2e POST_BUILD
351
+ COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:a2e> ${CMAKE_SOURCE_DIR}/public/a2e.js
352
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/a2e.wasm ${CMAKE_SOURCE_DIR}/public/a2e.wasm
353
+ COMMENT "Copying WASM files to public directory"
354
+ )
355
+
356
+ else()
357
+ # Native build for testing
358
+ # Note: a2e-native requires src/native/main.cpp which may not exist
359
+ # The tests below can be built independently
360
+
361
+ enable_testing()
362
+
363
+ # ==========================================================================
364
+ # Common paths and source lists
365
+ # ==========================================================================
366
+
367
+ set(CATCH2_INCLUDE ${CMAKE_SOURCE_DIR}/tests/catch2)
368
+ set(TEST_COMMON_INCLUDE ${CMAKE_SOURCE_DIR}/tests/common)
369
+
370
+ # All core include directories
371
+ set(ALL_CORE_INCLUDES
372
+ ${CMAKE_SOURCE_DIR}/src/core
373
+ ${CMAKE_SOURCE_DIR}/src/core/cpu
374
+ ${CMAKE_SOURCE_DIR}/src/core/mmu
375
+ ${CMAKE_SOURCE_DIR}/src/core/video
376
+ ${CMAKE_SOURCE_DIR}/src/core/audio
377
+ ${CMAKE_SOURCE_DIR}/src/core/input
378
+ ${CMAKE_SOURCE_DIR}/src/core/cards
379
+ ${CMAKE_SOURCE_DIR}/src/core/cards/mockingboard
380
+ ${CMAKE_SOURCE_DIR}/src/core/cards/smartport
381
+ ${CMAKE_SOURCE_DIR}/src/core/disk-image
382
+ ${CMAKE_SOURCE_DIR}/src/core/disassembler
383
+ ${CMAKE_SOURCE_DIR}/src/core/debug
384
+ ${CMAKE_SOURCE_DIR}/src/core/filesystem
385
+ ${CMAKE_SOURCE_DIR}/src/core/basic
386
+ ${CMAKE_SOURCE_DIR}/src/core/assembler
387
+ ${CMAKE_BINARY_DIR}/generated
388
+ )
389
+
390
+ # All core source files (excluding wasm_interface.cpp)
391
+ set(CORE_TEST_SOURCES
392
+ src/core/emulator.cpp
393
+ src/core/cpu/cpu6502.cpp
394
+ src/core/mmu/mmu.cpp
395
+ src/core/video/video.cpp
396
+ src/core/audio/audio.cpp
397
+ src/core/disk-image/dsk_disk_image.cpp
398
+ src/core/disk-image/woz_disk_image.cpp
399
+ src/core/disk-image/gcr_encoding.cpp
400
+ src/core/input/keyboard.cpp
401
+ src/core/disassembler/disassembler.cpp
402
+ src/core/cards/mockingboard/ay8910.cpp
403
+ src/core/cards/mockingboard/via6522.cpp
404
+ src/core/cards/disk2_card.cpp
405
+ src/core/cards/mockingboard_card.cpp
406
+ src/core/cards/thunderclock_card.cpp
407
+ src/core/cards/mouse_card.cpp
408
+ src/core/cards/smartport/block_device.cpp
409
+ src/core/cards/smartport/smartport_card.cpp
410
+ src/core/debug/condition_evaluator.cpp
411
+ src/core/debug/basic_variable_watch.cpp
412
+ src/core/filesystem/dos33.cpp
413
+ src/core/filesystem/prodos.cpp
414
+ src/core/filesystem/pascal.cpp
415
+ src/core/basic/basic_detokenizer.cpp
416
+ src/core/basic/basic_tokenizer.cpp
417
+ src/core/assembler/assembler.cpp
418
+ )
419
+
420
+ # Common test helper sources
421
+ set(TEST_COMMON_SOURCES
422
+ tests/common/disk_image_builder.cpp
423
+ tests/common/basic_program_builder.cpp
424
+ )
425
+
426
+ # Ensure roms.cpp is generated for native builds
427
+ add_custom_target(generate_roms_native DEPENDS ${CMAKE_BINARY_DIR}/generated/roms.cpp)
428
+
429
+ # ==========================================================================
430
+ # Helper function: add a Catch2 test with specified sources
431
+ # ==========================================================================
432
+ function(add_catch2_test TEST_NAME TEST_SOURCE)
433
+ # Remaining arguments are extra source files
434
+ set(EXTRA_SOURCES ${ARGN})
435
+
436
+ add_executable(${TEST_NAME}
437
+ ${TEST_SOURCE}
438
+ ${EXTRA_SOURCES}
439
+ )
440
+ add_dependencies(${TEST_NAME} generate_roms_native)
441
+ target_include_directories(${TEST_NAME} PRIVATE
442
+ ${ALL_CORE_INCLUDES}
443
+ ${CATCH2_INCLUDE}
444
+ ${TEST_COMMON_INCLUDE}
445
+ )
446
+ target_compile_options(${TEST_NAME} PRIVATE -O2 -Wall -Wextra)
447
+ add_test(NAME ${TEST_NAME}
448
+ COMMAND ${TEST_NAME}
449
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
450
+ )
451
+ endfunction()
452
+
453
+ # ==========================================================================
454
+ # Klaus Dormann CPU Functional Tests (legacy, non-Catch2)
455
+ # ==========================================================================
456
+
457
+ add_executable(klaus_65c02_test
458
+ tests/klaus/klaus_65c02_test.cpp
459
+ src/core/cpu/cpu6502.cpp
460
+ )
461
+ target_include_directories(klaus_65c02_test PRIVATE
462
+ ${CMAKE_SOURCE_DIR}/src/core
463
+ ${CMAKE_SOURCE_DIR}/src/core/cpu
464
+ )
465
+ target_compile_options(klaus_65c02_test PRIVATE -O3 -Wall -Wextra)
466
+ add_test(NAME klaus_65c02_extended_test
467
+ COMMAND klaus_65c02_test
468
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
469
+ )
470
+
471
+ add_executable(klaus_6502_test
472
+ tests/klaus/klaus_6502_test.cpp
473
+ src/core/cpu/cpu6502.cpp
474
+ )
475
+ target_include_directories(klaus_6502_test PRIVATE
476
+ ${CMAKE_SOURCE_DIR}/src/core
477
+ ${CMAKE_SOURCE_DIR}/src/core/cpu
478
+ )
479
+ target_compile_options(klaus_6502_test PRIVATE -O3 -Wall -Wextra)
480
+ add_test(NAME klaus_6502_functional_test
481
+ COMMAND klaus_6502_test
482
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
483
+ )
484
+
485
+ # ==========================================================================
486
+ # Thunderclock Card Tests (legacy, non-Catch2)
487
+ # ==========================================================================
488
+
489
+ add_executable(thunderclock_test
490
+ tests/thunderclock/thunderclock_test.cpp
491
+ src/core/cards/thunderclock_card.cpp
492
+ )
493
+ add_dependencies(thunderclock_test generate_roms_native)
494
+ target_include_directories(thunderclock_test PRIVATE
495
+ ${CMAKE_SOURCE_DIR}/src/core
496
+ ${CMAKE_SOURCE_DIR}/src/core/cards
497
+ ${CMAKE_BINARY_DIR}/generated
498
+ )
499
+ target_compile_options(thunderclock_test PRIVATE -O3 -Wall -Wextra)
500
+ add_test(NAME thunderclock_card_test
501
+ COMMAND thunderclock_test
502
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
503
+ )
504
+
505
+ add_executable(thunderclock_mmu_test
506
+ tests/thunderclock/thunderclock_mmu_test.cpp
507
+ src/core/cards/thunderclock_card.cpp
508
+ src/core/mmu/mmu.cpp
509
+ )
510
+ add_dependencies(thunderclock_mmu_test generate_roms_native)
511
+ target_include_directories(thunderclock_mmu_test PRIVATE
512
+ ${CMAKE_SOURCE_DIR}/src/core
513
+ ${CMAKE_SOURCE_DIR}/src/core/cards
514
+ ${CMAKE_BINARY_DIR}/generated
515
+ )
516
+ target_compile_options(thunderclock_mmu_test PRIVATE -O3 -Wall -Wextra)
517
+ add_test(NAME thunderclock_mmu_integration_test
518
+ COMMAND thunderclock_mmu_test
519
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
520
+ )
521
+
522
+ # ==========================================================================
523
+ # Catch2 Unit Tests - Pure (no ROM dependencies)
524
+ # ==========================================================================
525
+
526
+ # CPU tests (only need cpu6502.cpp)
527
+ add_catch2_test(test_cpu6502
528
+ tests/unit/test_cpu6502.cpp
529
+ src/core/cpu/cpu6502.cpp
530
+ )
531
+ add_catch2_test(test_cpu_addressing
532
+ tests/unit/test_cpu_addressing.cpp
533
+ src/core/cpu/cpu6502.cpp
534
+ )
535
+ add_catch2_test(test_cpu_interrupts
536
+ tests/unit/test_cpu_interrupts.cpp
537
+ src/core/cpu/cpu6502.cpp
538
+ )
539
+ add_catch2_test(test_cpu_decimal
540
+ tests/unit/test_cpu_decimal.cpp
541
+ src/core/cpu/cpu6502.cpp
542
+ )
543
+ add_catch2_test(test_cpu_cycle_counts
544
+ tests/unit/test_cpu_cycle_counts.cpp
545
+ src/core/cpu/cpu6502.cpp
546
+ )
547
+
548
+ # GCR encoding (only gcr_encoding.cpp)
549
+ add_catch2_test(test_gcr_encoding
550
+ tests/unit/test_gcr_encoding.cpp
551
+ src/core/disk-image/gcr_encoding.cpp
552
+ )
553
+
554
+ # Disassembler (only disassembler.cpp)
555
+ add_catch2_test(test_disassembler
556
+ tests/unit/test_disassembler.cpp
557
+ src/core/disassembler/disassembler.cpp
558
+ )
559
+
560
+ # Assembler (only assembler.cpp + disassembler for opcode table)
561
+ add_catch2_test(test_assembler
562
+ tests/unit/test_assembler.cpp
563
+ src/core/assembler/assembler.cpp
564
+ src/core/disassembler/disassembler.cpp
565
+ )
566
+
567
+ # Audio (audio.cpp + mockingboard deps for consumeStereoSamples)
568
+ add_catch2_test(test_audio
569
+ tests/unit/test_audio.cpp
570
+ src/core/audio/audio.cpp
571
+ src/core/cards/mockingboard_card.cpp
572
+ src/core/cards/mockingboard/via6522.cpp
573
+ src/core/cards/mockingboard/ay8910.cpp
574
+ )
575
+
576
+ # Keyboard (only keyboard.cpp)
577
+ add_catch2_test(test_keyboard
578
+ tests/unit/test_keyboard.cpp
579
+ src/core/input/keyboard.cpp
580
+ )
581
+
582
+ # AY-3-8910 (only ay8910.cpp)
583
+ add_catch2_test(test_ay8910
584
+ tests/unit/test_ay8910.cpp
585
+ src/core/cards/mockingboard/ay8910.cpp
586
+ )
587
+
588
+ # VIA 6522 (via6522.cpp + ay8910.cpp since VIA connects to PSG)
589
+ add_catch2_test(test_via6522
590
+ tests/unit/test_via6522.cpp
591
+ src/core/cards/mockingboard/via6522.cpp
592
+ src/core/cards/mockingboard/ay8910.cpp
593
+ )
594
+
595
+ # Block device (only block_device.cpp)
596
+ add_catch2_test(test_block_device
597
+ tests/unit/test_block_device.cpp
598
+ src/core/cards/smartport/block_device.cpp
599
+ )
600
+
601
+ # BASIC detokenizer (only basic_detokenizer.cpp + common helpers)
602
+ add_catch2_test(test_basic_detokenizer
603
+ tests/unit/test_basic_detokenizer.cpp
604
+ src/core/basic/basic_detokenizer.cpp
605
+ ${TEST_COMMON_SOURCES}
606
+ )
607
+
608
+ # BASIC tokenizer (basic_tokenizer.cpp + basic_detokenizer.cpp for round-trip)
609
+ add_catch2_test(test_basic_tokenizer
610
+ tests/unit/test_basic_tokenizer.cpp
611
+ src/core/basic/basic_tokenizer.cpp
612
+ src/core/basic/basic_detokenizer.cpp
613
+ ${TEST_COMMON_SOURCES}
614
+ )
615
+
616
+ # ==========================================================================
617
+ # Catch2 Unit Tests - ROM-dependent
618
+ # ==========================================================================
619
+
620
+ # MMU (mmu.cpp)
621
+ add_catch2_test(test_mmu
622
+ tests/unit/test_mmu.cpp
623
+ src/core/mmu/mmu.cpp
624
+ )
625
+
626
+ # MMU Slots (mmu.cpp + thunderclock for testing)
627
+ add_catch2_test(test_mmu_slots
628
+ tests/unit/test_mmu_slots.cpp
629
+ src/core/mmu/mmu.cpp
630
+ src/core/cards/thunderclock_card.cpp
631
+ )
632
+
633
+ # Video (video.cpp + mmu.cpp)
634
+ add_catch2_test(test_video
635
+ tests/unit/test_video.cpp
636
+ src/core/video/video.cpp
637
+ src/core/mmu/mmu.cpp
638
+ )
639
+
640
+ # Disk2 Card (disk2_card.cpp + disk images + gcr)
641
+ add_catch2_test(test_disk2_card
642
+ tests/unit/test_disk2_card.cpp
643
+ src/core/cards/disk2_card.cpp
644
+ src/core/disk-image/dsk_disk_image.cpp
645
+ src/core/disk-image/woz_disk_image.cpp
646
+ src/core/disk-image/gcr_encoding.cpp
647
+ )
648
+
649
+ # DSK disk image
650
+ add_catch2_test(test_dsk_disk_image
651
+ tests/unit/test_dsk_disk_image.cpp
652
+ src/core/disk-image/dsk_disk_image.cpp
653
+ src/core/disk-image/gcr_encoding.cpp
654
+ )
655
+
656
+ # WOZ disk image
657
+ add_catch2_test(test_woz_disk_image
658
+ tests/unit/test_woz_disk_image.cpp
659
+ src/core/disk-image/woz_disk_image.cpp
660
+ src/core/disk-image/gcr_encoding.cpp
661
+ )
662
+
663
+ # Mockingboard (mockingboard_card.cpp + via + ay)
664
+ add_catch2_test(test_mockingboard
665
+ tests/unit/test_mockingboard.cpp
666
+ src/core/cards/mockingboard_card.cpp
667
+ src/core/cards/mockingboard/via6522.cpp
668
+ src/core/cards/mockingboard/ay8910.cpp
669
+ )
670
+
671
+ # Thunderclock (Catch2 version)
672
+ add_catch2_test(test_thunderclock
673
+ tests/unit/test_thunderclock.cpp
674
+ src/core/cards/thunderclock_card.cpp
675
+ )
676
+
677
+ # Mouse Card (mouse_card.cpp)
678
+ add_catch2_test(test_mouse_card
679
+ tests/unit/test_mouse_card.cpp
680
+ src/core/cards/mouse_card.cpp
681
+ )
682
+
683
+ # SmartPort Card (smartport + block_device)
684
+ add_catch2_test(test_smartport_card
685
+ tests/unit/test_smartport_card.cpp
686
+ src/core/cards/smartport/smartport_card.cpp
687
+ src/core/cards/smartport/block_device.cpp
688
+ )
689
+
690
+ # ==========================================================================
691
+ # Catch2 Unit Tests - Filesystem
692
+ # ==========================================================================
693
+
694
+ # DOS 3.3 parser
695
+ add_catch2_test(test_dos33
696
+ tests/unit/test_dos33.cpp
697
+ src/core/filesystem/dos33.cpp
698
+ ${TEST_COMMON_SOURCES}
699
+ )
700
+
701
+ # ProDOS parser
702
+ add_catch2_test(test_prodos
703
+ tests/unit/test_prodos.cpp
704
+ src/core/filesystem/prodos.cpp
705
+ ${TEST_COMMON_SOURCES}
706
+ )
707
+
708
+ # Pascal parser
709
+ add_catch2_test(test_pascal
710
+ tests/unit/test_pascal.cpp
711
+ src/core/filesystem/pascal.cpp
712
+ ${TEST_COMMON_SOURCES}
713
+ )
714
+
715
+ # ==========================================================================
716
+ # Catch2 Unit Tests - Expansion Card Interface
717
+ # ==========================================================================
718
+
719
+ add_catch2_test(test_expansion_card
720
+ tests/unit/test_expansion_card.cpp
721
+ src/core/cards/disk2_card.cpp
722
+ src/core/cards/mockingboard_card.cpp
723
+ src/core/cards/thunderclock_card.cpp
724
+ src/core/cards/mouse_card.cpp
725
+ src/core/cards/smartport/smartport_card.cpp
726
+ src/core/cards/smartport/block_device.cpp
727
+ src/core/cards/mockingboard/via6522.cpp
728
+ src/core/cards/mockingboard/ay8910.cpp
729
+ src/core/disk-image/dsk_disk_image.cpp
730
+ src/core/disk-image/woz_disk_image.cpp
731
+ src/core/disk-image/gcr_encoding.cpp
732
+ )
733
+
734
+ # ==========================================================================
735
+ # Catch2 Integration Tests (full emulator)
736
+ # ==========================================================================
737
+
738
+ add_catch2_test(test_emulator
739
+ tests/integration/test_emulator.cpp
740
+ ${CORE_TEST_SOURCES}
741
+ ${TEST_COMMON_SOURCES}
742
+ )
743
+
744
+ add_catch2_test(test_emulator_debug
745
+ tests/integration/test_emulator_debug.cpp
746
+ ${CORE_TEST_SOURCES}
747
+ ${TEST_COMMON_SOURCES}
748
+ )
749
+
750
+ add_catch2_test(test_emulator_disk
751
+ tests/integration/test_emulator_disk.cpp
752
+ ${CORE_TEST_SOURCES}
753
+ ${TEST_COMMON_SOURCES}
754
+ )
755
+
756
+ add_catch2_test(test_emulator_basic
757
+ tests/integration/test_emulator_basic.cpp
758
+ ${CORE_TEST_SOURCES}
759
+ ${TEST_COMMON_SOURCES}
760
+ )
761
+
762
+ add_catch2_test(test_emulator_state
763
+ tests/integration/test_emulator_state.cpp
764
+ ${CORE_TEST_SOURCES}
765
+ ${TEST_COMMON_SOURCES}
766
+ )
767
+
768
+ # Condition evaluator (needs full emulator)
769
+ add_catch2_test(test_condition_evaluator
770
+ tests/unit/test_condition_evaluator.cpp
771
+ ${CORE_TEST_SOURCES}
772
+ )
773
+
774
+ endif()