jsbeeb 1.1.1 → 1.3.3

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 (418) hide show
  1. package/package.json +26 -12
  2. package/src/6502.js +51 -41
  3. package/src/app/app.js +99 -8
  4. package/src/app/electron.js +47 -5
  5. package/src/app/preload.js +11 -1
  6. package/src/config.js +9 -2
  7. package/src/disc.js +2 -2
  8. package/src/filestore.js +1 -4
  9. package/src/gamepad-source.js +1 -1
  10. package/src/machine-session.js +393 -0
  11. package/src/main.js +36 -7
  12. package/src/music5000-worklet.js +1 -0
  13. package/src/music5000.js +1 -9
  14. package/src/sth.js +3 -1
  15. package/src/utils.js +14 -2
  16. package/src/web/audio-renderer.js +1 -1
  17. package/src/web/debug.js +2 -2
  18. package/tests/test-machine.js +82 -1
  19. package/.editorconfig +0 -15
  20. package/.git-blame-ignore-revs +0 -3
  21. package/.github/copilot-instructions.md +0 -94
  22. package/.github/workflows/claude-issue-triage.yml +0 -105
  23. package/.github/workflows/claude.yml +0 -63
  24. package/.github/workflows/release-please.yml +0 -75
  25. package/.github/workflows/test-and-deploy.yml +0 -86
  26. package/.gitmodules +0 -6
  27. package/.husky/pre-commit +0 -1
  28. package/.idea/codeStyleSettings.xml +0 -9
  29. package/.idea/codeStyles/Project.xml +0 -62
  30. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  31. package/.idea/compiler.xml +0 -22
  32. package/.idea/copyright/profiles_settings.xml +0 -3
  33. package/.idea/encodings.xml +0 -6
  34. package/.idea/inspectionProfiles/Project_Default.xml +0 -7
  35. package/.idea/jsLibraryMappings.xml +0 -6
  36. package/.idea/jsLinters/jshint.xml +0 -85
  37. package/.idea/jsLinters/jslint.xml +0 -15
  38. package/.idea/jsbeeb.iml +0 -11
  39. package/.idea/misc.xml +0 -6
  40. package/.idea/modules.xml +0 -8
  41. package/.idea/prettier.xml +0 -7
  42. package/.idea/runConfigurations/Debug.xml +0 -5
  43. package/.idea/scopes/scope_settings.xml +0 -5
  44. package/.idea/vcs.xml +0 -8
  45. package/.prettierignore +0 -4
  46. package/.prettierrc.json +0 -1
  47. package/.release-please-manifest.json +0 -3
  48. package/.vscode/launch.json +0 -14
  49. package/.vscode/settings.json +0 -6
  50. package/CHANGELOG.md +0 -32
  51. package/CLAUDE.md +0 -136
  52. package/Dockerfile +0 -22
  53. package/Makefile +0 -30
  54. package/docker/nginx-default.conf +0 -10
  55. package/docs/pal-comb-filter-research.md +0 -129
  56. package/docs/pal-simulation-design.md +0 -368
  57. package/eslint.config.js +0 -35
  58. package/index.html +0 -954
  59. package/jsconfig.json +0 -10
  60. package/public/discs/README.Irq-Timing +0 -3
  61. package/public/discs/README.bcdtest +0 -5
  62. package/public/discs/README.elite +0 -6
  63. package/public/discs/README.eng_test +0 -3
  64. package/public/discs/README.protection +0 -7
  65. package/public/favicon.ico +0 -0
  66. package/public/images/botbar.png +0 -0
  67. package/public/images/cub-monitor.png +0 -0
  68. package/public/images/jsbeeb-example.png +0 -0
  69. package/public/images/placeholder.png +0 -0
  70. package/public/images/red-off-16.png +0 -0
  71. package/public/images/red-on-16.png +0 -0
  72. package/public/images/sb/CD-left.jpg +0 -0
  73. package/public/images/sb/CD-right.jpg +0 -0
  74. package/public/images/sidebar.png +0 -0
  75. package/public/images/tv.png +0 -0
  76. package/public/images/yellow-off-16.png +0 -0
  77. package/public/images/yellow-on-16.png +0 -0
  78. package/public/jsbeeb-icon.png +0 -0
  79. package/public/robots.txt +0 -3
  80. package/public/sounds/disc525/motor.wav +0 -0
  81. package/public/sounds/disc525/motoroff.wav +0 -0
  82. package/public/sounds/disc525/motoron.wav +0 -0
  83. package/public/sounds/disc525/seek.wav +0 -0
  84. package/public/sounds/disc525/seek2.wav +0 -0
  85. package/public/sounds/disc525/seek3.wav +0 -0
  86. package/public/sounds/disc525/step.wav +0 -0
  87. package/public/teletext/txt0.dat +0 -0
  88. package/public/teletext/txt1.dat +0 -0
  89. package/public/teletext/txt2.dat +0 -0
  90. package/public/teletext/txt3.dat +0 -0
  91. package/release-please-config.json +0 -13
  92. package/run-container.sh +0 -92
  93. package/tests/integration/RmwX.asm +0 -47
  94. package/tests/integration/TestInstructionsSource +0 -27
  95. package/tests/integration/TestTimingsResults +0 -27
  96. package/tests/integration/TestTimingsSource +0 -61
  97. package/tests/integration/bcd.js +0 -23
  98. package/tests/integration/dormann.js +0 -101
  99. package/tests/integration/dp111timing.js +0 -42
  100. package/tests/integration/ensure-submodules.js +0 -25
  101. package/tests/integration/nops.bas +0 -119
  102. package/tests/integration/nops.js +0 -24
  103. package/tests/integration/protection.js +0 -26
  104. package/tests/integration/rmw.js +0 -69
  105. package/tests/integration/teletext/expected_bug_469.png +0 -0
  106. package/tests/integration/teletext/expected_flash_0.png +0 -0
  107. package/tests/integration/teletext/expected_flash_1.png +0 -0
  108. package/tests/integration/teletext/expected_hoglet_held_char.png +0 -0
  109. package/tests/integration/teletext/expected_reveal_flash_0.png +0 -0
  110. package/tests/integration/teletext/expected_reveal_flash_1.png +0 -0
  111. package/tests/integration/teletext.js +0 -126
  112. package/tests/integration/timings.js +0 -56
  113. package/tests/integration/via.js +0 -1125
  114. package/tests/suite/README.md +0 -7
  115. package/tests/suite/Test Suite 2.15.txt +0 -373
  116. package/tests/suite/bin/ start +0 -0
  117. package/tests/suite/bin/adca +0 -0
  118. package/tests/suite/bin/adcax +0 -0
  119. package/tests/suite/bin/adcay +0 -0
  120. package/tests/suite/bin/adcb +0 -0
  121. package/tests/suite/bin/adcix +0 -0
  122. package/tests/suite/bin/adciy +0 -0
  123. package/tests/suite/bin/adcz +0 -0
  124. package/tests/suite/bin/adczx +0 -0
  125. package/tests/suite/bin/alrb +0 -0
  126. package/tests/suite/bin/ancb +0 -0
  127. package/tests/suite/bin/anda +0 -0
  128. package/tests/suite/bin/andax +0 -0
  129. package/tests/suite/bin/anday +0 -0
  130. package/tests/suite/bin/andb +0 -0
  131. package/tests/suite/bin/andix +0 -0
  132. package/tests/suite/bin/andiy +0 -0
  133. package/tests/suite/bin/andz +0 -0
  134. package/tests/suite/bin/andzx +0 -0
  135. package/tests/suite/bin/aneb +0 -0
  136. package/tests/suite/bin/arrb +0 -0
  137. package/tests/suite/bin/asla +0 -0
  138. package/tests/suite/bin/aslax +0 -0
  139. package/tests/suite/bin/asln +0 -0
  140. package/tests/suite/bin/aslz +0 -0
  141. package/tests/suite/bin/aslzx +0 -0
  142. package/tests/suite/bin/asoa +0 -0
  143. package/tests/suite/bin/asoax +0 -0
  144. package/tests/suite/bin/asoay +0 -0
  145. package/tests/suite/bin/asoix +0 -0
  146. package/tests/suite/bin/asoiy +0 -0
  147. package/tests/suite/bin/asoz +0 -0
  148. package/tests/suite/bin/asozx +0 -0
  149. package/tests/suite/bin/axsa +0 -0
  150. package/tests/suite/bin/axsix +0 -0
  151. package/tests/suite/bin/axsz +0 -0
  152. package/tests/suite/bin/axszy +0 -0
  153. package/tests/suite/bin/bccr +0 -0
  154. package/tests/suite/bin/bcsr +0 -0
  155. package/tests/suite/bin/beqr +0 -0
  156. package/tests/suite/bin/bita +0 -0
  157. package/tests/suite/bin/bitz +0 -0
  158. package/tests/suite/bin/bmir +0 -0
  159. package/tests/suite/bin/bner +0 -0
  160. package/tests/suite/bin/bplr +0 -0
  161. package/tests/suite/bin/branchwrap +0 -0
  162. package/tests/suite/bin/brkn +0 -0
  163. package/tests/suite/bin/bvcr +0 -0
  164. package/tests/suite/bin/bvsr +0 -0
  165. package/tests/suite/bin/cia1pb6 +0 -0
  166. package/tests/suite/bin/cia1pb7 +0 -0
  167. package/tests/suite/bin/cia1ta +0 -0
  168. package/tests/suite/bin/cia1tab +0 -0
  169. package/tests/suite/bin/cia1tb +0 -0
  170. package/tests/suite/bin/cia1tb123 +0 -0
  171. package/tests/suite/bin/cia2pb6 +0 -0
  172. package/tests/suite/bin/cia2pb7 +0 -0
  173. package/tests/suite/bin/cia2ta +0 -0
  174. package/tests/suite/bin/cia2tb +0 -0
  175. package/tests/suite/bin/cia2tb123 +0 -0
  176. package/tests/suite/bin/clcn +0 -0
  177. package/tests/suite/bin/cldn +0 -0
  178. package/tests/suite/bin/clin +0 -0
  179. package/tests/suite/bin/clvn +0 -0
  180. package/tests/suite/bin/cmpa +0 -0
  181. package/tests/suite/bin/cmpax +0 -0
  182. package/tests/suite/bin/cmpay +0 -0
  183. package/tests/suite/bin/cmpb +0 -0
  184. package/tests/suite/bin/cmpix +0 -0
  185. package/tests/suite/bin/cmpiy +0 -0
  186. package/tests/suite/bin/cmpz +0 -0
  187. package/tests/suite/bin/cmpzx +0 -0
  188. package/tests/suite/bin/cntdef +0 -0
  189. package/tests/suite/bin/cnto2 +0 -0
  190. package/tests/suite/bin/cpuport +0 -0
  191. package/tests/suite/bin/cputiming +0 -0
  192. package/tests/suite/bin/cpxa +0 -0
  193. package/tests/suite/bin/cpxb +0 -0
  194. package/tests/suite/bin/cpxz +0 -0
  195. package/tests/suite/bin/cpya +0 -0
  196. package/tests/suite/bin/cpyb +0 -0
  197. package/tests/suite/bin/cpyz +0 -0
  198. package/tests/suite/bin/dcma +0 -0
  199. package/tests/suite/bin/dcmax +0 -0
  200. package/tests/suite/bin/dcmay +0 -0
  201. package/tests/suite/bin/dcmix +0 -0
  202. package/tests/suite/bin/dcmiy +0 -0
  203. package/tests/suite/bin/dcmz +0 -0
  204. package/tests/suite/bin/dcmzx +0 -0
  205. package/tests/suite/bin/deca +0 -0
  206. package/tests/suite/bin/decax +0 -0
  207. package/tests/suite/bin/decz +0 -0
  208. package/tests/suite/bin/deczx +0 -0
  209. package/tests/suite/bin/dexn +0 -0
  210. package/tests/suite/bin/deyn +0 -0
  211. package/tests/suite/bin/eora +0 -0
  212. package/tests/suite/bin/eorax +0 -0
  213. package/tests/suite/bin/eoray +0 -0
  214. package/tests/suite/bin/eorb +0 -0
  215. package/tests/suite/bin/eorix +0 -0
  216. package/tests/suite/bin/eoriy +0 -0
  217. package/tests/suite/bin/eorz +0 -0
  218. package/tests/suite/bin/eorzx +0 -0
  219. package/tests/suite/bin/finish +0 -0
  220. package/tests/suite/bin/flipos +0 -0
  221. package/tests/suite/bin/icr01 +0 -0
  222. package/tests/suite/bin/imr +0 -0
  223. package/tests/suite/bin/inca +0 -0
  224. package/tests/suite/bin/incax +0 -0
  225. package/tests/suite/bin/incz +0 -0
  226. package/tests/suite/bin/inczx +0 -0
  227. package/tests/suite/bin/insa +0 -0
  228. package/tests/suite/bin/insax +0 -0
  229. package/tests/suite/bin/insay +0 -0
  230. package/tests/suite/bin/insix +0 -0
  231. package/tests/suite/bin/insiy +0 -0
  232. package/tests/suite/bin/insz +0 -0
  233. package/tests/suite/bin/inszx +0 -0
  234. package/tests/suite/bin/inxn +0 -0
  235. package/tests/suite/bin/inyn +0 -0
  236. package/tests/suite/bin/irq +0 -0
  237. package/tests/suite/bin/jmpi +0 -0
  238. package/tests/suite/bin/jmpw +0 -0
  239. package/tests/suite/bin/jsrw +0 -0
  240. package/tests/suite/bin/lasay +0 -0
  241. package/tests/suite/bin/laxa +0 -0
  242. package/tests/suite/bin/laxay +0 -0
  243. package/tests/suite/bin/laxix +0 -0
  244. package/tests/suite/bin/laxiy +0 -0
  245. package/tests/suite/bin/laxz +0 -0
  246. package/tests/suite/bin/laxzy +0 -0
  247. package/tests/suite/bin/ldaa +0 -0
  248. package/tests/suite/bin/ldaax +0 -0
  249. package/tests/suite/bin/ldaay +0 -0
  250. package/tests/suite/bin/ldab +0 -0
  251. package/tests/suite/bin/ldaix +0 -0
  252. package/tests/suite/bin/ldaiy +0 -0
  253. package/tests/suite/bin/ldaz +0 -0
  254. package/tests/suite/bin/ldazx +0 -0
  255. package/tests/suite/bin/ldxa +0 -0
  256. package/tests/suite/bin/ldxay +0 -0
  257. package/tests/suite/bin/ldxb +0 -0
  258. package/tests/suite/bin/ldxz +0 -0
  259. package/tests/suite/bin/ldxzy +0 -0
  260. package/tests/suite/bin/ldya +0 -0
  261. package/tests/suite/bin/ldyax +0 -0
  262. package/tests/suite/bin/ldyb +0 -0
  263. package/tests/suite/bin/ldyz +0 -0
  264. package/tests/suite/bin/ldyzx +0 -0
  265. package/tests/suite/bin/loadth +0 -0
  266. package/tests/suite/bin/lsea +0 -0
  267. package/tests/suite/bin/lseax +0 -0
  268. package/tests/suite/bin/lseay +0 -0
  269. package/tests/suite/bin/lseix +0 -0
  270. package/tests/suite/bin/lseiy +0 -0
  271. package/tests/suite/bin/lsez +0 -0
  272. package/tests/suite/bin/lsezx +0 -0
  273. package/tests/suite/bin/lsra +0 -0
  274. package/tests/suite/bin/lsrax +0 -0
  275. package/tests/suite/bin/lsrn +0 -0
  276. package/tests/suite/bin/lsrz +0 -0
  277. package/tests/suite/bin/lsrzx +0 -0
  278. package/tests/suite/bin/lxab +0 -0
  279. package/tests/suite/bin/mmu +0 -0
  280. package/tests/suite/bin/mmufetch +0 -0
  281. package/tests/suite/bin/nmi +0 -0
  282. package/tests/suite/bin/nopa +0 -0
  283. package/tests/suite/bin/nopax +0 -0
  284. package/tests/suite/bin/nopb +0 -0
  285. package/tests/suite/bin/nopn +0 -0
  286. package/tests/suite/bin/nopz +0 -0
  287. package/tests/suite/bin/nopzx +0 -0
  288. package/tests/suite/bin/oneshot +0 -0
  289. package/tests/suite/bin/oraa +0 -0
  290. package/tests/suite/bin/oraax +0 -0
  291. package/tests/suite/bin/oraay +0 -0
  292. package/tests/suite/bin/orab +0 -0
  293. package/tests/suite/bin/oraix +0 -0
  294. package/tests/suite/bin/oraiy +0 -0
  295. package/tests/suite/bin/oraz +0 -0
  296. package/tests/suite/bin/orazx +0 -0
  297. package/tests/suite/bin/phan +0 -0
  298. package/tests/suite/bin/phpn +0 -0
  299. package/tests/suite/bin/plan +0 -0
  300. package/tests/suite/bin/plpn +0 -0
  301. package/tests/suite/bin/rlaa +0 -0
  302. package/tests/suite/bin/rlaax +0 -0
  303. package/tests/suite/bin/rlaay +0 -0
  304. package/tests/suite/bin/rlaix +0 -0
  305. package/tests/suite/bin/rlaiy +0 -0
  306. package/tests/suite/bin/rlaz +0 -0
  307. package/tests/suite/bin/rlazx +0 -0
  308. package/tests/suite/bin/rola +0 -0
  309. package/tests/suite/bin/rolax +0 -0
  310. package/tests/suite/bin/roln +0 -0
  311. package/tests/suite/bin/rolz +0 -0
  312. package/tests/suite/bin/rolzx +0 -0
  313. package/tests/suite/bin/rora +0 -0
  314. package/tests/suite/bin/rorax +0 -0
  315. package/tests/suite/bin/rorn +0 -0
  316. package/tests/suite/bin/rorz +0 -0
  317. package/tests/suite/bin/rorzx +0 -0
  318. package/tests/suite/bin/rraa +0 -0
  319. package/tests/suite/bin/rraax +0 -0
  320. package/tests/suite/bin/rraay +0 -0
  321. package/tests/suite/bin/rraix +0 -0
  322. package/tests/suite/bin/rraiy +0 -0
  323. package/tests/suite/bin/rraz +0 -0
  324. package/tests/suite/bin/rrazx +0 -0
  325. package/tests/suite/bin/rtin +0 -0
  326. package/tests/suite/bin/rtsn +0 -0
  327. package/tests/suite/bin/sbca +0 -0
  328. package/tests/suite/bin/sbcax +0 -0
  329. package/tests/suite/bin/sbcay +0 -0
  330. package/tests/suite/bin/sbcb +0 -0
  331. package/tests/suite/bin/sbcb(eb) +0 -0
  332. package/tests/suite/bin/sbcix +0 -0
  333. package/tests/suite/bin/sbciy +0 -0
  334. package/tests/suite/bin/sbcz +0 -0
  335. package/tests/suite/bin/sbczx +0 -0
  336. package/tests/suite/bin/sbxb +0 -0
  337. package/tests/suite/bin/secn +0 -0
  338. package/tests/suite/bin/sedn +0 -0
  339. package/tests/suite/bin/sein +0 -0
  340. package/tests/suite/bin/shaay +0 -0
  341. package/tests/suite/bin/shaiy +0 -0
  342. package/tests/suite/bin/shsay +0 -0
  343. package/tests/suite/bin/shxay +0 -0
  344. package/tests/suite/bin/shyax +0 -0
  345. package/tests/suite/bin/staa +0 -0
  346. package/tests/suite/bin/staax +0 -0
  347. package/tests/suite/bin/staay +0 -0
  348. package/tests/suite/bin/staix +0 -0
  349. package/tests/suite/bin/staiy +0 -0
  350. package/tests/suite/bin/staz +0 -0
  351. package/tests/suite/bin/stazx +0 -0
  352. package/tests/suite/bin/stxa +0 -0
  353. package/tests/suite/bin/stxz +0 -0
  354. package/tests/suite/bin/stxzy +0 -0
  355. package/tests/suite/bin/stya +0 -0
  356. package/tests/suite/bin/styz +0 -0
  357. package/tests/suite/bin/styzx +0 -0
  358. package/tests/suite/bin/taxn +0 -0
  359. package/tests/suite/bin/tayn +0 -0
  360. package/tests/suite/bin/trap1 +0 -0
  361. package/tests/suite/bin/trap10 +0 -0
  362. package/tests/suite/bin/trap11 +0 -0
  363. package/tests/suite/bin/trap12 +0 -0
  364. package/tests/suite/bin/trap13 +0 -0
  365. package/tests/suite/bin/trap14 +0 -0
  366. package/tests/suite/bin/trap15 +0 -0
  367. package/tests/suite/bin/trap16 +0 -0
  368. package/tests/suite/bin/trap17 +0 -0
  369. package/tests/suite/bin/trap2 +0 -0
  370. package/tests/suite/bin/trap3 +0 -0
  371. package/tests/suite/bin/trap4 +0 -0
  372. package/tests/suite/bin/trap5 +0 -0
  373. package/tests/suite/bin/trap6 +0 -0
  374. package/tests/suite/bin/trap7 +0 -0
  375. package/tests/suite/bin/trap8 +0 -0
  376. package/tests/suite/bin/trap9 +0 -0
  377. package/tests/suite/bin/tsxn +0 -0
  378. package/tests/suite/bin/txan +0 -0
  379. package/tests/suite/bin/txsn +0 -0
  380. package/tests/suite/bin/tyan +0 -0
  381. package/tests/suite/cbm-hackers-post.html +0 -178
  382. package/tests/suite/cbm-hackers-post.md +0 -78
  383. package/tests/test-suite.js +0 -147
  384. package/tests/test.css +0 -7
  385. package/tests/unit/gzip/test-1 +0 -0
  386. package/tests/unit/gzip/test-1.gz +0 -0
  387. package/tests/unit/gzip/test-2 +0 -0
  388. package/tests/unit/gzip/test-2.gz +0 -0
  389. package/tests/unit/gzip/test-3 +0 -0
  390. package/tests/unit/gzip/test-3.gz +0 -0
  391. package/tests/unit/gzip/test-4 +0 -0
  392. package/tests/unit/gzip/test-4.gz +0 -0
  393. package/tests/unit/test-adc.js +0 -307
  394. package/tests/unit/test-bcd.js +0 -30
  395. package/tests/unit/test-cmos.js +0 -266
  396. package/tests/unit/test-disc-drive.js +0 -85
  397. package/tests/unit/test-disc-hfe.js +0 -347
  398. package/tests/unit/test-disc.js +0 -232
  399. package/tests/unit/test-fifo.js +0 -35
  400. package/tests/unit/test-gamepad-source.js +0 -67
  401. package/tests/unit/test-gzip.js +0 -22
  402. package/tests/unit/test-intel-fdc.js +0 -93
  403. package/tests/unit/test-keyboard.js +0 -410
  404. package/tests/unit/test-mouse-joystick-source.js +0 -128
  405. package/tests/unit/test-scheduler.js +0 -190
  406. package/tests/unit/test-serial.js +0 -154
  407. package/tests/unit/test-teletext-adaptor.js +0 -359
  408. package/tests/unit/test-tokenise.js +0 -65
  409. package/tests/unit/test-url-params.js +0 -398
  410. package/tests/unit/test-utils.js +0 -276
  411. package/tests/unit/test-video.js +0 -498
  412. package/tests/unit/test-zip.js +0 -56
  413. package/tests/unit/zip/test-mixed.zip +0 -0
  414. package/tests/unit/zip/test-rom.zip +0 -0
  415. package/tests/unit/zip/test-ssd.zip +0 -0
  416. package/tools/fir-generator.js +0 -80
  417. package/tools/vite-plugin-fir-shader.js +0 -131
  418. package/vite.config.js +0 -34
