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.
- package/.editorconfig +15 -0
- package/.git-blame-ignore-revs +3 -0
- package/.github/copilot-instructions.md +94 -0
- package/.github/workflows/claude-issue-triage.yml +105 -0
- package/.github/workflows/claude.yml +63 -0
- package/.github/workflows/release-please.yml +75 -0
- package/.github/workflows/test-and-deploy.yml +86 -0
- package/.gitmodules +6 -0
- package/.husky/pre-commit +1 -0
- package/.idea/codeStyleSettings.xml +9 -0
- package/.idea/codeStyles/Project.xml +62 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/compiler.xml +22 -0
- package/.idea/copyright/profiles_settings.xml +3 -0
- package/.idea/encodings.xml +6 -0
- package/.idea/inspectionProfiles/Project_Default.xml +7 -0
- package/.idea/jsLibraryMappings.xml +6 -0
- package/.idea/jsLinters/jshint.xml +85 -0
- package/.idea/jsLinters/jslint.xml +15 -0
- package/.idea/jsbeeb.iml +11 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/prettier.xml +7 -0
- package/.idea/runConfigurations/Debug.xml +5 -0
- package/.idea/scopes/scope_settings.xml +5 -0
- package/.idea/vcs.xml +8 -0
- package/.prettierignore +4 -0
- package/.prettierrc.json +1 -0
- package/.release-please-manifest.json +3 -0
- package/.vscode/launch.json +14 -0
- package/.vscode/settings.json +6 -0
- package/CHANGELOG.md +32 -0
- package/CLAUDE.md +136 -0
- package/COPYING +674 -0
- package/Dockerfile +22 -0
- package/Makefile +30 -0
- package/README.md +259 -0
- package/docker/nginx-default.conf +10 -0
- package/docs/pal-comb-filter-research.md +129 -0
- package/docs/pal-simulation-design.md +368 -0
- package/eslint.config.js +35 -0
- package/index.html +954 -0
- package/jsconfig.json +10 -0
- package/package.json +102 -0
- package/public/discs/README.Irq-Timing +3 -0
- package/public/discs/README.bcdtest +5 -0
- package/public/discs/README.elite +6 -0
- package/public/discs/README.eng_test +3 -0
- package/public/discs/README.protection +7 -0
- package/public/favicon.ico +0 -0
- package/public/images/botbar.png +0 -0
- package/public/images/cub-monitor.png +0 -0
- package/public/images/jsbeeb-example.png +0 -0
- package/public/images/placeholder.png +0 -0
- package/public/images/red-off-16.png +0 -0
- package/public/images/red-on-16.png +0 -0
- package/public/images/sb/CD-left.jpg +0 -0
- package/public/images/sb/CD-right.jpg +0 -0
- package/public/images/sidebar.png +0 -0
- package/public/images/tv.png +0 -0
- package/public/images/yellow-off-16.png +0 -0
- package/public/images/yellow-on-16.png +0 -0
- package/public/jsbeeb-icon.png +0 -0
- package/public/robots.txt +3 -0
- package/public/roms/ADFS1-53.rom +0 -0
- package/public/roms/BASIC.ROM +0 -0
- package/public/roms/README +4 -0
- package/public/roms/a01/BASIC1.rom +0 -0
- package/public/roms/ample.rom +0 -0
- package/public/roms/ats-3.0.rom +0 -0
- package/public/roms/b/DFS-0.9.rom +0 -0
- package/public/roms/b/DFS-1.2.rom +0 -0
- package/public/roms/b1770/dfs1770.rom +0 -0
- package/public/roms/b1770/zADFS.ROM +0 -0
- package/public/roms/bp/dfs.rom +0 -0
- package/public/roms/bp/zADFS.ROM +0 -0
- package/public/roms/bpos.rom +0 -0
- package/public/roms/compact/adfs210.rom +0 -0
- package/public/roms/compact/basic48.rom +0 -0
- package/public/roms/compact/basic486.rom +0 -0
- package/public/roms/compact/os51.rom +0 -0
- package/public/roms/compact/utils.rom +0 -0
- package/public/roms/deos.rom +0 -0
- package/public/roms/master/anfs-4.25.rom +0 -0
- package/public/roms/master/mos.txt +68819 -0
- package/public/roms/master/mos3.20 +0 -0
- package/public/roms/os.rom +0 -0
- package/public/roms/os01.rom +0 -0
- package/public/roms/tube/6502Tube.rom +0 -0
- package/public/roms/tube/ARMeval_100.rom +0 -0
- package/public/roms/tube/BIOS.ROM +0 -0
- package/public/roms/tube/ReCo6502ROM_816 +0 -0
- package/public/roms/tube/Z80_120.rom +0 -0
- package/public/roms/us/USBASIC.rom +0 -0
- package/public/roms/us/USDNFS.rom +0 -0
- package/public/roms/usmos.rom +0 -0
- package/public/sounds/disc525/motor.wav +0 -0
- package/public/sounds/disc525/motoroff.wav +0 -0
- package/public/sounds/disc525/motoron.wav +0 -0
- package/public/sounds/disc525/seek.wav +0 -0
- package/public/sounds/disc525/seek2.wav +0 -0
- package/public/sounds/disc525/seek3.wav +0 -0
- package/public/sounds/disc525/step.wav +0 -0
- package/public/teletext/txt0.dat +0 -0
- package/public/teletext/txt1.dat +0 -0
- package/public/teletext/txt2.dat +0 -0
- package/public/teletext/txt3.dat +0 -0
- package/release-please-config.json +13 -0
- package/run-container.sh +92 -0
- package/src/6502.js +1347 -0
- package/src/6502.opcodes.js +1411 -0
- package/src/acia.js +261 -0
- package/src/adc.js +149 -0
- package/src/analogue-source.js +21 -0
- package/src/app/app.js +175 -0
- package/src/app/electron.js +20 -0
- package/src/app/preload.js +8 -0
- package/src/app-bench.js +33 -0
- package/src/basic/multiline-tetris +9 -0
- package/src/basic-tokenise.js +104 -0
- package/src/canvas.js +177 -0
- package/src/cmos.js +141 -0
- package/src/config.js +165 -0
- package/src/ddnoise.js +138 -0
- package/src/disc-drive.js +371 -0
- package/src/disc-hfe.js +396 -0
- package/src/disc.js +997 -0
- package/src/econet/L3FS.dat +0 -0
- package/src/econet/scsi.dat +0 -0
- package/src/econet.js +714 -0
- package/src/fake6502.js +32 -0
- package/src/fdc.js +248 -0
- package/src/filestore.js +666 -0
- package/src/gamepad-source.js +59 -0
- package/src/gamepads.js +268 -0
- package/src/google-drive.js +160 -0
- package/src/intel-fdc.js +1717 -0
- package/src/jsbeeb.css +363 -0
- package/src/keyboard.js +411 -0
- package/src/lib/README +1 -0
- package/src/lib/webgl-debug.js +911 -0
- package/src/main.js +1759 -0
- package/src/microphone-input.js +149 -0
- package/src/models.js +200 -0
- package/src/mouse-joystick-source.js +107 -0
- package/src/music5000-worklet.js +43 -0
- package/src/music5000.js +207 -0
- package/src/scheduler.js +148 -0
- package/src/serial.js +31 -0
- package/src/soundchip.js +314 -0
- package/src/sth.js +59 -0
- package/src/tapes.js +265 -0
- package/src/teletext.js +348 -0
- package/src/teletext_adaptor.js +172 -0
- package/src/teletext_data.js +1064 -0
- package/src/touchscreen.js +86 -0
- package/src/tube.js +349 -0
- package/src/url-params.js +256 -0
- package/src/utils.js +1090 -0
- package/src/via.js +702 -0
- package/src/video-filters/pal-composite.js +94 -0
- package/src/video-filters/passthrough-filter.js +70 -0
- package/src/video-filters/shaders/pal-composite.frag.glsl +147 -0
- package/src/video-filters/shaders/pal-composite.vert.glsl +8 -0
- package/src/video-filters/shaders/passthrough.frag.glsl +6 -0
- package/src/video-filters/shaders/passthrough.vert.glsl +7 -0
- package/src/video.js +794 -0
- package/src/wd-fdc.js +1344 -0
- package/src/web/audio-handler.js +146 -0
- package/src/web/audio-renderer.js +115 -0
- package/src/web/debug.js +529 -0
- package/tests/integration/RmwX.asm +47 -0
- package/tests/integration/TestInstructionsSource +27 -0
- package/tests/integration/TestTimingsResults +27 -0
- package/tests/integration/TestTimingsSource +61 -0
- package/tests/integration/bcd.js +23 -0
- package/tests/integration/dormann.js +101 -0
- package/tests/integration/dp111timing.js +42 -0
- package/tests/integration/ensure-submodules.js +25 -0
- package/tests/integration/nops.bas +119 -0
- package/tests/integration/nops.js +24 -0
- package/tests/integration/protection.js +26 -0
- package/tests/integration/rmw.js +69 -0
- package/tests/integration/teletext/expected_bug_469.png +0 -0
- package/tests/integration/teletext/expected_flash_0.png +0 -0
- package/tests/integration/teletext/expected_flash_1.png +0 -0
- package/tests/integration/teletext/expected_hoglet_held_char.png +0 -0
- package/tests/integration/teletext/expected_reveal_flash_0.png +0 -0
- package/tests/integration/teletext/expected_reveal_flash_1.png +0 -0
- package/tests/integration/teletext.js +126 -0
- package/tests/integration/timings.js +56 -0
- package/tests/integration/via.js +1125 -0
- package/tests/suite/README.md +7 -0
- package/tests/suite/Test Suite 2.15.txt +373 -0
- package/tests/suite/bin/ start +0 -0
- package/tests/suite/bin/adca +0 -0
- package/tests/suite/bin/adcax +0 -0
- package/tests/suite/bin/adcay +0 -0
- package/tests/suite/bin/adcb +0 -0
- package/tests/suite/bin/adcix +0 -0
- package/tests/suite/bin/adciy +0 -0
- package/tests/suite/bin/adcz +0 -0
- package/tests/suite/bin/adczx +0 -0
- package/tests/suite/bin/alrb +0 -0
- package/tests/suite/bin/ancb +0 -0
- package/tests/suite/bin/anda +0 -0
- package/tests/suite/bin/andax +0 -0
- package/tests/suite/bin/anday +0 -0
- package/tests/suite/bin/andb +0 -0
- package/tests/suite/bin/andix +0 -0
- package/tests/suite/bin/andiy +0 -0
- package/tests/suite/bin/andz +0 -0
- package/tests/suite/bin/andzx +0 -0
- package/tests/suite/bin/aneb +0 -0
- package/tests/suite/bin/arrb +0 -0
- package/tests/suite/bin/asla +0 -0
- package/tests/suite/bin/aslax +0 -0
- package/tests/suite/bin/asln +0 -0
- package/tests/suite/bin/aslz +0 -0
- package/tests/suite/bin/aslzx +0 -0
- package/tests/suite/bin/asoa +0 -0
- package/tests/suite/bin/asoax +0 -0
- package/tests/suite/bin/asoay +0 -0
- package/tests/suite/bin/asoix +0 -0
- package/tests/suite/bin/asoiy +0 -0
- package/tests/suite/bin/asoz +0 -0
- package/tests/suite/bin/asozx +0 -0
- package/tests/suite/bin/axsa +0 -0
- package/tests/suite/bin/axsix +0 -0
- package/tests/suite/bin/axsz +0 -0
- package/tests/suite/bin/axszy +0 -0
- package/tests/suite/bin/bccr +0 -0
- package/tests/suite/bin/bcsr +0 -0
- package/tests/suite/bin/beqr +0 -0
- package/tests/suite/bin/bita +0 -0
- package/tests/suite/bin/bitz +0 -0
- package/tests/suite/bin/bmir +0 -0
- package/tests/suite/bin/bner +0 -0
- package/tests/suite/bin/bplr +0 -0
- package/tests/suite/bin/branchwrap +0 -0
- package/tests/suite/bin/brkn +0 -0
- package/tests/suite/bin/bvcr +0 -0
- package/tests/suite/bin/bvsr +0 -0
- package/tests/suite/bin/cia1pb6 +0 -0
- package/tests/suite/bin/cia1pb7 +0 -0
- package/tests/suite/bin/cia1ta +0 -0
- package/tests/suite/bin/cia1tab +0 -0
- package/tests/suite/bin/cia1tb +0 -0
- package/tests/suite/bin/cia1tb123 +0 -0
- package/tests/suite/bin/cia2pb6 +0 -0
- package/tests/suite/bin/cia2pb7 +0 -0
- package/tests/suite/bin/cia2ta +0 -0
- package/tests/suite/bin/cia2tb +0 -0
- package/tests/suite/bin/cia2tb123 +0 -0
- package/tests/suite/bin/clcn +0 -0
- package/tests/suite/bin/cldn +0 -0
- package/tests/suite/bin/clin +0 -0
- package/tests/suite/bin/clvn +0 -0
- package/tests/suite/bin/cmpa +0 -0
- package/tests/suite/bin/cmpax +0 -0
- package/tests/suite/bin/cmpay +0 -0
- package/tests/suite/bin/cmpb +0 -0
- package/tests/suite/bin/cmpix +0 -0
- package/tests/suite/bin/cmpiy +0 -0
- package/tests/suite/bin/cmpz +0 -0
- package/tests/suite/bin/cmpzx +0 -0
- package/tests/suite/bin/cntdef +0 -0
- package/tests/suite/bin/cnto2 +0 -0
- package/tests/suite/bin/cpuport +0 -0
- package/tests/suite/bin/cputiming +0 -0
- package/tests/suite/bin/cpxa +0 -0
- package/tests/suite/bin/cpxb +0 -0
- package/tests/suite/bin/cpxz +0 -0
- package/tests/suite/bin/cpya +0 -0
- package/tests/suite/bin/cpyb +0 -0
- package/tests/suite/bin/cpyz +0 -0
- package/tests/suite/bin/dcma +0 -0
- package/tests/suite/bin/dcmax +0 -0
- package/tests/suite/bin/dcmay +0 -0
- package/tests/suite/bin/dcmix +0 -0
- package/tests/suite/bin/dcmiy +0 -0
- package/tests/suite/bin/dcmz +0 -0
- package/tests/suite/bin/dcmzx +0 -0
- package/tests/suite/bin/deca +0 -0
- package/tests/suite/bin/decax +0 -0
- package/tests/suite/bin/decz +0 -0
- package/tests/suite/bin/deczx +0 -0
- package/tests/suite/bin/dexn +0 -0
- package/tests/suite/bin/deyn +0 -0
- package/tests/suite/bin/eora +0 -0
- package/tests/suite/bin/eorax +0 -0
- package/tests/suite/bin/eoray +0 -0
- package/tests/suite/bin/eorb +0 -0
- package/tests/suite/bin/eorix +0 -0
- package/tests/suite/bin/eoriy +0 -0
- package/tests/suite/bin/eorz +0 -0
- package/tests/suite/bin/eorzx +0 -0
- package/tests/suite/bin/finish +0 -0
- package/tests/suite/bin/flipos +0 -0
- package/tests/suite/bin/icr01 +0 -0
- package/tests/suite/bin/imr +0 -0
- package/tests/suite/bin/inca +0 -0
- package/tests/suite/bin/incax +0 -0
- package/tests/suite/bin/incz +0 -0
- package/tests/suite/bin/inczx +0 -0
- package/tests/suite/bin/insa +0 -0
- package/tests/suite/bin/insax +0 -0
- package/tests/suite/bin/insay +0 -0
- package/tests/suite/bin/insix +0 -0
- package/tests/suite/bin/insiy +0 -0
- package/tests/suite/bin/insz +0 -0
- package/tests/suite/bin/inszx +0 -0
- package/tests/suite/bin/inxn +0 -0
- package/tests/suite/bin/inyn +0 -0
- package/tests/suite/bin/irq +0 -0
- package/tests/suite/bin/jmpi +0 -0
- package/tests/suite/bin/jmpw +0 -0
- package/tests/suite/bin/jsrw +0 -0
- package/tests/suite/bin/lasay +0 -0
- package/tests/suite/bin/laxa +0 -0
- package/tests/suite/bin/laxay +0 -0
- package/tests/suite/bin/laxix +0 -0
- package/tests/suite/bin/laxiy +0 -0
- package/tests/suite/bin/laxz +0 -0
- package/tests/suite/bin/laxzy +0 -0
- package/tests/suite/bin/ldaa +0 -0
- package/tests/suite/bin/ldaax +0 -0
- package/tests/suite/bin/ldaay +0 -0
- package/tests/suite/bin/ldab +0 -0
- package/tests/suite/bin/ldaix +0 -0
- package/tests/suite/bin/ldaiy +0 -0
- package/tests/suite/bin/ldaz +0 -0
- package/tests/suite/bin/ldazx +0 -0
- package/tests/suite/bin/ldxa +0 -0
- package/tests/suite/bin/ldxay +0 -0
- package/tests/suite/bin/ldxb +0 -0
- package/tests/suite/bin/ldxz +0 -0
- package/tests/suite/bin/ldxzy +0 -0
- package/tests/suite/bin/ldya +0 -0
- package/tests/suite/bin/ldyax +0 -0
- package/tests/suite/bin/ldyb +0 -0
- package/tests/suite/bin/ldyz +0 -0
- package/tests/suite/bin/ldyzx +0 -0
- package/tests/suite/bin/loadth +0 -0
- package/tests/suite/bin/lsea +0 -0
- package/tests/suite/bin/lseax +0 -0
- package/tests/suite/bin/lseay +0 -0
- package/tests/suite/bin/lseix +0 -0
- package/tests/suite/bin/lseiy +0 -0
- package/tests/suite/bin/lsez +0 -0
- package/tests/suite/bin/lsezx +0 -0
- package/tests/suite/bin/lsra +0 -0
- package/tests/suite/bin/lsrax +0 -0
- package/tests/suite/bin/lsrn +0 -0
- package/tests/suite/bin/lsrz +0 -0
- package/tests/suite/bin/lsrzx +0 -0
- package/tests/suite/bin/lxab +0 -0
- package/tests/suite/bin/mmu +0 -0
- package/tests/suite/bin/mmufetch +0 -0
- package/tests/suite/bin/nmi +0 -0
- package/tests/suite/bin/nopa +0 -0
- package/tests/suite/bin/nopax +0 -0
- package/tests/suite/bin/nopb +0 -0
- package/tests/suite/bin/nopn +0 -0
- package/tests/suite/bin/nopz +0 -0
- package/tests/suite/bin/nopzx +0 -0
- package/tests/suite/bin/oneshot +0 -0
- package/tests/suite/bin/oraa +0 -0
- package/tests/suite/bin/oraax +0 -0
- package/tests/suite/bin/oraay +0 -0
- package/tests/suite/bin/orab +0 -0
- package/tests/suite/bin/oraix +0 -0
- package/tests/suite/bin/oraiy +0 -0
- package/tests/suite/bin/oraz +0 -0
- package/tests/suite/bin/orazx +0 -0
- package/tests/suite/bin/phan +0 -0
- package/tests/suite/bin/phpn +0 -0
- package/tests/suite/bin/plan +0 -0
- package/tests/suite/bin/plpn +0 -0
- package/tests/suite/bin/rlaa +0 -0
- package/tests/suite/bin/rlaax +0 -0
- package/tests/suite/bin/rlaay +0 -0
- package/tests/suite/bin/rlaix +0 -0
- package/tests/suite/bin/rlaiy +0 -0
- package/tests/suite/bin/rlaz +0 -0
- package/tests/suite/bin/rlazx +0 -0
- package/tests/suite/bin/rola +0 -0
- package/tests/suite/bin/rolax +0 -0
- package/tests/suite/bin/roln +0 -0
- package/tests/suite/bin/rolz +0 -0
- package/tests/suite/bin/rolzx +0 -0
- package/tests/suite/bin/rora +0 -0
- package/tests/suite/bin/rorax +0 -0
- package/tests/suite/bin/rorn +0 -0
- package/tests/suite/bin/rorz +0 -0
- package/tests/suite/bin/rorzx +0 -0
- package/tests/suite/bin/rraa +0 -0
- package/tests/suite/bin/rraax +0 -0
- package/tests/suite/bin/rraay +0 -0
- package/tests/suite/bin/rraix +0 -0
- package/tests/suite/bin/rraiy +0 -0
- package/tests/suite/bin/rraz +0 -0
- package/tests/suite/bin/rrazx +0 -0
- package/tests/suite/bin/rtin +0 -0
- package/tests/suite/bin/rtsn +0 -0
- package/tests/suite/bin/sbca +0 -0
- package/tests/suite/bin/sbcax +0 -0
- package/tests/suite/bin/sbcay +0 -0
- package/tests/suite/bin/sbcb +0 -0
- package/tests/suite/bin/sbcb(eb) +0 -0
- package/tests/suite/bin/sbcix +0 -0
- package/tests/suite/bin/sbciy +0 -0
- package/tests/suite/bin/sbcz +0 -0
- package/tests/suite/bin/sbczx +0 -0
- package/tests/suite/bin/sbxb +0 -0
- package/tests/suite/bin/secn +0 -0
- package/tests/suite/bin/sedn +0 -0
- package/tests/suite/bin/sein +0 -0
- package/tests/suite/bin/shaay +0 -0
- package/tests/suite/bin/shaiy +0 -0
- package/tests/suite/bin/shsay +0 -0
- package/tests/suite/bin/shxay +0 -0
- package/tests/suite/bin/shyax +0 -0
- package/tests/suite/bin/staa +0 -0
- package/tests/suite/bin/staax +0 -0
- package/tests/suite/bin/staay +0 -0
- package/tests/suite/bin/staix +0 -0
- package/tests/suite/bin/staiy +0 -0
- package/tests/suite/bin/staz +0 -0
- package/tests/suite/bin/stazx +0 -0
- package/tests/suite/bin/stxa +0 -0
- package/tests/suite/bin/stxz +0 -0
- package/tests/suite/bin/stxzy +0 -0
- package/tests/suite/bin/stya +0 -0
- package/tests/suite/bin/styz +0 -0
- package/tests/suite/bin/styzx +0 -0
- package/tests/suite/bin/taxn +0 -0
- package/tests/suite/bin/tayn +0 -0
- package/tests/suite/bin/trap1 +0 -0
- package/tests/suite/bin/trap10 +0 -0
- package/tests/suite/bin/trap11 +0 -0
- package/tests/suite/bin/trap12 +0 -0
- package/tests/suite/bin/trap13 +0 -0
- package/tests/suite/bin/trap14 +0 -0
- package/tests/suite/bin/trap15 +0 -0
- package/tests/suite/bin/trap16 +0 -0
- package/tests/suite/bin/trap17 +0 -0
- package/tests/suite/bin/trap2 +0 -0
- package/tests/suite/bin/trap3 +0 -0
- package/tests/suite/bin/trap4 +0 -0
- package/tests/suite/bin/trap5 +0 -0
- package/tests/suite/bin/trap6 +0 -0
- package/tests/suite/bin/trap7 +0 -0
- package/tests/suite/bin/trap8 +0 -0
- package/tests/suite/bin/trap9 +0 -0
- package/tests/suite/bin/tsxn +0 -0
- package/tests/suite/bin/txan +0 -0
- package/tests/suite/bin/txsn +0 -0
- package/tests/suite/bin/tyan +0 -0
- package/tests/suite/cbm-hackers-post.html +178 -0
- package/tests/suite/cbm-hackers-post.md +78 -0
- package/tests/test-machine.js +288 -0
- package/tests/test-suite.js +147 -0
- package/tests/test.css +7 -0
- package/tests/unit/gzip/test-1 +0 -0
- package/tests/unit/gzip/test-1.gz +0 -0
- package/tests/unit/gzip/test-2 +0 -0
- package/tests/unit/gzip/test-2.gz +0 -0
- package/tests/unit/gzip/test-3 +0 -0
- package/tests/unit/gzip/test-3.gz +0 -0
- package/tests/unit/gzip/test-4 +0 -0
- package/tests/unit/gzip/test-4.gz +0 -0
- package/tests/unit/test-adc.js +307 -0
- package/tests/unit/test-bcd.js +30 -0
- package/tests/unit/test-cmos.js +266 -0
- package/tests/unit/test-disc-drive.js +85 -0
- package/tests/unit/test-disc-hfe.js +347 -0
- package/tests/unit/test-disc.js +232 -0
- package/tests/unit/test-fifo.js +35 -0
- package/tests/unit/test-gamepad-source.js +67 -0
- package/tests/unit/test-gzip.js +22 -0
- package/tests/unit/test-intel-fdc.js +93 -0
- package/tests/unit/test-keyboard.js +410 -0
- package/tests/unit/test-mouse-joystick-source.js +128 -0
- package/tests/unit/test-scheduler.js +190 -0
- package/tests/unit/test-serial.js +154 -0
- package/tests/unit/test-teletext-adaptor.js +359 -0
- package/tests/unit/test-tokenise.js +65 -0
- package/tests/unit/test-url-params.js +398 -0
- package/tests/unit/test-utils.js +276 -0
- package/tests/unit/test-video.js +498 -0
- package/tests/unit/test-zip.js +56 -0
- package/tests/unit/zip/test-mixed.zip +0 -0
- package/tests/unit/zip/test-rom.zip +0 -0
- package/tests/unit/zip/test-ssd.zip +0 -0
- package/tools/fir-generator.js +80 -0
- package/tools/vite-plugin-fir-shader.js +131 -0
- package/vite.config.js +34 -0
package/src/fake6502.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Fakes out various 6502s for testing purposes.
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
import { FakeVideo } from "./video.js";
|
|
5
|
+
import { FakeSoundChip } from "./soundchip.js";
|
|
6
|
+
import { findModel, TEST_6502, TEST_65C02, TEST_65C12 } from "./models.js";
|
|
7
|
+
import { FakeDdNoise } from "./ddnoise.js";
|
|
8
|
+
import { Cpu6502 } from "./6502.js";
|
|
9
|
+
import { Cmos } from "./cmos.js";
|
|
10
|
+
import { FakeMusic5000 } from "./music5000.js";
|
|
11
|
+
|
|
12
|
+
const fakeVideo = new FakeVideo();
|
|
13
|
+
const soundChip = new FakeSoundChip();
|
|
14
|
+
const dbgr = {
|
|
15
|
+
setCpu: () => {},
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export function fake6502(model, opts) {
|
|
19
|
+
opts = opts || {};
|
|
20
|
+
const video = opts.video || fakeVideo;
|
|
21
|
+
model = model || TEST_6502;
|
|
22
|
+
if (opts.tube) model.tube = findModel("Tube65c02");
|
|
23
|
+
return new Cpu6502(model, dbgr, video, soundChip, new FakeDdNoise(), new FakeMusic5000(), new Cmos());
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function fake65C02() {
|
|
27
|
+
return fake6502(TEST_65C02);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function fake65C12() {
|
|
31
|
+
return fake6502(TEST_65C12);
|
|
32
|
+
}
|
package/src/fdc.js
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// Floppy disc assorted utils.
|
|
2
|
+
import { Disc, DiscConfig, loadAdf, loadSsd, toSsdOrDsd } from "./disc.js";
|
|
3
|
+
import { loadHfe, toHfe } from "./disc-hfe.js";
|
|
4
|
+
import * as utils from "./utils.js";
|
|
5
|
+
|
|
6
|
+
export function load(name) {
|
|
7
|
+
console.log("Loading disc from " + name); // todo support zip files
|
|
8
|
+
return utils.loadData(name);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Class representing a disc format type with associated loader and saver functions
|
|
13
|
+
*/
|
|
14
|
+
export class DiscType {
|
|
15
|
+
/**
|
|
16
|
+
* Create a new disc type
|
|
17
|
+
* @param {string} extension - File extension for this disc type (e.g. ".ssd", ".hfe")
|
|
18
|
+
* @param {function(Disc, Uint8Array, function?): Disc} loader - Function to load this disc type
|
|
19
|
+
* @param {function(Disc): Uint8Array} saver - Function to save this disc type
|
|
20
|
+
* @param {function(Uint8Array, string): void|null} nameSetter - Function to set the name/label in the disc image
|
|
21
|
+
* @param {boolean} isDoubleSided - Whether the disc format is double-sided
|
|
22
|
+
* @param {boolean} isDoubleDensity - Whether the disc format is double density
|
|
23
|
+
* @param {number|undefined} byteSize - The size in bytes of this disc format, or undefined if variable
|
|
24
|
+
*/
|
|
25
|
+
constructor(extension, loader, saver, nameSetter, isDoubleSided, isDoubleDensity, byteSize) {
|
|
26
|
+
this._extension = extension;
|
|
27
|
+
this._loader = loader;
|
|
28
|
+
this._saver = saver;
|
|
29
|
+
this._nameSetter = nameSetter;
|
|
30
|
+
this._isDoubleSided = isDoubleSided;
|
|
31
|
+
this._isDoubleDensity = isDoubleDensity;
|
|
32
|
+
this._byteSize = byteSize;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get the file extension for this disc type
|
|
37
|
+
* @returns {string} File extension including dot
|
|
38
|
+
*/
|
|
39
|
+
get name() {
|
|
40
|
+
return this._extension;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get the file extension for this disc type
|
|
45
|
+
* @returns {string} File extension including dot
|
|
46
|
+
*/
|
|
47
|
+
get extension() {
|
|
48
|
+
return this._extension;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get the loader function for this disc type
|
|
53
|
+
* @returns {function} Function that loads the disc
|
|
54
|
+
*/
|
|
55
|
+
get loader() {
|
|
56
|
+
return this._loader;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Get the saver function for this disc type
|
|
61
|
+
* @returns {function} Function that saves the disc
|
|
62
|
+
*/
|
|
63
|
+
get saver() {
|
|
64
|
+
return this._saver;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get whether this disc format is double-sided
|
|
69
|
+
* @returns {boolean} True if double-sided, false otherwise
|
|
70
|
+
*/
|
|
71
|
+
get isDoubleSided() {
|
|
72
|
+
return this._isDoubleSided;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Get whether this disc format is double density
|
|
77
|
+
* @returns {boolean} True if double density, false otherwise
|
|
78
|
+
*/
|
|
79
|
+
get isDoubleDensity() {
|
|
80
|
+
return this._isDoubleDensity;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get the size in bytes of this disc format
|
|
85
|
+
* @returns {number|undefined} The size in bytes, or undefined if variable
|
|
86
|
+
*/
|
|
87
|
+
get byteSize() {
|
|
88
|
+
return this._byteSize;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Whether this disc format supports setting a catalogue name
|
|
93
|
+
* @returns {boolean} True if a name setter function exists
|
|
94
|
+
*/
|
|
95
|
+
get supportsCatalogue() {
|
|
96
|
+
return this._nameSetter !== null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Sets the disc name in the disc data using the format-specific setter
|
|
101
|
+
* @param {Uint8Array} data - The disc data to modify
|
|
102
|
+
* @param {string} name - The name to set
|
|
103
|
+
* @throws {Error} If the disc format doesn't support setting a name
|
|
104
|
+
*/
|
|
105
|
+
setDiscName(data, name) {
|
|
106
|
+
if (!this.supportsCatalogue) {
|
|
107
|
+
throw new Error(`Cannot set disc name for ${this._extension} format`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
this._nameSetter(data, name);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Standard sizes
|
|
114
|
+
const SsdByteSize = 80 * 10 * 256; // 80 tracks, 10 sectors, 256 bytes/sector
|
|
115
|
+
const DsdByteSize = SsdByteSize * 2; // Double-sided
|
|
116
|
+
const AdfsLargeByteSize = 2 * 80 * 16 * 256; // Double-sided, 16 sectors/track
|
|
117
|
+
const AdfsSmallByteSize = 80 * 16 * 256; // Single-sided, 16 sectors/track
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Set the name in a DFS disc image (SSD/DSD format)
|
|
121
|
+
* @param {Uint8Array} data - The disc data to modify
|
|
122
|
+
* @param {string} name - The name to set (up to 8 characters)
|
|
123
|
+
*/
|
|
124
|
+
function setDfsDiscName(data, name) {
|
|
125
|
+
for (let i = 0; i < 8; ++i) {
|
|
126
|
+
data[i] = i < name.length ? name.charCodeAt(i) & 0xff : 0x20; // padded with spaces
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// HFE disc type - variable size
|
|
131
|
+
const hfeDiscType = new DiscType(
|
|
132
|
+
".hfe",
|
|
133
|
+
loadHfe,
|
|
134
|
+
toHfe,
|
|
135
|
+
null, // no name setter function yet
|
|
136
|
+
true, // double-sided
|
|
137
|
+
true, // double density
|
|
138
|
+
undefined, // variable size
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// ADFS (Large) discs are double density, double sided
|
|
142
|
+
const adlDiscType = new DiscType(
|
|
143
|
+
".adl",
|
|
144
|
+
(disc, data, _onChange) => {
|
|
145
|
+
// TODO handle onChange
|
|
146
|
+
return loadAdf(disc, data, true);
|
|
147
|
+
},
|
|
148
|
+
(_data) => {
|
|
149
|
+
throw new Error("ADL unsupported");
|
|
150
|
+
},
|
|
151
|
+
null, // no name setter function yet
|
|
152
|
+
true, // double-sided
|
|
153
|
+
true, // double density
|
|
154
|
+
AdfsLargeByteSize,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
// ADFS (Small) discs are standard ADFS (non-double) density, single sided
|
|
158
|
+
const adfDiscType = new DiscType(
|
|
159
|
+
".adf",
|
|
160
|
+
(disc, data, _onChange) => {
|
|
161
|
+
// TODO handle onChange
|
|
162
|
+
return loadAdf(disc, data, false);
|
|
163
|
+
},
|
|
164
|
+
(_data) => {
|
|
165
|
+
throw new Error("ADF unsupported");
|
|
166
|
+
},
|
|
167
|
+
null, // no name setter function yet
|
|
168
|
+
false, // single-sided
|
|
169
|
+
true, // double density
|
|
170
|
+
AdfsSmallByteSize,
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
// DSD (Double-sided disc)
|
|
174
|
+
const dsdDiscType = new DiscType(
|
|
175
|
+
".dsd",
|
|
176
|
+
(disc, data, onChange) => loadSsd(disc, data, true, onChange),
|
|
177
|
+
toSsdOrDsd,
|
|
178
|
+
setDfsDiscName, // supports setting catalogue name
|
|
179
|
+
true, // double-sided
|
|
180
|
+
false, // standard density
|
|
181
|
+
DsdByteSize,
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
// SSD (Single-sided disc)
|
|
185
|
+
const ssdDiscType = new DiscType(
|
|
186
|
+
".ssd",
|
|
187
|
+
(disc, data, onChange) => loadSsd(disc, data, false, onChange),
|
|
188
|
+
toSsdOrDsd,
|
|
189
|
+
setDfsDiscName, // supports setting catalogue name
|
|
190
|
+
false, // single-sided
|
|
191
|
+
false, // standard density
|
|
192
|
+
SsdByteSize,
|
|
193
|
+
);
|
|
194
|
+
/**
|
|
195
|
+
* Determine the disc type based on the file name extension
|
|
196
|
+
* @param {string} name - The file name with extension
|
|
197
|
+
* @returns {DiscType} The appropriate disc type handler
|
|
198
|
+
*/
|
|
199
|
+
export function guessDiscTypeFromName(name) {
|
|
200
|
+
const lowerName = name.toLowerCase();
|
|
201
|
+
if (lowerName.endsWith(".hfe")) return hfeDiscType;
|
|
202
|
+
if (lowerName.endsWith(".adl")) return adlDiscType;
|
|
203
|
+
if (lowerName.endsWith(".adf") || lowerName.endsWith(".adm")) return adfDiscType;
|
|
204
|
+
if (lowerName.endsWith(".dsd")) return dsdDiscType;
|
|
205
|
+
return ssdDiscType;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Create a disc object of the appropriate type based on the file name
|
|
210
|
+
* @param {Object} fdc - The FDC controller object
|
|
211
|
+
* @param {string} name - The file name with extension
|
|
212
|
+
* @param {string|Uint8Array} stringData - The disc image data as string or Uint8Array
|
|
213
|
+
* @param {function(Uint8Array): void} onChange - Optional callback when disc content changes
|
|
214
|
+
* @returns {Disc} The loaded disc object
|
|
215
|
+
*/
|
|
216
|
+
export function discFor(fdc, name, stringData, onChange) {
|
|
217
|
+
const data = typeof stringData !== "string" ? stringData : utils.stringToUint8Array(stringData);
|
|
218
|
+
return guessDiscTypeFromName(name).loader(new Disc(true, new DiscConfig(), name), data, onChange);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function localDisc(fdc, name) {
|
|
222
|
+
const discName = "disc_" + name;
|
|
223
|
+
let data;
|
|
224
|
+
const dataString = window.localStorage[discName];
|
|
225
|
+
if (!dataString) {
|
|
226
|
+
console.log("Creating browser-local disc " + name);
|
|
227
|
+
const discType = guessDiscTypeFromName(name);
|
|
228
|
+
if (!discType.byteSize) {
|
|
229
|
+
throw new Error(`Cannot create blank disc of type ${discType.extension} - unknown size`);
|
|
230
|
+
}
|
|
231
|
+
data = new Uint8Array(discType.byteSize);
|
|
232
|
+
if (discType.supportsCatalogue) {
|
|
233
|
+
discType.setDiscName(data, name);
|
|
234
|
+
}
|
|
235
|
+
} else {
|
|
236
|
+
console.log("Loading browser-local disc " + name);
|
|
237
|
+
data = utils.stringToUint8Array(dataString);
|
|
238
|
+
}
|
|
239
|
+
const onChange = (data) => {
|
|
240
|
+
try {
|
|
241
|
+
const str = utils.uint8ArrayToString(data);
|
|
242
|
+
window.localStorage.setItem(discName, str);
|
|
243
|
+
} catch (e) {
|
|
244
|
+
window.alert("Writing to localStorage failed: " + e);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
return discFor(fdc, name, data, onChange);
|
|
248
|
+
}
|