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
|
@@ -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
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|