@@ -1,85 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="JSHintConfiguration" version="2.10.2" use-config-file="true">
4
- <option asi="false" />
5
- <option bitwise="false" />
6
- <option boss="false" />
7
- <option browser="true" />
8
- <option browserify="false" />
9
- <option camelcase="false" />
10
- <option couch="false" />
11
- <option curly="false" />
12
- <option debug="false" />
13
- <option devel="false" />
14
- <option dojo="false" />
15
- <option elision="false" />
16
- <option enforceall="false" />
17
- <option eqeqeq="true" />
18
- <option eqnull="false" />
19
- <option es3="false" />
20
- <option es5="false" />
21
- <option esnext="false" />
22
- <option evil="false" />
23
- <option expr="false" />
24
- <option forin="true" />
25
- <option freeze="false" />
26
- <option funcscope="false" />
27
- <option futurehostile="false" />
28
- <option gcl="false" />
29
- <option globalstrict="false" />
30
- <option immed="false" />
31
- <option iterator="false" />
32
- <option jasmine="false" />
33
- <option jquery="false" />
34
- <option lastsemic="false" />
35
- <option latedef="false" />
36
- <option laxbreak="false" />
37
- <option laxcomma="false" />
38
- <option loopfunc="false" />
39
- <option maxerr="50" />
40
- <option mocha="false" />
41
- <option module="false" />
42
- <option mootools="false" />
43
- <option moz="false" />
44
- <option multistr="false" />
45
- <option newcap="false" />
46
- <option noarg="true" />
47
- <option nocomma="false" />
48
- <option node="false" />
49
- <option noempty="true" />
50
- <option nomen="false" />
51
- <option nonbsp="false" />
52
- <option nonew="true" />
53
- <option nonstandard="false" />
54
- <option notypeof="false" />
55
- <option noyield="false" />
56
- <option onevar="false" />
57
- <option passfail="false" />
58
- <option phantom="false" />
59
- <option plusplus="false" />
60
- <option proto="false" />
61
- <option prototypejs="false" />
62
- <option qunit="false" />
63
- <option quotmark="false" />
64
- <option rhino="false" />
65
- <option scripturl="false" />
66
- <option shadow="false" />
67
- <option shelljs="false" />
68
- <option singleGroups="false" />
69
- <option smarttabs="false" />
70
- <option strict="true" />
71
- <option sub="false" />
72
- <option supernew="false" />
73
- <option trailing="false" />
74
- <option typed="false" />
75
- <option undef="true" />
76
- <option unused="false" />
77
- <option validthis="false" />
78
- <option varstmt="false" />
79
- <option white="false" />
80
- <option withstmt="false" />
81
- <option worker="false" />
82
- <option wsh="false" />
83
- <option yui="false" />
84
- </component>
85
- </project>
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="JSLintConfiguration">
4
- <option bitwise="true" />
5
- <option browser="true" />
6
- <option devel="true" />
7
- <option indent="4" />
8
- <option maxerr="50" />
9
- <option maxlen="100" />
10
- <option node="true" />
11
- <option plusplus="true" />
12
- <option predef="window,Uint8Array,Uint16Array,Uint32Array,Int8Array,Int16Array,Int32Array,define" />
13
- <option vars="true" />
14
- </component>
15
- </project>
package/.idea/jsbeeb.iml DELETED
@@ -1,11 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="WEB_MODULE" version="4">
3
- <component name="NewModuleRootManager">
4
- <content url="file://$MODULE_DIR$">
5
- <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
6
- <excludeFolder url="file://$MODULE_DIR$/out" />
7
- </content>
8
- <orderEntry type="inheritedJdk" />
9
- <orderEntry type="sourceFolder" forTests="false" />
10
- </component>
11
- </module>
package/.idea/misc.xml DELETED
@@ -1,6 +0,0 @@
1
- <project version="4">
2
- <component name="JavaScriptSettings">
3
- <option name="languageLevel" value="ES6" />
4
- </component>
5
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_3" default="false" project-jdk-name="Python 3.6 (compiler-explorer-image)" project-jdk-type="Python SDK" />
6
- </project>
package/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/jsbeeb.iml" filepath="$PROJECT_DIR$/.idea/jsbeeb.iml" />
6
- </modules>
7
- </component>
8
- </project>
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="PrettierConfiguration">
4
- <option name="myConfigurationMode" value="AUTOMATIC" />
5
- <option name="myRunOnSave" value="true" />
6
- </component>
7
- </project>
@@ -1,5 +0,0 @@
1
- <component name="ProjectRunConfigurationManager">
2
- <configuration default="false" name="Debug" type="JavascriptDebugType" uri="http://localhost:5173/" useFirstLineBreakpoints="true">
3
- <method v="2" />
4
- </configuration>
5
- </component>
@@ -1,5 +0,0 @@
1
- <component name="DependencyValidationManager">
2
- <state>
3
- <option name="SKIP_IMPORT_STATEMENTS" value="false" />
4
- </state>
5
- </component>
package/.idea/vcs.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
- <mapping directory="$PROJECT_DIR$/tests/6502_65C02_functional_tests" vcs="Git" />
6
- <mapping directory="$PROJECT_DIR$/tests/integration/dp111_6502Timing" vcs="Git" />
7
- </component>
8
- </project>
package/.prettierignore DELETED
@@ -1,4 +0,0 @@
1
- dist
2
- tests/6502_65C02_functional_tests
3
- tests/integration/dp111_6502Timing
4
- package-lock.json
package/.prettierrc.json DELETED
@@ -1 +0,0 @@
1
- {}
@@ -1,3 +0,0 @@
1
- {
2
- ".": "1.1.1"
3
- }
@@ -1,14 +0,0 @@
1
- {
2
- "version": "0.2.0",
3
- "configurations": [
4
- {
5
- "type": "chrome",
6
- "request": "launch",
7
- "name": "Debug a running dev server",
8
- "url": "http://localhost:8080?logFdcStateChanges&logFdcCommands&model=MasterADFS&disc=CodenameDroid-ADFS_E.adf",
9
- "webRoot": "${workspaceFolder}",
10
- "sourceMaps": true,
11
- "trace": true
12
- }
13
- ]
14
- }
@@ -1,6 +0,0 @@
1
- {
2
- "editor.defaultFormatter": "esbenp.prettier-vscode",
3
- "[javascript]": {
4
- "editor.defaultFormatter": "esbenp.prettier-vscode"
5
- }
6
- }
package/CHANGELOG.md DELETED
@@ -1,32 +0,0 @@
1
- # Changelog
2
-
3
- ## [1.1.1](https://github.com/mattgodbolt/jsbeeb/compare/v1.1.0...v1.1.1) (2025-11-21)
4
-
5
-
6
- ### Bug Fixes
7
-
8
- * Fix Windows Build support ([8ffa1a0](https://github.com/mattgodbolt/jsbeeb/commit/8ffa1a037fdfd7e38e072dca65da5b1959823fb2))
9
-
10
- ## [1.1.0](https://github.com/mattgodbolt/jsbeeb/compare/v1.0.1...v1.1.0) (2025-11-21)
11
-
12
-
13
- ### Features
14
-
15
- * Windows Electron build support ([1955a5f](https://github.com/mattgodbolt/jsbeeb/commit/1955a5f3ad7e9eb12cdff2e9860d8b0e304196ee))
16
-
17
- ## [1.0.1](https://github.com/mattgodbolt/jsbeeb/compare/v1.0.0...v1.0.1) (2025-11-20)
18
-
19
-
20
- ### Bug Fixes
21
-
22
- * Trying to get release-please to work
23
-
24
- ## 1.0.0 (2025-11-20)
25
-
26
- First actual release with a changelog! These fixes below are not the only thing in this release, we previously had v0.0.7 which was 4+ years old. But - this include Electron support again!
27
-
28
- ### Bug Fixes
29
-
30
- - add application icon for Electron ([#536](https://github.com/mattgodbolt/jsbeeb/issues/536)) ([64c8043](https://github.com/mattgodbolt/jsbeeb/commit/64c80438bf7c0f87db993b9a878665e3d3b090bc))
31
- - enable window scaling in Electron and modernize event handlers ([#533](https://github.com/mattgodbolt/jsbeeb/issues/533)) ([64551c9](https://github.com/mattgodbolt/jsbeeb/commit/64551c9d53c3a1a253dd1ac8f6b0f9dd9f266272))
32
- - remove invalid package-name parameter from release-please action ([#535](https://github.com/mattgodbolt/jsbeeb/issues/535)) ([5dd0436](https://github.com/mattgodbolt/jsbeeb/commit/5dd043601282e1aae976a8cd58c2071bd2b15954))
package/CLAUDE.md DELETED
@@ -1,136 +0,0 @@
1
- # CLAUDE.md
2
-
3
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
-
5
- ## Build and Test Commands
6
-
7
- - `npm start` - Start development server (IMPORTANT: Never run this command directly; ask the user to start the server
8
- as needed)
9
- - `npm run build` - Build production version
10
- - `npm run lint` - Run ESLint
11
- - `npm run lint-fix` - Run ESLint with auto-fix
12
- - `npm run format` - Run Prettier
13
- - `npm run test` - Run all tests
14
- - `npm run test:unit` - Run unit tests
15
- - `npm run test:integration` - Run integration tests
16
- - `npm run test:cpu` - Run CPU compatibility tests
17
- - `npm run ci-checks` - Run linting checks for CI
18
- - `vitest run tests/unit/test-gzip.js` - Run a single test file
19
-
20
- ### Code Coverage
21
-
22
- - `npm run coverage:unit` - Run unit tests with coverage
23
- - `npm run coverage:all-tests` - Run all tests with coverage
24
- - Coverage reports are generated in the `coverage` directory
25
- - HTML report includes line-by-line coverage visualization
26
-
27
- ## Code Style Guidelines
28
-
29
- - **Formatting**: Uses Prettier, configured in package.json
30
- - **Linting**: ESLint with eslint-config-prettier integration
31
- - **Modules**: ES modules with import/export syntax (type: "module")
32
- - **JavaScript Target**: ES2020 with strict null checks
33
- - **Error Handling**: Use try/catch with explicit error messages that provide context about what failed
34
- - **Naming**: camelCase for variables and functions, PascalCase for classes
35
- - **Imports**: Group by source (internal/external) with proper separation
36
- - **Documentation**: Use JSDoc for public APIs and complex functions, add comments for non-obvious code
37
- - **Error Messages**: Use consistent, specific error messages (e.g., "Track buffer overflow" instead of "Overflow in disc building")
38
-
39
- ## Test Organization
40
-
41
- - **Test Consolidation**: All tests for a specific component should be consolidated in a single test file.
42
- For example, all tests for `emulator.js` should be in `test-emulator.js` - do not create separate test files
43
- for different aspects of the same component.
44
- - **Test Structure**: Use nested describe blocks to organize tests by component features
45
- - **Test Isolation**: When mocking components in tests, use `vi.spyOn()` with `vi.restoreAllMocks()` in
46
- `afterEach` hooks rather than global `vi.mock()` to prevent memory leaks and test pollution
47
- - **Memory Management**: Avoid global mocks that can leak between tests and accumulate memory usage over time
48
- - **Test philosophy**
49
- - Mock as little as possible: Try and rephrase code not to require it.
50
- - Try not to rely on internal state: don't manipulate objects' inner state in tests
51
- - Use idiomatic vitest assertions (expect/toBe/toEqual) instead of node assert
52
-
53
- ## Project-Specific Knowledge
54
-
55
- - **Never commit code unless asked**: Very often we'll work on code and iterate. After you think it's complete, let me
56
- check it before you commit.
57
-
58
- ### Code Architecture
59
-
60
- - **General Principles**:
61
- - Follow the existing code style and structure
62
- - Use `const` and `let` instead of `var`
63
- - Avoid global variables; use module scope
64
- - Use arrow functions for callbacks
65
- - Prefer template literals over string concatenation
66
- - Use destructuring for objects and arrays when appropriate
67
- - Use async/await for asynchronous code instead of callbacks or promises
68
- - Minimise special case handling - prefer explicit over implicit behaviour
69
- - Consider adding tests first before implementing features
70
- - **When simplifying existing code**
71
- - Prefer helper functions for repetitive operations (like the `appendParam` function)
72
- - Remove unnecessary type checking where types are expected to be correct
73
- - Replace complex conditionals with more readable alternatives when possible
74
- - Ensure simplifications don't break existing behavior or assumptions
75
- - Try and modernise the code to use ES6+ features where possible
76
-
77
- - Prefer helper functions for repetitive operations (like the `appendParam` function)
78
- - Remove unnecessary type checking where types are expected to be correct
79
- - Replace complex conditionals with more readable alternatives when possible
80
- - Ensure simplifications don't break existing behavior or assumptions
81
-
82
- - **Constants and Magic Numbers**:
83
- - Local un-exported properties should be used for shared constants
84
- - Local constants should be used for temporary values
85
- - Always use named constants instead of magic numbers in code
86
- - Use PascalCase for module-level constants (e.g., `const MaxHfeTrackPulses = 3132;`)
87
- - Prefer module-level constants over function-local constants for shared values
88
- - Define constants at the beginning of functions or at the class/module level as appropriate
89
- - Add comments explaining what the constant represents, especially for non-obvious values
90
-
91
- - **Pre-commit Hooks**:
92
- - The project uses lint-staged with ESLint
93
- - Watch for unused variables and ensure proper error handling
94
- - YOU MUST NEVER bypass git commit hooks on checkins. This leads to failures in CI later on
95
-
96
- ### Git Workflow
97
-
98
- - When creating branches with Claude, use the `claude/` prefix (e.g., `claude/fix-esm-import-error`)
99
-
100
- ### Conventional Commits
101
-
102
- This project uses [Conventional Commits](https://www.conventionalcommits.org/) for automated versioning and changelog generation via release-please.
103
-
104
- **Commit types for user-facing changes** (appear in changelog, affect version):
105
-
106
- - `fix:` - Bug fixes (bumps patch version: 0.0.7 → 0.0.8)
107
- - `feat:` - New features (bumps minor version: 0.0.7 → 0.1.0)
108
- - `fix!:` or `feat!:` - Breaking changes (bumps major version: 0.0.7 → 1.0.0)
109
-
110
- **Commit types for internal changes** (do NOT appear in changelog, do NOT affect version):
111
-
112
- - `chore:` - Maintenance tasks, tooling updates, dependency updates
113
- - `ci:` - CI/CD configuration changes (GitHub Actions, etc.)
114
- - `build:` - Build system changes (webpack, vite, electron-builder config)
115
- - `docs:` - Documentation-only changes
116
- - `style:` - Code style changes (formatting, whitespace)
117
- - `refactor:` - Code refactoring without behavior change
118
- - `test:` - Test additions or modifications
119
-
120
- **Guidelines**:
121
-
122
- - Use `fix:` and `feat:` ONLY for changes that affect end users
123
- - Use `chore:`, `ci:`, or `build:` for internal tooling/infrastructure changes
124
- - Example: A release-please workflow fix should be `ci:` or `chore:`, not `fix:`
125
- - Breaking changes must include `BREAKING CHANGE:` in the commit body or use `!` (e.g., `feat!:`)
126
-
127
- **Examples**:
128
-
129
- ```
130
- fix: enable window scaling in Electron app
131
- feat: add joystick support for gamepads
132
- chore: update dependencies to latest versions
133
- ci: fix release-please workflow configuration
134
- build: configure electron-builder icon settings
135
- docs: update README with installation instructions
136
- ```
package/Dockerfile DELETED
@@ -1,22 +0,0 @@
1
- # NOTE: We create a temporary Docker container to build the webapp in, then copy
2
- # the generated distributable files to the final Docker image. This keeps the
3
- # final image tidy (since it doesn't contain any generated temporary artifacts),
4
- # and its size to a minimum.
5
- # NOTE: The version of Node must be kept in sync with what's in package.json.
6
- FROM node:22-alpine AS build
7
-
8
- # build the webapp
9
- WORKDIR /app/
10
- COPY package.json .
11
- RUN npm install
12
- COPY . .
13
- RUN npm run build
14
-
15
- # create the final Docker image
16
- # NOTE: The webapp is just a bunch of static files, so all we need is something to serve them.
17
- FROM nginx:1.27-alpine
18
- COPY docker/nginx-default.conf /etc/nginx/conf.d/default.conf
19
- COPY --from=build /app/dist /app
20
-
21
- EXPOSE 80
22
- CMD [ "nginx", "-g", "daemon off;" ]
package/Makefile DELETED
@@ -1,30 +0,0 @@
1
- NPM_UP_TO_DATE:=.npm-up-to-date
2
- NODE=node
3
- NPM=npm
4
-
5
- .PHONY: all
6
- all: test
7
-
8
- npm: $(NPM_UP_TO_DATE)
9
-
10
- .PHONY: npm
11
- test: npm
12
- $(NPM) test
13
-
14
- $(NPM_UP_TO_DATE): package.json
15
- $(NPM) install
16
- touch $(NPM_UP_TO_DATE)
17
-
18
- HASH := $(shell git rev-parse HEAD)
19
-
20
- .PHONY: dist
21
- dist: npm
22
- npm run build
23
-
24
- .PHONY: clean
25
- clean:
26
- @rm -rf dist out
27
-
28
- .PHONY: spotless
29
- spotless: clean
30
- @rm -f $(NPM_UP_TO_DATE)
@@ -1,10 +0,0 @@
1
- server {
2
-
3
- server_name localhost ;
4
- listen 80 ;
5
-
6
- location / {
7
- root /app ;
8
- }
9
-
10
- }
@@ -1,129 +0,0 @@
1
- # Authentic PAL TV Comb Filter Research
2
-
3
- ## Sources
4
-
5
- 1. **Watkinson "Engineer's Guide to Decoding & Encoding"** (pages 37-39)
6
- 2. **Jim Easterbrook PAL Decoder Page** (https://www.jim-easterbrook.me.uk/pal/)
7
- 3. **Web search**: PAL television patents and implementations from 1980s
8
-
9
- ## What Real PAL TVs Used
10
-
11
- ### 2H Delay Line Comb Filters
12
-
13
- **Implementation:**
14
-
15
- - Used "64 microsecond quartz delay line" (2 line periods for PAL)
16
- - Delays of **2H** (two horizontal line periods) for PAL
17
- - Contrast with NTSC which uses 1H delays
18
-
19
- **Why 2H for PAL?**
20
-
21
- - PAL subcarrier: 283.75 cycles per line (fractional 0.75)
22
- - 2H spacing = 1.5 cycles = 540° = **180° phase shift** (mod 360°)
23
- - This ensures chroma signals are in opposite phase and cancel when added
24
- - V-switch state is SAME on lines N and N±2 (both inverted or both non-inverted)
25
-
26
- **From Watkinson (page 38):**
27
-
28
- > "The delays needed are of one line period [for NTSC]. The configuration for PAL is shown in b) in which the delays need to be of two line periods."
29
-
30
- ### Complementary Decoder Approach
31
-
32
- **From Jim Easterbrook:**
33
-
34
- > "Some form of filter is used to extract the modulated chrominance from a PAL signal. Subtracting this chrominance from a suitably delayed PAL signal then yields luminance"
35
-
36
- This is the **complementary decoder** principle:
37
-
38
- 1. Extract chroma from composite using a filter
39
- 2. Subtract extracted chroma from **delayed** composite to get luma
40
- 3. The decoder is "complementary" because chroma + luma = original PAL signal
41
-
42
- **Important Note:**
43
-
44
- > "Decoders like this are not widely used, as better subjective results can be obtained by using separate filters for chrominance and luminance, each optimised to give the best looking signals."
45
-
46
- **This explains our findings!**
47
-
48
- - Notch filter (complementary approach) is simpler but not what most TVs used
49
- - Real TVs used separate optimized filters for chroma and luma
50
-
51
- ### Simple Line Comb for Luma (Most Common Approach)
52
-
53
- **From Watkinson Figure 3.4.2b:**
54
-
55
- - PAL comb uses 2H delays
56
- - **Simple averaging:** Add current line + line delayed by 2H
57
- - This is a LOWPASS filter for luma
58
- - Chroma cancels due to 180° phase inversion
59
- - Luma adds (in phase)
60
-
61
- **Coefficients:**
62
-
63
- - Simplest form: `luma = 0.5 * current + 0.5 * delayed_2H`
64
- - 3-tap variation: `luma = 0.25 * prev_2H + 0.5 * current + 0.25 * next_2H`
65
-
66
- ### Tradeoffs and Limitations
67
-
68
- **From Watkinson (page 38-39):**
69
-
70
- > "Quite a lot of vertical luminance resolution is being lost, and becoming cross luminance, particularly in PAL."
71
-
72
- **The fundamental tradeoff:**
73
-
74
- - **More averaging** (comb filter) → Less cross-color, more vertical blur
75
- - **Less averaging** (notch filter) → Sharper, but more cross-color/cross-luma artifacts
76
-
77
- **Bandpass Comb Variation:**
78
-
79
- > "Some of this resolution loss can be overcome by restricting the combing to a bandpass region"
80
-
81
- This means applying the comb filter only to mid-frequencies where chroma lives, preserving low-frequency luma detail. However:
82
-
83
- > "Although the full luminance bandwidth is available, this is restricted to picture detail having vertical edges. Man-made subjects such as buildings give good results, but more natural scenes containing diagonal edges are less successful."
84
-
85
- ### BBC Transform Decoder (Advanced)
86
-
87
- **Not a comb filter!** Uses Fourier transforms:
88
-
89
- > "Each frequency in the block is compared with its reflection about the colour sub-carrier frequency, and if the magnitudes are too dissimilar the pair of frequencies is rejected."
90
-
91
- This is much more sophisticated than simple comb filters and not what consumer TVs used.
92
-
93
- ## Summary for Implementation
94
-
95
- ### What Consumer PAL TVs Actually Did:
96
-
97
- 1. **Most common:** Simple 2H comb filter for luma
98
- - Average current line with line ±2H away
99
- - Coefficients: 0.5 + 0.5 (or 0.25 + 0.5 + 0.25 for 3-tap)
100
- - Accept vertical blur as tradeoff for reduced color artifacts
101
-
102
- 2. **Some higher-end:** Separate optimized filters
103
- - Not pure complementary decoder
104
- - Custom filters for chroma and luma
105
- - Try to balance sharpness vs artifacts
106
-
107
- 3. **Not common:** Pure notch/complementary decoders
108
- - Simpler but gave worse subjective results
109
- - Used in some early/cheap implementations
110
-
111
- ### What We Should Simulate:
112
-
113
- **Option 1: Authentic simple comb (most TVs)**
114
-
115
- - Use 2H comb with equal weighting: `luma = 0.5 * current + 0.5 * delayed_2H`
116
- - Accept some vertical blur (that's what real TVs had!)
117
- - Minimal checkerboard/cross-color
118
-
119
- **Option 2: Notch filter (current implementation)**
120
-
121
- - Sharper than real TVs
122
- - But with FIR_GAIN = 2.0, no checkerboard
123
- - Arguably "better" than real hardware, but less authentic
124
-
125
- **Recommendation:**
126
- Implement the simple 2H comb as an option so users can choose between:
127
-
128
- - "Sharp mode" (notch filter - better than real hardware)
129
- - "Authentic mode" (2H comb - what TVs actually did, with appropriate blur)