jsbeeb 1.1.1

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 (498) hide show
  1. package/.editorconfig +15 -0
  2. package/.git-blame-ignore-revs +3 -0
  3. package/.github/copilot-instructions.md +94 -0
  4. package/.github/workflows/claude-issue-triage.yml +105 -0
  5. package/.github/workflows/claude.yml +63 -0
  6. package/.github/workflows/release-please.yml +75 -0
  7. package/.github/workflows/test-and-deploy.yml +86 -0
  8. package/.gitmodules +6 -0
  9. package/.husky/pre-commit +1 -0
  10. package/.idea/codeStyleSettings.xml +9 -0
  11. package/.idea/codeStyles/Project.xml +62 -0
  12. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  13. package/.idea/compiler.xml +22 -0
  14. package/.idea/copyright/profiles_settings.xml +3 -0
  15. package/.idea/encodings.xml +6 -0
  16. package/.idea/inspectionProfiles/Project_Default.xml +7 -0
  17. package/.idea/jsLibraryMappings.xml +6 -0
  18. package/.idea/jsLinters/jshint.xml +85 -0
  19. package/.idea/jsLinters/jslint.xml +15 -0
  20. package/.idea/jsbeeb.iml +11 -0
  21. package/.idea/misc.xml +6 -0
  22. package/.idea/modules.xml +8 -0
  23. package/.idea/prettier.xml +7 -0
  24. package/.idea/runConfigurations/Debug.xml +5 -0
  25. package/.idea/scopes/scope_settings.xml +5 -0
  26. package/.idea/vcs.xml +8 -0
  27. package/.prettierignore +4 -0
  28. package/.prettierrc.json +1 -0
  29. package/.release-please-manifest.json +3 -0
  30. package/.vscode/launch.json +14 -0
  31. package/.vscode/settings.json +6 -0
  32. package/CHANGELOG.md +32 -0
  33. package/CLAUDE.md +136 -0
  34. package/COPYING +674 -0
  35. package/Dockerfile +22 -0
  36. package/Makefile +30 -0
  37. package/README.md +259 -0
  38. package/docker/nginx-default.conf +10 -0
  39. package/docs/pal-comb-filter-research.md +129 -0
  40. package/docs/pal-simulation-design.md +368 -0
  41. package/eslint.config.js +35 -0
  42. package/index.html +954 -0
  43. package/jsconfig.json +10 -0
  44. package/package.json +102 -0
  45. package/public/discs/README.Irq-Timing +3 -0
  46. package/public/discs/README.bcdtest +5 -0
  47. package/public/discs/README.elite +6 -0
  48. package/public/discs/README.eng_test +3 -0
  49. package/public/discs/README.protection +7 -0
  50. package/public/favicon.ico +0 -0
  51. package/public/images/botbar.png +0 -0
  52. package/public/images/cub-monitor.png +0 -0
  53. package/public/images/jsbeeb-example.png +0 -0
  54. package/public/images/placeholder.png +0 -0
  55. package/public/images/red-off-16.png +0 -0
  56. package/public/images/red-on-16.png +0 -0
  57. package/public/images/sb/CD-left.jpg +0 -0
  58. package/public/images/sb/CD-right.jpg +0 -0
  59. package/public/images/sidebar.png +0 -0
  60. package/public/images/tv.png +0 -0
  61. package/public/images/yellow-off-16.png +0 -0
  62. package/public/images/yellow-on-16.png +0 -0
  63. package/public/jsbeeb-icon.png +0 -0
  64. package/public/robots.txt +3 -0
  65. package/public/roms/ADFS1-53.rom +0 -0
  66. package/public/roms/BASIC.ROM +0 -0
  67. package/public/roms/README +4 -0
  68. package/public/roms/a01/BASIC1.rom +0 -0
  69. package/public/roms/ample.rom +0 -0
  70. package/public/roms/ats-3.0.rom +0 -0
  71. package/public/roms/b/DFS-0.9.rom +0 -0
  72. package/public/roms/b/DFS-1.2.rom +0 -0
  73. package/public/roms/b1770/dfs1770.rom +0 -0
  74. package/public/roms/b1770/zADFS.ROM +0 -0
  75. package/public/roms/bp/dfs.rom +0 -0
  76. package/public/roms/bp/zADFS.ROM +0 -0
  77. package/public/roms/bpos.rom +0 -0
  78. package/public/roms/compact/adfs210.rom +0 -0
  79. package/public/roms/compact/basic48.rom +0 -0
  80. package/public/roms/compact/basic486.rom +0 -0
  81. package/public/roms/compact/os51.rom +0 -0
  82. package/public/roms/compact/utils.rom +0 -0
  83. package/public/roms/deos.rom +0 -0
  84. package/public/roms/master/anfs-4.25.rom +0 -0
  85. package/public/roms/master/mos.txt +68819 -0
  86. package/public/roms/master/mos3.20 +0 -0
  87. package/public/roms/os.rom +0 -0
  88. package/public/roms/os01.rom +0 -0
  89. package/public/roms/tube/6502Tube.rom +0 -0
  90. package/public/roms/tube/ARMeval_100.rom +0 -0
  91. package/public/roms/tube/BIOS.ROM +0 -0
  92. package/public/roms/tube/ReCo6502ROM_816 +0 -0
  93. package/public/roms/tube/Z80_120.rom +0 -0
  94. package/public/roms/us/USBASIC.rom +0 -0
  95. package/public/roms/us/USDNFS.rom +0 -0
  96. package/public/roms/usmos.rom +0 -0
  97. package/public/sounds/disc525/motor.wav +0 -0
  98. package/public/sounds/disc525/motoroff.wav +0 -0
  99. package/public/sounds/disc525/motoron.wav +0 -0
  100. package/public/sounds/disc525/seek.wav +0 -0
  101. package/public/sounds/disc525/seek2.wav +0 -0
  102. package/public/sounds/disc525/seek3.wav +0 -0
  103. package/public/sounds/disc525/step.wav +0 -0
  104. package/public/teletext/txt0.dat +0 -0
  105. package/public/teletext/txt1.dat +0 -0
  106. package/public/teletext/txt2.dat +0 -0
  107. package/public/teletext/txt3.dat +0 -0
  108. package/release-please-config.json +13 -0
  109. package/run-container.sh +92 -0
  110. package/src/6502.js +1347 -0
  111. package/src/6502.opcodes.js +1411 -0
  112. package/src/acia.js +261 -0
  113. package/src/adc.js +149 -0
  114. package/src/analogue-source.js +21 -0
  115. package/src/app/app.js +175 -0
  116. package/src/app/electron.js +20 -0
  117. package/src/app/preload.js +8 -0
  118. package/src/app-bench.js +33 -0
  119. package/src/basic/multiline-tetris +9 -0
  120. package/src/basic-tokenise.js +104 -0
  121. package/src/canvas.js +177 -0
  122. package/src/cmos.js +141 -0
  123. package/src/config.js +165 -0
  124. package/src/ddnoise.js +138 -0
  125. package/src/disc-drive.js +371 -0
  126. package/src/disc-hfe.js +396 -0
  127. package/src/disc.js +997 -0
  128. package/src/econet/L3FS.dat +0 -0
  129. package/src/econet/scsi.dat +0 -0
  130. package/src/econet.js +714 -0
  131. package/src/fake6502.js +32 -0
  132. package/src/fdc.js +248 -0
  133. package/src/filestore.js +666 -0
  134. package/src/gamepad-source.js +59 -0
  135. package/src/gamepads.js +268 -0
  136. package/src/google-drive.js +160 -0
  137. package/src/intel-fdc.js +1717 -0
  138. package/src/jsbeeb.css +363 -0
  139. package/src/keyboard.js +411 -0
  140. package/src/lib/README +1 -0
  141. package/src/lib/webgl-debug.js +911 -0
  142. package/src/main.js +1759 -0
  143. package/src/microphone-input.js +149 -0
  144. package/src/models.js +200 -0
  145. package/src/mouse-joystick-source.js +107 -0
  146. package/src/music5000-worklet.js +43 -0
  147. package/src/music5000.js +207 -0
  148. package/src/scheduler.js +148 -0
  149. package/src/serial.js +31 -0
  150. package/src/soundchip.js +314 -0
  151. package/src/sth.js +59 -0
  152. package/src/tapes.js +265 -0
  153. package/src/teletext.js +348 -0
  154. package/src/teletext_adaptor.js +172 -0
  155. package/src/teletext_data.js +1064 -0
  156. package/src/touchscreen.js +86 -0
  157. package/src/tube.js +349 -0
  158. package/src/url-params.js +256 -0
  159. package/src/utils.js +1090 -0
  160. package/src/via.js +702 -0
  161. package/src/video-filters/pal-composite.js +94 -0
  162. package/src/video-filters/passthrough-filter.js +70 -0
  163. package/src/video-filters/shaders/pal-composite.frag.glsl +147 -0
  164. package/src/video-filters/shaders/pal-composite.vert.glsl +8 -0
  165. package/src/video-filters/shaders/passthrough.frag.glsl +6 -0
  166. package/src/video-filters/shaders/passthrough.vert.glsl +7 -0
  167. package/src/video.js +794 -0
  168. package/src/wd-fdc.js +1344 -0
  169. package/src/web/audio-handler.js +146 -0
  170. package/src/web/audio-renderer.js +115 -0
  171. package/src/web/debug.js +529 -0
  172. package/tests/integration/RmwX.asm +47 -0
  173. package/tests/integration/TestInstructionsSource +27 -0
  174. package/tests/integration/TestTimingsResults +27 -0
  175. package/tests/integration/TestTimingsSource +61 -0
  176. package/tests/integration/bcd.js +23 -0
  177. package/tests/integration/dormann.js +101 -0
  178. package/tests/integration/dp111timing.js +42 -0
  179. package/tests/integration/ensure-submodules.js +25 -0
  180. package/tests/integration/nops.bas +119 -0
  181. package/tests/integration/nops.js +24 -0
  182. package/tests/integration/protection.js +26 -0
  183. package/tests/integration/rmw.js +69 -0
  184. package/tests/integration/teletext/expected_bug_469.png +0 -0
  185. package/tests/integration/teletext/expected_flash_0.png +0 -0
  186. package/tests/integration/teletext/expected_flash_1.png +0 -0
  187. package/tests/integration/teletext/expected_hoglet_held_char.png +0 -0
  188. package/tests/integration/teletext/expected_reveal_flash_0.png +0 -0
  189. package/tests/integration/teletext/expected_reveal_flash_1.png +0 -0
  190. package/tests/integration/teletext.js +126 -0
  191. package/tests/integration/timings.js +56 -0
  192. package/tests/integration/via.js +1125 -0
  193. package/tests/suite/README.md +7 -0
  194. package/tests/suite/Test Suite 2.15.txt +373 -0
  195. package/tests/suite/bin/ start +0 -0
  196. package/tests/suite/bin/adca +0 -0
  197. package/tests/suite/bin/adcax +0 -0
  198. package/tests/suite/bin/adcay +0 -0
  199. package/tests/suite/bin/adcb +0 -0
  200. package/tests/suite/bin/adcix +0 -0
  201. package/tests/suite/bin/adciy +0 -0
  202. package/tests/suite/bin/adcz +0 -0
  203. package/tests/suite/bin/adczx +0 -0
  204. package/tests/suite/bin/alrb +0 -0
  205. package/tests/suite/bin/ancb +0 -0
  206. package/tests/suite/bin/anda +0 -0
  207. package/tests/suite/bin/andax +0 -0
  208. package/tests/suite/bin/anday +0 -0
  209. package/tests/suite/bin/andb +0 -0
  210. package/tests/suite/bin/andix +0 -0
  211. package/tests/suite/bin/andiy +0 -0
  212. package/tests/suite/bin/andz +0 -0
  213. package/tests/suite/bin/andzx +0 -0
  214. package/tests/suite/bin/aneb +0 -0
  215. package/tests/suite/bin/arrb +0 -0
  216. package/tests/suite/bin/asla +0 -0
  217. package/tests/suite/bin/aslax +0 -0
  218. package/tests/suite/bin/asln +0 -0
  219. package/tests/suite/bin/aslz +0 -0
  220. package/tests/suite/bin/aslzx +0 -0
  221. package/tests/suite/bin/asoa +0 -0
  222. package/tests/suite/bin/asoax +0 -0
  223. package/tests/suite/bin/asoay +0 -0
  224. package/tests/suite/bin/asoix +0 -0
  225. package/tests/suite/bin/asoiy +0 -0
  226. package/tests/suite/bin/asoz +0 -0
  227. package/tests/suite/bin/asozx +0 -0
  228. package/tests/suite/bin/axsa +0 -0
  229. package/tests/suite/bin/axsix +0 -0
  230. package/tests/suite/bin/axsz +0 -0
  231. package/tests/suite/bin/axszy +0 -0
  232. package/tests/suite/bin/bccr +0 -0
  233. package/tests/suite/bin/bcsr +0 -0
  234. package/tests/suite/bin/beqr +0 -0
  235. package/tests/suite/bin/bita +0 -0
  236. package/tests/suite/bin/bitz +0 -0
  237. package/tests/suite/bin/bmir +0 -0
  238. package/tests/suite/bin/bner +0 -0
  239. package/tests/suite/bin/bplr +0 -0
  240. package/tests/suite/bin/branchwrap +0 -0
  241. package/tests/suite/bin/brkn +0 -0
  242. package/tests/suite/bin/bvcr +0 -0
  243. package/tests/suite/bin/bvsr +0 -0
  244. package/tests/suite/bin/cia1pb6 +0 -0
  245. package/tests/suite/bin/cia1pb7 +0 -0
  246. package/tests/suite/bin/cia1ta +0 -0
  247. package/tests/suite/bin/cia1tab +0 -0
  248. package/tests/suite/bin/cia1tb +0 -0
  249. package/tests/suite/bin/cia1tb123 +0 -0
  250. package/tests/suite/bin/cia2pb6 +0 -0
  251. package/tests/suite/bin/cia2pb7 +0 -0
  252. package/tests/suite/bin/cia2ta +0 -0
  253. package/tests/suite/bin/cia2tb +0 -0
  254. package/tests/suite/bin/cia2tb123 +0 -0
  255. package/tests/suite/bin/clcn +0 -0
  256. package/tests/suite/bin/cldn +0 -0
  257. package/tests/suite/bin/clin +0 -0
  258. package/tests/suite/bin/clvn +0 -0
  259. package/tests/suite/bin/cmpa +0 -0
  260. package/tests/suite/bin/cmpax +0 -0
  261. package/tests/suite/bin/cmpay +0 -0
  262. package/tests/suite/bin/cmpb +0 -0
  263. package/tests/suite/bin/cmpix +0 -0
  264. package/tests/suite/bin/cmpiy +0 -0
  265. package/tests/suite/bin/cmpz +0 -0
  266. package/tests/suite/bin/cmpzx +0 -0
  267. package/tests/suite/bin/cntdef +0 -0
  268. package/tests/suite/bin/cnto2 +0 -0
  269. package/tests/suite/bin/cpuport +0 -0
  270. package/tests/suite/bin/cputiming +0 -0
  271. package/tests/suite/bin/cpxa +0 -0
  272. package/tests/suite/bin/cpxb +0 -0
  273. package/tests/suite/bin/cpxz +0 -0
  274. package/tests/suite/bin/cpya +0 -0
  275. package/tests/suite/bin/cpyb +0 -0
  276. package/tests/suite/bin/cpyz +0 -0
  277. package/tests/suite/bin/dcma +0 -0
  278. package/tests/suite/bin/dcmax +0 -0
  279. package/tests/suite/bin/dcmay +0 -0
  280. package/tests/suite/bin/dcmix +0 -0
  281. package/tests/suite/bin/dcmiy +0 -0
  282. package/tests/suite/bin/dcmz +0 -0
  283. package/tests/suite/bin/dcmzx +0 -0
  284. package/tests/suite/bin/deca +0 -0
  285. package/tests/suite/bin/decax +0 -0
  286. package/tests/suite/bin/decz +0 -0
  287. package/tests/suite/bin/deczx +0 -0
  288. package/tests/suite/bin/dexn +0 -0
  289. package/tests/suite/bin/deyn +0 -0
  290. package/tests/suite/bin/eora +0 -0
  291. package/tests/suite/bin/eorax +0 -0
  292. package/tests/suite/bin/eoray +0 -0
  293. package/tests/suite/bin/eorb +0 -0
  294. package/tests/suite/bin/eorix +0 -0
  295. package/tests/suite/bin/eoriy +0 -0
  296. package/tests/suite/bin/eorz +0 -0
  297. package/tests/suite/bin/eorzx +0 -0
  298. package/tests/suite/bin/finish +0 -0
  299. package/tests/suite/bin/flipos +0 -0
  300. package/tests/suite/bin/icr01 +0 -0
  301. package/tests/suite/bin/imr +0 -0
  302. package/tests/suite/bin/inca +0 -0
  303. package/tests/suite/bin/incax +0 -0
  304. package/tests/suite/bin/incz +0 -0
  305. package/tests/suite/bin/inczx +0 -0
  306. package/tests/suite/bin/insa +0 -0
  307. package/tests/suite/bin/insax +0 -0
  308. package/tests/suite/bin/insay +0 -0
  309. package/tests/suite/bin/insix +0 -0
  310. package/tests/suite/bin/insiy +0 -0
  311. package/tests/suite/bin/insz +0 -0
  312. package/tests/suite/bin/inszx +0 -0
  313. package/tests/suite/bin/inxn +0 -0
  314. package/tests/suite/bin/inyn +0 -0
  315. package/tests/suite/bin/irq +0 -0
  316. package/tests/suite/bin/jmpi +0 -0
  317. package/tests/suite/bin/jmpw +0 -0
  318. package/tests/suite/bin/jsrw +0 -0
  319. package/tests/suite/bin/lasay +0 -0
  320. package/tests/suite/bin/laxa +0 -0
  321. package/tests/suite/bin/laxay +0 -0
  322. package/tests/suite/bin/laxix +0 -0
  323. package/tests/suite/bin/laxiy +0 -0
  324. package/tests/suite/bin/laxz +0 -0
  325. package/tests/suite/bin/laxzy +0 -0
  326. package/tests/suite/bin/ldaa +0 -0
  327. package/tests/suite/bin/ldaax +0 -0
  328. package/tests/suite/bin/ldaay +0 -0
  329. package/tests/suite/bin/ldab +0 -0
  330. package/tests/suite/bin/ldaix +0 -0
  331. package/tests/suite/bin/ldaiy +0 -0
  332. package/tests/suite/bin/ldaz +0 -0
  333. package/tests/suite/bin/ldazx +0 -0
  334. package/tests/suite/bin/ldxa +0 -0
  335. package/tests/suite/bin/ldxay +0 -0
  336. package/tests/suite/bin/ldxb +0 -0
  337. package/tests/suite/bin/ldxz +0 -0
  338. package/tests/suite/bin/ldxzy +0 -0
  339. package/tests/suite/bin/ldya +0 -0
  340. package/tests/suite/bin/ldyax +0 -0
  341. package/tests/suite/bin/ldyb +0 -0
  342. package/tests/suite/bin/ldyz +0 -0
  343. package/tests/suite/bin/ldyzx +0 -0
  344. package/tests/suite/bin/loadth +0 -0
  345. package/tests/suite/bin/lsea +0 -0
  346. package/tests/suite/bin/lseax +0 -0
  347. package/tests/suite/bin/lseay +0 -0
  348. package/tests/suite/bin/lseix +0 -0
  349. package/tests/suite/bin/lseiy +0 -0
  350. package/tests/suite/bin/lsez +0 -0
  351. package/tests/suite/bin/lsezx +0 -0
  352. package/tests/suite/bin/lsra +0 -0
  353. package/tests/suite/bin/lsrax +0 -0
  354. package/tests/suite/bin/lsrn +0 -0
  355. package/tests/suite/bin/lsrz +0 -0
  356. package/tests/suite/bin/lsrzx +0 -0
  357. package/tests/suite/bin/lxab +0 -0
  358. package/tests/suite/bin/mmu +0 -0
  359. package/tests/suite/bin/mmufetch +0 -0
  360. package/tests/suite/bin/nmi +0 -0
  361. package/tests/suite/bin/nopa +0 -0
  362. package/tests/suite/bin/nopax +0 -0
  363. package/tests/suite/bin/nopb +0 -0
  364. package/tests/suite/bin/nopn +0 -0
  365. package/tests/suite/bin/nopz +0 -0
  366. package/tests/suite/bin/nopzx +0 -0
  367. package/tests/suite/bin/oneshot +0 -0
  368. package/tests/suite/bin/oraa +0 -0
  369. package/tests/suite/bin/oraax +0 -0
  370. package/tests/suite/bin/oraay +0 -0
  371. package/tests/suite/bin/orab +0 -0
  372. package/tests/suite/bin/oraix +0 -0
  373. package/tests/suite/bin/oraiy +0 -0
  374. package/tests/suite/bin/oraz +0 -0
  375. package/tests/suite/bin/orazx +0 -0
  376. package/tests/suite/bin/phan +0 -0
  377. package/tests/suite/bin/phpn +0 -0
  378. package/tests/suite/bin/plan +0 -0
  379. package/tests/suite/bin/plpn +0 -0
  380. package/tests/suite/bin/rlaa +0 -0
  381. package/tests/suite/bin/rlaax +0 -0
  382. package/tests/suite/bin/rlaay +0 -0
  383. package/tests/suite/bin/rlaix +0 -0
  384. package/tests/suite/bin/rlaiy +0 -0
  385. package/tests/suite/bin/rlaz +0 -0
  386. package/tests/suite/bin/rlazx +0 -0
  387. package/tests/suite/bin/rola +0 -0
  388. package/tests/suite/bin/rolax +0 -0
  389. package/tests/suite/bin/roln +0 -0
  390. package/tests/suite/bin/rolz +0 -0
  391. package/tests/suite/bin/rolzx +0 -0
  392. package/tests/suite/bin/rora +0 -0
  393. package/tests/suite/bin/rorax +0 -0
  394. package/tests/suite/bin/rorn +0 -0
  395. package/tests/suite/bin/rorz +0 -0
  396. package/tests/suite/bin/rorzx +0 -0
  397. package/tests/suite/bin/rraa +0 -0
  398. package/tests/suite/bin/rraax +0 -0
  399. package/tests/suite/bin/rraay +0 -0
  400. package/tests/suite/bin/rraix +0 -0
  401. package/tests/suite/bin/rraiy +0 -0
  402. package/tests/suite/bin/rraz +0 -0
  403. package/tests/suite/bin/rrazx +0 -0
  404. package/tests/suite/bin/rtin +0 -0
  405. package/tests/suite/bin/rtsn +0 -0
  406. package/tests/suite/bin/sbca +0 -0
  407. package/tests/suite/bin/sbcax +0 -0
  408. package/tests/suite/bin/sbcay +0 -0
  409. package/tests/suite/bin/sbcb +0 -0
  410. package/tests/suite/bin/sbcb(eb) +0 -0
  411. package/tests/suite/bin/sbcix +0 -0
  412. package/tests/suite/bin/sbciy +0 -0
  413. package/tests/suite/bin/sbcz +0 -0
  414. package/tests/suite/bin/sbczx +0 -0
  415. package/tests/suite/bin/sbxb +0 -0
  416. package/tests/suite/bin/secn +0 -0
  417. package/tests/suite/bin/sedn +0 -0
  418. package/tests/suite/bin/sein +0 -0
  419. package/tests/suite/bin/shaay +0 -0
  420. package/tests/suite/bin/shaiy +0 -0
  421. package/tests/suite/bin/shsay +0 -0
  422. package/tests/suite/bin/shxay +0 -0
  423. package/tests/suite/bin/shyax +0 -0
  424. package/tests/suite/bin/staa +0 -0
  425. package/tests/suite/bin/staax +0 -0
  426. package/tests/suite/bin/staay +0 -0
  427. package/tests/suite/bin/staix +0 -0
  428. package/tests/suite/bin/staiy +0 -0
  429. package/tests/suite/bin/staz +0 -0
  430. package/tests/suite/bin/stazx +0 -0
  431. package/tests/suite/bin/stxa +0 -0
  432. package/tests/suite/bin/stxz +0 -0
  433. package/tests/suite/bin/stxzy +0 -0
  434. package/tests/suite/bin/stya +0 -0
  435. package/tests/suite/bin/styz +0 -0
  436. package/tests/suite/bin/styzx +0 -0
  437. package/tests/suite/bin/taxn +0 -0
  438. package/tests/suite/bin/tayn +0 -0
  439. package/tests/suite/bin/trap1 +0 -0
  440. package/tests/suite/bin/trap10 +0 -0
  441. package/tests/suite/bin/trap11 +0 -0
  442. package/tests/suite/bin/trap12 +0 -0
  443. package/tests/suite/bin/trap13 +0 -0
  444. package/tests/suite/bin/trap14 +0 -0
  445. package/tests/suite/bin/trap15 +0 -0
  446. package/tests/suite/bin/trap16 +0 -0
  447. package/tests/suite/bin/trap17 +0 -0
  448. package/tests/suite/bin/trap2 +0 -0
  449. package/tests/suite/bin/trap3 +0 -0
  450. package/tests/suite/bin/trap4 +0 -0
  451. package/tests/suite/bin/trap5 +0 -0
  452. package/tests/suite/bin/trap6 +0 -0
  453. package/tests/suite/bin/trap7 +0 -0
  454. package/tests/suite/bin/trap8 +0 -0
  455. package/tests/suite/bin/trap9 +0 -0
  456. package/tests/suite/bin/tsxn +0 -0
  457. package/tests/suite/bin/txan +0 -0
  458. package/tests/suite/bin/txsn +0 -0
  459. package/tests/suite/bin/tyan +0 -0
  460. package/tests/suite/cbm-hackers-post.html +178 -0
  461. package/tests/suite/cbm-hackers-post.md +78 -0
  462. package/tests/test-machine.js +288 -0
  463. package/tests/test-suite.js +147 -0
  464. package/tests/test.css +7 -0
  465. package/tests/unit/gzip/test-1 +0 -0
  466. package/tests/unit/gzip/test-1.gz +0 -0
  467. package/tests/unit/gzip/test-2 +0 -0
  468. package/tests/unit/gzip/test-2.gz +0 -0
  469. package/tests/unit/gzip/test-3 +0 -0
  470. package/tests/unit/gzip/test-3.gz +0 -0
  471. package/tests/unit/gzip/test-4 +0 -0
  472. package/tests/unit/gzip/test-4.gz +0 -0
  473. package/tests/unit/test-adc.js +307 -0
  474. package/tests/unit/test-bcd.js +30 -0
  475. package/tests/unit/test-cmos.js +266 -0
  476. package/tests/unit/test-disc-drive.js +85 -0
  477. package/tests/unit/test-disc-hfe.js +347 -0
  478. package/tests/unit/test-disc.js +232 -0
  479. package/tests/unit/test-fifo.js +35 -0
  480. package/tests/unit/test-gamepad-source.js +67 -0
  481. package/tests/unit/test-gzip.js +22 -0
  482. package/tests/unit/test-intel-fdc.js +93 -0
  483. package/tests/unit/test-keyboard.js +410 -0
  484. package/tests/unit/test-mouse-joystick-source.js +128 -0
  485. package/tests/unit/test-scheduler.js +190 -0
  486. package/tests/unit/test-serial.js +154 -0
  487. package/tests/unit/test-teletext-adaptor.js +359 -0
  488. package/tests/unit/test-tokenise.js +65 -0
  489. package/tests/unit/test-url-params.js +398 -0
  490. package/tests/unit/test-utils.js +276 -0
  491. package/tests/unit/test-video.js +498 -0
  492. package/tests/unit/test-zip.js +56 -0
  493. package/tests/unit/zip/test-mixed.zip +0 -0
  494. package/tests/unit/zip/test-rom.zip +0 -0
  495. package/tests/unit/zip/test-ssd.zip +0 -0
  496. package/tools/fir-generator.js +80 -0
  497. package/tools/vite-plugin-fir-shader.js +131 -0
  498. package/vite.config.js +34 -0
