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,276 +0,0 @@
1
- import { describe, it, beforeAll, expect } from "vitest";
2
-
3
- import {
4
- parseAddr,
5
- hexbyte,
6
- hexword,
7
- signExtend,
8
- readInt16,
9
- readInt32,
10
- stringToUint8Array,
11
- uint8ArrayToString,
12
- } from "../../src/utils.js";
13
-
14
- describe("Utils tests", function () {
15
- "use strict";
16
-
17
- describe("parseAddr", function () {
18
- it("parses hex values with $ prefix", function () {
19
- expect(parseAddr("$1234")).toBe(0x1234);
20
- expect(parseAddr("$0")).toBe(0);
21
- expect(parseAddr("$FFFF")).toBe(0xffff);
22
- });
23
-
24
- it("parses hex values with & prefix", function () {
25
- expect(parseAddr("&1234")).toBe(0x1234);
26
- expect(parseAddr("&0")).toBe(0);
27
- expect(parseAddr("&FFFF")).toBe(0xffff);
28
- });
29
-
30
- it("parses hex values with 0x prefix", function () {
31
- expect(parseAddr("0x1234")).toBe(0x1234);
32
- expect(parseAddr("0x0")).toBe(0);
33
- expect(parseAddr("0xFFFF")).toBe(0xffff);
34
- });
35
-
36
- it("parses hex values with no prefix", function () {
37
- expect(parseAddr("1234")).toBe(0x1234);
38
- expect(parseAddr("0")).toBe(0);
39
- expect(parseAddr("FFFF")).toBe(0xffff);
40
- });
41
- });
42
-
43
- describe("hexbyte", function () {
44
- it("formats single-digit values correctly", function () {
45
- expect(hexbyte(0)).toBe("00");
46
- expect(hexbyte(9)).toBe("09");
47
- });
48
-
49
- it("formats two-digit values correctly", function () {
50
- expect(hexbyte(10)).toBe("0a");
51
- expect(hexbyte(255)).toBe("ff");
52
- });
53
-
54
- it("truncates values greater than 255", function () {
55
- expect(hexbyte(256)).toBe("00");
56
- expect(hexbyte(257)).toBe("01");
57
- });
58
- });
59
-
60
- describe("hexword", function () {
61
- it("formats values as 4-digit hex", function () {
62
- expect(hexword(0)).toBe("0000");
63
- expect(hexword(0x1234)).toBe("1234");
64
- expect(hexword(0xffff)).toBe("ffff");
65
- });
66
-
67
- it("truncates values greater than 0xFFFF", function () {
68
- expect(hexword(0x10000)).toBe("0000");
69
- expect(hexword(0x10001)).toBe("0001");
70
- });
71
- });
72
-
73
- describe("signExtend", function () {
74
- it("leaves values under 128 unchanged", function () {
75
- expect(signExtend(0)).toBe(0);
76
- expect(signExtend(127)).toBe(127);
77
- });
78
-
79
- it("converts values between 128 and 255 to negative", function () {
80
- expect(signExtend(128)).toBe(-128);
81
- expect(signExtend(255)).toBe(-1);
82
- });
83
- });
84
-
85
- describe("uint8Array conversion", function () {
86
- it("converts between string and Uint8Array", function () {
87
- const str = "Hello, world!";
88
- const arr = stringToUint8Array(str);
89
-
90
- expect(arr).toBeInstanceOf(Uint8Array);
91
- expect(arr.length).toBe(str.length);
92
- expect(uint8ArrayToString(arr)).toBe(str);
93
- });
94
-
95
- it("handles empty string", function () {
96
- const str = "";
97
- const arr = stringToUint8Array(str);
98
-
99
- expect(arr).toBeInstanceOf(Uint8Array);
100
- expect(arr.length).toBe(0);
101
- expect(uint8ArrayToString(arr)).toBe(str);
102
- });
103
-
104
- it("truncates characters to 8 bits", function () {
105
- const arr = stringToUint8Array("\u1234"); // Character outside of 8-bit range
106
- expect(arr[0]).toBe(0x34); // Should be truncated to the lower 8 bits
107
- });
108
- });
109
-
110
- describe("readInt functions", function () {
111
- it("reads 16-bit integers correctly", function () {
112
- const data = new Uint8Array([0x34, 0x12, 0xff, 0xff]);
113
- expect(readInt16(data, 0)).toBe(0x1234);
114
- expect(readInt16(data, 2)).toBe(0xffff);
115
- });
116
-
117
- it("reads 32-bit integers correctly", function () {
118
- const data = new Uint8Array([0x78, 0x56, 0x34, 0x12, 0xff, 0xff, 0xff, 0xff]);
119
- expect(readInt32(data, 0)).toBe(0x12345678);
120
- // In JavaScript, bitwise operations are performed on 32-bit integers
121
- // 0xFFFFFFFF is treated as -1 when interpreted as a signed 32-bit integer
122
- expect(readInt32(data, 4)).toBe(-1);
123
- });
124
- });
125
-
126
- describe("DataStream", function () {
127
- let DataStream;
128
-
129
- beforeAll(async function () {
130
- const utils = await import("../../src/utils.js");
131
- DataStream = utils.DataStream;
132
- });
133
-
134
- it("creates from string data", function () {
135
- const stream = new DataStream("test", "Hello");
136
- expect(stream.name).toBe("test");
137
- expect(stream.pos).toBe(0);
138
- expect(stream.end).toBe(5);
139
- expect(stream.bytesLeft()).toBe(5);
140
- expect(stream.eof()).toBe(false);
141
- });
142
-
143
- it("creates from Uint8Array data", function () {
144
- const data = new Uint8Array([1, 2, 3, 4, 5]);
145
- const stream = new DataStream("test", data);
146
- expect(stream.bytesLeft()).toBe(5);
147
- expect(stream.data).toEqual(data);
148
- });
149
-
150
- it("handles advancing position correctly", function () {
151
- const stream = new DataStream("test", "Hello");
152
-
153
- // Advance and get position
154
- const pos = stream.advance(2);
155
- expect(pos).toBe(0);
156
- expect(stream.pos).toBe(2);
157
- expect(stream.bytesLeft()).toBe(3);
158
-
159
- // Advance more
160
- stream.advance(2);
161
- expect(stream.pos).toBe(4);
162
- expect(stream.bytesLeft()).toBe(1);
163
- expect(stream.eof()).toBe(false);
164
-
165
- // Advance to the end
166
- stream.advance(1);
167
- expect(stream.bytesLeft()).toBe(0);
168
- expect(stream.eof()).toBe(true);
169
-
170
- // Trying to advance past the end should throw
171
- expect(() => {
172
- stream.advance(1);
173
- }).toThrow(RangeError);
174
- });
175
-
176
- it("reads bytes correctly", function () {
177
- const data = new Uint8Array([0x12, 0x34, 0x56, 0x78]);
178
- const stream = new DataStream("test", data);
179
-
180
- expect(stream.readByte()).toBe(0x12);
181
- expect(stream.pos).toBe(1);
182
-
183
- expect(stream.readByte(2)).toBe(0x56);
184
- expect(stream.pos).toBe(1); // Position shouldn't change when position is provided
185
-
186
- stream.advance(2);
187
- expect(stream.readByte()).toBe(0x78);
188
- expect(stream.pos).toBe(4);
189
- });
190
-
191
- it("reads 16-bit and 32-bit values correctly", function () {
192
- const data = new Uint8Array([0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0]);
193
- const stream = new DataStream("test", data);
194
-
195
- expect(stream.readInt16()).toBe(0x3412);
196
- expect(stream.pos).toBe(2);
197
-
198
- expect(stream.readInt16(4)).toBe(0xbc9a);
199
- expect(stream.pos).toBe(2);
200
-
201
- // In JavaScript bitwise operations, large 32-bit values can be interpreted as negative
202
- // So we compare the actual value from readInt32 without using a literal
203
- const expectedInt32 = readInt32(data, 2);
204
- expect(stream.readInt32()).toBe(expectedInt32);
205
- expect(stream.pos).toBe(6);
206
- });
207
-
208
- it("reads null-terminated strings correctly", function () {
209
- const data = new Uint8Array([72, 101, 108, 108, 111, 0, 87, 111, 114, 108, 100, 0]);
210
- const stream = new DataStream("test", data);
211
-
212
- expect(stream.readNulString()).toBe("Hello");
213
- expect(stream.pos).toBe(6);
214
-
215
- expect(stream.readNulString(6)).toBe("World");
216
- expect(stream.pos).toBe(6); // Position shouldn't change when position is provided
217
-
218
- stream.advance(6);
219
- expect(stream.readNulString()).toBe("");
220
- expect(stream.pos).toBe(12);
221
- });
222
-
223
- it("creates substreams correctly", function () {
224
- const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
225
- const stream = new DataStream("test", data);
226
-
227
- // Create substream from current position with length
228
- const sub1 = stream.substream(3);
229
- expect(sub1.name).toBe("test.sub");
230
- expect(sub1.pos).toBe(0);
231
- expect(sub1.end).toBe(3);
232
- expect(Array.from(sub1.data)).toEqual([1, 2, 3]);
233
- expect(stream.pos).toBe(3);
234
-
235
- // Create substream from specific position with length
236
- const sub2 = stream.substream(4, 2);
237
- expect(sub2.pos).toBe(0);
238
- expect(sub2.end).toBe(2);
239
- expect(Array.from(sub2.data)).toEqual([5, 6]);
240
- expect(stream.pos).toBe(3); // Original stream position unchanged
241
- });
242
-
243
- it("seeks to position correctly", function () {
244
- const stream = new DataStream("test", "Hello World");
245
-
246
- stream.seek(6);
247
- expect(stream.pos).toBe(6);
248
- expect(stream.bytesLeft()).toBe(5);
249
-
250
- expect(() => {
251
- stream.seek(20);
252
- }).toThrow(RangeError);
253
- });
254
- });
255
-
256
- describe("Keyboard mapping", function () {
257
- it("maps simple strings to BBC keys correctly", async function () {
258
- const { stringToBBCKeys, BBC } = await import("../../src/utils.js");
259
-
260
- // Test special characters
261
- const keys1 = stringToBBCKeys("\n\t ");
262
- expect(keys1).toEqual([BBC.RETURN, BBC.TAB, BBC.SPACE]);
263
-
264
- // Verify uppercase letters are mapped correctly
265
- expect(stringToBBCKeys("ABC")).toEqual([BBC.A, BBC.B, BBC.C]);
266
-
267
- // Verify numbers are mapped correctly
268
- expect(stringToBBCKeys("123")).toEqual([BBC.K1, BBC.K2, BBC.K3]);
269
-
270
- // Test that stringToBBCKeys returns expected length for simple inputs
271
- expect(stringToBBCKeys("Q").length).toBe(1);
272
- expect(stringToBBCKeys("a").length).toBe(3); // With CAPSLOCK toggles
273
- expect(stringToBBCKeys("!").length).toBe(3); // With SHIFT
274
- });
275
- });
276
- });