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.
- package/package.json +26 -12
- package/src/6502.js +51 -41
- package/src/app/app.js +99 -8
- package/src/app/electron.js +47 -5
- package/src/app/preload.js +11 -1
- package/src/config.js +9 -2
- package/src/disc.js +2 -2
- package/src/filestore.js +1 -4
- package/src/gamepad-source.js +1 -1
- package/src/machine-session.js +393 -0
- package/src/main.js +36 -7
- package/src/music5000-worklet.js +1 -0
- package/src/music5000.js +1 -9
- package/src/sth.js +3 -1
- package/src/utils.js +14 -2
- package/src/web/audio-renderer.js +1 -1
- package/src/web/debug.js +2 -2
- package/tests/test-machine.js +82 -1
- package/.editorconfig +0 -15
- package/.git-blame-ignore-revs +0 -3
- package/.github/copilot-instructions.md +0 -94
- package/.github/workflows/claude-issue-triage.yml +0 -105
- package/.github/workflows/claude.yml +0 -63
- package/.github/workflows/release-please.yml +0 -75
- package/.github/workflows/test-and-deploy.yml +0 -86
- package/.gitmodules +0 -6
- package/.husky/pre-commit +0 -1
- package/.idea/codeStyleSettings.xml +0 -9
- package/.idea/codeStyles/Project.xml +0 -62
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/compiler.xml +0 -22
- package/.idea/copyright/profiles_settings.xml +0 -3
- package/.idea/encodings.xml +0 -6
- package/.idea/inspectionProfiles/Project_Default.xml +0 -7
- package/.idea/jsLibraryMappings.xml +0 -6
- package/.idea/jsLinters/jshint.xml +0 -85
- package/.idea/jsLinters/jslint.xml +0 -15
- package/.idea/jsbeeb.iml +0 -11
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/prettier.xml +0 -7
- package/.idea/runConfigurations/Debug.xml +0 -5
- package/.idea/scopes/scope_settings.xml +0 -5
- package/.idea/vcs.xml +0 -8
- package/.prettierignore +0 -4
- package/.prettierrc.json +0 -1
- package/.release-please-manifest.json +0 -3
- package/.vscode/launch.json +0 -14
- package/.vscode/settings.json +0 -6
- package/CHANGELOG.md +0 -32
- package/CLAUDE.md +0 -136
- package/Dockerfile +0 -22
- package/Makefile +0 -30
- package/docker/nginx-default.conf +0 -10
- package/docs/pal-comb-filter-research.md +0 -129
- package/docs/pal-simulation-design.md +0 -368
- package/eslint.config.js +0 -35
- package/index.html +0 -954
- package/jsconfig.json +0 -10
- package/public/discs/README.Irq-Timing +0 -3
- package/public/discs/README.bcdtest +0 -5
- package/public/discs/README.elite +0 -6
- package/public/discs/README.eng_test +0 -3
- package/public/discs/README.protection +0 -7
- 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 +0 -3
- 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 +0 -13
- package/run-container.sh +0 -92
- package/tests/integration/RmwX.asm +0 -47
- package/tests/integration/TestInstructionsSource +0 -27
- package/tests/integration/TestTimingsResults +0 -27
- package/tests/integration/TestTimingsSource +0 -61
- package/tests/integration/bcd.js +0 -23
- package/tests/integration/dormann.js +0 -101
- package/tests/integration/dp111timing.js +0 -42
- package/tests/integration/ensure-submodules.js +0 -25
- package/tests/integration/nops.bas +0 -119
- package/tests/integration/nops.js +0 -24
- package/tests/integration/protection.js +0 -26
- package/tests/integration/rmw.js +0 -69
- 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 +0 -126
- package/tests/integration/timings.js +0 -56
- package/tests/integration/via.js +0 -1125
- package/tests/suite/README.md +0 -7
- package/tests/suite/Test Suite 2.15.txt +0 -373
- 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 +0 -178
- package/tests/suite/cbm-hackers-post.md +0 -78
- package/tests/test-suite.js +0 -147
- package/tests/test.css +0 -7
- 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 +0 -307
- package/tests/unit/test-bcd.js +0 -30
- package/tests/unit/test-cmos.js +0 -266
- package/tests/unit/test-disc-drive.js +0 -85
- package/tests/unit/test-disc-hfe.js +0 -347
- package/tests/unit/test-disc.js +0 -232
- package/tests/unit/test-fifo.js +0 -35
- package/tests/unit/test-gamepad-source.js +0 -67
- package/tests/unit/test-gzip.js +0 -22
- package/tests/unit/test-intel-fdc.js +0 -93
- package/tests/unit/test-keyboard.js +0 -410
- package/tests/unit/test-mouse-joystick-source.js +0 -128
- package/tests/unit/test-scheduler.js +0 -190
- package/tests/unit/test-serial.js +0 -154
- package/tests/unit/test-teletext-adaptor.js +0 -359
- package/tests/unit/test-tokenise.js +0 -65
- package/tests/unit/test-url-params.js +0 -398
- package/tests/unit/test-utils.js +0 -276
- package/tests/unit/test-video.js +0 -498
- package/tests/unit/test-zip.js +0 -56
- 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 +0 -80
- package/tools/vite-plugin-fir-shader.js +0 -131
- package/vite.config.js +0 -34
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="JSHintConfiguration" version="2.10.2" use-config-file="true">
|
|
4
|
-
<option asi="false" />
|
|
5
|
-
<option bitwise="false" />
|
|
6
|
-
<option boss="false" />
|
|
7
|
-
<option browser="true" />
|
|
8
|
-
<option browserify="false" />
|
|
9
|
-
<option camelcase="false" />
|
|
10
|
-
<option couch="false" />
|
|
11
|
-
<option curly="false" />
|
|
12
|
-
<option debug="false" />
|
|
13
|
-
<option devel="false" />
|
|
14
|
-
<option dojo="false" />
|
|
15
|
-
<option elision="false" />
|
|
16
|
-
<option enforceall="false" />
|
|
17
|
-
<option eqeqeq="true" />
|
|
18
|
-
<option eqnull="false" />
|
|
19
|
-
<option es3="false" />
|
|
20
|
-
<option es5="false" />
|
|
21
|
-
<option esnext="false" />
|
|
22
|
-
<option evil="false" />
|
|
23
|
-
<option expr="false" />
|
|
24
|
-
<option forin="true" />
|
|
25
|
-
<option freeze="false" />
|
|
26
|
-
<option funcscope="false" />
|
|
27
|
-
<option futurehostile="false" />
|
|
28
|
-
<option gcl="false" />
|
|
29
|
-
<option globalstrict="false" />
|
|
30
|
-
<option immed="false" />
|
|
31
|
-
<option iterator="false" />
|
|
32
|
-
<option jasmine="false" />
|
|
33
|
-
<option jquery="false" />
|
|
34
|
-
<option lastsemic="false" />
|
|
35
|
-
<option latedef="false" />
|
|
36
|
-
<option laxbreak="false" />
|
|
37
|
-
<option laxcomma="false" />
|
|
38
|
-
<option loopfunc="false" />
|
|
39
|
-
<option maxerr="50" />
|
|
40
|
-
<option mocha="false" />
|
|
41
|
-
<option module="false" />
|
|
42
|
-
<option mootools="false" />
|
|
43
|
-
<option moz="false" />
|
|
44
|
-
<option multistr="false" />
|
|
45
|
-
<option newcap="false" />
|
|
46
|
-
<option noarg="true" />
|
|
47
|
-
<option nocomma="false" />
|
|
48
|
-
<option node="false" />
|
|
49
|
-
<option noempty="true" />
|
|
50
|
-
<option nomen="false" />
|
|
51
|
-
<option nonbsp="false" />
|
|
52
|
-
<option nonew="true" />
|
|
53
|
-
<option nonstandard="false" />
|
|
54
|
-
<option notypeof="false" />
|
|
55
|
-
<option noyield="false" />
|
|
56
|
-
<option onevar="false" />
|
|
57
|
-
<option passfail="false" />
|
|
58
|
-
<option phantom="false" />
|
|
59
|
-
<option plusplus="false" />
|
|
60
|
-
<option proto="false" />
|
|
61
|
-
<option prototypejs="false" />
|
|
62
|
-
<option qunit="false" />
|
|
63
|
-
<option quotmark="false" />
|
|
64
|
-
<option rhino="false" />
|
|
65
|
-
<option scripturl="false" />
|
|
66
|
-
<option shadow="false" />
|
|
67
|
-
<option shelljs="false" />
|
|
68
|
-
<option singleGroups="false" />
|
|
69
|
-
<option smarttabs="false" />
|
|
70
|
-
<option strict="true" />
|
|
71
|
-
<option sub="false" />
|
|
72
|
-
<option supernew="false" />
|
|
73
|
-
<option trailing="false" />
|
|
74
|
-
<option typed="false" />
|
|
75
|
-
<option undef="true" />
|
|
76
|
-
<option unused="false" />
|
|
77
|
-
<option validthis="false" />
|
|
78
|
-
<option varstmt="false" />
|
|
79
|
-
<option white="false" />
|
|
80
|
-
<option withstmt="false" />
|
|
81
|
-
<option worker="false" />
|
|
82
|
-
<option wsh="false" />
|
|
83
|
-
<option yui="false" />
|
|
84
|
-
</component>
|
|
85
|
-
</project>
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="JSLintConfiguration">
|
|
4
|
-
<option bitwise="true" />
|
|
5
|
-
<option browser="true" />
|
|
6
|
-
<option devel="true" />
|
|
7
|
-
<option indent="4" />
|
|
8
|
-
<option maxerr="50" />
|
|
9
|
-
<option maxlen="100" />
|
|
10
|
-
<option node="true" />
|
|
11
|
-
<option plusplus="true" />
|
|
12
|
-
<option predef="window,Uint8Array,Uint16Array,Uint32Array,Int8Array,Int16Array,Int32Array,define" />
|
|
13
|
-
<option vars="true" />
|
|
14
|
-
</component>
|
|
15
|
-
</project>
|
package/.idea/jsbeeb.iml
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="WEB_MODULE" version="4">
|
|
3
|
-
<component name="NewModuleRootManager">
|
|
4
|
-
<content url="file://$MODULE_DIR$">
|
|
5
|
-
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
|
|
6
|
-
<excludeFolder url="file://$MODULE_DIR$/out" />
|
|
7
|
-
</content>
|
|
8
|
-
<orderEntry type="inheritedJdk" />
|
|
9
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
10
|
-
</component>
|
|
11
|
-
</module>
|
package/.idea/misc.xml
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
<project version="4">
|
|
2
|
-
<component name="JavaScriptSettings">
|
|
3
|
-
<option name="languageLevel" value="ES6" />
|
|
4
|
-
</component>
|
|
5
|
-
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_3" default="false" project-jdk-name="Python 3.6 (compiler-explorer-image)" project-jdk-type="Python SDK" />
|
|
6
|
-
</project>
|
package/.idea/modules.xml
DELETED
package/.idea/prettier.xml
DELETED
package/.idea/vcs.xml
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="VcsDirectoryMappings">
|
|
4
|
-
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
5
|
-
<mapping directory="$PROJECT_DIR$/tests/6502_65C02_functional_tests" vcs="Git" />
|
|
6
|
-
<mapping directory="$PROJECT_DIR$/tests/integration/dp111_6502Timing" vcs="Git" />
|
|
7
|
-
</component>
|
|
8
|
-
</project>
|
package/.prettierignore
DELETED
package/.prettierrc.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|
package/.vscode/launch.json
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "0.2.0",
|
|
3
|
-
"configurations": [
|
|
4
|
-
{
|
|
5
|
-
"type": "chrome",
|
|
6
|
-
"request": "launch",
|
|
7
|
-
"name": "Debug a running dev server",
|
|
8
|
-
"url": "http://localhost:8080?logFdcStateChanges&logFdcCommands&model=MasterADFS&disc=CodenameDroid-ADFS_E.adf",
|
|
9
|
-
"webRoot": "${workspaceFolder}",
|
|
10
|
-
"sourceMaps": true,
|
|
11
|
-
"trace": true
|
|
12
|
-
}
|
|
13
|
-
]
|
|
14
|
-
}
|
package/.vscode/settings.json
DELETED
package/CHANGELOG.md
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## [1.1.1](https://github.com/mattgodbolt/jsbeeb/compare/v1.1.0...v1.1.1) (2025-11-21)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
### Bug Fixes
|
|
7
|
-
|
|
8
|
-
* Fix Windows Build support ([8ffa1a0](https://github.com/mattgodbolt/jsbeeb/commit/8ffa1a037fdfd7e38e072dca65da5b1959823fb2))
|
|
9
|
-
|
|
10
|
-
## [1.1.0](https://github.com/mattgodbolt/jsbeeb/compare/v1.0.1...v1.1.0) (2025-11-21)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
### Features
|
|
14
|
-
|
|
15
|
-
* Windows Electron build support ([1955a5f](https://github.com/mattgodbolt/jsbeeb/commit/1955a5f3ad7e9eb12cdff2e9860d8b0e304196ee))
|
|
16
|
-
|
|
17
|
-
## [1.0.1](https://github.com/mattgodbolt/jsbeeb/compare/v1.0.0...v1.0.1) (2025-11-20)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
### Bug Fixes
|
|
21
|
-
|
|
22
|
-
* Trying to get release-please to work
|
|
23
|
-
|
|
24
|
-
## 1.0.0 (2025-11-20)
|
|
25
|
-
|
|
26
|
-
First actual release with a changelog! These fixes below are not the only thing in this release, we previously had v0.0.7 which was 4+ years old. But - this include Electron support again!
|
|
27
|
-
|
|
28
|
-
### Bug Fixes
|
|
29
|
-
|
|
30
|
-
- add application icon for Electron ([#536](https://github.com/mattgodbolt/jsbeeb/issues/536)) ([64c8043](https://github.com/mattgodbolt/jsbeeb/commit/64c80438bf7c0f87db993b9a878665e3d3b090bc))
|
|
31
|
-
- enable window scaling in Electron and modernize event handlers ([#533](https://github.com/mattgodbolt/jsbeeb/issues/533)) ([64551c9](https://github.com/mattgodbolt/jsbeeb/commit/64551c9d53c3a1a253dd1ac8f6b0f9dd9f266272))
|
|
32
|
-
- remove invalid package-name parameter from release-please action ([#535](https://github.com/mattgodbolt/jsbeeb/issues/535)) ([5dd0436](https://github.com/mattgodbolt/jsbeeb/commit/5dd043601282e1aae976a8cd58c2071bd2b15954))
|
package/CLAUDE.md
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
-
|
|
5
|
-
## Build and Test Commands
|
|
6
|
-
|
|
7
|
-
- `npm start` - Start development server (IMPORTANT: Never run this command directly; ask the user to start the server
|
|
8
|
-
as needed)
|
|
9
|
-
- `npm run build` - Build production version
|
|
10
|
-
- `npm run lint` - Run ESLint
|
|
11
|
-
- `npm run lint-fix` - Run ESLint with auto-fix
|
|
12
|
-
- `npm run format` - Run Prettier
|
|
13
|
-
- `npm run test` - Run all tests
|
|
14
|
-
- `npm run test:unit` - Run unit tests
|
|
15
|
-
- `npm run test:integration` - Run integration tests
|
|
16
|
-
- `npm run test:cpu` - Run CPU compatibility tests
|
|
17
|
-
- `npm run ci-checks` - Run linting checks for CI
|
|
18
|
-
- `vitest run tests/unit/test-gzip.js` - Run a single test file
|
|
19
|
-
|
|
20
|
-
### Code Coverage
|
|
21
|
-
|
|
22
|
-
- `npm run coverage:unit` - Run unit tests with coverage
|
|
23
|
-
- `npm run coverage:all-tests` - Run all tests with coverage
|
|
24
|
-
- Coverage reports are generated in the `coverage` directory
|
|
25
|
-
- HTML report includes line-by-line coverage visualization
|
|
26
|
-
|
|
27
|
-
## Code Style Guidelines
|
|
28
|
-
|
|
29
|
-
- **Formatting**: Uses Prettier, configured in package.json
|
|
30
|
-
- **Linting**: ESLint with eslint-config-prettier integration
|
|
31
|
-
- **Modules**: ES modules with import/export syntax (type: "module")
|
|
32
|
-
- **JavaScript Target**: ES2020 with strict null checks
|
|
33
|
-
- **Error Handling**: Use try/catch with explicit error messages that provide context about what failed
|
|
34
|
-
- **Naming**: camelCase for variables and functions, PascalCase for classes
|
|
35
|
-
- **Imports**: Group by source (internal/external) with proper separation
|
|
36
|
-
- **Documentation**: Use JSDoc for public APIs and complex functions, add comments for non-obvious code
|
|
37
|
-
- **Error Messages**: Use consistent, specific error messages (e.g., "Track buffer overflow" instead of "Overflow in disc building")
|
|
38
|
-
|
|
39
|
-
## Test Organization
|
|
40
|
-
|
|
41
|
-
- **Test Consolidation**: All tests for a specific component should be consolidated in a single test file.
|
|
42
|
-
For example, all tests for `emulator.js` should be in `test-emulator.js` - do not create separate test files
|
|
43
|
-
for different aspects of the same component.
|
|
44
|
-
- **Test Structure**: Use nested describe blocks to organize tests by component features
|
|
45
|
-
- **Test Isolation**: When mocking components in tests, use `vi.spyOn()` with `vi.restoreAllMocks()` in
|
|
46
|
-
`afterEach` hooks rather than global `vi.mock()` to prevent memory leaks and test pollution
|
|
47
|
-
- **Memory Management**: Avoid global mocks that can leak between tests and accumulate memory usage over time
|
|
48
|
-
- **Test philosophy**
|
|
49
|
-
- Mock as little as possible: Try and rephrase code not to require it.
|
|
50
|
-
- Try not to rely on internal state: don't manipulate objects' inner state in tests
|
|
51
|
-
- Use idiomatic vitest assertions (expect/toBe/toEqual) instead of node assert
|
|
52
|
-
|
|
53
|
-
## Project-Specific Knowledge
|
|
54
|
-
|
|
55
|
-
- **Never commit code unless asked**: Very often we'll work on code and iterate. After you think it's complete, let me
|
|
56
|
-
check it before you commit.
|
|
57
|
-
|
|
58
|
-
### Code Architecture
|
|
59
|
-
|
|
60
|
-
- **General Principles**:
|
|
61
|
-
- Follow the existing code style and structure
|
|
62
|
-
- Use `const` and `let` instead of `var`
|
|
63
|
-
- Avoid global variables; use module scope
|
|
64
|
-
- Use arrow functions for callbacks
|
|
65
|
-
- Prefer template literals over string concatenation
|
|
66
|
-
- Use destructuring for objects and arrays when appropriate
|
|
67
|
-
- Use async/await for asynchronous code instead of callbacks or promises
|
|
68
|
-
- Minimise special case handling - prefer explicit over implicit behaviour
|
|
69
|
-
- Consider adding tests first before implementing features
|
|
70
|
-
- **When simplifying existing code**
|
|
71
|
-
- Prefer helper functions for repetitive operations (like the `appendParam` function)
|
|
72
|
-
- Remove unnecessary type checking where types are expected to be correct
|
|
73
|
-
- Replace complex conditionals with more readable alternatives when possible
|
|
74
|
-
- Ensure simplifications don't break existing behavior or assumptions
|
|
75
|
-
- Try and modernise the code to use ES6+ features where possible
|
|
76
|
-
|
|
77
|
-
- Prefer helper functions for repetitive operations (like the `appendParam` function)
|
|
78
|
-
- Remove unnecessary type checking where types are expected to be correct
|
|
79
|
-
- Replace complex conditionals with more readable alternatives when possible
|
|
80
|
-
- Ensure simplifications don't break existing behavior or assumptions
|
|
81
|
-
|
|
82
|
-
- **Constants and Magic Numbers**:
|
|
83
|
-
- Local un-exported properties should be used for shared constants
|
|
84
|
-
- Local constants should be used for temporary values
|
|
85
|
-
- Always use named constants instead of magic numbers in code
|
|
86
|
-
- Use PascalCase for module-level constants (e.g., `const MaxHfeTrackPulses = 3132;`)
|
|
87
|
-
- Prefer module-level constants over function-local constants for shared values
|
|
88
|
-
- Define constants at the beginning of functions or at the class/module level as appropriate
|
|
89
|
-
- Add comments explaining what the constant represents, especially for non-obvious values
|
|
90
|
-
|
|
91
|
-
- **Pre-commit Hooks**:
|
|
92
|
-
- The project uses lint-staged with ESLint
|
|
93
|
-
- Watch for unused variables and ensure proper error handling
|
|
94
|
-
- YOU MUST NEVER bypass git commit hooks on checkins. This leads to failures in CI later on
|
|
95
|
-
|
|
96
|
-
### Git Workflow
|
|
97
|
-
|
|
98
|
-
- When creating branches with Claude, use the `claude/` prefix (e.g., `claude/fix-esm-import-error`)
|
|
99
|
-
|
|
100
|
-
### Conventional Commits
|
|
101
|
-
|
|
102
|
-
This project uses [Conventional Commits](https://www.conventionalcommits.org/) for automated versioning and changelog generation via release-please.
|
|
103
|
-
|
|
104
|
-
**Commit types for user-facing changes** (appear in changelog, affect version):
|
|
105
|
-
|
|
106
|
-
- `fix:` - Bug fixes (bumps patch version: 0.0.7 → 0.0.8)
|
|
107
|
-
- `feat:` - New features (bumps minor version: 0.0.7 → 0.1.0)
|
|
108
|
-
- `fix!:` or `feat!:` - Breaking changes (bumps major version: 0.0.7 → 1.0.0)
|
|
109
|
-
|
|
110
|
-
**Commit types for internal changes** (do NOT appear in changelog, do NOT affect version):
|
|
111
|
-
|
|
112
|
-
- `chore:` - Maintenance tasks, tooling updates, dependency updates
|
|
113
|
-
- `ci:` - CI/CD configuration changes (GitHub Actions, etc.)
|
|
114
|
-
- `build:` - Build system changes (webpack, vite, electron-builder config)
|
|
115
|
-
- `docs:` - Documentation-only changes
|
|
116
|
-
- `style:` - Code style changes (formatting, whitespace)
|
|
117
|
-
- `refactor:` - Code refactoring without behavior change
|
|
118
|
-
- `test:` - Test additions or modifications
|
|
119
|
-
|
|
120
|
-
**Guidelines**:
|
|
121
|
-
|
|
122
|
-
- Use `fix:` and `feat:` ONLY for changes that affect end users
|
|
123
|
-
- Use `chore:`, `ci:`, or `build:` for internal tooling/infrastructure changes
|
|
124
|
-
- Example: A release-please workflow fix should be `ci:` or `chore:`, not `fix:`
|
|
125
|
-
- Breaking changes must include `BREAKING CHANGE:` in the commit body or use `!` (e.g., `feat!:`)
|
|
126
|
-
|
|
127
|
-
**Examples**:
|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
fix: enable window scaling in Electron app
|
|
131
|
-
feat: add joystick support for gamepads
|
|
132
|
-
chore: update dependencies to latest versions
|
|
133
|
-
ci: fix release-please workflow configuration
|
|
134
|
-
build: configure electron-builder icon settings
|
|
135
|
-
docs: update README with installation instructions
|
|
136
|
-
```
|
package/Dockerfile
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# NOTE: We create a temporary Docker container to build the webapp in, then copy
|
|
2
|
-
# the generated distributable files to the final Docker image. This keeps the
|
|
3
|
-
# final image tidy (since it doesn't contain any generated temporary artifacts),
|
|
4
|
-
# and its size to a minimum.
|
|
5
|
-
# NOTE: The version of Node must be kept in sync with what's in package.json.
|
|
6
|
-
FROM node:22-alpine AS build
|
|
7
|
-
|
|
8
|
-
# build the webapp
|
|
9
|
-
WORKDIR /app/
|
|
10
|
-
COPY package.json .
|
|
11
|
-
RUN npm install
|
|
12
|
-
COPY . .
|
|
13
|
-
RUN npm run build
|
|
14
|
-
|
|
15
|
-
# create the final Docker image
|
|
16
|
-
# NOTE: The webapp is just a bunch of static files, so all we need is something to serve them.
|
|
17
|
-
FROM nginx:1.27-alpine
|
|
18
|
-
COPY docker/nginx-default.conf /etc/nginx/conf.d/default.conf
|
|
19
|
-
COPY --from=build /app/dist /app
|
|
20
|
-
|
|
21
|
-
EXPOSE 80
|
|
22
|
-
CMD [ "nginx", "-g", "daemon off;" ]
|
package/Makefile
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
NPM_UP_TO_DATE:=.npm-up-to-date
|
|
2
|
-
NODE=node
|
|
3
|
-
NPM=npm
|
|
4
|
-
|
|
5
|
-
.PHONY: all
|
|
6
|
-
all: test
|
|
7
|
-
|
|
8
|
-
npm: $(NPM_UP_TO_DATE)
|
|
9
|
-
|
|
10
|
-
.PHONY: npm
|
|
11
|
-
test: npm
|
|
12
|
-
$(NPM) test
|
|
13
|
-
|
|
14
|
-
$(NPM_UP_TO_DATE): package.json
|
|
15
|
-
$(NPM) install
|
|
16
|
-
touch $(NPM_UP_TO_DATE)
|
|
17
|
-
|
|
18
|
-
HASH := $(shell git rev-parse HEAD)
|
|
19
|
-
|
|
20
|
-
.PHONY: dist
|
|
21
|
-
dist: npm
|
|
22
|
-
npm run build
|
|
23
|
-
|
|
24
|
-
.PHONY: clean
|
|
25
|
-
clean:
|
|
26
|
-
@rm -rf dist out
|
|
27
|
-
|
|
28
|
-
.PHONY: spotless
|
|
29
|
-
spotless: clean
|
|
30
|
-
@rm -f $(NPM_UP_TO_DATE)
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# Authentic PAL TV Comb Filter Research
|
|
2
|
-
|
|
3
|
-
## Sources
|
|
4
|
-
|
|
5
|
-
1. **Watkinson "Engineer's Guide to Decoding & Encoding"** (pages 37-39)
|
|
6
|
-
2. **Jim Easterbrook PAL Decoder Page** (https://www.jim-easterbrook.me.uk/pal/)
|
|
7
|
-
3. **Web search**: PAL television patents and implementations from 1980s
|
|
8
|
-
|
|
9
|
-
## What Real PAL TVs Used
|
|
10
|
-
|
|
11
|
-
### 2H Delay Line Comb Filters
|
|
12
|
-
|
|
13
|
-
**Implementation:**
|
|
14
|
-
|
|
15
|
-
- Used "64 microsecond quartz delay line" (2 line periods for PAL)
|
|
16
|
-
- Delays of **2H** (two horizontal line periods) for PAL
|
|
17
|
-
- Contrast with NTSC which uses 1H delays
|
|
18
|
-
|
|
19
|
-
**Why 2H for PAL?**
|
|
20
|
-
|
|
21
|
-
- PAL subcarrier: 283.75 cycles per line (fractional 0.75)
|
|
22
|
-
- 2H spacing = 1.5 cycles = 540° = **180° phase shift** (mod 360°)
|
|
23
|
-
- This ensures chroma signals are in opposite phase and cancel when added
|
|
24
|
-
- V-switch state is SAME on lines N and N±2 (both inverted or both non-inverted)
|
|
25
|
-
|
|
26
|
-
**From Watkinson (page 38):**
|
|
27
|
-
|
|
28
|
-
> "The delays needed are of one line period [for NTSC]. The configuration for PAL is shown in b) in which the delays need to be of two line periods."
|
|
29
|
-
|
|
30
|
-
### Complementary Decoder Approach
|
|
31
|
-
|
|
32
|
-
**From Jim Easterbrook:**
|
|
33
|
-
|
|
34
|
-
> "Some form of filter is used to extract the modulated chrominance from a PAL signal. Subtracting this chrominance from a suitably delayed PAL signal then yields luminance"
|
|
35
|
-
|
|
36
|
-
This is the **complementary decoder** principle:
|
|
37
|
-
|
|
38
|
-
1. Extract chroma from composite using a filter
|
|
39
|
-
2. Subtract extracted chroma from **delayed** composite to get luma
|
|
40
|
-
3. The decoder is "complementary" because chroma + luma = original PAL signal
|
|
41
|
-
|
|
42
|
-
**Important Note:**
|
|
43
|
-
|
|
44
|
-
> "Decoders like this are not widely used, as better subjective results can be obtained by using separate filters for chrominance and luminance, each optimised to give the best looking signals."
|
|
45
|
-
|
|
46
|
-
**This explains our findings!**
|
|
47
|
-
|
|
48
|
-
- Notch filter (complementary approach) is simpler but not what most TVs used
|
|
49
|
-
- Real TVs used separate optimized filters for chroma and luma
|
|
50
|
-
|
|
51
|
-
### Simple Line Comb for Luma (Most Common Approach)
|
|
52
|
-
|
|
53
|
-
**From Watkinson Figure 3.4.2b:**
|
|
54
|
-
|
|
55
|
-
- PAL comb uses 2H delays
|
|
56
|
-
- **Simple averaging:** Add current line + line delayed by 2H
|
|
57
|
-
- This is a LOWPASS filter for luma
|
|
58
|
-
- Chroma cancels due to 180° phase inversion
|
|
59
|
-
- Luma adds (in phase)
|
|
60
|
-
|
|
61
|
-
**Coefficients:**
|
|
62
|
-
|
|
63
|
-
- Simplest form: `luma = 0.5 * current + 0.5 * delayed_2H`
|
|
64
|
-
- 3-tap variation: `luma = 0.25 * prev_2H + 0.5 * current + 0.25 * next_2H`
|
|
65
|
-
|
|
66
|
-
### Tradeoffs and Limitations
|
|
67
|
-
|
|
68
|
-
**From Watkinson (page 38-39):**
|
|
69
|
-
|
|
70
|
-
> "Quite a lot of vertical luminance resolution is being lost, and becoming cross luminance, particularly in PAL."
|
|
71
|
-
|
|
72
|
-
**The fundamental tradeoff:**
|
|
73
|
-
|
|
74
|
-
- **More averaging** (comb filter) → Less cross-color, more vertical blur
|
|
75
|
-
- **Less averaging** (notch filter) → Sharper, but more cross-color/cross-luma artifacts
|
|
76
|
-
|
|
77
|
-
**Bandpass Comb Variation:**
|
|
78
|
-
|
|
79
|
-
> "Some of this resolution loss can be overcome by restricting the combing to a bandpass region"
|
|
80
|
-
|
|
81
|
-
This means applying the comb filter only to mid-frequencies where chroma lives, preserving low-frequency luma detail. However:
|
|
82
|
-
|
|
83
|
-
> "Although the full luminance bandwidth is available, this is restricted to picture detail having vertical edges. Man-made subjects such as buildings give good results, but more natural scenes containing diagonal edges are less successful."
|
|
84
|
-
|
|
85
|
-
### BBC Transform Decoder (Advanced)
|
|
86
|
-
|
|
87
|
-
**Not a comb filter!** Uses Fourier transforms:
|
|
88
|
-
|
|
89
|
-
> "Each frequency in the block is compared with its reflection about the colour sub-carrier frequency, and if the magnitudes are too dissimilar the pair of frequencies is rejected."
|
|
90
|
-
|
|
91
|
-
This is much more sophisticated than simple comb filters and not what consumer TVs used.
|
|
92
|
-
|
|
93
|
-
## Summary for Implementation
|
|
94
|
-
|
|
95
|
-
### What Consumer PAL TVs Actually Did:
|
|
96
|
-
|
|
97
|
-
1. **Most common:** Simple 2H comb filter for luma
|
|
98
|
-
- Average current line with line ±2H away
|
|
99
|
-
- Coefficients: 0.5 + 0.5 (or 0.25 + 0.5 + 0.25 for 3-tap)
|
|
100
|
-
- Accept vertical blur as tradeoff for reduced color artifacts
|
|
101
|
-
|
|
102
|
-
2. **Some higher-end:** Separate optimized filters
|
|
103
|
-
- Not pure complementary decoder
|
|
104
|
-
- Custom filters for chroma and luma
|
|
105
|
-
- Try to balance sharpness vs artifacts
|
|
106
|
-
|
|
107
|
-
3. **Not common:** Pure notch/complementary decoders
|
|
108
|
-
- Simpler but gave worse subjective results
|
|
109
|
-
- Used in some early/cheap implementations
|
|
110
|
-
|
|
111
|
-
### What We Should Simulate:
|
|
112
|
-
|
|
113
|
-
**Option 1: Authentic simple comb (most TVs)**
|
|
114
|
-
|
|
115
|
-
- Use 2H comb with equal weighting: `luma = 0.5 * current + 0.5 * delayed_2H`
|
|
116
|
-
- Accept some vertical blur (that's what real TVs had!)
|
|
117
|
-
- Minimal checkerboard/cross-color
|
|
118
|
-
|
|
119
|
-
**Option 2: Notch filter (current implementation)**
|
|
120
|
-
|
|
121
|
-
- Sharper than real TVs
|
|
122
|
-
- But with FIR_GAIN = 2.0, no checkerboard
|
|
123
|
-
- Arguably "better" than real hardware, but less authentic
|
|
124
|
-
|
|
125
|
-
**Recommendation:**
|
|
126
|
-
Implement the simple 2H comb as an option so users can choose between:
|
|
127
|
-
|
|
128
|
-
- "Sharp mode" (notch filter - better than real hardware)
|
|
129
|
-
- "Authentic mode" (2H comb - what TVs actually did, with appropriate blur)
|