@@ -0,0 +1,78 @@
1
+ ## Wolfgang Lorenz's 6502 test suite
2
+
3
+ When Wolfgang Lorenz's excellent 6502 (well, actually there's some 6526
4
+ stuff in there as well) test suite was mentioned earlier on, I recalled
5
+ having re-packaged it a few years ago in a form more suitable for play
6
+ on non-Commodore platforms (it was originally provided as a D64 image).
7
+
8
+ In case anyone would find it useful I packed it up and put it online at
9
+ http://jegt.net/~palm/testsuite-2.15.tar.gz
10
+
11
+ Since it makes a few assumtions about the surrounding environment, I'd
12
+ also like to share a few notes on the "test bench" environment I hacked
13
+ up to be able to run it outside a C64:
14
+
15
+ The testcase is started by loading " start" and starting the CPU.
16
+
17
+ The load routine does the following:
18
+
19
+ Check the filename for "trap17" and exit if it is, since this is where testing of non-6510 stuff begins.
20
+
21
+ Read the starting address from the two first bytes of the file (LO, HI). Load the rest of the file into memory at the specified starting address.
22
+
23
+ Initialize some memory locations:
24
+
25
+ $0002 = $00
26
+ $A002 = $00
27
+ $A003 = $80
28
+ $FFFE = $48
29
+ $FFFF = $FF
30
+ $01FE = $FF
31
+ $01FF = $7F
32
+
33
+ Set up the KERNAL "IRQ handler" at $FF48:
34
+
35
+ FF48 48 PHA
36
+ FF49 8A TXA
37
+ FF4A 48 PHA
38
+ FF4B 98 TYA
39
+ FF4C 48 PHA
40
+ FF4D BA TSX
41
+ FF4E BD 04 01 LDA $0104,X
42
+ FF51 29 10 AND #$10
43
+ FF53 F0 03 BEQ $FF58
44
+ FF55 6C 16 03 JMP ($0316)
45
+ FF58 6C 14 03 JMP ($0314)
46
+
47
+ Set `S` to `$FD`, `P` to `$04` and `PC` to `$0801`
48
+
49
+ Put trap instructions at `$FFD2`, `$E16F`, `$FFE4`, `$8000` and `$A474`, where the trap handler does the following:
50
+
51
+ if `PC == $FFD2` (Print character):
52
+
53
+ - Set `$030C = 0`
54
+ - Print `PETSCII` character corresponding to value of `A`
55
+ - Pop return address from stack
56
+ - Set `PC` to return address
57
+ - Re-start the CPU
58
+
59
+ if `PC == $E16F` (Load):
60
+
61
+ - `$BB` is `PETSCII` filename address, low byte
62
+ - `$BC` is `PETSCII` filename address, high byte
63
+ - `$B7` is `PETSCII` filename length
64
+ - Load the file
65
+ - Pop return address from stack
66
+ - Set `PC` to `$0816`
67
+ - Re-start the CPU
68
+
69
+ if `PC == $FFE4` (Scan keyboard):
70
+
71
+ - Set `A` to 3
72
+ - Pop return address from stack
73
+ - Set `PC` to return address
74
+ - Re-start the CPU
75
+
76
+ if `PC == $8000` or `PC == $A474`:
77
+
78
+ - Exit
@@ -0,0 +1,288 @@
1
+ import * as fdc from "../src/fdc.js";
2
+ import { fake6502 } from "../src/fake6502.js";
3
+ import { findModel } from "../src/models.js";
4
+ import assert from "assert";
5
+ import * as utils from "../src/utils.js";
6
+ import * as Tokeniser from "../src/basic-tokenise.js";
7
+
8
+ const MaxCyclesPerIter = 100 * 1000;
9
+
10
+ export class TestMachine {
11
+ constructor(model, opts) {
12
+ model = model || "B-DFS1.2";
13
+ this.processor = fake6502(findModel(model), opts || {});
14
+ }
15
+
16
+ async initialise() {
17
+ await this.processor.initialise();
18
+ }
19
+
20
+ runFor(cycles) {
21
+ let left = cycles;
22
+ let stopped = false;
23
+ return new Promise((resolve) => {
24
+ const runAnIter = () => {
25
+ const todo = Math.max(0, Math.min(left, MaxCyclesPerIter));
26
+ if (todo) {
27
+ stopped = !this.processor.execute(todo);
28
+ left -= todo;
29
+ }
30
+ if (left && !stopped) {
31
+ setTimeout(runAnIter, 0);
32
+ } else {
33
+ resolve();
34
+ }
35
+ };
36
+ runAnIter();
37
+ });
38
+ }
39
+
40
+ async runUntilVblank() {
41
+ let hit = false;
42
+ if (this.processor.isMaster) throw new Error("Not yet implemented");
43
+ const hook = this.processor.debugInstruction.add((addr) => {
44
+ if (addr === 0xdd15) {
45
+ hit = true;
46
+ return true;
47
+ }
48
+ });
49
+ await this.runFor(10 * 1000 * 1000);
50
+ hook.remove();
51
+ assert(hit, "did not hit appropriate breakpoint in time");
52
+ }
53
+
54
+ async runUntilInput(secs) {
55
+ if (!secs) secs = 120;
56
+ console.log("Running until keyboard input requested");
57
+ const idleAddr = this.processor.model.isMaster ? 0xe7e6 : 0xe581;
58
+ let hit = false;
59
+ const hook = this.processor.debugInstruction.add((addr) => {
60
+ if (addr === idleAddr) {
61
+ hit = true;
62
+ return true;
63
+ }
64
+ });
65
+ await this.runFor(secs * 2 * 1000 * 1000);
66
+ hook.remove();
67
+ assert(hit, "did not hit appropriate breakpoint in time");
68
+ return this.runFor(10 * 1000);
69
+ }
70
+
71
+ async runUntilAddress(targetAddr, secs) {
72
+ if (!secs) secs = 120;
73
+ let hit = false;
74
+ const hook = this.processor.debugInstruction.add((addr) => {
75
+ if (addr === targetAddr) {
76
+ hit = true;
77
+ return true;
78
+ }
79
+ });
80
+ await this.runFor(secs * 2 * 1000 * 1000);
81
+ hook.remove();
82
+ assert(hit, "did not hit appropriate breakpoint in time");
83
+ }
84
+
85
+ async loadDisc(image) {
86
+ const data = await fdc.load(image);
87
+ this.processor.fdc.loadDisc(0, fdc.discFor(this.processor.fdc, "", data));
88
+ }
89
+
90
+ async loadBasic(source) {
91
+ const tokeniser = await Tokeniser.create();
92
+ const tokenised = tokeniser.tokenise(source);
93
+ // TODO: dedupe from main.js
94
+ const page = this.readbyte(0x18) << 8;
95
+ for (let i = 0; i < tokenised.length; ++i) {
96
+ this.writebyte(page + i, tokenised.charCodeAt(i));
97
+ }
98
+ // Set VARTOP (0x12/3) and TOP(0x02/3)
99
+ const end = page + tokenised.length;
100
+ const endLow = end & 0xff;
101
+ const endHigh = (end >>> 8) & 0xff;
102
+ this.writebyte(0x02, endLow);
103
+ this.writebyte(0x03, endHigh);
104
+ this.writebyte(0x12, endLow);
105
+ this.writebyte(0x13, endHigh);
106
+ }
107
+
108
+ async type(text) {
109
+ console.log("Typing '" + text + "'");
110
+ const cycles = 40 * 1000;
111
+
112
+ const kd = (ch) => {
113
+ this.processor.sysvia.keyDown(ch);
114
+ return this.runFor(cycles).then(() => {
115
+ this.processor.sysvia.keyUp(ch);
116
+ return this.runFor(cycles);
117
+ });
118
+ };
119
+
120
+ const typeChar = (ch) => {
121
+ let shift = false;
122
+ switch (ch) {
123
+ case '"':
124
+ ch = 50;
125
+ shift = true;
126
+ break;
127
+ case "*":
128
+ ch = utils.keyCodes.APOSTROPHE;
129
+ shift = true;
130
+ break;
131
+ case "!":
132
+ ch = utils.keyCodes.K1;
133
+ shift = true;
134
+ break;
135
+ case ".":
136
+ ch = utils.keyCodes.PERIOD;
137
+ break;
138
+ case ";":
139
+ ch = utils.keyCodes.SEMICOLON;
140
+ break;
141
+ case ":":
142
+ ch = utils.keyCodes.APOSTROPHE;
143
+ break;
144
+ case ",":
145
+ ch = utils.keyCodes.COMMA;
146
+ break;
147
+ case "&":
148
+ ch = utils.keyCodes.K6;
149
+ shift = true;
150
+ break;
151
+ default:
152
+ ch = ch.toUpperCase().charCodeAt(0);
153
+ break;
154
+ }
155
+ if (shift) {
156
+ this.processor.sysvia.keyDown(16);
157
+ return this.runFor(cycles).then(() => {
158
+ return kd(ch).then(() => {
159
+ this.processor.sysvia.keyUp(16);
160
+ return this.runFor(cycles);
161
+ });
162
+ });
163
+ } else {
164
+ return kd(ch);
165
+ }
166
+ };
167
+
168
+ return text
169
+ .split("")
170
+ .reduce(function (p, char) {
171
+ return p.then(function () {
172
+ return typeChar(char);
173
+ });
174
+ }, Promise.resolve())
175
+ .then(function () {
176
+ return kd(13);
177
+ });
178
+ }
179
+
180
+ writebyte(addr, val) {
181
+ this.processor.writemem(addr, val);
182
+ }
183
+
184
+ readbyte(addr) {
185
+ return this.processor.readmem(addr);
186
+ }
187
+
188
+ readword(addr) {
189
+ return this.readbyte(addr) | (this.readbyte(addr + 1) << 8);
190
+ }
191
+
192
+ captureText(onElement) {
193
+ const attributes = {
194
+ x: 0,
195
+ y: 0,
196
+ text: "",
197
+ foreground: 7,
198
+ background: 0,
199
+ mode: 7,
200
+ };
201
+ let currentText = "";
202
+ let params = [];
203
+ let nextN = 0;
204
+ let vduProc = null;
205
+
206
+ function flush() {
207
+ if (currentText.length) {
208
+ attributes.text = currentText;
209
+ onElement(attributes);
210
+ attributes.x += currentText.length; // Approximately...anyway
211
+ }
212
+ currentText = "";
213
+ }
214
+
215
+ function onChar(c) {
216
+ if (nextN) {
217
+ params.push(c);
218
+ if (--nextN === 0) {
219
+ if (vduProc) vduProc(params);
220
+ params = [];
221
+ vduProc = null;
222
+ }
223
+ return;
224
+ }
225
+ switch (c) {
226
+ case 1: // Next char to printer
227
+ nextN = 1;
228
+ break;
229
+ case 10:
230
+ attributes.y++;
231
+ break;
232
+ case 12: // CLS
233
+ attributes.x = 0;
234
+ attributes.y = 0;
235
+ break;
236
+ case 13:
237
+ attributes.x = 0;
238
+ break;
239
+ case 17: // Text colour
240
+ nextN = 1;
241
+ vduProc = function (params) {
242
+ if (params[0] & 0x80) attributes.background = params[0] & 0xf;
243
+ else attributes.foreground = params[0] & 0xf;
244
+ };
245
+ break;
246
+ case 18: // GCOL
247
+ nextN = 2;
248
+ break;
249
+ case 19: // logical colour
250
+ nextN = 5;
251
+ break;
252
+ case 22: // mode
253
+ nextN = 1;
254
+ vduProc = function (params) {
255
+ attributes.mode = params[0];
256
+ attributes.x = 0;
257
+ attributes.y = 0;
258
+ };
259
+ break;
260
+ case 25: // plot
261
+ nextN = 5;
262
+ break;
263
+ case 28: // text window
264
+ nextN = 4;
265
+ break;
266
+ case 29: // origin
267
+ nextN = 4;
268
+ break;
269
+ case 31: // text location
270
+ nextN = 2;
271
+ vduProc = function (params) {
272
+ attributes.x = params[0];
273
+ attributes.y = params[1];
274
+ };
275
+ }
276
+ if (c >= 32 && c < 0x7f) {
277
+ currentText += String.fromCharCode(c);
278
+ } else flush();
279
+ return false;
280
+ }
281
+
282
+ const wrchv = this.readword(0x20e);
283
+ this.processor.debugInstruction.add((addr) => {
284
+ if (addr === wrchv) onChar(this.processor.a);
285
+ return false;
286
+ });
287
+ }
288
+ }
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+
3
+ import * as utils from "../src/utils.js";
4
+ import { fake6502 } from "../src/fake6502.js";
5
+
6
+ const processor = fake6502();
7
+ const IRQ_ROUTINE_START = 0xff48;
8
+ const RTS_OPCODE = 0x60;
9
+ const NOP_OPCODE = 0xea;
10
+
11
+ // prettier-ignore
12
+ const IRQ_ROUTINE = [
13
+ 0x48, // PHA
14
+ 0x8a, // TXA
15
+ 0x48, // PHA
16
+ 0x98, // TYA
17
+ 0x48, // PHA
18
+ 0xba, // TSX
19
+ 0xbd, 0x04, 0x01, // LDA $0104,X
20
+ 0x29, 0x10, // AND #$10
21
+ 0xf0, 0x03, // BEQ $03
22
+ 0x6c, 0x16, 0x03, // JMP ($0316)
23
+ 0x6c, 0x14, 0x03 // JMP ($0314)
24
+ ];
25
+
26
+ async function setup(filename) {
27
+ try {
28
+ initializeMemory();
29
+ await loadTest(filename);
30
+ setupIRQRoutine();
31
+ setupProcessor();
32
+ } catch (error) {
33
+ console.error(`Error in setup: ${error.message}`);
34
+ }
35
+ }
36
+
37
+ function initializeMemory() {
38
+ for (let i = 0x0000; i < 0xffff; ++i) processor.writemem(i, 0x00);
39
+ }
40
+
41
+ async function loadTest(filename) {
42
+ const data = await utils.loadData(`tests/suite/bin/${filename}`);
43
+ const addr = data[0] + (data[1] << 8);
44
+ console.log(`>> Loading test '${filename}' at ${utils.hexword(addr)}`);
45
+ for (let i = 2; i < data.length; ++i) processor.writemem(addr + i - 2, data[i]);
46
+ }
47
+
48
+ function setupIRQRoutine() {
49
+ for (let i = 0; i < IRQ_ROUTINE.length; ++i) processor.writemem(IRQ_ROUTINE_START + i, IRQ_ROUTINE[i]);
50
+ }
51
+
52
+ function setupProcessor() {
53
+ processor.writemem(0x0002, 0x00);
54
+ processor.writemem(0xa002, 0x00);
55
+ processor.writemem(0xa003, 0x80);
56
+ processor.writemem(0x01fe, 0xff);
57
+ processor.writemem(0x01ff, 0x7f);
58
+ processor.writemem(0xffd2, RTS_OPCODE);
59
+ processor.writemem(0x8000, RTS_OPCODE);
60
+ processor.writemem(0xa474, RTS_OPCODE);
61
+ processor.writemem(0xe16f, NOP_OPCODE);
62
+ processor.writemem(0xffe4, 0xa9);
63
+ processor.writemem(0xffe5, 0x03);
64
+ processor.writemem(0xffe6, RTS_OPCODE);
65
+ processor.writemem(0xfffe, 0x48);
66
+ processor.writemem(0xffff, 0xff);
67
+ processor.s = 0xfd;
68
+ processor.p.reset();
69
+ processor.p.i = true;
70
+ processor.pc = 0x0801;
71
+ }
72
+
73
+ let curLine = "";
74
+
75
+ function petToAscii(char) {
76
+ if (char === 14 || char === 145) return "";
77
+ if (char === 147) return "\n-------\n";
78
+ if (char >= 0xc1 && char <= 0xda) return String.fromCharCode(char - 0xc1 + 65);
79
+ if (char >= 0x41 && char <= 0x5a) return String.fromCharCode(char - 0x41 + 97);
80
+ if (char < 32 || char >= 127) return ".";
81
+ return String.fromCharCode(char);
82
+ }
83
+
84
+ processor.debugInstruction.add((addr) => {
85
+ switch (addr) {
86
+ case 0xffd2:
87
+ handlePrint();
88
+ break;
89
+ case 0xe16f:
90
+ return handleLoad();
91
+ case 0x8000:
92
+ case 0xa474:
93
+ handleError();
94
+ break;
95
+ default:
96
+ break;
97
+ }
98
+ return false;
99
+ });
100
+
101
+ function handlePrint() {
102
+ if (processor.a === 13) {
103
+ console.log(curLine);
104
+ curLine = "";
105
+ } else {
106
+ curLine += petToAscii(processor.a);
107
+ }
108
+ processor.writemem(0x030c, 0x00);
109
+ }
110
+
111
+ function handleLoad() {
112
+ const filenameAddr = processor.readmem(0xbb) | (processor.readmem(0xbc) << 8);
113
+ const filenameLen = processor.readmem(0xb7);
114
+ let filename = "";
115
+ for (let i = 0; i < filenameLen; ++i) filename += petToAscii(processor.readmem(filenameAddr + i));
116
+ if (filename === "trap17") {
117
+ console.log("All tests complete");
118
+ process.exit(0);
119
+ }
120
+ setup(filename).then(anIter);
121
+ processor.pc--;
122
+ return true;
123
+ }
124
+
125
+ function handleError() {
126
+ if (curLine.length) console.log(curLine);
127
+ throw new Error("Test failed");
128
+ }
129
+
130
+ function anIter() {
131
+ for (;;) {
132
+ if (!processor.execute(10 * 1000 * 1000)) return;
133
+ }
134
+ }
135
+
136
+ async function main() {
137
+ try {
138
+ await processor.initialise();
139
+ const filename = process.argv.length === 3 ? process.argv[2] : " start";
140
+ await setup(filename);
141
+ anIter();
142
+ } catch (error) {
143
+ console.error(`Error in main: ${error.message}`);
144
+ }
145
+ }
146
+
147
+ main().then(() => {});
package/tests/test.css ADDED
@@ -0,0 +1,7 @@
1
+ .success {
2
+ background-color: #062206;
3
+ }
4
+
5
+ .fail {
6
+ background-color: #440606;
7
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file