From 28109a39ac3f1a05a056954aeadee7d84015761f Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sun, 8 Sep 2019 16:42:15 +0200 Subject: [PATCH] clean up of c64 tests --- c64tests/0start | Bin 0 -> 3438 bytes c64tests/_Test Suite 2.15.txt | 376 ++++++++++ c64tests/adca | Bin 0 -> 842 bytes c64tests/adcax | Bin 0 -> 865 bytes c64tests/adcay | Bin 0 -> 865 bytes c64tests/adcb | Bin 0 -> 846 bytes c64tests/adcix | Bin 0 -> 859 bytes c64tests/adciy | Bin 0 -> 868 bytes c64tests/adcz | Bin 0 -> 844 bytes c64tests/adczx | Bin 0 -> 853 bytes c64tests/alrb | Bin 0 -> 638 bytes c64tests/ancb | Bin 0 -> 685 bytes c64tests/anda | Bin 0 -> 665 bytes c64tests/andax | Bin 0 -> 688 bytes c64tests/anday | Bin 0 -> 688 bytes c64tests/andb | Bin 0 -> 666 bytes c64tests/andix | Bin 0 -> 682 bytes c64tests/andiy | Bin 0 -> 691 bytes c64tests/andz | Bin 0 -> 668 bytes c64tests/andzx | Bin 0 -> 677 bytes c64tests/aneb | Bin 0 -> 671 bytes c64tests/arrb | Bin 0 -> 795 bytes c64tests/asla | Bin 0 -> 637 bytes c64tests/aslax | Bin 0 -> 659 bytes c64tests/asln | Bin 0 -> 637 bytes c64tests/aslz | Bin 0 -> 640 bytes c64tests/aslzx | Bin 0 -> 649 bytes c64tests/asoa | Bin 0 -> 635 bytes c64tests/asoax | Bin 0 -> 658 bytes c64tests/asoay | Bin 0 -> 658 bytes c64tests/asoix | Bin 0 -> 652 bytes c64tests/asoiy | Bin 0 -> 661 bytes c64tests/asoz | Bin 0 -> 638 bytes c64tests/asozx | Bin 0 -> 647 bytes c64tests/axsa | Bin 0 -> 610 bytes c64tests/axsix | Bin 0 -> 620 bytes c64tests/axsz | Bin 0 -> 613 bytes c64tests/axszy | Bin 0 -> 622 bytes c64tests/bccr | Bin 0 -> 750 bytes c64tests/bcsr | Bin 0 -> 750 bytes c64tests/beqr | Bin 0 -> 751 bytes c64tests/bita | Bin 0 -> 656 bytes c64tests/bitz | Bin 0 -> 659 bytes c64tests/bmir | Bin 0 -> 751 bytes c64tests/bner | Bin 0 -> 751 bytes c64tests/bplr | Bin 0 -> 751 bytes c64tests/branchwrap | Bin 0 -> 246 bytes c64tests/brkn | Bin 0 -> 747 bytes c64tests/bvcr | Bin 0 -> 753 bytes c64tests/bvsr | Bin 0 -> 750 bytes c64tests/cia1pb6 | Bin 0 -> 1340 bytes c64tests/cia1pb7 | Bin 0 -> 1338 bytes c64tests/cia1ta | Bin 0 -> 1976 bytes c64tests/cia1tab | Bin 0 -> 555 bytes c64tests/cia1tb | Bin 0 -> 1976 bytes c64tests/cia1tb123 | Bin 0 -> 1616 bytes c64tests/cia2pb6 | Bin 0 -> 1340 bytes c64tests/cia2pb7 | Bin 0 -> 1338 bytes c64tests/cia2ta | Bin 0 -> 2760 bytes c64tests/cia2tb | Bin 0 -> 2760 bytes c64tests/cia2tb123 | Bin 0 -> 1614 bytes c64tests/clcn | Bin 0 -> 590 bytes c64tests/cldn | Bin 0 -> 590 bytes c64tests/clin | Bin 0 -> 590 bytes c64tests/clvn | Bin 0 -> 590 bytes c64tests/cmpa | Bin 0 -> 646 bytes c64tests/cmpax | Bin 0 -> 669 bytes c64tests/cmpay | Bin 0 -> 669 bytes c64tests/cmpb | Bin 0 -> 647 bytes c64tests/cmpix | Bin 0 -> 663 bytes c64tests/cmpiy | Bin 0 -> 672 bytes c64tests/cmpz | Bin 0 -> 649 bytes c64tests/cmpzx | Bin 0 -> 658 bytes c64tests/cntdef | Bin 0 -> 340 bytes c64tests/cnto2 | Bin 0 -> 389 bytes c64tests/cpuport | Bin 0 -> 469 bytes c64tests/cputiming | Bin 0 -> 2602 bytes c64tests/cpxa | Bin 0 -> 645 bytes c64tests/cpxb | Bin 0 -> 647 bytes c64tests/cpxz | Bin 0 -> 648 bytes c64tests/cpya | Bin 0 -> 645 bytes c64tests/cpyb | Bin 0 -> 647 bytes c64tests/cpyz | Bin 0 -> 648 bytes c64tests/dcma | Bin 0 -> 609 bytes c64tests/dcmax | Bin 0 -> 632 bytes c64tests/dcmay | Bin 0 -> 632 bytes c64tests/dcmix | Bin 0 -> 626 bytes c64tests/dcmiy | Bin 0 -> 635 bytes c64tests/dcmz | Bin 0 -> 612 bytes c64tests/dcmzx | Bin 0 -> 621 bytes c64tests/deca | Bin 0 -> 623 bytes c64tests/decax | Bin 0 -> 648 bytes c64tests/decz | Bin 0 -> 626 bytes c64tests/deczx | Bin 0 -> 635 bytes c64tests/dexn | Bin 0 -> 622 bytes c64tests/deyn | Bin 0 -> 622 bytes c64tests/eora | Bin 0 -> 676 bytes c64tests/eorax | Bin 0 -> 699 bytes c64tests/eoray | Bin 0 -> 699 bytes c64tests/eorb | Bin 0 -> 677 bytes c64tests/eorix | Bin 0 -> 693 bytes c64tests/eoriy | Bin 0 -> 702 bytes c64tests/eorz | Bin 0 -> 679 bytes c64tests/eorzx | Bin 0 -> 688 bytes c64tests/finish | Bin 0 -> 45 bytes c64tests/flipos | Bin 0 -> 714 bytes c64tests/icr01 | Bin 0 -> 934 bytes c64tests/imr | Bin 0 -> 509 bytes c64tests/inca | Bin 0 -> 623 bytes c64tests/incax | Bin 0 -> 648 bytes c64tests/incz | Bin 0 -> 626 bytes c64tests/inczx | Bin 0 -> 635 bytes c64tests/insa | Bin 0 -> 609 bytes c64tests/insax | Bin 0 -> 632 bytes c64tests/insay | Bin 0 -> 632 bytes c64tests/insix | Bin 0 -> 626 bytes c64tests/insiy | Bin 0 -> 635 bytes c64tests/insz | Bin 0 -> 612 bytes c64tests/inszx | Bin 0 -> 621 bytes c64tests/inxn | Bin 0 -> 622 bytes c64tests/inyn | Bin 0 -> 622 bytes c64tests/irq | Bin 0 -> 3341 bytes c64tests/jmpi | Bin 0 -> 664 bytes c64tests/jmpw | Bin 0 -> 611 bytes c64tests/jsrw | Bin 0 -> 715 bytes c64tests/lasay | Bin 0 -> 714 bytes c64tests/laxa | Bin 0 -> 611 bytes c64tests/laxay | Bin 0 -> 634 bytes c64tests/laxix | Bin 0 -> 628 bytes c64tests/laxiy | Bin 0 -> 637 bytes c64tests/laxz | Bin 0 -> 614 bytes c64tests/laxzy | Bin 0 -> 623 bytes c64tests/ldaa | Bin 0 -> 619 bytes c64tests/ldaax | Bin 0 -> 645 bytes c64tests/ldaay | Bin 0 -> 645 bytes c64tests/ldab | Bin 0 -> 620 bytes c64tests/ldaix | Bin 0 -> 639 bytes c64tests/ldaiy | Bin 0 -> 648 bytes c64tests/ldaz | Bin 0 -> 620 bytes c64tests/ldazx | Bin 0 -> 629 bytes c64tests/ldxa | Bin 0 -> 619 bytes c64tests/ldxay | Bin 0 -> 644 bytes c64tests/ldxb | Bin 0 -> 620 bytes c64tests/ldxz | Bin 0 -> 622 bytes c64tests/ldxzy | Bin 0 -> 631 bytes c64tests/ldya | Bin 0 -> 619 bytes c64tests/ldyax | Bin 0 -> 644 bytes c64tests/ldyb | Bin 0 -> 620 bytes c64tests/ldyz | Bin 0 -> 622 bytes c64tests/ldyzx | Bin 0 -> 631 bytes c64tests/loadth | Bin 0 -> 619 bytes c64tests/lsea | Bin 0 -> 637 bytes c64tests/lseax | Bin 0 -> 660 bytes c64tests/lseay | Bin 0 -> 660 bytes c64tests/lseix | Bin 0 -> 654 bytes c64tests/lseiy | Bin 0 -> 663 bytes c64tests/lsez | Bin 0 -> 640 bytes c64tests/lsezx | Bin 0 -> 649 bytes c64tests/lsra | Bin 0 -> 629 bytes c64tests/lsrax | Bin 0 -> 651 bytes c64tests/lsrn | Bin 0 -> 629 bytes c64tests/lsrz | Bin 0 -> 632 bytes c64tests/lsrzx | Bin 0 -> 641 bytes c64tests/lxab | Bin 0 -> 662 bytes c64tests/mmu | Bin 0 -> 694 bytes c64tests/mmufetch | Bin 0 -> 523 bytes c64tests/nmi | Bin 0 -> 3337 bytes c64tests/nopa | Bin 0 -> 594 bytes c64tests/nopax | Bin 0 -> 646 bytes c64tests/nopb | Bin 0 -> 624 bytes c64tests/nopn | Bin 0 -> 622 bytes c64tests/nopz | Bin 0 -> 624 bytes c64tests/nopzx | Bin 0 -> 636 bytes c64tests/oneshot | Bin 0 -> 413 bytes c64tests/oraa | Bin 0 -> 665 bytes c64tests/oraax | Bin 0 -> 688 bytes c64tests/oraay | Bin 0 -> 688 bytes c64tests/orab | Bin 0 -> 666 bytes c64tests/oraix | Bin 0 -> 682 bytes c64tests/oraiy | Bin 0 -> 691 bytes c64tests/oraz | Bin 0 -> 668 bytes c64tests/orazx | Bin 0 -> 677 bytes c64tests/phan | Bin 0 -> 628 bytes c64tests/phpn | Bin 0 -> 623 bytes c64tests/plan | Bin 0 -> 652 bytes c64tests/plpn | Bin 0 -> 623 bytes c64tests/rlaa | Bin 0 -> 639 bytes c64tests/rlaax | Bin 0 -> 662 bytes c64tests/rlaay | Bin 0 -> 662 bytes c64tests/rlaix | Bin 0 -> 656 bytes c64tests/rlaiy | Bin 0 -> 665 bytes c64tests/rlaz | Bin 0 -> 642 bytes c64tests/rlazx | Bin 0 -> 651 bytes c64tests/rola | Bin 0 -> 647 bytes c64tests/rolax | Bin 0 -> 669 bytes c64tests/roln | Bin 0 -> 644 bytes c64tests/rolz | Bin 0 -> 650 bytes c64tests/rolzx | Bin 0 -> 659 bytes c64tests/rora | Bin 0 -> 651 bytes c64tests/rorax | Bin 0 -> 673 bytes c64tests/rorn | Bin 0 -> 648 bytes c64tests/rorz | Bin 0 -> 654 bytes c64tests/rorzx | Bin 0 -> 663 bytes c64tests/rraa | Bin 0 -> 604 bytes c64tests/rraax | Bin 0 -> 627 bytes c64tests/rraay | Bin 0 -> 627 bytes c64tests/rraix | Bin 0 -> 621 bytes c64tests/rraiy | Bin 0 -> 630 bytes c64tests/rraz | Bin 0 -> 607 bytes c64tests/rrazx | Bin 0 -> 616 bytes c64tests/rtin | Bin 0 -> 667 bytes c64tests/rtsn | Bin 0 -> 650 bytes c64tests/sbca | Bin 0 -> 834 bytes c64tests/sbcax | Bin 0 -> 857 bytes c64tests/sbcay | Bin 0 -> 857 bytes c64tests/sbcb | Bin 0 -> 838 bytes c64tests/sbcb(eb) | Bin 0 -> 843 bytes c64tests/sbcix | Bin 0 -> 851 bytes c64tests/sbciy | Bin 0 -> 860 bytes c64tests/sbcz | Bin 0 -> 836 bytes c64tests/sbczx | Bin 0 -> 845 bytes c64tests/sbxb | Bin 0 -> 664 bytes c64tests/secn | Bin 0 -> 588 bytes c64tests/sedn | Bin 0 -> 588 bytes c64tests/sein | Bin 0 -> 588 bytes c64tests/shaay | Bin 0 -> 684 bytes c64tests/shaiy | Bin 0 -> 687 bytes c64tests/shsay | Bin 0 -> 714 bytes c64tests/shxay | Bin 0 -> 651 bytes c64tests/shyax | Bin 0 -> 651 bytes c64tests/staa | Bin 0 -> 598 bytes c64tests/staax | Bin 0 -> 621 bytes c64tests/staay | Bin 0 -> 621 bytes c64tests/staix | Bin 0 -> 615 bytes c64tests/staiy | Bin 0 -> 624 bytes c64tests/staz | Bin 0 -> 601 bytes c64tests/stazx | Bin 0 -> 610 bytes c64tests/stxa | Bin 0 -> 596 bytes c64tests/stxz | Bin 0 -> 601 bytes c64tests/stxzy | Bin 0 -> 610 bytes c64tests/stya | Bin 0 -> 594 bytes c64tests/styz | Bin 0 -> 601 bytes c64tests/styzx | Bin 0 -> 610 bytes c64tests/taxn | Bin 0 -> 616 bytes c64tests/tayn | Bin 0 -> 616 bytes c64tests/trap1 | Bin 0 -> 4246 bytes c64tests/trap10 | Bin 0 -> 4269 bytes c64tests/trap11 | Bin 0 -> 4248 bytes c64tests/trap12 | Bin 0 -> 4269 bytes c64tests/trap13 | Bin 0 -> 4069 bytes c64tests/trap14 | Bin 0 -> 4090 bytes c64tests/trap15 | Bin 0 -> 4269 bytes c64tests/trap16 | Bin 0 -> 4347 bytes c64tests/trap17 | Bin 0 -> 4344 bytes c64tests/trap2 | Bin 0 -> 4246 bytes c64tests/trap3 | Bin 0 -> 4246 bytes c64tests/trap4 | Bin 0 -> 4246 bytes c64tests/trap5 | Bin 0 -> 4246 bytes c64tests/trap6 | Bin 0 -> 4246 bytes c64tests/trap7 | Bin 0 -> 4246 bytes c64tests/trap8 | Bin 0 -> 4089 bytes c64tests/trap9 | Bin 0 -> 4247 bytes c64tests/tsxn | Bin 0 -> 644 bytes c64tests/txan | Bin 0 -> 616 bytes c64tests/txsn | Bin 0 -> 620 bytes c64tests/tyan | Bin 0 -> 616 bytes sim65/bcd_vice_sim.c | 160 ++++ sim65/src/C64KernalStubs.kt | 20 +- sim65/src/C64Screencodes.kt | 550 -------------- sim65/src/Petscii.kt | 1121 +++++++++++++++++++++++++++++ sim65/src/Sim65Main.kt | 55 +- sim65/src/Sim65MainBCDtest.kt | 27 +- sim65/src/components/Bus.kt | 4 +- sim65/src/components/Component.kt | 10 +- sim65/src/components/Cpu6502.kt | 696 +++++++++--------- sim65/src/components/Parallel.kt | 8 +- sim65/src/components/Ram.kt | 7 +- sim65/src/components/Rom.kt | 4 +- sim65/src/components/Timer.kt | 4 +- sim65/test/Test6502CpuBasics.kt | 2 +- sim65/test/TestCommon6502.kt | 1058 ++++++--------------------- sim65/test/TestDisassembler.kt | 2 +- 282 files changed, 2294 insertions(+), 1810 deletions(-) create mode 100644 c64tests/0start create mode 100644 c64tests/_Test Suite 2.15.txt create mode 100644 c64tests/adca create mode 100644 c64tests/adcax create mode 100644 c64tests/adcay create mode 100644 c64tests/adcb create mode 100644 c64tests/adcix create mode 100644 c64tests/adciy create mode 100644 c64tests/adcz create mode 100644 c64tests/adczx create mode 100644 c64tests/alrb create mode 100644 c64tests/ancb create mode 100644 c64tests/anda create mode 100644 c64tests/andax create mode 100644 c64tests/anday create mode 100644 c64tests/andb create mode 100644 c64tests/andix create mode 100644 c64tests/andiy create mode 100644 c64tests/andz create mode 100644 c64tests/andzx create mode 100644 c64tests/aneb create mode 100644 c64tests/arrb create mode 100644 c64tests/asla create mode 100644 c64tests/aslax create mode 100644 c64tests/asln create mode 100644 c64tests/aslz create mode 100644 c64tests/aslzx create mode 100644 c64tests/asoa create mode 100644 c64tests/asoax create mode 100644 c64tests/asoay create mode 100644 c64tests/asoix create mode 100644 c64tests/asoiy create mode 100644 c64tests/asoz create mode 100644 c64tests/asozx create mode 100644 c64tests/axsa create mode 100644 c64tests/axsix create mode 100644 c64tests/axsz create mode 100644 c64tests/axszy create mode 100644 c64tests/bccr create mode 100644 c64tests/bcsr create mode 100644 c64tests/beqr create mode 100644 c64tests/bita create mode 100644 c64tests/bitz create mode 100644 c64tests/bmir create mode 100644 c64tests/bner create mode 100644 c64tests/bplr create mode 100644 c64tests/branchwrap create mode 100644 c64tests/brkn create mode 100644 c64tests/bvcr create mode 100644 c64tests/bvsr create mode 100644 c64tests/cia1pb6 create mode 100644 c64tests/cia1pb7 create mode 100644 c64tests/cia1ta create mode 100644 c64tests/cia1tab create mode 100644 c64tests/cia1tb create mode 100644 c64tests/cia1tb123 create mode 100644 c64tests/cia2pb6 create mode 100644 c64tests/cia2pb7 create mode 100644 c64tests/cia2ta create mode 100644 c64tests/cia2tb create mode 100644 c64tests/cia2tb123 create mode 100644 c64tests/clcn create mode 100644 c64tests/cldn create mode 100644 c64tests/clin create mode 100644 c64tests/clvn create mode 100644 c64tests/cmpa create mode 100644 c64tests/cmpax create mode 100644 c64tests/cmpay create mode 100644 c64tests/cmpb create mode 100644 c64tests/cmpix create mode 100644 c64tests/cmpiy create mode 100644 c64tests/cmpz create mode 100644 c64tests/cmpzx create mode 100644 c64tests/cntdef create mode 100644 c64tests/cnto2 create mode 100644 c64tests/cpuport create mode 100644 c64tests/cputiming create mode 100644 c64tests/cpxa create mode 100644 c64tests/cpxb create mode 100644 c64tests/cpxz create mode 100644 c64tests/cpya create mode 100644 c64tests/cpyb create mode 100644 c64tests/cpyz create mode 100644 c64tests/dcma create mode 100644 c64tests/dcmax create mode 100644 c64tests/dcmay create mode 100644 c64tests/dcmix create mode 100644 c64tests/dcmiy create mode 100644 c64tests/dcmz create mode 100644 c64tests/dcmzx create mode 100644 c64tests/deca create mode 100644 c64tests/decax create mode 100644 c64tests/decz create mode 100644 c64tests/deczx create mode 100644 c64tests/dexn create mode 100644 c64tests/deyn create mode 100644 c64tests/eora create mode 100644 c64tests/eorax create mode 100644 c64tests/eoray create mode 100644 c64tests/eorb create mode 100644 c64tests/eorix create mode 100644 c64tests/eoriy create mode 100644 c64tests/eorz create mode 100644 c64tests/eorzx create mode 100644 c64tests/finish create mode 100644 c64tests/flipos create mode 100644 c64tests/icr01 create mode 100644 c64tests/imr create mode 100644 c64tests/inca create mode 100644 c64tests/incax create mode 100644 c64tests/incz create mode 100644 c64tests/inczx create mode 100644 c64tests/insa create mode 100644 c64tests/insax create mode 100644 c64tests/insay create mode 100644 c64tests/insix create mode 100644 c64tests/insiy create mode 100644 c64tests/insz create mode 100644 c64tests/inszx create mode 100644 c64tests/inxn create mode 100644 c64tests/inyn create mode 100644 c64tests/irq create mode 100644 c64tests/jmpi create mode 100644 c64tests/jmpw create mode 100644 c64tests/jsrw create mode 100644 c64tests/lasay create mode 100644 c64tests/laxa create mode 100644 c64tests/laxay create mode 100644 c64tests/laxix create mode 100644 c64tests/laxiy create mode 100644 c64tests/laxz create mode 100644 c64tests/laxzy create mode 100644 c64tests/ldaa create mode 100644 c64tests/ldaax create mode 100644 c64tests/ldaay create mode 100644 c64tests/ldab create mode 100644 c64tests/ldaix create mode 100644 c64tests/ldaiy create mode 100644 c64tests/ldaz create mode 100644 c64tests/ldazx create mode 100644 c64tests/ldxa create mode 100644 c64tests/ldxay create mode 100644 c64tests/ldxb create mode 100644 c64tests/ldxz create mode 100644 c64tests/ldxzy create mode 100644 c64tests/ldya create mode 100644 c64tests/ldyax create mode 100644 c64tests/ldyb create mode 100644 c64tests/ldyz create mode 100644 c64tests/ldyzx create mode 100644 c64tests/loadth create mode 100644 c64tests/lsea create mode 100644 c64tests/lseax create mode 100644 c64tests/lseay create mode 100644 c64tests/lseix create mode 100644 c64tests/lseiy create mode 100644 c64tests/lsez create mode 100644 c64tests/lsezx create mode 100644 c64tests/lsra create mode 100644 c64tests/lsrax create mode 100644 c64tests/lsrn create mode 100644 c64tests/lsrz create mode 100644 c64tests/lsrzx create mode 100644 c64tests/lxab create mode 100644 c64tests/mmu create mode 100644 c64tests/mmufetch create mode 100644 c64tests/nmi create mode 100644 c64tests/nopa create mode 100644 c64tests/nopax create mode 100644 c64tests/nopb create mode 100644 c64tests/nopn create mode 100644 c64tests/nopz create mode 100644 c64tests/nopzx create mode 100644 c64tests/oneshot create mode 100644 c64tests/oraa create mode 100644 c64tests/oraax create mode 100644 c64tests/oraay create mode 100644 c64tests/orab create mode 100644 c64tests/oraix create mode 100644 c64tests/oraiy create mode 100644 c64tests/oraz create mode 100644 c64tests/orazx create mode 100644 c64tests/phan create mode 100644 c64tests/phpn create mode 100644 c64tests/plan create mode 100644 c64tests/plpn create mode 100644 c64tests/rlaa create mode 100644 c64tests/rlaax create mode 100644 c64tests/rlaay create mode 100644 c64tests/rlaix create mode 100644 c64tests/rlaiy create mode 100644 c64tests/rlaz create mode 100644 c64tests/rlazx create mode 100644 c64tests/rola create mode 100644 c64tests/rolax create mode 100644 c64tests/roln create mode 100644 c64tests/rolz create mode 100644 c64tests/rolzx create mode 100644 c64tests/rora create mode 100644 c64tests/rorax create mode 100644 c64tests/rorn create mode 100644 c64tests/rorz create mode 100644 c64tests/rorzx create mode 100644 c64tests/rraa create mode 100644 c64tests/rraax create mode 100644 c64tests/rraay create mode 100644 c64tests/rraix create mode 100644 c64tests/rraiy create mode 100644 c64tests/rraz create mode 100644 c64tests/rrazx create mode 100644 c64tests/rtin create mode 100644 c64tests/rtsn create mode 100644 c64tests/sbca create mode 100644 c64tests/sbcax create mode 100644 c64tests/sbcay create mode 100644 c64tests/sbcb create mode 100644 c64tests/sbcb(eb) create mode 100644 c64tests/sbcix create mode 100644 c64tests/sbciy create mode 100644 c64tests/sbcz create mode 100644 c64tests/sbczx create mode 100644 c64tests/sbxb create mode 100644 c64tests/secn create mode 100644 c64tests/sedn create mode 100644 c64tests/sein create mode 100644 c64tests/shaay create mode 100644 c64tests/shaiy create mode 100644 c64tests/shsay create mode 100644 c64tests/shxay create mode 100644 c64tests/shyax create mode 100644 c64tests/staa create mode 100644 c64tests/staax create mode 100644 c64tests/staay create mode 100644 c64tests/staix create mode 100644 c64tests/staiy create mode 100644 c64tests/staz create mode 100644 c64tests/stazx create mode 100644 c64tests/stxa create mode 100644 c64tests/stxz create mode 100644 c64tests/stxzy create mode 100644 c64tests/stya create mode 100644 c64tests/styz create mode 100644 c64tests/styzx create mode 100644 c64tests/taxn create mode 100644 c64tests/tayn create mode 100644 c64tests/trap1 create mode 100644 c64tests/trap10 create mode 100644 c64tests/trap11 create mode 100644 c64tests/trap12 create mode 100644 c64tests/trap13 create mode 100644 c64tests/trap14 create mode 100644 c64tests/trap15 create mode 100644 c64tests/trap16 create mode 100644 c64tests/trap17 create mode 100644 c64tests/trap2 create mode 100644 c64tests/trap3 create mode 100644 c64tests/trap4 create mode 100644 c64tests/trap5 create mode 100644 c64tests/trap6 create mode 100644 c64tests/trap7 create mode 100644 c64tests/trap8 create mode 100644 c64tests/trap9 create mode 100644 c64tests/tsxn create mode 100644 c64tests/txan create mode 100644 c64tests/txsn create mode 100644 c64tests/tyan create mode 100644 sim65/bcd_vice_sim.c delete mode 100644 sim65/src/C64Screencodes.kt create mode 100644 sim65/src/Petscii.kt diff --git a/c64tests/0start b/c64tests/0start new file mode 100644 index 0000000000000000000000000000000000000000..fb1cd21bcd79d9b67d316b2bfd867039d2d72465 GIT binary patch literal 3438 zcmd^;`#+QaAI9&^X}dG#FqXotC=;3UNHNS|#vF@|Iy*}zo$0U+YNb?kl9Vz@>nI@# zqdOU3N2Yi0$*S((ibzSe*^%{=A(IP-;mZo%v3`@El9fBYM zj)zBBlvEW`IoHRB>&6XWA-2{?rB5)28N>}hYFU9nNKLR;5Q_wYT{vE@NCnr2>E&yR z_;QhQu3uV(%)N2%#!HRGi!+%#DIm4CN1WJ3;#=XW0ZyrCAIb6xv0M>O&LmR?ahDwSX^%sl#TBt zAf4jgK@OCJ{mOA;xQHMh3E>U`Vv z{-db(%eU_XKZl0@Yk!=af)a5INmWgQqCIw;uD-!Uqsg=>X66=FHg@*YraLiRSsq^A zK3xC6;8~$_<}Fybco4G5AaTU;9H44u{9f z$;rzrC@3l_DG>-nA`FiiqpVCKsi>%`lF4dn>gpOAnwk`fmX@|Ql{$8;j?TDognn0BZz^)gb5QT8X6iIO`0@$vavCZW@0jBim9oY+0?1#=5)G+g{7sHm9@2vjjgSn z9fM(S@8B?Pnxo_N=`&_HIXOEsnJzA_u5NBDmb<%$ho`5P7n|+v&Efd?`1*3Wet!P` z0Re%5K|#U6GiT146%rB}I(znT;{f(2n=3l}b0w0QB7B}swR-iMHEY)ZojawaWo38o-n&;`UQtn5dH?={2US%l`taeS zM~@#rdGhq>vu6N2e_mZ(Q&U@8S65&E;zdJ4V`Ed(%a_f~EiJ9BZEfxC9UZS;y?))< z`R2{rx9{F{b#-^YfB)gb$B&;ri9|g;y}h45fBEwD>$h)xec!+L_YVyG`0?}S;NZ~E zuV2H%VlfUcC$FHWL?FUrlu0V8WHogSO^TK_b*#>~@w$5Yh{1%3hDMVn8`Dgtn3_#B zr(0NBS=-p!G3*_tIZmJ9<+Gw{5+rnavBMMGoL%jTBWw)T!!uRGtoeb?3f{=>&lqMqK*U%r0p z``$nB literal 0 HcmV?d00001 diff --git a/c64tests/_Test Suite 2.15.txt b/c64tests/_Test Suite 2.15.txt new file mode 100644 index 000000000..b9ecc398a --- /dev/null +++ b/c64tests/_Test Suite 2.15.txt @@ -0,0 +1,376 @@ +C64 Emulator Test Suite - Public Domain, no Copyright + +https://github.com/mattgodbolt/jsbeeb/blob/master/tests/suite/cbm-hackers-post.md + + +The purpose of the C64 Emulator Test Suite is +- to help C64 emulator authors improve the compatibility +- ensure that updated emulators have no new bugs in old code parts + +The suite are a few hundred C64 programs which check the details of the C64 they are running on. The suite runs automated and stops only if it has detected an error. That the suite doesn't stop on my C64-I/PAL proves that the suite has no bugs. That the same suite doesn't stop on an emulator proves that this particular emulator is compatible to my C64 regarding every tested detail. Of course, the emulator may still have bugs in parts which are not tested by the suite. There may also be a difference between your C64 and my C64. + +While the Test Suite is running, the Datasette should be disconnected. Needs about 80 min to complete. + +The source code has been developed with MACRO(SS)ASS+ by Wolfram Roemhild. The file TEMPLATE.ASM provides a starting point for adding new tests to the suite. + + +/////////////////////////////////////////////////////////////////////////////// +Program _START - some 6510 basic commands, just as an insurance + + +/////////////////////////////////////////////////////////////////////////////// +Programs LDAb to SBCb(EB) - 6510 command function + +addressing modes +----------------------------------- +n none (implied and accu) +b byte (immediate) +w word (absolute for JMP and JSR) +z zero page +zx zero page,x +zy zero page,y +a absolute +ax absolute,x +ay absolute,y +i indirect (JMP) +ix (indirect,x) +iy (indirect),y +r relative + +Display: +before data accu xreg yreg flags sp +after data accu xreg yreg flags sp +right data accu xreg yreg flags sp + +Either press STOP or any other key to continue. + +All 256 opcodes are tested except HLTn (02 12 22 32 42 52 62 72 92 B2 D2 F2). + +Indexed addressing modes count the index registers from 00 to FF. + +JMPi (xxFF) is tested. + +Single operand commands: 256 data combinations from 00 to FF multiplied by 256 flag combinations. + +Two operand commands: 256 data combinations 00/00, 00/11, ... FF/EE, FF/FF multiplied by 256 flag combinations. + +ANEb, LASay, SHAay, SHAiy, SHXay, SHYax and SHSay are executed only in the y border. These commands cause unpredictable results when a DMA comes between the command byte and the operand. + +SHAay, SHAiy, SHXay, SHYax and SHSay are tested on a data address xxFF only. When the hibyte of the indexed address needs adjustment, these commands will write to different locations, depending on the data written. + + +/////////////////////////////////////////////////////////////////////////////// +Programs TRAP* - 6510 IO traps, page boundaries and wrap arounds + + # code data zd zptr aspect tested +----------------------------------------------------------------------------- + 1 2800 29C0 F7 F7/F8 basic functionality + 2 2FFE 29C0 F7 F7/F8 4k boundary within 3 byte commands + 3 2FFF 29C0 F7 F7/F8 4k boundary within 2 and 3 byte commands + 4 D000 29C0 F7 F7/F8 IO traps for code fetch + 5 CFFE 29C0 F7 F7/F8 RAM/IO boundary within 3 byte commands + 6 CFFF 29C0 F7 F7/F8 RAM/IO boundary within 2 and 3 byte commands + 7 2800 D0C0 F7 F7/F8 IO traps for 16 bit data access + 8 2800 D000 F7 F7/F8 IO trap adjustment in ax, ay and iy addressing + 9 2800 29C0 02 F7/F8 wrap around in zx and zy addressing +10 2800 29C0 00 F7/F8 IO traps for 8 bit data access +11 2800 29C0 F7 02/03 wrap around in ix addressing +12 2800 29C0 F7 FF/00 wrap around and IO trap for pointer accesses +13 2800 0002 F7 F7/F8 64k wrap around in ax, ay and iy addressing +14 2800 0000 F7 F7/F8 64k wrap around plus IO trap +15 CFFF D0C6 00 FF/00 1-14 all together as a stress test +16 FFFE ---- -- --/-- 64k boundary within 3 byte commands +17 FFFF ---- -- --/-- 64k boundary within 2 and 3 byte commands + +In the programs TRAP16 and TRAP17, the locations of data, zerodata and zeroptr depend on the addressing mode. The CPU port at 00/01 is not able to hold all 256 bit combinations. + +The datasette may not be connected while TRAP16 and TRAP17 are running! + +Display: +after data accu xreg yreg flags +right data accu xreg yreg flags + +If all displayed values match, some other aspect is wrong, e.g. the stack pointer or data on stack. + +All 256 commands are tested except HLTn. Registers before: +data 1B (00 01 10 11) +accu C6 (11 00 01 10) +xreg B1 (10 11 00 01) +yreg 6C (01 10 11 00) +flags 00 +sptr not initialized, typically F8 + +The code length is 6 bytes maximum (SHSay). + +When the lowbyte of the data address is less than C0, SHAay, SHAiy, SHXay, SHYax and SHSay aren't tested. Those commands don't handle the address adjustment correctly. + +Relative jumps are tested in 4 combinations: offset 01 no jump, offset 01 jump, offset 80 no jump, offset 80 jump. For the offset 80, a RTS is written to the location at code - 7E. + + +/////////////////////////////////////////////////////////////////////////////// +Program BRANCHWRAP - Forward branches from FFxx to 00xx + +Backward branches from 00xx to FFxx were already tested in TRAP16 and TRAP17. + + +/////////////////////////////////////////////////////////////////////////////// +Program MMUFETCH - 6510 code fetching while memory configuration changes + +An example is the code sequence LDA #$37 : STA 1 : BRK in RAM at Axxx. Because STA 1 maps the Basic ROM, the BRK will never get executed. + +addr sequence +--------------------- +A4DF RAM-Basic-RAM +B828 RAM-Basic-RAM +EA77 RAM-Kernal-RAM +FD25 RAM-Kernal-RAM +D400 RAM-Charset-RAM +D000 RAM-IO-RAM + +The sequence IO-Charset-IO is not tested because I didn't find some appropriate code bytes in the Charset ROM at D000-D3FF. The SID registers at D4xx are write-only. + + +/////////////////////////////////////////////////////////////////////////////// +Program MMU - 6510 port at 00/01 bits 0-2 + +Display: +0/1=0-7 repeated 6 times: values stored in 0 and 1 +after 0 1 A000 E000 D000 IO +right 0 1 A000 E000 D000 IO + +address value meaning +---------------------------------------- +A000 94 read Basic, write RAM +A000 01 read/write RAM +E000 86 read Kernal, write RAM +E000 01 read/write RAM +D000/IO 3D/02 read Charset, write RAM +D000/IO 01/02 read/write RAM +D000/IO 00/03 read/write IO + + +/////////////////////////////////////////////////////////////////////////////// +Program CPUPORT - 6510 port at 00/01 bits 0-7 + +Display: +0/1=00/FF repeated 6 times: values stored in 0 and 1 +after 00 01 +right 00 01 + +The datasette may not be connected while CPUPORT is running! + +If both values match, the port behaves instable. On my C64, this will only happen when a datasette is connected. + + +/////////////////////////////////////////////////////////////////////////////// +Program CPUTIMING - 6510 timing whole commands + +Display: +xx command byte +clocks #measured +right #2 + +#1 #2 command or addressing mode +-------------------------------------- +2 2 n +2 2 b +3 3 Rz/Wz +5 5 Mz +4 8 Rzx/Rzy/Wzx/Wzy +6 10 Mzx/Mzy +4 4 Ra/Wa +6 6 Ma +4 8 Rax/Ray (same page) +5 9 Rax/Ray (different page) +5 9 Wax/Way +7 11 Max/May +6 8 Rix/Wix +8 10 Mix/Miy +5 7 Riy (same page) +6 8 Riy (different page) +6 8 Wiy +8 10 Miy +2 18 r+00 same page not taken +3 19 r+00 same page taken +3 19 r+7F same page taken +4 20 r+01 different page taken +4 20 r+7F different page taken +3 19 r-03 same page taken +3 19 r-80 same page taken +4 20 r-03 different page taken +4 20 r-80 different page taken +7 7 BRKn +3 3 PHAn/PHPn +4 4 PLAn/PLPn +3 3 JMPw +5 5 JMPi +6 6 JSRw +6 6 RTSn +6 6 RTIn + +#1 = command execution time without overhead +#2 = displayed value including overhead for measurement +R/W/M = Read/Write/Modify + + +/////////////////////////////////////////////////////////////////////////////// +Programs IRQ and NMI - CPU interrupts within commands + +Tested are all commands except HLTn. For a command of n cycles, a loop with the interrupt occurring before cycle 1..n is performed. Rax/Ray/Riy addressing is tested with both the same page and a different page. Branches are tested not taken, taken to the same page, and taken to a different page. + +Display: +stack
+right
+ +When an interrupt occurs 2 or more cycles before the current command ends, it is executed immediately after the command. Otherwise, the CPU executes the next command first before it calls the interrupt handler. + +The only exception to this rule are taken branches to the same page which last 3 cycles. Here, the interrupt must have occurred before clock 1 of the branch command; the normal rule says before clock 2. Branches to a different page or branches not taken are behaving normal. + +The 6510 will set the IFlag on NMI, too. 6502 untested. + +When an IRQ occurs while SEIn is executing, the IFlag on the stack will be set. + +When an NMI occurs before clock 4 of a BRKn command, the BRK is finished as a NMI. In this case, BFlag on the stack will not be cleared. + + +/////////////////////////////////////////////////////////////////////////////// +Programs CIA1TB123 and CIA2TB123 - CIA timer B 1-3 cycles after writing CRB + +The cycles 1-3 after STA DD0F cannot be measured with LDA DD06 because it takes 3 cycles to decode the LDAa. Executing the STA DD0F at DD03 lets the CPU read DD06 within one cycle. + +#1 #2 DD06 sequence 1/2/3 (4) +--------------------------------- +00 01 keep keep count count +00 10 keep load keep keep +00 11 keep load keep count +01 11 count load keep count +01 10 count load keep keep +01 00 count count keep keep + +#1, #2 = values written to DD0F + + +/////////////////////////////////////////////////////////////////////////////// +Programs CIA1PB6 to CIA2PB7 - CIA timer output to PB6 and PB7 + +Checks 128 combinations of CRA/B in One Shot mode: + old CRx bit 0 Start + CRx bit 1 PBxOut + CRx bit 2 PBxToggle + new CRx bit 0 Start + CRx bit 1 PBxOut + CRx bit 2 PBxToggle + CRx bit 4 Force Load + +The resulting PB6/7 bit is: + 0 if new PBxToggle is 0 + 1 if new PBxToggle is 1 + - (undetermined) if PBxOut is 0 + +Old values do not influence the result. Start and Force Load don't either. + +Next, the programs test if PBx is toggled to 0 on the first underflow and that neither writing CRx except bit 0 nor Timer Hi/Lo will set it back to 1. The only source which is able to reset the toggle line is a rising edge on the Start bit 0 of CRx. + +Another test verifies that the toggle line is independent from PBxOut and PBxToggle. Changing these two bits will have no effect on switching the toggle flip flop when the timer underflows. + +The last test checks for the correct timing in Pulse and Toggle Mode. + + +/////////////////////////////////////////////////////////////////////////////// +Program CIA1TAB - TA, TB, PB67 and ICR in cascaded mode + +Both latches are set to 2. TA counts system clocks, TB counts TA underflows (cascaded). PB6 is high for one cycle when TA underflows, PB7 is toggled when TB underflows. IMR is $02. + +TA 01 02 02 01 02 02 01 02 02 01 02 02 +TB 02 02 02 01 01 01 00 00 02 02 02 02 +PB 80 C0 80 80 C0 80 80 C0 00 00 40 00 +ICR 00 01 01 01 01 01 01 01 03 83 83 83 + +If one of the registers doesn't match this table, the program displays the wrong values with red color. + + +/////////////////////////////////////////////////////////////////////////////// +Program LOADTH - Load timer high byte + +Writing to the high byte of the latch may load the counter only when it is not running. + +writing counter load +------------------------ +high byte stopped yes +high byte running no +low byte stopped no +low byte running no + + +/////////////////////////////////////////////////////////////////////////////// +Program CNTO2 - Switches between CNT and o2 input + +When the timer input is switched from o2 to CNT or from CNT back to o2, there must be a two clock delay until the switch is recognized. + + +/////////////////////////////////////////////////////////////////////////////// +Program ICR01 - Reads ICR around an underflow + +Reads ICR when an underflow occurs and checks if the NMI is executed. + +time ICR NMI +-------------- +t-1 00 yes +t 01 no +t+1 81 yes + + +/////////////////////////////////////////////////////////////////////////////// +Program IMR - Interrupt mask register + +When a condition in the ICR is true, setting the corresponding bit in the IMR must also set the interrupt. Clearing the bit in the IMR may not clear the interrupt. Only reading the ICR may clear the interrupt. + + +/////////////////////////////////////////////////////////////////////////////// +Program FLIPOS - Flip one shot + +Sets and clears the one shot bit when an underflow occurs at t. Set must take effect at t-1, clear at t-2. + +time set clear +------------------ +t-2 stop count +t-1 stop stop +t count stop + + +/////////////////////////////////////////////////////////////////////////////// +Program ONESHOT - Checks for start bit cleared + +Reads CRA in one shot mode with an underflow at t. + +time CRA +--------- +t-1 $09 +t $08 + + +/////////////////////////////////////////////////////////////////////////////// +Program CNTDEF - CNT default + +CNT must be high by default. This is tested with timer B cascaded mode CRB = $61. + + + + + + +******************************************* +** U N D E R C O N S T R U C T I O N ** +******************************************* + + + +/////////////////////////////////////////////////////////////////////////////// +Programs CIA1TA to CIA2TB - CIA timers in sysclock mode + +PC64Win 2.15 bug: + before 05/02/01/00 + after xx + cr 11/19 + after xx +timer low doesn't match diff --git a/c64tests/adca b/c64tests/adca new file mode 100644 index 0000000000000000000000000000000000000000..87bfdf6cb39e48562d8d1ad0730ff1c8acfb4050 GIT binary patch literal 842 zcmZ{h&ubGw6vt<`wa&{n#9m6&%k-AT7S~=3#e@BkHm!@5Qbarz@sQ94|AZDX9zv(A z7X=Tp1Uzi$6nheXT~x#*-E{gZ=?^c0hxQ_SP!M{kZ_>4b;2d_}=R5Dmmw6hsJ1Ke6 z+imqd>$NUhgb+{5>#WO&KI$JD>?huNUIFhDuY$MCSHPR$K6r%J;Pt|)3MznCq6Q|F zcLjn3UI#u+%~^h*#?^%uXh|xnkR`mKGQl#hI67!0)XdpLmRRitOlmK{)sp>~s`!U! zK$*za0_Y_S&tNcDTG$2qBAm=HV_ed(T?zkVs$DEgTvCoWr;`T}Gv-p9IRA^zA5ttc zgXkgU7-C)kB%USoMQho0T9XIvezXCYo4C@U+fmi{)4Z;V$17a2U z9xScGQ%p=_+ocs)^dXUxK)3lCEUd%)24wgqzSS16FAzr;*$!R-=UnsU;#h-R1t)@B zh3_>8TI>|X*JnL!{92Se*8|GF9R-IrnL|}=Md>~x1yvPj0W0=$Y zeE!S-4U5+!j$W*#3s{sX-c(Qz!BTK3gaHNbLl{!w(3bCzDd^#f^(RCzyG{>@6WtdxN(xR z$KB_{Jx{vBm%@xOQ%QNWi0XgT8;kaiG4qTl!F(^uFjqtc=A@{?WMUmJ7dB*20v*wT zwGN%z_blQX#4f}%*Js2W56T0@Q6k(bBgsTVW+JR#&Um2YNz-RSNfz!%Q&LA7SMtUp zm+^P2fdaGJ((vRdJVC*1eqkTRMI80e1L6~R%jM}iB+CVoEXxYM%<)Lwrw6i}I?n&% z^G#0IbjRQ1fJ@q(Tt2UjV2Ad^S4r-j4EagkR zFps64o2#i;CQ`2x31hlM6a8mdH57MY>((ZU4cKR`I*NO+Pgz?iI0f!5{Vkhz6qD9P*a)^kyB~6?3UwW-NDa7AP&kBNXc=!8!-|x?t_fFx)Y0e&Z zUkvv==?-5BGsa9M?a?Bt|50x&+B?R~bD|9My{N!k5$iA~L=`3z8+f^}DT6ZTh%{>h zI=3HK#5IULh$*hmh&djV2a2OaxK%-liH6KXSihR}Kq-)>&xBGe+>xQAjts69j72Wv z?^XjvX18VFDNuNdg4x2t0gTHyo}mZCC+@Z@(05R_3#3?%6@A&0ku9Gd$Z?uD|BKHz zIhE;-zsUuKl;?m2Q;a`rE9SCok*!?a-vH%?Znbl1BXl&;?K)Y;kri@atwZd?szNxh zHX#nNyop6hj8og?bu3j8ny!I=5p^tVVSXD)u|wCj3+)>kqp-b=FdzDDA=4tvX5#*ypV+l=fktv9?iiV0T(OC>_9twTsdr zY-L>j4SoFsL&N==#`5JHv}vEzdIv`Ohc&6yjc`bS!Wt^OQ z$@GLLH@EcA%CVIt?Sg7*l+)Ti{N?|K`J2A1C%+cYP*E~}Tf%1-!V)gI&?n)o3o!|+ zE+ixrUAQCRs|!&H?~dS)q4*#ztxHYn0fdV^Sx>6npvfYtCPhrmD{uN#r=7gi?H`fM TWKN5?yA25`QTq4 literal 0 HcmV?d00001 diff --git a/c64tests/adcb b/c64tests/adcb new file mode 100644 index 0000000000000000000000000000000000000000..55169ef8d2d9cf2c7ebc88db0127f41c2f634e2d GIT binary patch literal 846 zcmZ{h%WD%+6vpqQq24dk5WA6BH{(L+fa0_uhT_6LQqy*@Qi_YNy3zz%{S(@S<0ABy zxDs8+5O6V}Q>+{DwNVkXNHR^^v`zX@aM5mL7P=Cw=O*I=!MnI~e&0R!oNw+?xOsxJ z`@Lt4zDK>rMT0TsC{{>2qek!b4-F15=aeYJc`qt(R)hyi;^gV=$)3b6}! z4Pqb5Yj{YBDJr|{VQCfgQ+!KoV6ldUO{B#ZJ=iw1kBF0rOs6O#*VTN!I9(yGAQvI7 z;7b*Lo0;S^0_~hOJ{DzidfH`u=UJ&YQ1z|y-KIe+n;EB z|15VMr8+#_-9V`U@3dP(X$Rg(cN3*uc%AMRN_+6&ZlkmhPnnjZA4m?5Pb4*s<;ym- z8xg7X4^Jj1G^wrs)+R=-q$ZnMy{S1-t$Nh7T5R)`X)@kMo@YY#-K9IO%~qDQnCfVh z)7(D%;s1vDtC3tNUruG|QaXQKLM;G8LQen#65a$bB;j2EBNB=MOi8E*Feu?|3w{|& zjndM()U+OhQS8fwGVLaH7KWM@J!)QgeO~q3$;*NFEs>oyR57MHY_>-grfQC=KLP6J BO7s8# literal 0 HcmV?d00001 diff --git a/c64tests/adcix b/c64tests/adcix new file mode 100644 index 0000000000000000000000000000000000000000..252ea07b033ee8cb302403e503bc419738c6d66c GIT binary patch literal 859 zcmZ{iJ!n%=6vyvNWBdMj4bes7$MBrY1BKYdP}^cZP3yyIDcU+!a7duV!NIW|j6>)R zaS|LP1RP$-Ep`$=2Nf|x%ELj#ByH2rq^;!*IyuyH(`N<2JKT4E|9kE^f9`pTY93YD zqqZ~Q_9t!O^I^uAr6fFho92Jm-Pb!f#;g;(1nVO&!eOP;#Uh)1f#Ewky0JTM*0OJD6L>V@ixt*|`exiwNDyt6%vFQmdF6FvhKKAVI~V#Sd~jh< zLcxWb627_6E8+b<{4o?AqNShKVnzVrLVMa1Z#Jnj@6=+vOUo*6Iy9%5ywvQUk>pgT R#>X^^O?7E}Tr+QIzX2(|SF!*A literal 0 HcmV?d00001 diff --git a/c64tests/adciy b/c64tests/adciy new file mode 100644 index 0000000000000000000000000000000000000000..faafc6969e30907ff6ae48e657fd6a41bf10df26 GIT binary patch literal 868 zcmZ{iOK1~87{_O~p`9<=5POlRm-QfIL1FF1(0Z_GlcsgCT8p5kDjpJO5Kmr&_TYL5 zov@w+53&S2Y{(RQ5?>dU(i~D244b;2dVZ-+#WxpP7}Yah#H; zgJ<=j=Y#qMoe<(krmPMtp(i6_qZ2oYbBa~LSz$GBmRTK~Io1G&uqM38w?t3{JQ7;l zEID9u-UN-hcRA{9U>>jsRGVjc8W9JQC&ehQL58pnpa8md(UL(bqNdG9GeqytVN!n% zE)|Ue74aVLK$*CK9LPlsk72M-%QHJx^nQtcW$TdNfW=Knvn{-}ZBTzgz2wSujxVT)O12sNug?k`YpHbS`}LRNSmG*Pt9~Sud6vB_47g3YPrXg zX3=;LdY+T*$E8QyCd(!DjN+)6)7@78@_)m^m7paT)>1hvN*8Vj_~L^u;JgoU0UvxA z6Y$B02?1pvZVCA2!>E9dhw#TxY7&>KD`_nZdU?o_Gra~*W=SQ@#+8EfKB0KM=%wlI V$8y=E!fq=L$&M@Rj$+IzzXAJUVS4}o literal 0 HcmV?d00001 diff --git a/c64tests/adcz b/c64tests/adcz new file mode 100644 index 0000000000000000000000000000000000000000..356737d1c996dbdecc1535a18f6647e08646c661 GIT binary patch literal 844 zcmZ{h%WD%+6vppNYrQAa5WA76n=5WIVB4`9Lvdjrsc9Xolp@kqL4`zG{1aNiaS?jU zxDdgG41q2t9UmF!MkV&WME9pZhxM(*r3l)lsdTu&Z5WI^!=l9Kde4MLL^CTrt zy3QNj&$^6@1|h^%ER~(pqK|s|`^JcShL^$p#655qcm>=Ez6dViKD?e?l0g~pm+(QS z{w+}ktH^7>?^1n=-=}e@D}j=v!h|lT4#3-{dB7i50P4xyP)R?sMyn3)b6A z#=N(KkN3|JRq$%y>tY$aI{0VB3V0jfpAxI!ZGzt>*1+2WAH+I%+u$qX^5J_^1H&UJ z#z?;G0J|NLTF<~}YJ^Fx`bQfXypkSmXtjpsMp^Zs;kDEhDC6k72~AI^&cosZ;gE$Q zi)t>zoW}L}FaI~pUyImkzLL&iQ6_&w!deK1gbN|`N_Zbazl4t=3`!`4FeYImggyx$ z4&lg9dI%4TYZ*NTMycCYvn?i0<{eswcWQa%UAq>vpqE|$M>03rq47b@C6k>RAJWXU F_8Y5@PI3SM literal 0 HcmV?d00001 diff --git a/c64tests/adczx b/c64tests/adczx new file mode 100644 index 0000000000000000000000000000000000000000..036d83e154472569c2de6d05a7380de826ecb000 GIT binary patch literal 853 zcmZ{iOK1~87{_O~q0X0Wh`p4km+dVJ6}COtP(0YDX-%2LRq=`-oW_EPqs7p2s1lC6T^9A>}Yf4;|`nU$!~LCN!; zF1_znkKU^jLTt&D)h;FQtbb^5>OQfrup-!BSPAT9Rt9^9Rlp`}9o{ZfMNkAh!UMhz z8g(AzXV=(+L{jWng>2E5P=F zSAiYEQWaieViemhl_6Jw@Z%hum{d1z72(aaN79}6b`@vz6*szaHMJR z2Mi34jK_vmm1K$*s7b%j`bQ>)W2(?L{%En$o6(7eR%>W>KwUd)Sk1S%(li=xLC-U? z^)&Z{TVy$>b||)rIgRb>U;b~Hx$RHOnbl|ti{hC{0VNM~0o@)92>9s1kbut~j0(tm zFeRYs!JvRoO*l6c9mAz|Dse3cdcH3$Ct3}h%zBkLizpfC!!^ZiMK4Frk4P%ntFV}2 NlVn6;_Y~u<@*Bo^R#^Z5 literal 0 HcmV?d00001 diff --git a/c64tests/alrb b/c64tests/alrb new file mode 100644 index 0000000000000000000000000000000000000000..75da7c89fd26d58236866ff4db4eaf9ec9694252 GIT binary patch literal 638 zcmZ{hKWG#|6vk(FFPHfyxtwVvYBP2T7+BL7(#V}&yj&IoOSG`@(rqBYUM(!#6o(Ve zM!`ak1B-#1Kq~QHqat3hvRH`NDHc|8jg@fgn{`DHoZ>ORZ{C~ty%~oGM>)H{bjn|O zxa6Pl8DrXsU3p1V?$&~^&h!a2=K77wxIR=2dPh0XOu2Zv@7c|m(~+TAf)Y?2Zd^3y zO~x0;yrrhVBQ*oVpr&CQs0xe+RmFja2R4%u4;Tgx=GPhjs3x#q#+^w-icE-4 zzCBBQy2tZ&b5uf{@vb1w_;(j0FKBSGEEna*dWAi5M_hi*Mn3~~i_}_Z$6&FDpXgHj zSbvG1X&yh1qTt$R8uy=NN=O9K1v7zU3h7BxMly}`n3+UUK{{(Vk{P5hKvG5OwCz*X z8><^(LrT^k_qe)TaJqoHg_i}KxA3}vH4DQ6u2}d~ zz&Q)Ae#0L_%@!@$6462x{&1!1ZkGe4afiYzxVOGcQMmGVv>8g(^mOG z&MH`h5D{|?woMavD=UjtB98ME#2cQ5*ykCDO>RLDp2d@PPKOlqt3$kJN)_|qCGcId zG2~ZFnMPv>qH-BB13n9BfzLr^0V{cb2(~bKncu%i+G7SXZ0u zWze^9k`VJFpF(>YcV^)5f-)$Aox!9!cw<6|c*jOQlWK|LG(4&}jc-|maeLVmr~IB7 zjww?G>H}Gdt)5Sihel|!FT?PMO>U~zu3V^GB7(ToeJl>TkHon9RKR`aIQF&A>URDa zG7rCmAStKdml2$h)9_~z9F;Th=MYTD0{nRdkVW_l2x9B{W~;TO)n<(`(oJ>1UPE`4 zrL|g<=`R1LYc|f+*G64w)QJRpKODIZ;$duEna7p%rqQ|G-tzRRj$Ug9t8b_!PmShL^wKw@`gq4R)P6 u$-}S)WzX0cv(?FbhdSJ&-PrRs4abzr*Wi1xwY5WePyNF!kMdn=3;Gk)7x(u7 literal 0 HcmV?d00001 diff --git a/c64tests/anda b/c64tests/anda new file mode 100644 index 0000000000000000000000000000000000000000..5ebc4cde60704c14f8d121a258247285e05a4a56 GIT binary patch literal 665 zcmZ{hKWI}y9LFy&THf~{XcuYzU)rWks)c74rCVxK6MeK0ifE@U!Yj1sY%6r|IRr1n zK?@EN0uHa_3Yo-zi;9@x$-_a!O>l6MEKUmP@8VNI@P@nZ=X-yC-@A*L_6d{i&7HF5 zAI@24EXJ4@aSd^u$L^Mv7fZ}b$~e3?G6AnElkhfW3LcYbJZ)sOh=ZmS^;yU~ssnk& zR0$fvNKZi}A*Z2IkOinTU=?rft10wYaHI}H%i|<=_Zvm14CD+BGI&4>D|E;~5}gzZ zvssuQr9dNxJL7QV1eKnIIEgVTyD>@$nu%eMG1^0%K$8j+ zqi>2YgZ>Yj?UJi6c$s<3sMSTFRj$dLa=tc1<{4}N=vKdn$TYMk5{XnudEKe z{Lu4a;{9NlwHNJ2)+u?ELT?(a+nrmg#kw7_#yvr6hTYr0{9oB#=1rshu2QE>PWzIE z4e1cS#EPj h?(lZx#SPvcp)6m6?`P{<+g#qKZ`<18a*x~h_#w(!>Z~3H<=hM?y!lSkq-|nT6AdkdA}R?9nky4#q%+WA$XVzJYksxFD9V1lUt+V2f|V!Os%gB-h;gI#aC5t1r~i>T`9X`bwetx>70K`brP< zPt$R@X?Q`MfSZALRwv=k!aJp>;m*OE)G4_0@StblX5sl(&Ew|si_7J_5Uk}iAr4@? z?BYtkEQ}ZboFlcKrk2Dkb+*=yj`kzkN?P*?wEx=1S0-QFri{ z|0`QdykWI^g&J+Dw5}TXGzP~&Xbd?6Z^y7;;Qbhi2D)RoVc^RcE*g0E3w{SGT&5=O w@JjF)oNlUNtxc4uvfSnsxx-t&H(Pu#L0P_gKa#bLZ7wx^+r|!;9bRhlL&G@wWdHyG literal 0 HcmV?d00001 diff --git a/c64tests/anday b/c64tests/anday new file mode 100644 index 0000000000000000000000000000000000000000..448381aa06e7857b700edf0aef3b6799cfc5e66c GIT binary patch literal 688 zcmZ{hPiPZC7{w92+m>V{oc%c^JXTbnAU4U&i6A%LE)IlX%%k`N9BAk*7$cA@it? zm7 z0_U=6=%3{@8W}vy!jd^UeFmb0!86?p4|a8`?uGlidOv|FO0qUdxtgcP@usK@aSTmP z9K#@qVc4wdbVqSPEMJMRr`k{#-$uiqCfg*J?p?jc9A%$??wqh+Ij~<_mU-(d zJ{V&jR{v literal 0 HcmV?d00001 diff --git a/c64tests/andb b/c64tests/andb new file mode 100644 index 0000000000000000000000000000000000000000..1f4db4258144166d934b0a522120f497c44eb663 GIT binary patch literal 666 zcmZ{hO=uHA7=|aCQuZAP+KbfuPWqE%+X`zhN^gx#O>}7?6c5!yPm)55c(#EaTo1ts z@nXe;gn+`9Orc)Hzl(~P!^+}8#GBy3ljPz_Fn$wP1;IHC@AJ-l^Sv_@F`Z*3+nb-W z7w*m5r)p-jTtk|}shrtzei(IO67QZx(59OMJD zGLV-{l|W?xMmi6bge*X%AT6jgU|aQll}C>SBMlf@9wo86-<*NUK+fVIgS)h`OotpK z(M_RXG4q4WqB((^lc>olYCa7yhjD7WIYt>;@nMv4Dj`mw#fcO6nnpkBluWvgI3ZTg z$Jl+NZ;H=@{&$D%l1o=yXC8C8``8hh1@zdxG{1r#FB3zp}H!TSn(?xj{v> z&IJwcL$EcR456suMF>k8UWHK6&yeB zyj8RqV_w8H#4R4XH@i4ryTrVcG6CXZ0s44g}2qLTcS?4MXOUo4@SSQhj*oF3H7gj3E zLVMO9Z@G51x-#?%L(hwekAq>>UbG)srQ}fxy>7JcbZ@IR+v$pH+!M5B*nRlR|COCZ z-ZDCS)jDl*Iu|v33c=El3t>*fZV2-l-i1)p&w-M@`(|PW%Y0 rUb$tgjo5UvY;Z?P-if@q%ljjg<$Lg>RNrWD`Gmf0Lvs0)+mHDHpTYM$ literal 0 HcmV?d00001 diff --git a/c64tests/andiy b/c64tests/andiy new file mode 100644 index 0000000000000000000000000000000000000000..770f86f64c3f2026ba5a8bc9181efda963143089 GIT binary patch literal 691 zcmZ{hKWI}y9LFy&rM&M!&@NhaIX43eug(ATPyW|L9}R{g=+s3>p~b~j?BH_*pZ zSu0^N#@v8ohz1Yc$t@QvmzaA(M&RzrDBPZm!CjYexJ)MSteMmz0-DlZ%IUgrlp-Sq znL%YFub3)IBN*u{R17i)6^G12B>*dYeMe={XWm2uhL(p(Z0H;r)Ik5N0~-*4!7q~mkShP5u${Hu4f!5D(xA2YCn!?O0hOY*;>cP5vQpHaTG01 z9L2W;hC%y+N%s_IMD=`#Jv4@<_%a&)u-PWL)mkpkT;_1+sXO63agRFB>2fdXb^GdP zdZT}uN@0+J7glKuvhYr-ISg{}j;VPJ^6;kA0tN+mP>UE8;RROp`{qka)mlji)`_$s z-a&i0rIk`mXfO50t5wdHSH@mu?71QFel(8S4-NyX6g)_o*NyhA?oHKZy{@>%T|sNc z-P^zXU)fpaEu*tvZqTNB=c0xWK3E!Ne8_8fy>OB$1y~m>OJrkz)+;yEBpVedh(_{fb385uN5m*TG zaty&F!qc*dU<%=|97j+_2sweEf-teBA9Aj`u+*qBM!M+^*du6fc44{NVA?DE@f!8Z zwdH|V8h9eb-uDMtd&wxVrjjRB=nbQD+rK3{2Ww#^;N_o#E9{sc^u?#BQC literal 0 HcmV?d00001 diff --git a/c64tests/andzx b/c64tests/andzx new file mode 100644 index 0000000000000000000000000000000000000000..5a6de9e30017102f634d1366fd4dd882720f0bc0 GIT binary patch literal 677 zcmZ{hO=uHA9K|P_QuYl5?M13y#zQ_fAMGY>TInsdsfjKvgd$Qr^du>?h^OzNx1K23hus4!(EdZxJ(*&+0KR{37Vn_m4xld zBI?KThOScd1tVR8N<&USWgsV^48Sz*?y3@cEEsA*3*~7N8@uf?R2Fgyds#f9g*E!g zUK(BonX;#UmU*-bxIc!b9H-hQc08Gbn8wjF{V{rxZH=EY2uXHQ_G?jy2 zL|~{q{1So-ssMii!C5s1e-gon8i!v-0A<3TLJ(UCZ*;agzu2e>!JK3l;sBvnnO~|l zMCj%Ic#Zny+S0%)4m>v@J{}LE_Tv563I&f-<~6Om>D^OZw(p6X+!eHDFnsvS|CP=H z?`Y0ptwo!f&b1IeMPP~2na4@f;|<#E-GRUD~ksaZ-NI;AqPEqXy3+FL2wRl-tW)My#IR>)9s@=yE9iZ z=O50QCr!qf7jrdnl_zdjmaHoCPRJCzw^G2{kp{dqnTE$?2G6#$VUhx=iee732>Do7 z0vMDHlu0W=8IWbDG~_f?1~3cPdL;xJG};bpXv!I=ETjpQ49tV-NYKwe`QFRoE}gE? zTRj8aH1ao@{z*8(Hnghp`43kCW#$t$m|=UA5UxS2VaM=*%d*`^*1LJ4?K!b>7#u z=#ta95W>d@%n)WHsD|(=f-@n!iC{5=egv07_#DCM5MKX+--c@EXo<_*DI9{?pKoca oV>VTm8{Cnbyc2ubziCY;PySf57AicumAu6 literal 0 HcmV?d00001 diff --git a/c64tests/arrb b/c64tests/arrb new file mode 100644 index 0000000000000000000000000000000000000000..af871cab6c4239e678e60b83b0530329a98850dd GIT binary patch literal 795 zcmaKp&1+LZ6vZd6HM}z=)GpLiH{(hJEyTJ|ii@V2n$~A4p}26BWuh(q33g#z1SiCm zVA3Rg{hTyY=t}(BsEAoa9xg=0jUbqnJOo$T);sa3Am}V+=67c9y=U%(Z0DfO?v4z_ zN2??8Q*p+a3gs>Fg-7lr(&=%gj>t093t55MmWxnxvI@my4G)WTvnhj)G|fwp>yXEw z?4cUGgsx#qS1?@0Rk;Bo#A9c+HsD#XXxVRJp`kYr8}maQvu1p|mGOHE7;6+a;aDal zNFd$+=eX#aG~G~5+y2(R(gBmwmmQndXf7P<$ABakbn3S*mAI)G&1FcUT6z&uL02Ig z&~?Zrw(7V?aRnt# zT*2oW{2nK1Q$NM9n7I&PtCnwzk9+<%hb@qrm`+lUS)S(~sNVd2btC^sA^$j=b*_J) zzxZqDCA8P!#poezYUNSAjJAR|s8`T#z#Gu3Xm7%UUPHSHFO)I=IG&uCNhgJ1Zn+L| zk{c~CF`G;aqb>c`(v#;?vt4bytEq^1z1Owc>hVJvGTuX;=dAjz=1pB^+fDJFD?xX< z)5|~n&#gPnOP2d8RiL1(d)dI70OAHt1Tb#kX#nR8JP%;fKr4VN2Hpj5*1)r$@XJtY ziiY^av-JP*)@aGfg&nFacX(FrayRtkJNLunrQ>})U6|kDGTNuu{4SS+ea@l2AIo4m A=l}o! literal 0 HcmV?d00001 diff --git a/c64tests/asla b/c64tests/asla new file mode 100644 index 0000000000000000000000000000000000000000..932a6d47ad210a9b9426a723ed7ef8e8d4f942c3 GIT binary patch literal 637 zcmZ{gKZp}S6vk(F^Jl)f+uYd*Vl#FI6xM5$D}+RICc1bKgNTKfa)mprJuR+qEy7KR zg$NcB7Az)Y4z3daH7a6?mBm8DO2NYF*v3k7>r7k`1Ya?HzmIwIzBd;24^r}A>6o|t zXvsV25kjOD+PuTud$mh`jmX1dO66OzPvx%2s9YBWk_ZdW`nC~Ms-{#p5I_Y``&2Nf zjEXrZ0x=I|0bcd?NC6X)lzXs^WP?HvTO-}NsD(A^yHGYn1v@q#>XxQ{XeXm%f}<4& z^phx{U&M9^fhg3VHYQ67)_(Ph%rcF-T3I-IeU6gLACZ>96Aq`So?0A(H7u(69gV!N= zVmb*95&~LI%qesd{}vT7!wnY)5jVlXDP$1`hk8!DDhQt8<9%MvcfR+0hH1x5a&Pv8 zHTPiFI&Bd`gyDwRH5%D2EZc<@BGNnx@s^K4?C}`H8jnK|p1`wuQi~{*D^*Q_XK^SC zIR?%kW8gW+IQSG~0yGW~FW$5hk&aBs)##n6w!KhRHL5VlLE`UgA7 zmM%uf!_dHFU-kz-Y_g?Xd%3bm1aYbRRE)S!#CP|(Fx?l9V_*NQcJR-UDR^1W^1h zIA5*~z3k8v5%zw67_}Q77^^CHSY=)dHE(xr$tKzBuqqWy-5Hj5fBC<%wMZMGRtFCYQ2By7>P0F{aeV6_O zDhw*4Vh)Nx%tKj#SG_w_3}cd%yReO9{X!QzLtV6}g*EKCP&Pybdo~{Hl7>Fn%jk&U zB%@#S!@VMQO9(_+x2E6=IGoa?cxWMY{2JAX`Dwm>#U)Sel=5#``qL*n+SOBR5J^H7 zK9_~?nLG$zN*cZj0{`ZLp7x)m9K=9URRzQh$q7|NJcs0%Dj}XnazvF8yGWoY;tCS0 zV}7buUtMq2IVaI%K>0%$Z)LSzZ*k)}1LR(-d8yH!d6;?9<)5-y)UlIV9Ua`!nYZl0 z{n0%&Ap0YJo=L9n%(f4I`M)w+V|_dN*y!q_Ai8GYa}J(?Gda`@yvgCBfpFxC3?w`vjT2UqWsLZC7PxC)wh~3fVDpmwi3Re*|P(xq6RlM39I^ zPlO#k7GI)g!i}DXVX*mGE&NYO2dRgwDa%MJ$c{-DX%*QK38Xb-4M~yKkwMNNZ6GsN z^k=m@^NYO>V26c)f-5-KDALO+8Uz?+>O~CsuB(sN|Lky>5=~ zB)8>=>?N#41ygsX$J@XBUm0JbLoF~8xuJQ(3Dji1N<+RzW8=kjnma1Xx9t0w{>CchH>n^S LYn0!j!4~}q=40Kq literal 0 HcmV?d00001 diff --git a/c64tests/aslzx b/c64tests/aslzx new file mode 100644 index 0000000000000000000000000000000000000000..594fb681ee40b0725a17474c7e93c67ddfe372a5 GIT binary patch literal 649 zcmZ{g&1(}u7{+HeweB;?=A&)WroD_e0}5*|N^hwqrggCpt4L2dt~SMgz(Wsih2VsE z5_d~Bs$)LsU_`9wXi!-omnM}LAwZ<24BQ}8V^-VO+B=qM3BPC zLSTL5S+sMwHv^B)s?l@k2Rs9|gi+r*OkxB?$3`~B3Abvg^z1a-xMY*QIkwoBqwx=y z>?&7nR3?J>)PE|b{3qg@|6Ex93(s?JeO8>0+?PdOW^|gz&&54(vc*17yk0w!v ziLud8!4oQT)9mgAcVw3w1Z%s~I-XWp XzDD2AwRW~C-=l);G%3GJU7!90DDLBO literal 0 HcmV?d00001 diff --git a/c64tests/asoa b/c64tests/asoa new file mode 100644 index 0000000000000000000000000000000000000000..299da9d8ee37810f77c6dc51615ba5af6d062c99 GIT binary patch literal 635 zcmZ{gKWG#|6vk(E@6UUaEYU^~o3ZmiVNIh1n>)SaqKgM-5D^nnu8?49_%?$()eMG$<&@clmKW4<>Oydyv!&7X7^ zp3J*vTtbMXfyGMzA}E!30js zQH0OJ!j6si3+Rg??srPa9Xv=OE*@l%*j^2EU4Du;FFE9?l>q;qC8pRoq{a^mC3@@{;6@F;6b;u8|8u*lhYv6PaH3P46xM1LI4$B6H zIb1jJC5Q6{-u#9?g&G(2@FnI~=FlB3bgi2uProcynJ?B@NMGGxNlAD45&t~f-dttk P4wGbajfuO=yUl(9y4dS8 literal 0 HcmV?d00001 diff --git a/c64tests/asoax b/c64tests/asoax new file mode 100644 index 0000000000000000000000000000000000000000..205e6c1aec4c4e9cc61d818b3f5d215abf327cea GIT binary patch literal 658 zcmZ{gKWI}?6vpp+vGsiyf|~zn+T^BnFre`4qI63&G1Z5Gwup6*jw!S_*lrFTd=9}I z<0Lpp2xhn;x6n!ax2T92UU)c&xCstUAxkHRdT)Fx2;SlF{XXvDeCHUJld#C6`P25o zlX?4`O$ZT&YqAX*epp4ncSVFB(ZLB2cbWH3iDE2uHzl zkTGxu83)fpCIGu|rz>;l6aQ!(rk1pMq>kOLYCNul(QV8^Cc)>hm&9Y$Qjt;Y#n6l6 zR4xVUGf$&2h5H%Q__P{519lR_ryR9PK+ z*|8_W?Bn4$YdZP53cYEz?)C1<7TNEy6)KqeGcF(g@_%LfDs7tWL8Y#mYVB(p zJ_TTFI2*vChBpCR)bK8VB@O)mZfN)tzy%F&f5GoSmCNd}o3vIq2D`t|G&d$4HJNYI i8sDL9RiTicXBpn`1eP~N0YgZ=~|wdf@P literal 0 HcmV?d00001 diff --git a/c64tests/asoay b/c64tests/asoay new file mode 100644 index 0000000000000000000000000000000000000000..b6657bbd0b949019296fcf311226c2957e3c958b GIT binary patch literal 658 zcmZ{gKWI}?6vpp+vGsiyf|~zn+T^BnFre`4qI63&G0}&Cw1{<(j<3+-V7obV@Hqr; zjFaFXA(-KY+(IYu-=ZRBc;Vq7;wCsag)E&M>V5I4Ab5wv_xreq^PQs^R>B~U7EhZ? zPZrH{CLu&W^2iUaG84 zyzImiVfOKGl64RoYwId`NQK_i+xPl+Wt;5x*$Nd*{h5>xfBC<%bCtIA&al!@O?Ky+ z51#@seK;GyvJYG>3CXY`R*N@Z)|N-{(uUywL^J}T21;BEqv%K literal 0 HcmV?d00001 diff --git a/c64tests/asoix b/c64tests/asoix new file mode 100644 index 0000000000000000000000000000000000000000..9ff13a131ce029abaf04806d9d20619dd5d3e0b4 GIT binary patch literal 652 zcmZ|LziSg=90u_BF1FtDlFP5QY0|Xvx*1S7yC~gSO-=M{AQq`k1(yg-^A9+5@I-@e zh?C$TA?WaidkdY!UyF*E;mYA4;wCsa#Vk$^^?l>1Aovc)_w#UH?s?C!+^j|JFCKT6 z9xghk972dNJd<6c_Pymx)yf7D1s;cZ%Wa4~o`BfmNeIGIc-BtqAr75pJYT?*QYiz< zbFgjjJY)iV4l)T|fJ^~S@kU?fF(BdL7EC?T&Y>1|`f4$y2BY7ehfISnU^k5iYNae~ z>?YtRaV+LrANds8)3`f>I?t*GvtUOs^sW5_hH-=w!xTm_cg<4$*$Gy?V3Wt@$YNg( zMn7D#qf&jRD?|{FdQZiK_e6a2o(s!+QLnqr&+7939GO9oLs*nk2=WMz%4r012=j6V zK>=Y}W)aLIgq%gNfY8{~KW?S8TCJ5BBfWSR>=AUfyt-bhF`Z@pWVOn<^7=T-jWc1h z_Xp#ygV@N}RLx_m^p@GZ<=>QDvgfmlR510<`0?(q|2y{9XvggBms@J7-n*>vA%dfE zGQx_+s|aT`-bAQq3?f|B_!Qxc#_M1BU8sCs9kxO1#Uz};QpdbL>8daDZCd9|+B04@ b=x9=P`5Jyd-D+%8euoOuXj0yy?rr)L@#^I^ literal 0 HcmV?d00001 diff --git a/c64tests/asoiy b/c64tests/asoiy new file mode 100644 index 0000000000000000000000000000000000000000..389b578e2c1e23bf92ab718ac5e02ef56610a4d2 GIT binary patch literal 661 zcmZ{gJ!n%=7>3WisWtC`pd$J2&q?~D0flQ9rCX}0iC!9rrO-}wyF!Ya?cmVC>kvF4 z)j@EO5O6r*oUR^fJ6=Fua;(FRN{X=|u~&8})Zu7uHTPC;hCr?H*EBh^xt z32Z0frEvPB7yZab&>Y3RF*tl&C17BuuMA@9ql`bzeG;ee<)r!apUm@N)P#73UXAHKx7nAFo!q zTwWY_xq&BQ?ET>&YA@0^R#otb%3L?wcfC8ZO?EuCL31-}E8uc%_zsZ%%xt2f&+Zw%XN lGGC_--=H1i)h*f|R$0CV-!3%P)+xVF1zFpm`~kJM=ucV~?HT|8 literal 0 HcmV?d00001 diff --git a/c64tests/asoz b/c64tests/asoz new file mode 100644 index 0000000000000000000000000000000000000000..3e06cc8ac0ee0c5c75fa108f35660a08b22e5c76 GIT binary patch literal 638 zcmZ{gKWG#|6vk(F@6UX5*<5S{u^BrL6xK9K8p*|rm$-OvMv*jLx)l=aHAM>7;>a9l zqhKM&LW((d0;$A*jf!~1%3>j67qGAj*H{UA&YUZP;46mj_c4$6y=PJXI3{_+V)UYFd}KW3)@K6FLbdp)O~YWSi{~dlmk)4zJn*arKu)#pCGnyx*XFl zqKIAzyJZA|>Z!n9EDGRrILc^RJhCx%{5sW%`B~n&;*vdkO!>FT_@_^Hv}?AwNhAqb z_*@plXYw$7DQWmB2>d&Tdfk6Y6_7BbHC04XL3&D+kjx-Gp~^^Hq{kFRGK&-nNUBJ! zjyYAmvD|7mI44myp!^Yxx4694XmjHg2FShk%H`(T)MHamy8P2*nswxit&UFa=+K+? z;6Z#}4ah;vFEYvXpXu}AFaK9YS6SbVJ~q3$DTr^aY4I}N3@EImfKH zo&*mXB0WslDfA@%x~PabY*{>rcoRGbLdeCFhdLA23WD!2d_Q02@xJdFcD-Pe2a9Li zrALeId6y6(4BuoosdK-)+E~9q#7S;JyyG^+0SCkurx1iE@w}7L!h&+81wWuX2ge4_ zLjrsbl7bf?lYm>gJ&<_}No2KQYDv3OZR`wGUq%UI&?!Quz~`}_!b8|1ROrGM;4+Jqa?X1EiY_qRNhy zMOZ`xIg4-}k+Gp~wp^(;nia-K-|B%qhW5(UwMvs|&pGy*E0=3)6E8RMgu^}@O`;AH zV`D=FPpHgWX76sWD|_T1U^Ob3`ZIan|KajNBQ^;bS<|TLF1d|&aWQZP2^MwL&Ki9> zVqLTdA;R!Xc9|BIiZj=XM4aX=i1)k=vC1QeS>Aylyo=`xJw3FctZaeDkZRt=a0H$} zs-8l2!1o}#$Xk3LvIl;El^&ibQ&y{2A~ZS}d>jK`_y!g>@n{P!-&SYufPF{OMu;Rr z(nXqcY^YRhm`z{*#?jSfoXw>v~jM)=YRhu#5x9VW`^4b+A zrtK=zF8<@Hl`G}xzDxQ}6xgT3e%59#HEJq(PKBN|>kk_bWSy)w*jXx=TGMYI{_=lE z{~BF1{g35&waN8wX!x9grQt#bV;Wv(P}1-=gNlY`1~)Z)&0t)^nT{Q0uIO=9zqAs_oZ@e0(>43@-hd(aO&y^^@O$C{=DX&rI7X1afApNKS literal 0 HcmV?d00001 diff --git a/c64tests/axsix b/c64tests/axsix new file mode 100644 index 0000000000000000000000000000000000000000..f285bc9542231b5788d0b1f38a5bb81c6d0747e8 GIT binary patch literal 620 zcmZ{g&ubGw7=~vzQr?UN@gj(q@n*rm+KZ*Pq^2giCJ>7hPd#p>#eYGt>!CQMo&*mP z7Ca2>6nYYWT~x#zwhSIbya^sWB%4jzv}w~?XX0u>a1I~e^Y9JdJ7d8;1M+y{qBHe$ z!ny1aLWJepY?|gC73OYM=7>1QTM!?38)AdU5R1G6L3o0ft6kHyVQkM21$-%6;5|s~ z_K=Uk2avk%Lw3N2kO{I5KY;9lA7Z_WC)$+t^m>f2gA4aVeBoPI-NwT{Jien>?1KG7 z+=ebTxd+mAd z-EaDF{~XyvG=LhHTZs0c&dY5?`%q_PAJGu%wA?{-0F{-yhz_BwdGj&F(oC&hVvGc> z2H0}exWdeAsm_e+{dM)q)$;7f4MtAn*r%gW)Mh5J=5_Fl&b(+h9)!!XK{i5`r-JF3 zQTcex|80XRU9*GD@`}FX1-A@*PQfv7DTShew<%mP@IHl#fo2M~4SY>u+Q7Tt@F!6D znm%ljdgG_EPIGF_UKn%rW?rQpuhGDIbAu*hI?E5$pIlk0QocY1S*lTfhq@m91upCc AT>t<8 literal 0 HcmV?d00001 diff --git a/c64tests/axsz b/c64tests/axsz new file mode 100644 index 0000000000000000000000000000000000000000..c1304fce199398d8a09ef91186ecf6581a59dc8b GIT binary patch literal 613 zcmZ{gy=xRf7>8%~F#K-d2sT2n8Jl3hz$T3n(j*13*7VxW zU;gjtU!!ZL|G{2Sn_PcR!>1H14I?Q`YIu{v6%FrFn9@*5VP3T;X<#_Ix2`c#%i)V;K_RHXbi6=cb#{0?<)(Vr*(0QLX? literal 0 HcmV?d00001 diff --git a/c64tests/axszy b/c64tests/axszy new file mode 100644 index 0000000000000000000000000000000000000000..f886f0d24c8a6ee579bb3572dceb8768f41e97f9 GIT binary patch literal 622 zcmZ{gy=xRf7>8%~B>Z;Z5F0^k#?FAjHH~uJ#az78#Y@g0nkwb07yK72+z7!5u?kqo zv5;b5Cy+|~NE1c8V#AU`#7?lV+S~ie$6butPLrl?l0CkUFjxEkOq?_zlu&-dW+eRcQ&)&kxEBUaqR z_A|r{M2Hi_EhHJI1Qn5uvGT1fSu+!`AA_XtkSEHj*m)v|N4+=Vl=oWfc<%(f_pa+a z{;r<)U&#)_9->j%Mc7AlLGB_vM08H>Av{8KM(!g#Mr6qYgabszy#AVr!c@6ZV2t>2 z4Q$cUE z*gpT`6G#6xT`~Rb;*#3r`gb*aNx{}|C4~tMTPaLx_?SXTLp_B#4c}6@uHnOP_!Fpj zQx(fmcl5Mn*K;f8gAqsF%%`c#XQ*#%mT5Agviyv?*OnHhDSt!-S(u@`N}Y%F7cSEW ARsaA1 literal 0 HcmV?d00001 diff --git a/c64tests/bccr b/c64tests/bccr new file mode 100644 index 0000000000000000000000000000000000000000..776e8876640d73cc416e3efef3cccd84a186d91a GIT binary patch literal 750 zcmZ{gOK1~87{_OmQ1%-LHkVi_!U!HLR9Jhl^wuQXrgcrqCf4Gq$1OBz()YWi7?Hx1 zcoKw2T<|cEsq`dP1@T35SlxOM5ibP~MWrl)co3{J+o&Ko@D20(-v3clBdVgC9qn4z z?GEj{h7e*(DL`J}@QqkJZX(u7^T1xxF<@J?0Bn>Nfgw5$+Zz+|A%ZrI2AN8a2W_-o zS!=GWMfTnAJP&jd=sfT-pbNkYKo@}*fi3|b2hiv;Y*tm?3KbL)xfLa{IRP6ha7#p! zqGq!IwIZA`P{g7$V9{w|Q^ID2y;CjvLEYY%gBD&@Yj@OFE09$<$b*<&|LHdSO2k59n}e$A1&txKvm6!G zF2&20J?=<;%=>0Izs_dCcA2rm62K0DVPxu{;lOSTT!HoDeRKlePEL6JB%+f;! zrAL-!jO~f<{pavWaOS~n<5S=)fP0EhgR=ecCBp4%n}f>!QfA2PM31fF|Kw17Z@MHXtG4c?0?+)EjU`!utlq zB|JNV-wP%C#Ub0+YC8s6y{jA;X)?rQ>SBxTVq1Cq8hcG*mwoqJ=X%b?^fP8Cw~Of) IY<$AM069M$XaE2J literal 0 HcmV?d00001 diff --git a/c64tests/bcsr b/c64tests/bcsr new file mode 100644 index 0000000000000000000000000000000000000000..074baf2226532006383743c82c5685e56682652b GIT binary patch literal 750 zcmZ{gOK1~87{_OmQuZ4NCYM?%!U!HLR9JgadTWwx)4Dcg8?|`qaSLr8eK&nlT#>?* zdJ=@ly5M0TQ|(Et3gV0A5Z!tZ5if#=qEZ$?JP6jA?W!O+@GblMfAc;5qo_ucimtb} zX&pD)wbL3xh$(i2JjbzX$<%;}SPRVqdqE4pHfa&q2rU6q=ooCRjRQk6>C&bsQ|aNT zi&iTu@ybeK*Za=%Kqr8fffsWNsJsO#C?W1vl*Gn3tS!L} zky+L(L4yK zA+O;v@>`^li)Oa3oAjPP*H1drX;U8#3Zc4muh~LFAIDlz28|WBWd9u=C;SUA*&S8@ literal 0 HcmV?d00001 diff --git a/c64tests/beqr b/c64tests/beqr new file mode 100644 index 0000000000000000000000000000000000000000..b77ef957e414707433dd299cad98426daf8ae6a4 GIT binary patch literal 751 zcmZ{gO=uHA6vth@sOWBQ zPq6QPZ}5B&A;grti)>@>osf1pj#w8pfo;<%U>h_IY?5Yxx#%=(7H5DVnY3uY%~X2K zZJ|PW-B(`s@7dqE33L`{7WfpujhtEPI3wAf3gT^x0r}#WHR=_^a7of2Uwx2ITV-0NJOVG%Ht&Gd* zA#E@g*9bwDSpjkcORaw}sl|!ZX8&mM;h{*frDakai{g!`OE+PwW7G>vR+3DqR6nWN_f+TpoDX62uXO+hOmTJZ5WnNZ^Ly7 z@7gdR;pHLxUMMmm4%xy+_fZJe`%12f4qZ&9yV#&jY$?xd>~x4-_UvyL3aMR8KVybc LO-#RF{S*ELvSc2H literal 0 HcmV?d00001 diff --git a/c64tests/bita b/c64tests/bita new file mode 100644 index 0000000000000000000000000000000000000000..2800315e233a8fdc9a12368c67b8cd774a265fd3 GIT binary patch literal 656 zcmZ{hO=uHA7=|aCQuZAPX7ktlwVik}(8Ah_Qt;4dYGRibL+~ITdUFdcVtW@4u7}VG z@g#VV5D=V_DfA@%fvAW%tSlZxya^sWNe+7QP-nKQg5VrJ=6UD+_}-a`nNH3mcNgaD z#rq5PDVq=?VxGaS(!`xwv%N$_i649mU77brn3WGH)9F+rwM3PY#CcA{9(|!t(Yn|93lBr9ETtuF+9V?%FjU?9pP+*qC(GWWG&ZzC#DG d=hx|YQf2uX{5aj&+NPYVU)$QDyi1*3`U@Y9;<*3- literal 0 HcmV?d00001 diff --git a/c64tests/bitz b/c64tests/bitz new file mode 100644 index 0000000000000000000000000000000000000000..439ca8216947e799608bd33cdb38eeaa0999b4c2 GIT binary patch literal 659 zcmZ{hKWG#|7{%xILfAKONZ9*-Np3DV!2<(p8YN(n(~Eby7&s1#G^X50f{jThShyC4 z6EBruA;&?Ai93N*;y(}-@rsqjLc~t6u##=W!XnO`tAgNH4D);QX6Ah}3De1%SuJZ*^9PC~*toHBUnv@C?K{&q5HM!{hC|o>)*z(t_vnGGrQ@ zL1w@!kXi5<$Q)qTPVcFeISb)f7sj4)*Piq1W*3CdLgvA%*w5ph@-~%kKLbCDV^!b$ zz>C-};r1k4KBX?4#;(r`U`LTxXRJ+d3%%kfLtgDuoJNl-PUCA1QPOFcst-2DmM^5p zt`V8+^I`PEAvct&dRrudc+`6&#=M8(yZ1zx-c#3gu6|N)@K4DCf-=IIEFxeCE3$;3 zg0LVb5zHW*kW&a|5kgKQs3J_P>i4TRmX_NM#>l|xgFS%O7MD7WHq%<+kJfITYj#Fj zd8COHdv`dBI!s21RTVs`GOru`TmDViCkH<3P{EXEG`#uC|D6sl(w;GR+w7`M?%#>#Q@3^m_HdzRtc^SBX1+;X hzC{O#XV+*nuCjayzn$uCY*Ma&ZDWh_9qQbnKLKB{=DPp@ literal 0 HcmV?d00001 diff --git a/c64tests/bmir b/c64tests/bmir new file mode 100644 index 0000000000000000000000000000000000000000..5ed96e48cb568d1c2169c160814d2fe1789e0b38 GIT binary patch literal 751 zcmZ{gO=uHA6vtz(Cw-@fymTR_u5Gr*^St^l6~x(a*-=o;`@0F7p0qoVRtP)0s+x2*U!=Af8^ zdmIjE>jw=t%& ztmYTxKSl)_&n5Cz&XPgpuP&uNxlg6HE?`<3F=vJfG zrw8<*Xj~@**;WO}F)X!#p`;!sQcM5Q;^E;?vZZBO8uOCIVarC%-BiYfDYx)5>8jkS z-sBauStXA!BjQf$v-_9-`)fyV$z{I|6-1F~UzPBt4Vr`tZ3sws(T1ReS8WJOsI}p` zgm-Nil<@KhelHXn5r=GJv*$Qywf>T8qQelA=^i#|1KY|o2RA#!F8j{6ONG=Prk^oG MsRpKBu<;510-#17%K!iX literal 0 HcmV?d00001 diff --git a/c64tests/bner b/c64tests/bner new file mode 100644 index 0000000000000000000000000000000000000000..d14bfdeb64120c17fe43c83b31754986b705d552 GIT binary patch literal 751 zcmZ{gO=uHA6vtr5II1P9(QzxVwgMb&*Oy4&C9 zAGqJ|zvxE@F(vOHJJ@|E5Yb|Y^-vSo4xItENmIb4X&M-!v#?d1lMfNJsL#n%dctX; zLV3ee-tg|*-?<4i12hYK2Iva#6wp=RX`pMsX94_l9cmSopMo;-irli|t<6C(2lqrY zBx-6YsHWkZj=Tn41cNRJn-{hu?5%3h_v%)08M=8ztv*nvTqR|<&jgQhyE|!ufI6~W z&rz#K3b_`GMn=f!m9cR$7!1a=c-)Q1S0FdwzyvY7{?qofm57DJHU|~8<D4drqE33KHivv_`+ zLH?;>=;jCUzyBPbfkqbWUOo?v6|m3n1!$~-eUdLiV-0LCUxLOu*ua;ekpo+ql+y#+ za5Sb7f-JKFk{5| zU`WEtBlx{gXjB}sjg8*p;I9vq98+Dom`wMuL7Ui8p4qt7C3e}jzg;RM_b~m88A>)W J{etyR_!n(I9%BFi literal 0 HcmV?d00001 diff --git a/c64tests/bplr b/c64tests/bplr new file mode 100644 index 0000000000000000000000000000000000000000..26f074d3ca33075a6668719c9719cc488be73737 GIT binary patch literal 751 zcmZ{gO=uHA6vtr5II1P9(QzxVwgMb&*Oy4T<5 zA9&F3zvxE@F(vOH+t__K5Yyv`^-vSoHk}5xK~umcX&M-!Gq72ll@AfLsL#n%dctX; zLV4X&Uia?X-?<4i12hYK8t5|c6wnpmX`rjXX8`0@TfRs3md)1!CxOJIVQSvF`4dSgEq0HJhySHOYE|5f4fwe+QsxUW@xI3 K=@+bj!oL6#kRB`m literal 0 HcmV?d00001 diff --git a/c64tests/branchwrap b/c64tests/branchwrap new file mode 100644 index 0000000000000000000000000000000000000000..d7740b9584414d790a08c488806918c49d416531 GIT binary patch literal 246 zcmZSN@Dbr)m~L)ipkrV)&&a^sn1O*|C1WoSvyTPG%KBd3J1ZZzGORRdWlUJ94`i6P zGOla{iY6#*6y)gV>=7R17{H()!?9AJci;b&PQCm8uT1DY@V}L5rGbZr0#N8P zn37n#?|-HOP|1Yn3R)aM{R+AY{@%O{Yk8PIa40s~sGDnuvj@XU zhE}fDohvz7x38Smx*JIE$;j}@f0)sGkRzk_5XU0My$3ixuqj;n|Kh?|i>};*9KClq kRx;!s;^@80;d7hA!wU!$UUFn;@^c!Tw3@(_2~wK?09Yttp8x;= literal 0 HcmV?d00001 diff --git a/c64tests/brkn b/c64tests/brkn new file mode 100644 index 0000000000000000000000000000000000000000..fc4611110797f0abb30eba0aeffcb6551f57cd39 GIT binary patch literal 747 zcmZ{g&1(}u7{+H4srwEDn~T`$VZ2#TSc}lolS!L4u}cDLP>?iV{o1sN{s}6$9*R@q zNhw6af``#epr>NBmnzbL8x{{DQb9p*dntR7f`V}-#t#GsW|-eI?=$m0qp12(72O*? zt&Kex)gtM zCZqM&kRqZ9A2~x(qVQqBSIMW2|4m0XgleP{;**etttae|wZYC?PZ?OxOjE!1QGDh< zgBQUu!5!kW;FQ2U$>+dX0(XGVgR=~7m@j}+1{e4uI2CY}yzDm`n@kxoLXe%Q0|{cO zMJCfRgGjCTTQd?<@pM-+yBZ6T*PU*wt)Q>un}hIoB9S8~B9sI5+l^bij@BEbff*5& z?y~cT|GTx5xEiqA@fBe*?Mo8g^gxqvwg*uO+dY_&@S+C^39TMnk?^hu;}V|#gkKHC zFNi@lusL)DwANTPQ0mjg%hbUpZDU*6dWHQy(TnGP8C|J3n0lC@N*mKXtbfKo0GWm) A{{R30 literal 0 HcmV?d00001 diff --git a/c64tests/bvcr b/c64tests/bvcr new file mode 100644 index 0000000000000000000000000000000000000000..af935d66b27a67b0857a0c55a2a40eaf9c51eeb9 GIT binary patch literal 753 zcmZ{gPiPZC6vk(hQ1%T3lS`}=WCRZuD#Tutp4ukcrgcq1n%3f}#|<<{nzZS^v}rUV zfeG;>2$8tpVIUKz7qMCp6-f?}r7a@jMexvzF_+>&u+F4WL2%#=^ZVY+d+!@X)jcY@ zKRDnWdN}C4>_rGMC2u2j?7TNRps$ZgP7FzAYiWf5y4KBxx$r0x{gp_fLWGgC@J-U1h|yDz3~JH zXduh+61DrJk?WCAaGXp|Ukj5Fzdxc)O*s)c0&)vl2@t&-KP^|si5N&s)2gU#yFRP3 z;n;B4BMOjr~m;hwUM!?79mng|Is27L%XBp6Bzwml8x4C~nG>e$!q2>| za;JKmSI~BqJi&~JJDsimm;ZY-gSccf-vtWdkzvkAc;5xDgiBo*mGG(yehF{7Fd?DQ zg&Pt+cEKm%^$GkQC@?7&*~LcxDeyLiO14;!E;`eFY|sO2D!Y5Q-6Li>w2rP6;`^Ak OFhlVJOuu3MEB*yBp&x?) literal 0 HcmV?d00001 diff --git a/c64tests/bvsr b/c64tests/bvsr new file mode 100644 index 0000000000000000000000000000000000000000..45337d0e391a97274d3c317dda69f71595d4ae15 GIT binary patch literal 750 zcmZ{gOK1~87{_OmQ1%-LCYM+#!U!HLREWJOJ=rANrgcrqrpDr_$1SvZwCO8-QjADo zLOcmVBrbRu$V7TltAhBVIYhS}M8u2Wp{SG~hzG$svyBRZ1K+a0|2N;`KZ>dcRCK+! zC)jthH+VXT5MoNfMV@2twNNr)Al5}wz+TWauuYl)Hc7L<&eCbvD$M{xGHKC(o2m4$ z+d{?4hOe^W-?hK<6wn;dJn%HoCEyvL%fPchSAb6g1nDZ&t19n;3i6A)6~$klfzle> z5ZS1xsb`>;g%djRn{*ybIwxXQ#Da*os!89gTct(l`-iQz;P8 zK(^;GYIR8?7mavqkPKfqKSKH=5kpHPyoh`SvJQJG5VIRUZJ*;rEF`wstEw%xKBnHw z1VlACN#f_c=(ekMoP6AG{m{|6>=}z6G}OjMwD71FaXRWpLF7Wouy{69z=iwFQ@G2F z!UG0{ho-5gKZxi3=kOdf^I&)LS!gbSeT>gRa~bR-d>)!BVEg$3G*`g}z6i}Vu$6H+ zJ){l94UG_FrK&(Wu+;hoMm2*-E%!$=h6bafj+S>c<|VK99UBdIOBolY+``YKt9qq& znOD(fjoiVEh&#?_`!E0Z*NWk?%X%3tiXziWN_f+TpoCLx2uXO-hKPh`Z5Wc!Xu~B5 z@7fTS@bmzFFBBaXhiqZ9`w#>heP!1~hb|^l8=G_oTgszXxYZ$c*|oo&DNfm#e#Q(< L?O^%^>!0v1-+>+* literal 0 HcmV?d00001 diff --git a/c64tests/cia1pb6 b/c64tests/cia1pb6 new file mode 100644 index 0000000000000000000000000000000000000000..e8b683eca2c9574d5204c86dfa2a205bcc2fe41f GIT binary patch literal 1340 zcmZ`&OK1~O6n&FvlQ&_KCgP{7`dn#hqEiJ^x-q{onK;RmWJ>C;i!S1#xN#wF6eK}} zDXvsph(4u{qK7~PGJ zOHpa!!6_+z8X-hEL*yH%{@Gl^WV!QwaSgYAkw2KmYaBgUL*&2~dAvogViF_T`2aFS z-u9CBSVh+x8~4q1+>Et&_41Pja?tC5rl{txy{^Bc>$Nu&*WRj^zE+JIt{QdR;1vX{0fzZ}E)p_4LNy=p z1v~;<=LD0plmrlb;4Is(B>a9lJgR;ZXl$W_S9rmea?B1*&5)v8Az%a{$V38ZU`oJ! zliL|qVG8;D(ZLe0-V{Jq&}z)iJ3_9ISC|gL0!>6Yt96KRGA^Y|ikePxN;Zc8OSx#! zYHd1)?1QdDs#bB%1h;AIW9&qwr07a9OVXtzDI_mAd}Ud8r0(#}f*)Ph<9jiBk^pOe z7y=Kwu&4{hnET^Kb|fBUxN}-5EyGR8On-=}bTCp$K$qlQLZf*`cH|xogP6|_Ho&4uzqJfrd!qT|0WDi4cLm%qRu`^fCij0M2 zxTjoK3UY>MQ#wnbnidh|jg;ur2-F26hgr>(m??356vQ-q^FiyGQ`pWB>NJvQ4c>$1 z1mo`Umi44AZhP5@BklK}UOAM_UX% Go%sv)F0U{E literal 0 HcmV?d00001 diff --git a/c64tests/cia1pb7 b/c64tests/cia1pb7 new file mode 100644 index 0000000000000000000000000000000000000000..10920f788504574661ab5e4927cf7a81266bf103 GIT binary patch literal 1338 zcmZ{iPiPZC6vk(>HkmD(CK3PiRL7I1Cc3R)N)N)OU7L-YY)Q7X-g@XE9*P$a;>Ca@ zh%m*IiU-l?WuRL;2rAl(;2{NNsn=~q^dP0k9x7I9iEp-Pt1B6jnc127zWL32Pr$|@ zjP7NIl$0|3a8SvdMF=s0%3=f6KicbQt2aQ+P_4W6s{Vp))Lt`Odt+SrT%k2wp>^C4 z78423!$r=Iq1&@HOdnx}X6u+f#zrEM%R?hJt|ViU(j2}Mx*Rr^TXw=xBKAS2+4t<% z^bXJz`P%ZfnxZF6b0QINfH9gaX(~V(CLYn%f$?kx!8kacJ%@~&61*0r15F9Ez;=2d z(1QB`xf0wD$OjmrEzGJ^bYUjAw8y0}m))RIHx+eRi-uhqaqSjPMqr&H38wjcE*YmG zsgh4dq9KW|3z99kdKC=b3$7>W)o#|?Z+wwhdZC3^M9EWfJQ}7kN{ZSffjAI?Y$TBe zW(0z73wzTFd_p?Ex3D4_wvMgEIrwSksA!qd39X+bdC#JBbq8)?RbG56{|(4jp7VIGtpQUvL;Wj`>>c-+^a4+oRw|h#!eOQWV|5o} JRgTY3{{c~0vi|@8 literal 0 HcmV?d00001 diff --git a/c64tests/cia1ta b/c64tests/cia1ta new file mode 100644 index 0000000000000000000000000000000000000000..9f5ccfaf114dea111abd1c08214c5eacf9d82a2d GIT binary patch literal 1976 zcmb7FU1%It6rP`*-7`OTcXpdLt=2keZQ5YfG6&%+89(fZ(% zCWRG|on-{8h^>URFHIt^>bZ9|yBkeGhndTn zd(ZjKchAqgJeV!OeQ_e)d93r~*Ik__x;c(>cuNz_KOtis!S5&(_+mQ*QRB{o-%D%h zPtG3!>ohpr`J-UWSuYXO`VYYE}4 zIk2kmzVo3)%FZ|r#t5B_mo2G0H3!9cuohve3O9a(TmVxGkdKrLdOlu0M#`w=E`b#( z=TL~0r$~7c?Uo_G0=avD0T_1YKv5J@1?5^XD`zK*AIVwwtx4{tJR{$fcPRtPtN2|~ zW|RSSM!BP&(nhpX+9mCu>l%5QXe38ANNaq9jKtjquvRJ0HE;v4*1`Oi&ZXxCWLOcs zIP$7+rI;_+VtSrux^yMx2{K=a;y8w;nD&2JigZU5dIxox&Z(ZzvE{L*8nWn+L$oP$ zE!h06JVU`B>W;5S)F}d#1bG|{cCv}$7J~m^=ujd-j5<=9*epPSOV6v`Gq?rHRPhd_ zH``S2F@(h|C}ar=iP9q|j_Z8X{#4N*fHqE@G&rZ?L) zq(QU0wc!aCq&=R7fl_dOwo9{x2|33~qQQXUbX|{YdLm9JUcEN34zOQX-2O-AX$ zCrd(s_k_YY7L~)ZLM#c`sw}QpL|8ub;ZUUNk>GJeeiU&Kv=!Bvi$Ca}OkI43E+}}| zkqGV}IE%bfOJD*MNGg&o(}qxO!KpPOJNZIiC?ZxJWry71GNT$OcwW>h1@&1*Y=X`a zTWWHS5$a&)fr68@%^^ULs;EJ{q6D;}wjoh;Z6~C#n{g9i)@oh7l{I%6rdOfV=dQr? z8kBn6doaBYrS8QlxK;4MZb$D`SeyeqYq1Sm@plexFM&?j34eP5bkQ77n7d_q1(5z1 z`-cpJMtzVFQsGfzYR6vF-G6>rg7 zeYoT;UjzWD3Cr-u7>EVBE+*R4aSD^~mk0TemAe}YC|W3C!$r|X-*GzYB)o^gxq0Sg ztFeBwiXEg*?$y(id3N^s&jEk@hkq%H-~GBPW^HydI)#H<#N z{p(EA^&{2E*E9gKdiXj#RDeqW#8zUAMkAVcGl3~IKDsQ&gHK-k&Hv6GK{aW=$!*R# z@Mnx*zx6M=`XB1HuN_4ONCgs0a@y_0Wqb|azORnlCE}1x$9iW1jSns>>K)p}SPv*F zAS)e;dAFCpk+#2IQd54O_paDbeT2!WGK56>z2;iK0}`USXd=z%g|woVaxQum1pckh Fe*v|GyWs!; literal 0 HcmV?d00001 diff --git a/c64tests/cia1tb b/c64tests/cia1tb new file mode 100644 index 0000000000000000000000000000000000000000..3802a1bf5287d6326e982aa3442a4a200facece5 GIT binary patch literal 1976 zcmb7FU1%It6rP`*-7`OTcXpdLt=2keZQ5YfGc9Q)4ti%Y7hLs zT;6BLY=!rEof+5Py=u5nya9z7un5}Vn>8+@(<{{JSFKJjgK?KSy#mIspzQ}TcxHsL zlG+)tG&Bn&Iz2r2{Mn2au4q}%J-{8YAgal|`%tPsRP)n;!T#f!(~Nb%SOBZdSVDMX z4vZSSXMJFhs+Ge*8>O>}su8PB%|Uq{j76BL!S&yu;KS4c6rz8yJaY@K;a%>07mRNkR*xJK)P1Wi}}g&M`GT7bCS6!&WJa~UDA;B3VxTQ z8EHtKk?zQ+lu_lBa!L8;xo)h9`m`?Qs+gl!WuMJ&MUqh=rgenhY35Rn@qnCgOzRHEILv0Q)6~+yBTs&5QCd z%MRR$t2p~y$=Ty2oMb&|6RDZ|iXZt{-FR3{QOKaGg39nDGvX;`Y;p;H!uqi4)tbBb zP8i9aMkuL2!IZ+X5n5u?+Ei}bdBlzQ`|%*#dkuBco9`10WdcQggrw(5Fmf1}60Ha~ zS>Z~Y!+fhAm@dy1Asf+K>1qBZ~ z62UD54GHi+7PnIS@lK?PQK6=iip)f*&%nh98mQoJTK~%g8D&5OoGl4 zTWE2P5$X!g0|_VVn?nFU<;i~BlYClH+mI-_vJ+C+&A5p$YxS<)%9_0l)2mP!uvcJu z4Jv*1J(ymHO7CI~>>9XWcB1zhEY1O*wb+L3_&W!;mp~=K34eP5R9^ouq3;&y6+i}G z7|duIjr`U{f`X!E- v+Ed#3A;QpGF-os2W*jH+a_Y(SGZvGV@;_M7{P)(E`5&!B{(3g6zjgO-M-1@| literal 0 HcmV?d00001 diff --git a/c64tests/cia1tb123 b/c64tests/cia1tb123 new file mode 100644 index 0000000000000000000000000000000000000000..f7a90a299a338664852df7589de95151c7d6af07 GIT binary patch literal 1616 zcmb7^PiWIn9LHZMV+K}C=pMB<@%(1R!c9D*o3 zohMK8&?)kef;SmDJ@+6KMK9){;9=%sJq!`i`Ci`Aq)FevM-m<(`Q-a~@0VW=+T##B zoSreN#_Xe-FGAO+joyTh|wk z(}5b$-CvT7?(Aaz5_{I^=sjb5XGgEQ=lL%OE&oAZH~PQ3g?`TIsPy{OzWUe=hjWbp zJmyywAJaqfF=TUc18aU&^T~C*t3V*0C^!q`BAfrEbINniIA{`T53FNH%~Nw`tq$yu zFu)~Wc8~|#;9kjJ?ZKtIzxKJfxQ@<2l0$hPbznE&pJZ=p^UY?Xi3|f7CbG_2_B=8H za-qFjq7;(AOh}_JvJg`XF&7vnP~tS_M`FZj>LKQt#H4~4^JIV_GA{beth{MfPDe70 zA+w*MS%URL%*yBuSX|GNS*!%>h#aj_CKnRs;*R&_l;fQ&OW$VKr`6|uPEVJ+o&NE==+u!SRSHpxzNTT40K60^W?eVMFraTa%c&sf2DypM0itc>G; w6*|)Hhz_8}2@SATU1U8G+@v>YtF7@?OMoYPD@5{Mkb~Y!GUmNn8sXjkGQ1tr$?5QQ$J6q!ZEN-goeN&0alm*oA=dFP#bhr{YYjPAuJ zq^LCca9oO?K?qUK5cvkGe=*lFS?PRVTF0$lo@|qAn8b*7A%IMg zx4q;8R?&^d<^yvBH)Abcz4Eky9P|dDDXRHvZ|bk;M(r)dwRh^}Z&jm)t419+xTSCy z@NiM<=fva5tbistLsc#PF>IG2YYCay+?1gSZB$8*W6u5`?BOY)fqTFsFczh}FG zX2@#C-fHqTH_H_9AO|!CQYASFB2^8imE`zT>MZK^airc9;I$~`3dt3&?bw(r-1{!L z$#2G!f;j))B_ZxRf#}YC6d&*&G5a<)T5W zwdEYL54#SjTE#gN+@Y~guoIP%qASHLNtcqOki6*dm1W(Ly30EUesoz+?#Jj!0<8UE z2t4e^s!xjE|GtS3u4DNL7j@}HN923ocWOXKFUJq*1KeW*9b&RjhwG8UHM zo^o9&$Qhzd>nw$8T11pLQle8MP#2IKW;Ih{ro@R+5YzB21g+;zVLL;p(@3H9p}Xo=(dPu;3!j(waLDH!9AG_%*w6X1 zmIjP=SKMM-TzW6=7sys#GQZc>Kofi~Xw>>F+Q%GGN`YldE|s(rVQOYTM|(#{TMRv$ F{R?mmuV?@O literal 0 HcmV?d00001 diff --git a/c64tests/cia2pb7 b/c64tests/cia2pb7 new file mode 100644 index 0000000000000000000000000000000000000000..118c51f0f393395c234432b318c46f8bb4fd9621 GIT binary patch literal 1338 zcmZ{iO=uHA6vtCcZ zh%m*IiU-l?WuRL;2rAl(;2{NNsppM|9;6i6L&Zuh@y#~Egr`zNPCTU_` ziXvMUy)b!?4ODAvKD0M*Gwq1RwPy|Ft2aQ+P`$VQdj2KbsJ~&j{?@qqrAq6#O6PGy zSWYBB4;MK& z&+GtAlW%Qrt0{WI3?~u+2N^HLNZQ6 zQgu8TiH0P;E=acE>NPO7_PyMafeNJQ}8vBSo!3AP$5e8%d;r z8G+#2!rrtBpODTUZLEmKZ3(DiZew=A=eSN@VHV?nwUppG$GIo>(#xc1TBM-o3kbAK zNX1-d%Rl5D3mh`cihrhW*Ty@|PgF{}r5E#Ltdu1a>Sf=rtXV$lp6@J#W5@N(L5-yn zaP2Nbw5KCW1!Ua0yKZ0)@f6oxG)rR|+@$8ZOM1Cv|7mHiD_3-DtiT^Y*~ES^FmDH?C3pjtVJt;!>V0Mm#p#N0)w>&_I)G+A?c z9zb`Ndv|=xmTGCcWuzB#+N1_u(SjmXWhhd(?V~Ek?-`%vh~LCci-g6HfFj|ZLwpnv z|M`F3vnXxtz%8}p<#+NyK)&*V$9ruJn0gr+bRF3{=`-mQJXu<)WR?hrnFfs3E=Eg^ HFV6f00wc3T literal 0 HcmV?d00001 diff --git a/c64tests/cia2ta b/c64tests/cia2ta new file mode 100644 index 0000000000000000000000000000000000000000..59254a2c48d225435bd5911d4f18a429135547e7 GIT binary patch literal 2760 zcmb7GTWl0%6rStOncL3n_6`-dV4)j8S0HqSM1`WXI1#NSX`&BAG+B+rC_a=YC`l7i zJ9RK2J_w{)eHqei=E1}e*ubMx1KH?<;bD@+)<_@PPJtGTDdYKPZ!K1%lbOkx|D6Ba zzcW7#MmQhP4#NOkU{D9WZyg*6^Q#@vEW2W08|X7D44pMtxE#q{v;Enw~k zn>yYBW)~Ryp!*PBiNladYGTUWV=*5P*`v8wAtmJE1$Tq<$I-+$%Zcg0|I=lC`e;sJ zeb%5(8=rk^x-fbjMs9e++%O1w?@QP1SPi7Cj>fH?;f({SxK81Z3Z7DhQQtB*##ZK{V- zxp^=-Zv+X>n^3)R+_wOu_h95cU@q)~ME_&dkJA0QDUc*dod)T0{-QWEp1&jxq$7Xe9$>hU0;gMecqbRbCO)j;QYo~3z? zW#~`deXIA)=QnL^tBc3*6Wf--cEzW3Q)o3kqxx}6cR6dX&u1y)p`4}hRSrdQ+SAML zC_b|)7~RV#)nFFo{7Iz}Ojy}*jAi=`aFQf|gG#Ecs1)Ezr=mCDSM$l26f>y|r)OfQ zwOn-)o-7B9tOOLpP><2oFfy8>g@C0gSrS2r1e_oUJS#-P*v_1I@7R&P-kt5wY;35H z^BhAnEKT0{l^15y}Ohr!q=T7x>kX2tG5*OBM4vPel%aFk>3;M6RD(D z8a^+iJ9qEewl&$YWpn$cjjiijnwuIM>f$o#TlVb0K!5rN`|Lobzq_NkN`wm?XHI-t zYUCZ&P9{0wEvYnBc=V>ynk#3n8+F#XoZpK7zvjy*lU`odu#+_;jW0BWb@*n`%`CyW z8!Iqb+F`PTICE?|oKpn`CwZlZo3J1_1#~}>|5-DB)be+=TK#a!&^*lr63z00D63jf zN8wt)vk?f&!ze}*sFL|YE(%Fvmh+!R57(11!#GW7Hgxq%9lu24>Mk9B9@XANCv9{x z>`%LlLk)4L7I}+|#-eO7AvB2UHK52Ac$+pxbgX3=lLS09r;tLURdZ`V0oh@0dCE?Ao}%4wLJ0z6}2kWKhG1-IrwSHlC(ty$1n<6PWm6v>H5?RmYY zFOeXvP&rs(lvQ%BM*4&#TlT%$_ewABSg7&t)kr+-l*G!%vfP6jZ?Q%$g<^PG`z3}t v6WbGqUsEY^N{o;r9CaEO!?W6c%BF^-p(}P|=zH59x@yOVu4OXD$9Mh$r0N%a literal 0 HcmV?d00001 diff --git a/c64tests/cia2tb b/c64tests/cia2tb new file mode 100644 index 0000000000000000000000000000000000000000..886daac15535020b8457df3399b4a26b1f4d4983 GIT binary patch literal 2760 zcmb7GU2GIp6rQ>Bcjj+rcKZ(%7qHL`pcM#RAyJ_SElxyBNt);b5lyO*7{v#8f;4GD zuu}&U;)6h%)t4dNW*$rofek!57|2E+3=f+uwnqBUb_%p$Oc~Fe{cEuroy<(m+;i^v z|IS<%ta@O+>P&ZR?$~*0Ye(lchGAUR);Q}i4A>j-X@?A(+W>)>{3*PbpHH7Xwh`<- z;4;VB!R`WUH*_DsD|rwGQij~&?{vrqRQ5)PvwS5@54#RiA)o~Br1NH?pdXXCada2P1VBe)iFM|CmBwIo6+1t;!@#J1` zlejIS=yGq*{_ehHiIW@vs|Xko3$ht+Zb7Piy-G#Tb@lAt+P8;s*VxnG*4wkF-<|+_ z5>B{}>}JjdyM=R4*?Pep#8>id$~OwOR2ZLt+!WX|Fg^*_euLov#;0LKEM&|Pqp(>o zpj37iY_Twmgjg8Y3uCx%4o2?7@B_eHxcjO8C#WB#`?C|ED2hG_%H`Zed1x$mNgm36 zG{zLF5`Wp%TUcx^Ey7y$FtL5Kcr62 zLpA_=0j%qEEj>lh-6H43(8(f`mwe)I=_xjnr5wp4GAWAqK8;(k9sahHqv282D~QW< zP4!5sVzDe*@**Xdw2h-_;;=VIA}#nq&5@!&jiQ1)kq2?ZN_#{MA@~m)UFt|6QA5fS zZ>Ax`q^DHx1q^|Ds(98mFJGB)|+ZxrDVU_!J!yRhVUXNTFgv@AsdD~5!p~u%B!I%2m;3n zJV)41-aXX&){E=ct*uMM@e|vYV7uZ|x*4>Zp3;MaWBR zJ6b@N1!EQlv}!Q(YVM>~2_~xS7{;>Y26!nNz<#Y`ZBfg^l}^oUz^~?$uV{8kJDZ-0 zqt*QsLYOD$Y7`mEvr@>hjH<{Wi6JjZlE6t~6x-nO_l_R!>)qD&+`5MP zguoM)a4db}Q@WQ$w>FCIs)o^B)vD2{>BUoe*^f#LqfrqXJq-(~pk(25-65m$@B*Mh zU-9T}Uv&fob7=`Y5tpz^$j`STnVyn@15P(xK~d9r*^OGXSNFMm15L_@I`WEfr>)8$ zCC1^1k#MvsgAIPi>|o(IEHe*808KBKKUx%s#PX7=Ra&B!B8D+dGp3nFOs6iR#S*v> zNH~3>#`_=8p^dFQwG-nFl0NV0s6ME_d^0f5T6)X}FKXSoSgmzQ7!nbES1N9X^_T~Q z>sp#q&1=EDHWm#pUdGF4;!cMV@Mp}&{{(01Oa$l%ltsnii<%>i&B6_YX0^17y`z*T$~V0fx>kX2YhfW4hzMWnK`d8i(BBj06RDI@ z8a^+jJ9li~yeZYbaYNhsb*-ygnwuIM>JlpLTkgz>6aDEQ+%qQz`n%hkt3w)?7Ms{g}7P=Yv-K|21Dmne^hKft_q1X?#A`yck*i;t_$57tWS zf4XHH8i+%^C^&R97FCBt(4eYUfFhR{T-F*kv6f{_Qt;HALJEym&8+|hWJkFP6l{(1 zWI%apPjhrc5IP|&@e)gtivCXuF4nSXU@9XNw8U#!ETbS?iUNdCqNoP3q7u+yv&?9O zxs{BTengm=Mq+q3>OH=&G9-x;8LieSG&XzhW2D literal 0 HcmV?d00001 diff --git a/c64tests/cia2tb123 b/c64tests/cia2tb123 new file mode 100644 index 0000000000000000000000000000000000000000..f8b13c7a24e2436821b7799cadd0403ee586b82e GIT binary patch literal 1614 zcmb7^PiWIn9LHZ<>|XO{ZDhL3l&6v22%soBB%%>2a)VhJm|rbe-1$u zp3ak}dFT{*NWq&7ot}FTilP?@D0rB;SPw%)biS9jv}w{e@R5W^NIv;~-uva3g4P%W z52t7Jl0N&WtWQ?}03?N#jP)8ixJb`Q*i5ZyS~rW{ZLW7VX6`nM5LY1qjY)`2XldH~ z2|7>>ItTJOy*;~>US!YOEv=)Ew03sdd!PTZ(aIn6b+h}so$03RmO`&jt*einVA$6P zz@uJC_Aoti9)@gAZeZ0bsUEqGcV`I1;~9INTw?RTbWVBBIU7wt^?`Z(SouuVC|7{> z5&AgqNj7p}6Wq&tYaO_p_SQdVmp0G^NKz>6p%!eXyA$k9b*^5o)se0v-9YAf)0#sD zKn}F_#?|=DX~}))=?>3r9>_y%*7q=OEJegNtU+ds3ll~yZ4FZB9UAl z#H^%a$l{JgIp(-ePB@0S_6u`y$1Ac=OLA9#9~(VZP@GMTertGz8psH9@d|w-Q&hA< zSH-NDV}!*WWrebQsh?|y5<31zF79|%i8-E*u?pKc4%X@l%N2E87PFF$A&WbHk2`)7 zvts`vU9XVE9gnCn$3yDidVy^mX|suTn%ip3@s^kc2J6dUjf=Cm<9o*P$NKyDR?JE` z_E>=oS6TwY-leSvpRP`_*z?IxpGUC1b`Ou>++X>XKNZi literal 0 HcmV?d00001 diff --git a/c64tests/clcn b/c64tests/clcn new file mode 100644 index 0000000000000000000000000000000000000000..a89106ab232bfa79213896f9764c1790af73c92f GIT binary patch literal 590 zcmZ{fyK59d9LHz(Bz$k+2sWaz84JM!#l192z`~ptFUgX?87!<)$qEVn3l^?L$S)+7 zU?InX#lTGrss3vG1 zs)ekV|3L>(ZO|ds+jwML+3Z}`s5No!Bzm-kl`fXI5m3)uxC8MKUt35r{uP)6aY4*Z z=hzcBf%trseD~QsV{epf77Ka!TpkOb$*18(KMVwg)|_6(*EfBC=5Xoj!4QKP(M4h7Lo z3*8hv3xyQMExbwLnuT{MOj@X?aLYnJg`$PGzun(|nh+n2ig?9d<{r6RE-wWOE7?XYEaJ?$8W5afn9qlKe8z!)2JGqZC2!>U zuy@sCj7cYS#SqUu8S}?ym^@E)$Pcsyxkegtff|sEns~X~f~tespdQo~Xb(z*_MsY} z1E?mlUj7FiLbX6gSZ(2%aV4{JRioO##V)$EjpYs=?;xPAxo{Wa6TUT(Wc=$e3F5Mt zozAfrZUXV;IQi+b2gcqi+AJ3Ga8sTNH{^QwN+Nt61pfWcCjXzI+K7A5d9{sr5Bh@Y zAl`>Qt9B3{K%Z7!#D~yXwTt)&+L^asA1zMImWx8Ls9u4%o3-x7#9Xl~tZV;u<;k0+ zxxVZ5oy>{maX+<|Nt}5To-xe}Zsk$+p{lU8su<)_m_7aJ;|c$F8O`t&H>#JG%%LE< zZK0EbXQ7b7sD-yFj9Yl0!lZ>-3U@5@QW&%F?l=4iDovRo&ha2WnDuHSEAG7k-@Hs7 h52(N+=gk$K449U$`unw|MUT@omu#`X$>;tQ{{;+l?+5?@ literal 0 HcmV?d00001 diff --git a/c64tests/clin b/c64tests/clin new file mode 100644 index 0000000000000000000000000000000000000000..f5dd27042c8d3d3fc054019fd1daaff018d1691d GIT binary patch literal 590 zcmZ{fyK59d9LHz(Bz$k+2sVP+jD_HV;$9jhU}56LyJSh=3?f#kWQ7F(1q;_AgMEE8M{0Co5{y#%?5ci?;Y76l$^f}c< zya#<+Z6n@?KB;<$51_MZ2k{}aGiSd(R-Blr6op_>qY7~^Yu)vU*OWys^QLqT-g zLN^7^LLr4Q3-406Vc|mxWefEb?po-lFmB=fFZdl)nlwY4;X!^l>(xhB-1|emd6_&O gP=QCz+six|GA-ZqkE@Fd9;YcT*+PMn&;3dM6FrUYmH+?% literal 0 HcmV?d00001 diff --git a/c64tests/clvn b/c64tests/clvn new file mode 100644 index 0000000000000000000000000000000000000000..ec9bfb4b108c8e3e47f3cc22ab8fa7be93c1e0b1 GIT binary patch literal 590 zcmZ|Ky=#*}90%}wo=ExTAQTrtUCu!;p!lSVQgCR})UoZq?L##| z2T(1fz3f{$gldD1u+hd7la;{yJym|@j{+S7V_|gJQY5ZPs3Ld;p-sq?|w1${~4--s1Kc0+lcm{ zFQ_h}edx1l2hjoaY1Kn?2%T2Dh>oD01^e}UabmVy6oOS76^Pqun~hD(70beAoxfRm z@@8pnko5={g-PW<0xb%w9H)kbOA z915!Q7TpA%MJ_?!;$4Dqiw_AVE$RtwS@aVWEZ+adpF*W6GsHO_WQWsUeRS2mGvu3> j$>Ra#c-47xmB&M-%QyYw`tp*;X_`y6l;h-ce~SMCS>x`a literal 0 HcmV?d00001 diff --git a/c64tests/cmpa b/c64tests/cmpa new file mode 100644 index 0000000000000000000000000000000000000000..b515e08612a3b5e068250e66c339a5d9fffd95b3 GIT binary patch literal 646 zcmZ{h&ubGw6vrnCZst2lnkH@2sF(3(Kw<60(py{8rn*`QMMMyK>jql<2Rw-FdMHkb zC&5Dr3myhCg`UJ;7ZovwmBoXIH^GA*lw3S{sBhM_g5Vs6_xa9ye7`f3;a-ii`%|af zncXS(tjieFnIJ2#i_*RMiF&0yI+sPj(8na6m_f_99djCJ!}+ z>2D6W-`G@Z+z7yJ+yqlK7!EZK1E>j@0@Nh-3V1*rEgIY7=mRICBKQYY!p;cpmf@>W z@~J@9Q74a1h3vY=64yG-5a-bq#Cd!d80Netr{waqT)t3Z53@rqKOYQ#dh8ad_BL0U zW`PJE>m$J<{WW;1dGO5ly&IqC+W#z5L{vrGFeOA|h)D( zf@l(PX4O8~TytT$-IS7rP7iVyR-0W|X||=+iicWzX|c7EXw^j1CHd|k$vVglGpm$5 zN1@lVy*vFa(_{O6xhS-xo@9ITm;YOamqa%kzHM#OkRM*L@ID3C!kHB2EWAkJoP}2@ zELj+&aLvNU6y`0w{0)Bswa(L$ZQ(b{a0fHpY{&7)S^2_O9T8@puZf{US-!+SrnfhI Qp*HE;HabFW3GcS}1-&HQ5C8xG literal 0 HcmV?d00001 diff --git a/c64tests/cmpax b/c64tests/cmpax new file mode 100644 index 0000000000000000000000000000000000000000..baa55f1615e12f298012d516a204bfd69a8715de GIT binary patch literal 669 zcmZ{hPiPZC6vihBmi-2T^dePBGD-R;+a`7G#nM|_QxjdSgd*C5^tizmFCN7PG#-jm zB3Q%<5*9oxWC}fq`0t`3=CEP$AR>4WJa{qW;>kmO6ITVnISlXj&Aj)%Hxn`J0|vW0 zmA7UdOj*Y)#+VnWN5vH$zde8Y?Cg2w9hM1rZ)6hQu1vvOl>#14Or$?Fj;^~K~6vk$UIaAauPckY}1VrrR}8963BhZ!uTME zu{nZUqj2OHwaP&pLHCXk#JXDs6$xUUEu)jd5Vfril8MHlzLy~?L!3l|6DQG4qZhNw z1`Q+%V)0a*J&g7Y@nx^~!)7&7^^g~s$LhTP#M@VYOwltB_2-UbU;a$5@y}9O_$C5V z4Z|NtkX9q`ClDM|qwwya+;v)A1-RW;{|MGuB_Y7}D z-A-wPk{tJ(hW8;@8jglAr{QG?$2GhTp{$`D!m@^sA<$Z47<39nVz3f2% literal 0 HcmV?d00001 diff --git a/c64tests/cmpay b/c64tests/cmpay new file mode 100644 index 0000000000000000000000000000000000000000..f8351fc175920dcbbaf68d8ee9075987b9e7c818 GIT binary patch literal 669 zcmZ{hPiPZC6vihBmi-2T^dePBGD-R;+a`7G#nM|_QxjdSgd*C5^tizmFCN7PbUhTO zM6iezBm_JRWC}fq`0t`3=CEP$AnHx<;Kh)OClB>)TonZ0VR*l9-kbN$OvJDc80_v; z-kNzZWgW8^V=CfC#T6dEJ%9S_>;1HNK5}+;8G$mO` z6Pj=w)87&>9P_%oWau6@{>}0S_6(wrhNuec>`jsnqRxqv=%&$&*=2(+ zBno2jRGdAG_6+f5ulK`dHB#x4c`Ot0}z=qx-FzNv@d zjl)mt5qJ~u59(2PdH92R3|;{~bPnDm{K!i1l5@p{#Y#~K)=V@Y9wE?X7nX_@5op;z zTBUrVwA9zkzNX^h-Co~oJJyS=kn_`9r literal 0 HcmV?d00001 diff --git a/c64tests/cmpb b/c64tests/cmpb new file mode 100644 index 0000000000000000000000000000000000000000..fbe1b911cad467c485bd0e515931e98598c122bb GIT binary patch literal 647 zcmZ{hziX307{~8Tq`B`UZ__kwn(A_H1{7YqSh|^-n(C{SSR6V?$2XzHf1pF5eI1Hd zA`XIshJeFCuFy&RwWx?0UU_j4aT6Q_QL;EW)aT+`1;HDR=kvYi;rqQihx;YY?#`U_ z=I+mUXFSH3cEXgrF5KJmm#$QqKBh9zuN8;hSAbqq0-C8Tp6upqkpUeU+Fht3)E#a( z)C6X~Wx#{VmTGa61-!}zn3{qC)Fh06D#7HS%Gk@{9(B}dY!B!Ooai(DL5*TJk6U91 zRDqnvA*WF$mu7(s+ee4KWf~#oXbWPF?^z7eevMOhc}gx_blJnyfXmMZgP%UzB$e*7 z!ZZs-_*fqaAL*~*Q_aI?LEzu`MECw@85dCzam9=xnm~Nq*sG8jI)a%R{X=)U+$#9So!P(*tLf zf~P6-TB>uiw{1FXzbETLOX?YJZ~pRs%kE{-PIcebcW5Z+UbFB%0nfte1gaKZByi5c zs{|G;^b=UI@G*gT3on1eVW9d2TJow0DtUPQxpt~K;*+y#ia@nQ*Lfa@!3bsf691Up SS#JupO~1C@5-Jq_miPq``Q9=B literal 0 HcmV?d00001 diff --git a/c64tests/cmpix b/c64tests/cmpix new file mode 100644 index 0000000000000000000000000000000000000000..5e07d9d42000921c2a0bd9d8fa3b7daf816673f8 GIT binary patch literal 663 zcmZ{hJ!lj`6vyZ8FzkQekTl+RGMCH89Vo164Czd~c&Dq;BS^Fg*lZxt!o~y(LDwQU z;Y39ck>kK(;3kqv{3`rFykf&*Az~+3*ch&{(IUQCR|UaW4Da`!_jvz#6SJH>7P~XP z*PgsTZXd82V=Csw#W|k5F@5YreV(bDOhLVoX{b$^fm)JTC?<1wvYt0d3Up;I3SLLS z)0%_=WC@z&VN85Y!E!5C^|KhYlk30;6+LQv5I@P`o; z^&tEa1Q{*hk0R*TMfhU~poid>5yTeE4yUR!vyG|{tet8>JcQ8>&dgOC!f1s*TBClr zHWzB8P*X|qZYT8GP4r?5wA5!eRyM=)jJWdw%|ypEu5pc}y%10N%pHt^~f{5DiOLLts_x3U{{cd{8@>~mi@euIUcLn1Cf1f$xV%N*w!F&aZSLIUKLN@i>Q(>% literal 0 HcmV?d00001 diff --git a/c64tests/cmpiy b/c64tests/cmpiy new file mode 100644 index 0000000000000000000000000000000000000000..6926664651c27112bbffac405598782fca23f4ab GIT binary patch literal 672 zcmZ{hKWGzC9LHZSQtta8NEfNPy!>shP1;KqOE(i!6FqGWMbxR?u8`v3;NqZ-=TLkl zPJ(C&0f&Qog--roREim{oDL#xf)p1ei<3kBT|5;8AKdXipL@Ue`@VNE-8!VRyXAs8 zyID4mnT#Np8e#-0~wdx~lUZAa~KbUP&xPo1cn-i zUqp~pdH7QZ4l4uxG=fnz0pCObH3`3jAhr}eD2dZG*Q7@<2pw^(b6(B=NP zX5(aiap(#|=O)Cv{bAI8d=Oir;Bm^_(z>_2o2tvUJ+aJPL2HJuH-GuR)81L$(R#b} zbtj)Yl^dq{8n^x9d(-_j3c<~ZfBS#cTb(L()1^)pHK{rBh z!dVFxaxSD8*a@T(e>MKXD^?Z@5j(-cLS-8(i#W4c6$D=~yw7*u<9*+ZVYyX{+?_t^ z%-)}NPB?@RVfZHNQv1&Q+4HMJOmRTG<`iO&=OKE$071Bo$J<4n0P0Ete#k436ugR= zZ-C`BZ}7{Ov;n7i4TRSr^Wc+^1@IbV5xjxjBJQb*wrbnWBP`&^tI+zuN3mVT?J;dviYh@1f8|mPh>QhY7r-~`Q+emV5%TngqF}8fhCOc+gvCsR-PnTR* zs$S?45yYqdBXP)oD8Bkngylc=JooA+wfR3GONc6nn{pIU74czNMl^}IF2@kn5SQgR zqB>&82}BLVMpwVuTx(&u(_)MS7=S&1)=n<0v^q>{r9WC{@pOA7)hekbZ1!$H^*YQY zMprq{Dbqc3uo>Qz1F{#gB`TPzNsl*w`M+s!j`q#qZF@^KdBH^u?=x^T9M51*!}API zX?U5zqK07xs~SFLFt6do0sJ=9UQ)p>P_J2nGo0<4Ya_0j%-5;Mdo(bfU7^W{^71AA UF|)O?PWh(#wv8U;x2WsWUoD~GJOBUy literal 0 HcmV?d00001 diff --git a/c64tests/cmpzx b/c64tests/cmpzx new file mode 100644 index 0000000000000000000000000000000000000000..d332c16bbd24f3f693db32666a241d9842706a6f GIT binary patch literal 658 zcmZ{hJ!lj`6vyZ8Bf{GB6fm>jo}(?EaKa9RS|{nYE`D8n9SfwD;p#U&=p~+gaSFiW;?Tr{Jb>_?>Hfka@HU zxK)HLM`+L}wp^KmIE1~s#%>BZ8rB@9(e1*(L5{kKlW23|B=$1s$E>mVBFzcWax}WOpwF z@IC}HfMX%d2Jj+;69K#mp&mdlgrxvJhA_}`{B*VehbO~1Cb!DX9UE&dbn3Fj98 literal 0 HcmV?d00001 diff --git a/c64tests/cntdef b/c64tests/cntdef new file mode 100644 index 0000000000000000000000000000000000000000..b12f46c5124f3378d530bf0a7f0bc9dac7f051ea GIT binary patch literal 340 zcmXAlKS;w+5Qkrkrl+)(h^}(D2`xq)TDqmR+UlbPji6iI>QG!9#6_2vL3rRMIEY4< zHw4^Nw4*}?A=LFPf`dbcLJ|K_;;Y_vaKG=qI}PYKkdsW-N?EzHIV&?y2oV~O>mG5R z{Wf4LdTX{J{J?Jz8K#LDMsT8smp$AEOk;H=LHxMhG4K&6IrKhH{VoLQP^Y_B9{Edm zRay`>!tUG~(Pj4n*aO{psdEN(?t-T^O;hF7qVPR?)L_8RL6C+E`~s+HmX=ka5B2HM zVJpZT4{RH>75Qdp#r&}_n7sa~{R?g2Yt;D(^o~~R8|g|%IVSR}MO#VIDikWtLUEB4 z%J!^dlRZIrQu0wL4tPSQ5>oYpk`GCBeo~5v8i-KiHd{eHLO$} TER~l^nBPRjwb!Xb)E8>M4I+f} literal 0 HcmV?d00001 diff --git a/c64tests/cnto2 b/c64tests/cnto2 new file mode 100644 index 0000000000000000000000000000000000000000..a7b0405b38397c597fa9d952baf1cd613b9b807d GIT binary patch literal 389 zcmaKoF-QVo6vw~o%wFLc7q!M~6qK%OP~7YkDnC3>huR!%kd}sMspTAkFWQ2JsH^20 zF4`)}vEjDE)^8|iXmAiAG(zmV+!Fi^;?{(%toi)K#TDmUt@=)-VIc_+>E`gIq6WA3{U0>gng&x!s zv(tv3J)PKz()P&H17pgY3;e~q@7h>s3qMBPA7AY%wa`eFI?_>FD;IK7lGD{k0%5pfb1w-MnFyNPg}T!K{_Z4>i$ hp@Jp5iunS~ZKH`6wXI@>$WOfW$FQU%8%F+tYri4MlMMg> literal 0 HcmV?d00001 diff --git a/c64tests/cpuport b/c64tests/cpuport new file mode 100644 index 0000000000000000000000000000000000000000..c3ac852dcfc5529cdbc9e51320f21d54d3828067 GIT binary patch literal 469 zcmYjNJ4gdT5S=q3Gis24Wj<@?p}|v&h>$|WnCST-M6t9y3$d{fD+{j?R$>YRog?ka7HiM0(RZmArp>L=qJ z$rQ%&LV(A^Uk3w2;A gC6d>qVEKsT4Y^m8o!}!XS*t*h)g5QX|c-8I7qe3O;nzm#J+2qr?YI zd>9MGyG;ucC`31ldAK$c6dJ5CL2Mpk6k(`7_~3vAg;3E%p+v38c+SjhW=PT+@zK3x z=gxP&^PQi&=Msr(b(D-Zw=^|29ed~DrsgAr5FzontPRC=eu(NkO-s_kgLJKm-EdZ{ z+b!q24^jRo6{I^&c^lP^)6C=WVVzWONJg8MkBvpnA~(k?>_Vk2_Va`-q{f78-N}Kt z`w^rhPYlp6YX4-HC|jZ>d7+28z7_OTM!W8Nn1D|$}4SN zW%FuVbRndIDOVzeg#B%cSz%|Lp9d)Kp=Kp+2PyBRW)*ISDDR_YHEv&~yq`V`aiX*rkIM6^T}h&0h2U9r}4I`5C^d>}S+BD%7287%G52_k_-Q`P5HCy`DaPEIP5%2ilz zsRbpk6qJLBgNbHXtI0FTbn4UOlCq@ShLu-35_x4Y(E)1_)^FSV-~E^Vb*bIsUsd-O zKeElg9RKhcJY5rOKbNIfF)E=B_m}Zz_rmDXT#;qmoi1JkrwQ6U2sZ}%6N3E)verid%l6pBK z6u6E|(0`0#=r*mht>bA%SVa_HPiEUQrx+tT$b$BkFj#+Z*6u9JYqGW&H{-N2)&#!4?)0sJxWX}}4HMg5o5X&Q$!WJqem5R)L1)q| zcP`+!hWX|0oeuM{cLBc-P547bscK)}a6#Dv@niyiG0ZQYB>1OKhS5M81;bGojJX29_R5Y=!v*zvbjux8M@HR@MXv7P}`$FsrV zgS|GV;v3!u;s%@^=t|h0JRBt8mC#0U3sX`#!Ibij+g`jX;Enx`-Vh$gR-`hb2K963 PSw>i9m;%;X#&UlHjAmHI literal 0 HcmV?d00001 diff --git a/c64tests/cpxa b/c64tests/cpxa new file mode 100644 index 0000000000000000000000000000000000000000..bc36f18742286a88b1ba57ad2c52317ddffc8752 GIT binary patch literal 645 zcmZ{h&1+LZ6vZcr$(u82nx-GI>So*-sPOE@(p?i1Q+?PPim15g%Dh60|9}g%J{QF) zaU}>!2)G!?6uJ_>HY#EkPaZBr+zBoeRI+j9qP-KJ3I*@ta(`!LIA>-O+$(Z+cY4a5 zeK74FcNt?k5hUd$k-Jk_JU_?uA(e)HtuoNt%7I>09GWTM$)>PF8l)QPS*QYx12u-3 z?`d$qw62=m0B}oJ!PEpy25J6Yr{waeTsWO$50iZ^KkxK^dF&dgmBkBX zrdc3@$9iAzNPi8UY92iEeecRAy7itiS%d{dB{PI@6wzUmLpX-$fEh+Oj;LVr2qzH1 zj36u`N-WzKD_3g^jjEKalWs%aht=k4OVx(7TK2Ejm_J!x8fb-qrgQS$&LCH0Ujcee323IWc(j|dO$MYIsxDL!>J~SE zn#Ana40ur4QY~(>fLGZBQ&TV;Y63<;m0)sEW$fi}hbHQ@vj_A9j(uSKof^e%9yi7i zr~)~SLr$YiF3kcNwhs?|%j851v;{HnEsH_guW`yQPspY7F1zmxxcqc5_~El_q|$v> zm}a2}AL>Kl1N|j@tagwYbnkzbaS;^}SIj7)3B*TD9?>M?X)}hXgt%Y|h^7$3 zj3X)|POaKEtJW5l8Z{|dH`9T<2dkZ4Sgtjs)!aW?WASW#d8ieKns()zgJINudXQSB z;AzUd=5((2woQla_hemYNi)Op>M#Gd?OqUVr~A6TLx+OyWeaZ;@GP86plab+0%t6| zNMO-IKYrJ7y>DSg`JsO-g)hx%?@EeO60!~C9^;d$Pf6nDy;J(xac z&pw*AFWQVTo$}K1may(GT)(-@^l8PR-zY#IDgnK&vd~QB@O00L7aXJ-4$oI57y(tr z%r_41*0$7bZgPNKy9=f&Fo2qX$wE!SSWs0QSa?V$8nkmD;Ae66$mbtb0ehpkSA?s^ z$YmV+zRE*Rp+YvDA~|-ahQ<}LBNpfiVu9~DL>Z^fDZD%{m#$iDKOJ#-bR7M3*e0pe z&>Yju6W$Yj%6qK8de1cXp1ZDd=QB0_PnkS|62h7(AecaS#*88;BdnStf=Pr$Glrmo z5M~@f6=7;6ezf`e;!>+FCF}DZBn{H$7TfifjJ5n{vj$V90X z3Z9|N>*?N(zioQ#(3ef2C7l^gZ%_EY%llt;g|u_n}xaJI!SFoWQ> literal 0 HcmV?d00001 diff --git a/c64tests/cpya b/c64tests/cpya new file mode 100644 index 0000000000000000000000000000000000000000..ab9448419684744761cd2824d97d3124418609d6 GIT binary patch literal 645 zcmZ{h&1+LZ6vZbmCYdv7nx-GI>So*-u<-20(p^&%6Ma|>L9n>!%Dh60|9}g%J{QF) zaU}>!2)G!?6uJ_>HY#GkCl41Q?gSUQP_l95qTY#51)+CwxxX_roHH{C?iD$^GkesX zzd!39cNt?k5jgUq$lYE%dtrg;Ln;ORN~NK9R0euYacHK1$6LYj!k=_?P)L(-qng>sP-@E*YZv9`GEW!e!k{Llbj_9z-A)G*Tz>FfCL{u<&gj0xM z#t;?}C06WL+W>p;j1bIw#-l4x{#ygTx92 zPg3SJr*pG+!*tkAPgaGNv}f2}|KmN!?itZ`x^HWnbja_Xx9~m&*TS(F$`+o-aKggN z80r@KF)Um77{j847r)_8pxP-ac~1DHJly_#+gVL}bo?Q}yG-de`{g~Ta RZwYmser??sYD0L}#4pKg+>`(S literal 0 HcmV?d00001 diff --git a/c64tests/cpyb b/c64tests/cpyb new file mode 100644 index 0000000000000000000000000000000000000000..8247ec99d4bf0a984cb32041d0d762f146e3ed62 GIT binary patch literal 647 zcmZ{h&ubGw6vrnUY34i0Hciu}sb0pL0fn^}OK+y8rn*>(MX(3yaT8kl5A-0k>!CO$ z;z97BA>d&kQ|L+j1)?J6u(Eg%@g{f>M9IaIhx#V23W9TZyw7*u@cqtAiu)zbZqFR| z=I+jTr#!}(PKA!VD%_j%7q3*AKB6+vuM~&gSAbqq0-C8T9_{9AlK}~astZ+wy2Xuv zDq;3(20W;2sTMa`z^iP6sVNu^H30*tNthf|8GAY0p@}-}>;XN2W6v0WuST(($Bi)r zsz6TTkkcrWOS3?R?ZZRgGC2_ov<0!iw=4!}zs4!MJRz6PyX?L*;PTVK;D^tykxKVj zVVZ>^e5enF5A>JtvF72EAn-Rn(!Kv##zj;_Trs1FCJ-Mrc|?Aeur9 zGmfZ?IJIiutXf-GYSg4;-Ao7a9;|kHVY$|jR&)Pojm5L|<)Ky_YTA`=4~9|u=|O6h zf~P6-n$x-7+cq7x-;;HrCCv=W>%aWpwtGReo$j0Z4jl@*mo2SO+5|7V1%-Kj=#_D StT%<)re9lc2^9)|OZ)^tBi=~> literal 0 HcmV?d00001 diff --git a/c64tests/cpyz b/c64tests/cpyz new file mode 100644 index 0000000000000000000000000000000000000000..81451bc17a890e0bc025f757423ed94453ee347f GIT binary patch literal 648 zcmZ{h&1(}u7{(`wlzArEq-oPMsh9C)Kw<60(py_o6J4x?AlQpN$)+Fp4|piF+e2|m zJP95o1bP_QDfA?MU9^ZftSlZxya^sWsO-g)hx%?@EeO60!~C9^;d$Pf6nDy;J(xac z&pw*AFWQVTo$}K1may(GT)(-@^l8PRUn@W#DgnK&vd~QB@O00L7aSxQ4$oI5m@L#J zX1;N7x3;BjbCUz?+FdYJfdSM6jDRY`SWs0QSa?V$8nkmD;Ae66$mbta0ehpkSA?s^ z$YmV+zRE*Rp+YvDA~|-ahQ<}LBhI2Lh_m>fLzHpqoWjfVa_OqY_R|rUpO2%T4%;M^ z8k%F8dBS_5PkE2^SMQnT-gDP=?tG%g|0$D4P(oNU1q2fa&zMmJWrS5zL@CFlMciF!ty6OJg#x7lQ`!`~EpMV|1g#_kfc$vVZ z7>*KX#xO`=Ifjo3EX45YH~b0IxI!h{!mSlx4`#dR&WJCM=H6RzL3CXC1m&IOnw~3F zgvmO8vdYY*^4uWn4KkS%pNXR$>-CyHv9ws=bel`ISmbnvySMmHzgPVr literal 0 HcmV?d00001 diff --git a/c64tests/dcmax b/c64tests/dcmax new file mode 100644 index 0000000000000000000000000000000000000000..18ccbe8662b834bd060a9a0f999c31e3df71b978 GIT binary patch literal 632 zcmZ{gKWI}y9LMjym!!YnK@b-~T+Xe93a?$%Zf%p8>eE0d#imQgC$zYzvxCne^+KEk z2MG@x4swM~rBxRzVulxv4kC6C!NDoKMM(44yZBTP{0%?u^W}GUpF0b@b3mTW&$;u$nJ3la2ml<&|s2)k&6Wpq>+1c08WAww&17)aH(s-m)8y zn~!9J>^0d{Dwv*`v=4vzzsv9zt=nO{Sk;^SaLvHS1Y84i2`m|Sn?TOMy98DYv=XQo z_?*D9fumpWTc~(l7t2w9<_x;6g}QwwVjy#Hm3V5SBBt0dScrI)U||)u5pvo5aVD+`g0FbY_v1b0o3X$<1!Q;eoV)aN z(Y@#rLWC9AtV;7w3ai(b*NHg82O!?_V-N>?2x5yTAP679VRLK_1JHrgeF8j#y$s3` zl;`C!L>c5+1fK)SA@Cf^1o#}vF>u8FG3=Q^J-0uEP6G2s6M)Zr3QdBKE%dpKhfN0= z#eM^n)87HTuAJTu^b+U~KxO+Qh#jv4+LfJW)oXe3%#MM5o5qPp9_Up2S8fqO0vfy! z+2FZ23SJ5bUirRv=c|6`KP4wdSuMyZL|Ig4CBZ0%>a?^lnnQI`+86;UlnzFS%Gxxa zv{EcpYemLLIA{ZFp~;p@YsDHf+2l`Ft6V9s&9Y1z^_4=}3ze_xVg>3ioItm`)Ut2qJbg2-Q=f0p(0aX28$fP58~gAvS{8j9mf>Yb=x$f=Mpk>6*ZK5w%LWLSpyL=ujGG(G$G%M9mp-wf?N@8NFq9Tx!yIGCQRB3B8fmLO+APK z>I0|_3KMDv@c?27_`;^D1wp84Ls(RGAso8d#S_!0`!-vM+L+jm@I~xmeGd=%dT3wo zIRHOI8;?+Lq0vM#*61L0yai}Weu^(%&XH$!3jTeV_C0b}r^fsSktATj3po}%m!E=H zTJN>*du!kH6aOjIGm^=q+C@A>azgDPCNw#w`iL!>98vp-ZJJPZfY_mlwQRm;CO^Me z%5zS_W)-|bO?F|voG)>c_5Ng~;>ALFlnq9i%<+%Ik!#IKtz~WQXz3NZdOy0Ss$?tT zXPD%=XLNk{%m2NG3v9y<>xGIQ^22KeK4;(>IGw?afwvjV8F-gL(LgPOn+CpSFl%7@ z7yK3~T++qQGk@|hb!*cb_N{SGZx&_dizOCXZ?3X*T)X^8+UF{(WhT~`B&$nI++p5r F_7gqz0>=OV literal 0 HcmV?d00001 diff --git a/c64tests/dcmiy b/c64tests/dcmiy new file mode 100644 index 0000000000000000000000000000000000000000..4df404452ddf3af0012ce2dca871a5ce713e997d GIT binary patch literal 635 zcmZ|LKWG#|6bA5_-TU+2B!}1tVl#FLD6DCeU}KU??sUDt83cm~DOX6aR67gTA~;9H zLa>ly!D3)1kV=f&s06RrV^9#W5kZ1g*v4vex6Yg^g5VUx{65~W-wp-;7?8(Pr@ZN> zQ{GvR5F%;l@HVSGoSVJeyhh{+k%8P3hah*v0OYzDf+Qk`-3~!>$iN0Pj3tIj8Br8f z>{n6c(3nt%kW^6sLLkOa4L~5OAqa+wpcuz(f=}$AncE&fJcNmlF?<#dc3gZ=!a$U9 zw^Ko0!~Ix0`^wza&YtQI;UEKDKFA?;{T7(M{4`&@R3p!v6!`Z%&3tm#q|MfqWgK9^s^mlDEPLEzu~X8!e`r6`)VdQv%<0P2&<#RO3wS0zjs>Z7WR$rx%>6->ra z(>41}Gxhn!cAaw)WnJKp&}J9rm+Eb9Gup)>Yd04fOQWnh%4Cgy$VXLsZc5ioao2QS zce?lEd#X!zVt$@UZe~W?`@jD0F>0|bC+asg&7~l^YVoOnXK|*$jK!M*a~AIkG%b1s zmMy*%n6-HO8-EHlE}F#`STK16z25YebED#$FN+lxh*cKR*VkEEFpXW9=R+zZW NB-vPH;tum~v0wFz^TYrE literal 0 HcmV?d00001 diff --git a/c64tests/dcmz b/c64tests/dcmz new file mode 100644 index 0000000000000000000000000000000000000000..fa04f43bc47fa80e8eba3f090d3784f058b37a5d GIT binary patch literal 612 zcmZ{gy=xRf7>8%~Nci2rAvS{8jD?VZ!kR{jm6zN{%xd5WBB@TR6%zahEG%4$;DlHS zDZ;UkVqhnbO5#VOV!UF*Vj*HDZ0;+`W%6-07IEfW6#|)Jc%L8dJM+v~aL<9f9J%a_ zE{{0Z972e&e4E{%xfkPOw`YjBz!Qj1d<$ZYHy~zt6N2y-UN5vwkw7N!L$0u?AX_L8 z$t^?*d>`=m5o81W0I~^w2-ybjVYQ7V)2RDa8wi^i+6eKDZ)0Hx&v*4uSD(Fym5_J9 zexjQo9_Y59GHxE)i(O$;lR2_tE3o8P{c_0@of_ABL=d0)>teuvB{uvw0{&aib07WC zk2FE?jhwq?z`4A%BpJfjFz6YYtO=`vPRZIc8Ln6d-~hw z|9om0+@XthuvwnhLtb##z}FNU16NbX8+f0>xPgx;OcYI6ydb~sf>s^7WLG99td)MdZij?1{g3OgDe?Z+T{S7oQ0CNBU literal 0 HcmV?d00001 diff --git a/c64tests/dcmzx b/c64tests/dcmzx new file mode 100644 index 0000000000000000000000000000000000000000..c9e72b7a238329ef95e3a1edf109924768b5edab GIT binary patch literal 621 zcmZ{g&ubGw7=~vzTHXu<@gj(q@z#RM+Kbv-+a#vCHYF61o_gGBi~oWLSFkvxJrz7i zSm!Kp&uwnI};!W`2WjC9oX`7~PoQbP~;2ehUdHKGXXU2ei3S@osoHh1j z)VgF5LWJR(EKhT5`NqgbL*?^y5__L2Md>bnrJlau1yXyEoZ1}tl z)<@hx{UPEA;qkbMBx4t$4B2^BzMdl+W&-xTpY&{UPo>IwoCxAl_nA26J{2F_7Xt1} z$Fc8zQ?L7H$+i{^N8~nweS~La2SE?vX}N>o0O3iwi{KDpR_-A8$-Ht4v)j%?`5eAQL(Eu|H6)WfEgviD#7aqFH_5-}6!IG0rZA z3ze>^#ja3iNsAs&Irpb_U`4M(5FE5oTzfA>MnxXs-wHN45 D>n#Vz literal 0 HcmV?d00001 diff --git a/c64tests/deca b/c64tests/deca new file mode 100644 index 0000000000000000000000000000000000000000..167ef546390a51e3a95af2d34fa7ed383958f43a GIT binary patch literal 623 zcmZ{g&1(}u7>8%KT7Nqb#EVe8j5h-cYcEPY^&>IW#oDEacex+@kiK~L(dl=s5$2+{wi~;93$fL>A_SBO} z`SRK3?LKmJ;*lr zK4b^{0J00q&fZy*12jl{q->eGrIkZvYh^7MLiWIkRqx@knk=aM^)_l9oND%g&wLZX z79MWH<2!2IE|_68TZn@nUBnNRB0IwtE@#M7GXeWHOa=~FQK{CxP6Y9(|6CmQpNS3s zrGWp+^PJmX)%*S_*+(=$oRyo1_7I0QI zFSt3zNZ6`^-M4f$onOkiOlSQ+nLB^6ur$gBqfBJj#&G1?7)y+0Wj>~)i)Qs+?XIkn z^%}FOU}|P`eE7@%ZNn?HVusB^SzYqNYZ^YKU~4#=!ihjm%_Y;MhZ7Hd`V$e z!`ol*Tc~hJ6}v#a>`}{ZOjXRAVp Gx9Csh1_ags literal 0 HcmV?d00001 diff --git a/c64tests/decax b/c64tests/decax new file mode 100644 index 0000000000000000000000000000000000000000..69c31f94cfb80a661dde0bc761625297ba687bc9 GIT binary patch literal 648 zcmZ{g&1(}u7{(`?TIZQ$)22<+Mla*dfWq2~(p%alCc3l`gNPS<+)S0*{2)+!%^Luz--e)F8-7F<{=g&9` z59Xco4k1Lwe2d>;_MPS8QsEkrCk2IkEdY5a803~nKoXI}lZI^sg?76XjTGKCGEjh+ zfnpF@s073;R1$FVw+>VWJrW+T!!nXJ$LiQQXv{&`5IJ;h+|!+9J>O;MByjpu3iN}R zKw}cO)9}QU-Z%|@0)zWBj1TsyUJ}Op`?Sx{rwES?k{HI_64l}PS-yJNCJ(J4o$| zMFTG)ST^t~f{KA&1lJ9Gj9|&Y%U|$2Q2CNBUSnQ<0#0wCX|0dDdb8MIp4epV*zOyZnIzkrOzbgtm;D4CPvnUJ literal 0 HcmV?d00001 diff --git a/c64tests/decz b/c64tests/decz new file mode 100644 index 0000000000000000000000000000000000000000..f7f39461d0fccff31485f9bd713a98a78727f47f GIT binary patch literal 626 zcmZ{g&1(}u7>8#!wf<%xh!>%F8E*y@)_PES5Nw;8Xs{4dk)C>7p|$=4LJw{Zu@mA+ z@E{@3!<3ysPvX}_r5It$A}Hcb@Zd?pHeYSp#F@A%2)>8meSW;d`^;F#od9_>dB&M~ zGU;4!2qDt)Y@TJwhqLLKMIuj%2y$EOLT-r`Jf_m`|<#47h(w2 zf*@42AuOsopib)ErW&9@!lNZ>o0e6^N_1_rY*W>RNYHv0kM(3m->1DfG z^zW-G+4A{$Cb^y&9q<0~f7{x1RF3a6vKLImv0t^5E literal 0 HcmV?d00001 diff --git a/c64tests/deczx b/c64tests/deczx new file mode 100644 index 0000000000000000000000000000000000000000..d8c0e7694182cb564495c186ffac31eae73d5c81 GIT binary patch literal 635 zcmZ{gKWG#|6o+T`F1PPZa)^x}He=_3!kQ)$Z1U%li!KI^AQDVSxq$>rwGdLcDGp~j zu@F+ov5;cI&Os_kqK%4p!XAS~5E~IJtim-`o4a-9ToD9cF}&~N4fA_rfp-qb^YP2> zd6XO`~}ae=2G-t$us`@9cggAYIup21;AP&X-P+fHFS{unwa zPk{rTxnx+n{nAgc4ShzUh?R*qmYiV9^3 zlQC4*n)#>c>fBM(q@O)|w7p z(3v;v)^_|@w#a_Wu2aGE%<%Z|m;c*Fw`kLjy0wPB$|j9(pi3}pVu0j RE0jN=f^4o*{*Ze2=`ZmF@`V5Z literal 0 HcmV?d00001 diff --git a/c64tests/dexn b/c64tests/dexn new file mode 100644 index 0000000000000000000000000000000000000000..c02027a0298e70f2695482eb10b3fec1f9af5b6f GIT binary patch literal 622 zcmZ{g&1(}u7>6g@Qhz%T#ET$a#+w1fwHHfn)@)66Y1&XkJ@vS1O8)|(2e)8wLOcl` zBrJHCk}32geqB_=2pg6jM7#+eJf)kjek5t*Ou8xvzK7v`e$34K%p~BP1bH%f&PqR< zv@ThM5Rvc}Mtz5@sx)KYQrg6$-b*p=y%1a8 zYXR?#>pCmn)${%-*+I}ln37!teS~M^4uS!~Q*sx<0m2h<55XZqQ|==eB1|mlubH-I za(SCE;x{T_Yo^XF&n((`rnAnUEI)fSyEw{vqf8{()^Ma+8;cT4N_2)N#|QrOU>h2}e!l^VH=F)K9$4(P%=s{0zHO#pQX*?@>XP7bq`K H=PvyPSr-O` literal 0 HcmV?d00001 diff --git a/c64tests/deyn b/c64tests/deyn new file mode 100644 index 0000000000000000000000000000000000000000..8c9e0687144854d750383b1bb96e9cdc42cf3626 GIT binary patch literal 622 zcmZ|L&1(}u7zXg!ZK=-=1o0w>m+@vmaqUIP&9++;4M`h{U{5`+n&Mv|^xzf^PKYPL zgM zd#?q&H?Et#`%Qh`KTCEI^bsay55WN88M%w#5aB7ghhT{Cgxp7PgwT=)2u28v75!^w zocVmgVT}0AD%iTEvn%sUPJ!vH`zI@8uBMm9S$~{~1lt~stJWtXV?`C8P@Rirb-i|9 zR>@Y4U7&)gJ>$oxzy9y&=V-uu%a5>kxwN`K`5h|A>LTSu In!Qbb0`ZFmOaK4? literal 0 HcmV?d00001 diff --git a/c64tests/eora b/c64tests/eora new file mode 100644 index 0000000000000000000000000000000000000000..7473a9b7b5bb47037a36c2f02c254ec4f1536136 GIT binary patch literal 676 zcmZ{hKWGzC0LEV~TJL)hw2M?-o{)c+Cha9{Rl2o$HPO>RC?dt7gUS_JbQht6mqPG` zI0+6C4;)^}D|8aIE-GS%lfyy8O>l6MEKUyby?81JzTxrxzI*TP_ueH;_pnLsSBm!h z!-{>-aV3*a{R6|*+v zS528gZD)Z-JXTCz~``I;elFM zRj=5|qL)MdLILJSK8bb_cT4d2l(LuxJAnyhur{t_I!8xN6Kap*3_4VC2H)}+Bwfc; z=VB#RKc6Cxje*I&3I+?Tmg)_MF%qP^V0+Nr!qT$SV7e>( z=^C}O)#XuVk2;ZJ?}sDTesYjlRpv=0y>4`yy*si?c6;m^6-=!eO>h75e`9cwc8uU% zwWT(B!6gkJVz4!oV_4MiGKMo6UdK?=(2rq7!>1TdYk2hwehXF4sljei&pHUZKi@Id o#$5Gf-lQJiqCw(?PX}Yl)nRh~_d&DFU7Ei~P zI*YM$F+zw4H4Jv2M($bFTJ|y#$9Wv$El)t~@Fc_GpH1kA+y`Rpq4#JaAT_q2z&}&BbcK?>_lAS)g zK?PHLX4AXB{9oC-NZUqlWH;3zuXjnq#{gm)&IXXv@G5|UhBpB?8U_Je)$lohyoT4m z;CCRqtOmP7z33st21{*YWzJPM^G)jU4()|rKBAL3mF1iN{d{wMlk%tP+txdj?^Ab= F{sca}0A~OI literal 0 HcmV?d00001 diff --git a/c64tests/eoray b/c64tests/eoray new file mode 100644 index 0000000000000000000000000000000000000000..340b6a5142addb499f0c59a3e68e11c36903c809 GIT binary patch literal 699 zcmZ{h&1(}u7{(_XE&B`v?M14Bj5h-cu@|NJ{@zVi1EGlZl;c)f{09_zFbcs5(TgB9 zgn)-FnL_QM){l#dm_x#%AmUB%;3?$d$wPc6jS7Nu7@prVGw(d}PQY}Ine5@>*~n6R zF>)co81n*kLpMo0guTfo;OokL_tgBDH3VOB4o|9 zC(<=l4E7|<C#Fdk zs0?uoElwQ6D2Z{bP4R6q{^_s{a;XLORpzleukU+@>wDg*`U?;B zm#*vF_)5L{XQ(s=MfhQr!N7ulT4gb?;U8By3`+3lRUU&fe5e8j4*Wn(_c@a@)>>GdYj9A?(Fej DN}K?0 literal 0 HcmV?d00001 diff --git a/c64tests/eorb b/c64tests/eorb new file mode 100644 index 0000000000000000000000000000000000000000..3b171684991dd13b81bdac805bed4d0dbed4c3bb GIT binary patch literal 677 zcmZ{hKWI}y9LFy&rM&M!&@NJSIfwjtNz=Zh|D>DI)I=W!LUHI~Cw+kyaaZVI+7i4F zC&5AD6NguFg-qg~E-GS%Cl3b^H^IS4vN$=!-^Hhb;K3c=&-Z?J_r1HA=^QiJz2c0$ z@}Ouh+l((;(1V!*L5OhZBXzyW!^NpJH6Yg%lbWWmHUEf#>3mc{9ox^;vK_# zS835A*SoCYLj<;lLIfoZFC#do;dKO64TA{QHGGQTtcF*=;CGU_w9P4c8!SBJPGlRryvGA4Y9^E5QJy3-^yu`gj&)Id9N?vNvVuH zcmdosYh%7?$`oqj1mQQeN)QlUgiM2%AT!`)$ShzbZtuz>h9o%BgrVheCAM~3He?RG zg1sCbs*P23#9kWx49*t%<|jUj)*QCy;qnEQXAx`(hx_J18gUh4by|gMpPFQht3t&o zw5j404zn0Vohznll$~ewOEL1;7@6$rc=W>|TguhVUnhci)O#+Dde21Md!gEU>AKFw z7xha244H>tK#-8L@QVn}$T|2W1SjP@{4#=Rxd7ir0J#Xif*`V@U$|&j>J6JQ(o1&1 zd}yywS+*NYd-*?JqqbCCo_K|cCt~cwc#?G(9Yt1D@~8^EW_0iM@5(M2^w}*cnA$U$ z-v8zQ%HCz#HhKrurYdrKS2cVL!P0OcgrbJmA(S<|4WXuC7{Uz=pF=2Vc=HQ>2dZ9F zgWaKS;ux%9u5GMNIqGKKp)TK{y~wKvbTp;1d<(v3n(H0PpQvwJ-=X{|bq4e&@BsZ7 literal 0 HcmV?d00001 diff --git a/c64tests/eoriy b/c64tests/eoriy new file mode 100644 index 0000000000000000000000000000000000000000..194802bfc54364b97818a35f0a66bdd49f8e6aa9 GIT binary patch literal 702 zcmZ{hKWG#|7{%xILfAKOXc~#yj8+~ftZ9@Kxj%b*w|lp_Ge;1#O1Xgq#a>L|S{%-C z79v>a<-lUXP9T+-#6~4}#fHTqh@Bw8O0Kc8IA_jPL2!!U{oc%c^X8k3>7O#mlevr5 z{IfahibV(!nb2U5Y3`BJYI`?`ILj9x4tN1#hZiB%cnN~=GIqPR77I{I+N*?-Kq#d$ zD&TeS!1TuawkZqn#(Bc;Xq6`*ya8DR_aRH*i;!i&%HQ3R4Gc*#)q$bqNhLP6x=lzM zyoGHWPt`_OmDnyKD&fLXWPaohx>Y=^A>gjce^0RlEKfvVypdBrhGr4J7Ae6|s-xw5%asL^2~?#7!iS9^w{~%!+Px*{QbL z4r64n&<8t$_Da=dr_Hoi`Qx>{n!7yl>Jv}o*oW~X>M%RXtf=5wm3htRKZx$jKG})b zJt~;mGnwB1<^Re-llF|kq1#c1g28nSM=4kuE~ik|@Fs!OSA%tEkUs%yINvi?r+sxZ@6&*9(n03+b2^$L7pZdG> EC**YnKmY&$ literal 0 HcmV?d00001 diff --git a/c64tests/eorz b/c64tests/eorz new file mode 100644 index 0000000000000000000000000000000000000000..fa3e882ca57ad20c07d29656e3fe6ab9552d137f GIT binary patch literal 679 zcmZ{hJBSlO0EQ>OMrz7SNz6f28`h@D_zC26cI;!Io>1gBX3@86l(Z)Ovwd&nerOL=?o ze#x%dgbq>Xl5x4|o~;qS+Yp zOQy`AF}4W5tdm7Rcm>h|pNGtXFF@u1+q$+RD;Sb!UmJ#w2UXbG=~N-};5F>#aZgRG zt1Wgd1X*O9!2HN((V4?-8y+tzhY|(>FMu7#jFMQNRzBS$6RjDwPH_fZsyKshIgFC7 zW2&RE0&AX4k%2KX*_ZL?hfB6ptB-qu2;x)!vDoiF64ZYx;6L*`_sVB=FaHc#Kv+g( z$ytOIM91VD!g)l8rHya_(X=cgtRjLeA*>-vtm!*la+aGdhcVJm_rP92cPExtoEFnv z;ZN6UoUX4-y7HtGDfWImaUCW{i8W=ORMHzp?`CjA_Q+nqJSv!)GkLuI%m0o2bF^#p z-__e{k=H-3;X@3zhGGm$8eYb5O2g|I8XAT%tZMia!$}RVe!*{{`WZFYRq9y>U=J6& q#`=`2zRb6&$J?}@cz%nHrj*Oq=zFcbxlQ>)_1iYvln$bwkq|;>P_OF;Rf6fJOOvWO}Ohk377B`UbfRJ7?4wPLKtv7UI4$P z*T(#|E)uAX4*mjyQ(_MOB7zx_hrfgXVjg}8L1ax`Zn?5tZ&Vl~J);Y@ z57m{HS1Jvry3C)hQM+7SnRJCo=f>E_@kDhP9YxlpcvL#CYu$(51JNY|kKLs%lWQiA z{lEO**twAA>Q>ceLiTCBMwKsm*t2FY;!Kj;5u{_uxmawXsdPkbiAshw?tPJo*bg?fIVo literal 0 HcmV?d00001 diff --git a/c64tests/finish b/c64tests/finish new file mode 100644 index 0000000000000000000000000000000000000000..52f6f4521a292af91720cfca56bde7af198f406c GIT binary patch literal 45 zcmZSNVCP_Dn8~2U!Nf3AK`F#FI7A^h)HB3YA6j16oPIGHH}+XAX-LnHE_ z3#Il%%<$5yHPcag8oHWq)VWQ**SdRGd^I$Q7h!Pksew|gI#Q(_=`r4y&t{}aYQi8L z9ybfb%w-EhrbXsCVU2<%1Ycxv(GeG1Wf37SYXxtU6CTR8+Ekz6K5)f}$!euhxDlb( z3NH*gtAIk*!nZ#$W1*#Y;lS_!=1dCPkc{+t4}ty}6~{7D izhwRpGv+9t#q6i~|Hq7cAM-u(>2208Mw021&ep*eY z={vB<-Ok1XzX!ows9HClcF3^0ht-03`@L7~7oz9A5#YVGZhUmP2QF_zN9pQ1)?=ga zOJRA*1O5mES!x4+43@4}F5*Xha8G7ZELgZVaedla9r$|4_W1|G;Mnu8%^#qv^wS{u z7O08Rlp+;5Xw=R-Wdo5`4a}m$a>T4Uc*n|e<#l&b;p@K%Wdpl zGVKd8ahBz1$t(?1MXPLJiQOQw>pCET&%`_v%igi<9cOXf;D=QK{D>+Qu~fuA6|t|y zD_XouG5>qTiN7m~juiWSNKXAByy%p#l_| y;p|>FhO3wB4Z3L5@mc;$td0?rF=EDs@7+p9#Ej9Zac%c|?}$eyy%XLu>E?H=n?*GM literal 0 HcmV?d00001 diff --git a/c64tests/imr b/c64tests/imr new file mode 100644 index 0000000000000000000000000000000000000000..3fe057bd5645a3baedee9cec3927cdaf101b160e GIT binary patch literal 509 zcma)&F-QVY7{}jvX`kU07rM#|S^}k02SsQwQ8J%inS*VPHb_f@w3Nd+1P|JRhA6Ay z4F_!z<=AlBVe2hHLxjUEp%P;6a;P@H?fV}8-}n2T0K^aIES^w8O7bGA#A65{CQzT) zMy(gU2e>O`o5-^TWrA=*OKF%r2Bca+vknG}~KD&z_! zlqI<>b%!6>aSOB$9gjc8%KT7Nqb#ET$a#+w0!wHKwH+M1Z?(%Mi&JoUI@f`5U~gR2;vC7uKi z5*9p6$pm^5zb-0b4l7F!BHjcKJ!Lmv{Yu+76ITVn_b|NAk9T;V83WF7kS9}T?CEDy z_IaBSA`H)Dd761#oS&N^;v|nDKJo-&jdvi*ybD2i53l^bZelcJ_ycVCL&yYt53&Qk z57`Ajfb7Atvv*hJ5G@iNsamFPY3)$eT3Pi+kbQ7sHT!s~CJX9*vx7z#r`rSIE8m2_ zg-6?P`Hot*3uajD7?I!ZA$q73*;%%5HA9}83D}QOGIYp_O11V4B8W%5m*TMZLackQ z1-v(|>)iRS-uF+*0m31otlUJnhv<~tLb#9Ugxp4WfasXqK{!HW$z6oRii~CbH?z6? zLMg`>3F11~150N!`K4Tm>1^;PD-|ynmd4p|oQVuuAB|mG6N#~`%qNs|*{t7h+>>>( z)?hXjOwEjsPk;HpZ7@%3X7IUCRhQi0x`r<)*c#5IFstER3YRo|NTH~qmBLL8-%^;< z@ctM47Ajm(#V%4ed(^U9(>3$fq@yHlo3WYGsk~G8Lp!qP#+# G+w>>TX$4RK literal 0 HcmV?d00001 diff --git a/c64tests/incax b/c64tests/incax new file mode 100644 index 0000000000000000000000000000000000000000..065ae31834ef4766ea1ad68f67ebcbe5a84dd91f GIT binary patch literal 648 zcmZ{g&1(}u7{(`?TIZQ$lcr76Mla*dfWq2~(p#G*Cc3l`f=Dm+xc$PvK>1`i_M1P?t($iWVc7j6=HR#3>d0+5G-L2iizBoRqGYucfpFm8{cnZj{13k8U2 zC|^!=RjrAC;D^)Rw!9(tbv__<}8#Akw?$Q1JhYC^F4-c0_T6EKtGB! zniII2fhQ)-#wqYK7(AppKG>&biH;xb(<6ofg+4V%VioX` zcgc=%mrBJ|B8kuZr*h1HBES02CG}r;o_qVVdH6r2QV6op1(ilH4Sh~cAjm=IRR+Nf zbVf}gn1zO#LXd}!t%aYqSSqj7N}Q7pZG)R*yoGYTRO6wS`s3BAS1a|AmmPW1=I>8N zQTy>>Y|R9Zo6K8Qd#}5z+T^gyt4wm!GrHdW<^RggGHY3#qe{aJd7T>}e2Bma;Zg*P zA-sxUDTFr>R72=Tuo}Xr2#O)R{sq4SRj!%hb>8#!wf<%xh!>%F8E*y@)_PES5Nu6NG_(*?k)C>7p|$=4LJw{Zu@mA+ z@E~EKhbcROp2V+8meSW;d`^;F#od9_>dB&M~ zGU;4!2qDt)Y@TJwhuOKAMIuj%CgeM@3%Mm)kjtVCNkj+F%U#nnQEQ?YY?lX6yAVUD z76hTH4PjB$0d-RMHq`)i5*;m3+qA4QR-$X0Wt*xlM1t13c&sNg`hKm2ppDZ%0(=pB zDDPvv4_6%MWrx@ZL=Sw7?lciS*y$iDYD<2W&tFfH4Z8vUec0&d$eK=#`7I)e$Gm6q zi1$=}@?J=IFI_jc`b|IapHe-914Jpchj57Kl-fr~Xf&bv2rU{NR|g1f8c}tKFhL`0 z$$ZardUiga=A8J=DtL*S?DA|Oo#!U&{mJs#tC_+m8;mlUyy>)$l+IR?kTxfrGmypG|DfwwVa4b)>; zH1IWs83S*A!Ed3=HC_A?b5qBtQ=h8Xx5smOvnViEEHK}Cb%Qm=waa$YzF1l*FtN%c NSy^D>F3a6vKLH-~0)_wp literal 0 HcmV?d00001 diff --git a/c64tests/inczx b/c64tests/inczx new file mode 100644 index 0000000000000000000000000000000000000000..019a4698f9010654a02ad11293fd9b7aa4dc822d GIT binary patch literal 635 zcmZ{gKWG#|6o+T`F1PPZa)^x}He=_3!kR`2Hu-bOoh}I+K_r-va)ks-wGdLcDGq13 zU?HTCVlF` zPk;l;0dPb)1Wr+AfNtgCzI3oll+#4pw6s-h;?{mRj*=jszz)G(Jz3NDI|GP^aN%bR zpSg`;0UsC9=VN#nmT)iT7P2z-cHw9My%bc?%Rp`EyzCNNx=|*3b|2XHte<+sSiQqE z5hS3&3sDT7i?6{;0l_QZ_wIhvyZ%$s!o)#Ukv1lP>bxvqf~d~QA|@2oX*q_;I4YDS zOeRoS>*k+ks`E>YDq|!{+rXZnantk5)dn-pYGdvi^@ZB<$T=e?%Isq{irOvot#uu| zpfhjS?d|xHY?FhSU892OnbGm#FaNiV7HP|lj%rPP$&YRt_>_Zd;BpQ#2HxZ_XW(59 zbpzcTRt$W}Vb;Lg-|#0;?Yb_uK>f-obh}e6`%cNzFY{IE^EDb-uW!?SNoP4$Kdv@6 RS1G?w1=(Dq`~mgu(O=#V^8Ww; literal 0 HcmV?d00001 diff --git a/c64tests/insa b/c64tests/insa new file mode 100644 index 0000000000000000000000000000000000000000..b117525b0994c38a3453473bb872961423622598 GIT binary patch literal 609 zcmZ{gJ!lj`7=~x}NO*7H5F0^kMymu2tZ5ACazF7-mjuorBB&`>NU*lEa4kY6#7amJ zjs=T>n?Nd2lO_q`6)TH{h~4IX^Rs)Kh?Pa0IadY2DTeQP`M#NF#(;eRE&ZM-nyCQntWMeh3 zgkV(m;Kv9q%LDj*1Q+EY`~<;yc?ACiK~^5aKSf~7>)*(ire~`q#)uczz@B7vHZ?t0 zsxqB*|76w5jq=w&AdPzUZkF}ou|pLa_I%%Czciqls}+?EEXw$NbURdC)3XTtN;K2 literal 0 HcmV?d00001 diff --git a/c64tests/insax b/c64tests/insax new file mode 100644 index 0000000000000000000000000000000000000000..e6b1cc3ec27e8f4c30b1c7dcbdaa22a1c6a96ecc GIT binary patch literal 632 zcmZ{gKZp}S6vk)&B=_Dx5F0^k#_kRj)@#)3?!3fAmkY#0yj*kT3U}D3wS{Yub3&{H z3keGr1DS)X#8Vp;F~x?#LPRUU!p5+TkjuYyCawyCuXw!Q$2V`j84LVlKprlh@|GSi zdS^XCh_FJNRcYZtW$nuHH6l*%0f@K!5X3$og4pIG5QLB6pgA$a0JJJ~p8|KW@1h(- zd0rmEcNcjMA>e>=2t1E+1bhzV1UTZ}1Rfcq_U#R!GlKba3h^DF;{aw&Yl+)XV-Vpi&P`UmX62~ur&dN@+>g57?Vkf}9rpd@BceHBqZxBI38a@-b z@TvG5J{J(a2m=4c7yZzGN=_kmQ7y<6;vA}zl3<)ibzE8)&!IXhZHxgGN(W;^Wo?;H zS}B&QwIX9A8nl76&}hr0^nOj?o%z*-@|D(1(KPs(}v~cm~d7uwvj<2CD|%WKc2C&7f}J zQwA3dy#58h1C=l7VyiS*ID%exsbyc!`}$^Hrvcxjk@a$eCV8FZoBDCCu~Vn~78PV? Llk(ftze#@rt4#Op literal 0 HcmV?d00001 diff --git a/c64tests/insay b/c64tests/insay new file mode 100644 index 0000000000000000000000000000000000000000..06a4b7346b68d12b0aa15d35bfb958d4c15b3744 GIT binary patch literal 632 zcmZ{gKZp}S6vk)&B=_Dx5F0^k#_kRj)@#)3?!3fAmkY#0yj*kT3U}D3wS{Yub3&{H z3keGr1DS)X#8Vp;F~x?#LPRUU!p5+Tkjv(eGjUZAe8uDaKEB8MW-RcJ0eQH1%3FH8 z=$-WlA;Jo6R;7gpm9;C&8$_Jo0}yZdA&7lG1hLIi5QLB5pgA_f0JI==p8$8U@1h(* zd0rmEcNcjMA>e>=2t1E61wMyz3>;%}?X_ETnj#hR4$~7WLNW*6$ z7d{oA!{-9R7eV0P_@W>BPss_yE~*7Ng*b=mq$C*UQ5}~S#&f8SN*iN9h0?(oQCVB& zlU9nQYOTl^i3V+8Ei~G4X}wruMw|T6YL$!S^_k|jQTs%Jy`RpqcAdo9(#ahidfRT_ z>)e%Xvfp9nsbJbOYw!N@f5&Kzw(O`^Zs?^Tx@zD<2A+X48LSw1mBFfkHyKn6bTg{o~1FwIonk-G_qc9&?K+3d{aNpHFoNh-=c!- LY*K!k`ZwuMw%_;k literal 0 HcmV?d00001 diff --git a/c64tests/insix b/c64tests/insix new file mode 100644 index 0000000000000000000000000000000000000000..85572f234792229716b98bd5edbc9113ae8b1c12 GIT binary patch literal 626 zcmZ{gy=xRf7>8$fP58~gAvS{8j9mf>XDpNyg3*h2x?JFL5w%LWLSpS0S8P}WMeIZi8;|93U&$qV&YY`);9Csy{CHp9XU2ki805j!@%;3o zsr>0YAw*if%}XqIuT-8dT_y6UXhFUe+mM^04Y?#bkVJIxY^`T5Ets_LhZ4S0n)(na znkiHl#R;{IA1TBT@PtiO8-h^Pfv~9RK{#}yhli$7_ieNhb};cZ#3!+XwO!mD=%GEm zXCM3kZQjRL8_gEtv1S*Ee5fK_6Q3FI4jSs0kL^h47+DGKj*jhB-GgFwI zs}wjVL8}g4qb55yTP;+$$@+h?O6g*;I?B>fCUgA#aOB!>5^GVLJ6d|luCIo7RGn;w z{1lU1_l%BrfBC=Hpv>0oV5?ZuLtb#jz{d>o22N%$W8hT=7Yw|~pk$zt!F2RJ^2%pJm?UL7Hz&uiH1qUAAH5qx)%146(@Q1*c%$^meSk{}<&9fD8Hpq|_5Lp*@-A2EF7HntsnSi*pp zaj#uLR>i|u*@sf!RrbC-7(g!rRqo}GI(`#$Uv`EqT&|L*b_(oko@PF|r&E9W+7b~Y zq~UW>3ZIG3;R^xb%OLP?ebN8=&yp4V*;p7Ne2@|byAivp{S0_GA1LaP*yM* zMP;p;cbciqEwpNkktpi`dxR#No?EQ7n8~aT7Fnw?Utb(%?l2Qo_C6n0?K-Kos*5|i z^P1gx5Z{*_vKzAtR4_d=+}{25e~(d9 P?@&S3S17+r{oC{x<|*_w literal 0 HcmV?d00001 diff --git a/c64tests/insz b/c64tests/insz new file mode 100644 index 0000000000000000000000000000000000000000..717dd27b800507320a8e362ae7a2bd6e816f0a7e GIT binary patch literal 612 zcmZ{gy=xRf7>8%~Nci2rAvS{8jD?VZ!kR{jm8bWmO9E#QNp)JSkl;UHVc}YYOo)|W zA;&_Bft^4q@vBi$uUJ_uMC^pkeI>VkT4^PyJ_N%zrB0`!59im!9X|`KBNB z&ysya3h|`eLbQwcq})cdhxoW0AlgTKRHldy5a;C%q9J0dVLqf-D$mwSjFBK|g5AxV z>|%MYRA(mZ|H0pDp57AUApn`{L*5X@|#qU#R}!OsN0}F0ZM5A{{R30 literal 0 HcmV?d00001 diff --git a/c64tests/inszx b/c64tests/inszx new file mode 100644 index 0000000000000000000000000000000000000000..fbc2057080d37a254e13e743d8c3d65701e3229f GIT binary patch literal 621 zcmZ{g&ubGw7=~vzTHXu<@ghhs^p+A!HN04;h0WK(@h;u-V2F-KhFDoA6?c^*nsxJ6P@F(XJZmspI#s;qeaG z08ta$4-th3jz=xT8LJ4Dkey@I>p8Mv#$ewEao-~MlvSyxh#(Gio{MA7Gx5=RDd4=a zZR_qg^}2tS?7&YDjLRMP`v}g+F8n@%({dO70fLjV2mcU3R_?(+LSQWDpP4QctF;1S z#0~3UPFB0A;#{G|wCntFwer={+|VUMCvxo5U>LQLiH!vnJfku%ne_+WeOV`49y?D3 zQ$54&!(aYy=~n2P>28-+)R67o)bKflyoL)YOlx?P!ixdQkd89HH9l0-u{B$ zflAlZVwb5sej=N1Os<)WBbK_ESEMo~8T_wHE15 D1O*6F literal 0 HcmV?d00001 diff --git a/c64tests/inxn b/c64tests/inxn new file mode 100644 index 0000000000000000000000000000000000000000..b18ba945740b777b0bc0e336f1b1f47a36b059fe GIT binary patch literal 622 zcmZ{g&1(}u7>8%KrT%sxh!;V;j5h;{YcEP}R#OvQk~S1kPd%=h;$I;2;1&!{h$q2= zgar>%GKHSRuZxP9!^+Zwh&RDQPutB`Ka#X@CS4T--^1`eKW65AW(+vTL7q;Zu`|!7 z?F%*`L>QjQvNZK1U$|Ky;v|nCKJhJxbsj^Mc?*K@HeOddx``np@IH7KatnL_8G{cI z4Ix|L`;cu|cKX4p9HL3WBNfZkEv-#ftmW0}0b~b!gtZQyshv4>#afI;3#T{njrUO9 z#^W8hd{>Rz10z-xBdkVkgpZUWJIjjKQ{;sigZ&)E1BWcDG+(%-w24Q(S7Oq8DK@+} z0^VEKb?*OA&-cyKdOVRSUS5jyO1q0opt|YrTo?0!Z_=XGm&B&qp@mpA~qJ4_=IvUoAs5(Ls=*5 z4R($SruK}N&wu&9tzV!u)BlpIs6(!QL&MhuYz^lVn9=Y)fh!t5CXmOIchSWqb{GPzVWU|<0<8`8TKw#mgXqGM+I4$r@Ty^ GyYv@9fCl~m literal 0 HcmV?d00001 diff --git a/c64tests/inyn b/c64tests/inyn new file mode 100644 index 0000000000000000000000000000000000000000..5ceba8dfd8fc8084f279005785f418edd15999f7 GIT binary patch literal 622 zcmZ{g&1(}u7>8%KrT%sxh!;V;j5h;{YcEP})}|&Jk~S1kPd%=h;$I;2;1&!{h$q2= zgar>%GKHSRuZxN_hn1xV5pRMAPutym^do5+XX2_L_#TG$`7tx^Gh?7|9OTLL89VcA z+P+{DLWJR(EK5_5^TnG*B2MxU;v?UN*x(UFg~t$txACgh(M=2)g7?9@klWw`$O!xZ zG6o+a9748X+3EXha)=fQj#MpEx3oT4wN}<@hmalc5!O3+s&?ko73&e2F-~vd3-6(} zgGak?_?{ZK4@RsoMoaVR?c6^EsnGPI1?$hH5#k7CL&`=iBBl!irH9gK9CKv z(PZbSU~12J+5F4@ZM`C`o8G5fRULA?>l!{MU~4#^z>J1>3CwEvkU(BTD}h@Yz9w*4 z!~0+GTPSx`70Xa3eblmBnYwv5>KSiKG@4Q_KZ4%H>he70cc~!D3zS!A H;ST)?`3VNq literal 0 HcmV?d00001 diff --git a/c64tests/irq b/c64tests/irq new file mode 100644 index 0000000000000000000000000000000000000000..54be04f9bc4c604c4d6a240380486e38f81e64a5 GIT binary patch literal 3341 zcmd^BU1$_n6uz^QpPO}l%~(>fb*iPVkmBMGE={#$q_LSF3z|PH^;Mve{W&9DV%kU;I&kTC`oBw7;VH3m|S${!M^BKQl}Odp~u% zZm;X1Oy_!sOZkoFe+5c~dcd0=;+EI_?g7ywz9A>@73fU|dZVKzj{mQ(^ZDi$Mj*kb zXv<9TPb+J$k7w;Q@iWaWGc$cKLt9P}0cN!qFSM603T0(o>sOR5$NdEV8_<{Zt#)Ih(%;5+6 z+wZ~udyfC>ltUVRF@9_qdk{b7prr5B7cJTA#*aA|lgki)Sq<91^D%!nG~{}G%pYdY zYaTz!f35z5OPHrKYS7jV}yK~QOay~E0aN1K6Z#18$ zjyyR^iWhl<|11>0Mogr=+&Sx;+7mk+&{O1L|V^8O{^gd)<#weT#yt@pr89cdIFTRSH8J8SMgq|GBymT5&m`|HsJ7j``UKTI| zt8)aVcJ1sWoaExU&$yU7$Is?I=W=c+o6Wp<-K23yoINc={VqvPNrD8=K6eF@3-Ju! zk=b-XHm^wEmL%;5vn_53F<2lM^|FhCfI1tXzH-8v3JM@yJ7C0{hT)a&u!SmHl^PXJ zW_^_&g>7{~u8I{C5qnhOvCyOUV*&QK!j9HrJ#fFm8x{bcQ&@i;IOf4GDO?0NBL(8P zv3wHRpH}Bfu1}m#xo}hyodoWPVmzU&xz6g%Q=w5?fqY?5WhCe^J>;gvOOdzu+5c zHEA9@OxmePYlQ}@ulYHc^4TG?L*q?#$*W;@Ypi2FGg9roFCS(}*LvIWyU_B;+JJ7L~k1}7Ib9SlOuxV7#_#KOWC%^?bP#GI*1p^Ar~*&QnCF-D6gV9IgpnpT&Sw33TyA9(g;swz z|7Zz9441gkaLXAdY0vg-Z~`AQSYyHP;nx5T{}EB?&LoYn&~GzXvIa?rzz^d7GH`!I z1^fkKhLl$fcCe0uBs?0P6K38Z*}(4)43-bE)0X>c?t!_H=EJ_GjHa{)39|CqX(0x zjj6|z#yJBa#5G5!8zg*ZVR5;Pc#_3{zhiOWdn^IG&XT|pOTmksH1H@xC)^IV8Ys$F z8d{X&h90%9;huV6d3xTYtKW~FA%h7o-PRu799une#qh&Zq@5D8%8Ad%@nGJmpadA?K|WVu1c!}R0PK(!m{Yim+GB%SMe^H%GoXrjFqT_v2#JA?B6 zFaLMzR>-dIekg6rCfi+6@F@U8!Px+c3OWJIDtH?}SwS~|%L+aRFr(njFZeA~T9Aug yA$H+77~QE|{pye=auzDd|U!qNH`VfTr3m;407!t7-L literal 0 HcmV?d00001 diff --git a/c64tests/jmpw b/c64tests/jmpw new file mode 100644 index 0000000000000000000000000000000000000000..738249c183693c545698634af5690ecdb385bece GIT binary patch literal 611 zcmZ{gy=xRf7>8%~B>ZmRkZlC98Nng}#Wjs`U}4N&?vmBW5fp4ZyA=}r18gkZ6p0gJ zB?uRe1&e{3gH+;IqoQ81vRH`N$$jVJZu3=H#F=wd5PXYao*(ba`^*?{kAXZMKW%5% z#_jVqAw(Fy$+9%_X!^>v8$_Jo4T$%=39-&w5c9kZL3jr*R=SW4@E-U8vI!nTw!n8F z+u*y99i(l(2iXPRM{OCxEfY)dvSA67O{><$6V;PfleHGAZH&6a!dJe5l}$X{g2%Vj ziayu@`pf8d5U1RWP+sf|o1Mv!r)CV+JdA(1&jQ~$X*;y)7~{Feg$E6;Q9 zephe$r(_S|0MVG-Ko}!BDK`=BAUZC$5bh$fHnB;afEaWJ^P2F4cC%$(2 A6G+T zDQpc39tJWCJ&DzVsAzK7vUm^?Jcu6RrR+t7dZ;sT{XlSFK7J4H!~49WXx4cR?aW=( z7xw1#8#+RWDXvO}A9*(k!r7bP?D-%>i4Zd0>bZ;9$!T`$Y56AyPavJ&wNd zEYKoQ6Zj&~I`ACO2Jk%4Ch!7)PA%XD%zsho5(J*ch=(%lfv04c=Bb&$fL&2$3UiQy zK_0GHD5JfjCD(jfa3zhDa#VMcV+Zx4=EzL@R4hzEeap1u|__h#@{V;N2qqU z(?Sfn*nP~-xQ`fdpD=KrI*xVwqxh_U7B50*LNv=u5Y{2O%*zlqAe!M72%8XPcojkm zBH%R$mmpGBWZq(>+O{i%AV1p&@(HA7RJ#?MNUiu=v+FgpJJHOE#?s`?=_KkX6)P*j ziT3wIVvdv;VNLDd8{Fl6v_Bx5m=R%_9K%2S->2WgJ=H%lH-yRYZ%TNZfG**B0!0bW z6DUh~nLu5_D1loN-X~C!@Zu-@3S>6KB0JcbJqP+|p{K4+S)w!L*r5UTmBRs!r$m-< V^mTq?ont!046O&4jDYG zxF{4V^#zBw=1Mb()-Ecw8Bz`h5jVx5Q^=q=IJD2js33U5@qE5K$9ZT4wdj_(AVM>aSvyk&pDabjfG~h&UZ>l1iO!uuKWXeG*RyM08sEBq>s8hOm zVf)*bhc#+Xs3~l@sHZTrlY#wFPNSN|{T#|NPZ~22H__gH~`ky(=1Gwh+pyQb|lI$^hH`;j#>#Nax!Xb2iz3=3~+fISU$Z1MG|^V4N3l;&dN zv7vY@$^us5l^20sc^+J<>;$O1Dwo|`pXurTSt^580XnLt(JDe;R9UoUq0g!uT6545 zl}D=t4K;(-JhZi7o;?vz-!Yt+R(9ti5`Zu@`vzonn%wUB?1SfxW{zhK})4;%wmdJr@4 zx(C+{yzRlHfo2a%20ry*+`yY(@LMR6q$M8ma`Yse=4dUn*zeNKvd+s=ao^f~#ykDw Xa;U#wTV1Ym`Huc^S#i0~-93H`>+}v7 literal 0 HcmV?d00001 diff --git a/c64tests/laxa b/c64tests/laxa new file mode 100644 index 0000000000000000000000000000000000000000..7693a0cf3450f25d864cc2ec7759c1fa8975fae1 GIT binary patch literal 611 zcmZ{gy=xRf7>8%~Ncio*p=kuM86kxSifbC>x;wMyMHd4{5Vi5_R!Hy<5Fv$|A~+#d zf`uFlDF$v%Qi)%UO7M!6#X`hR_HrNjxZ8YH7IEgXDhR&C%sfBdnR#XmxF_q&DeRMu%=OBb!Mo8gWgv=3b z1PeJ9ECy~4Qi)L!RKzRx7%W5t3&Fzb*v95Ack9f#A_%_X&HH}dy!qca5F7&XX!f{2 z_hi;T5IzeBn-sTP48;`g zHVer2VSfv>+ZSNQYPTn#H-f$yTIi1;@cYNUm^)~KJaElxCVqRArvm`%KP-PBn%&Rt`A zjkfN$@2M8qY4bBoa?>+OAO7-x%lH!8rg5*fX)cBF6$_to@GYFoVcx=<9L`yImqXn` zH-~E$zT|M$!rR~Q$58Ep30`GkX+QeixovvG3(U)6nT2A7#m=kiEcJ|+ANuF%&Gls_ PZZk>NSD3iNf?Mnta5wSM literal 0 HcmV?d00001 diff --git a/c64tests/laxix b/c64tests/laxix new file mode 100644 index 0000000000000000000000000000000000000000..67d0388674940e27a1ee97415af98cd608676539 GIT binary patch literal 628 zcmZ{gJ!lj`6vt<0bH{rFhuR2YGj<**tN~F{nU9NiW=Y_PmuQu8g# zSje$rF|c!xO8jb6#49!|7Akgvh1IdeeP5Du=CUdXPBHU-f8NaeW-M@z19>!l#+i6B z?p$yPA=2_GpJTZP?&NZ5naGo(3G#zzf!q;okgK8tl87$6-0GR42`26Pp#)zkO??mq zg@uBm>VU9Obpf6H-C7f3ic~L0DXxn#R6P(Gto7ir?kK7j)Y=es;PlfFzKQ{C?ZM_g zc;Z0cGz6Z-#zWX`Lqi{vX>=j6-FeWS{48IX%aLa^0sdo{3|z9VQ{#S(Na8d9h0OTR zdnFL}M7E8bXx8*jh0k zG*y^gC>J;*||Dg?VC$1=gFZEXit@pK4fbL9#N)+#~@*CIF} z79v>4v0yQBNq~o z9C93*Ku$nAfM31a8?cOmn%5zUHR(Z9$Vv1lo|qL4eZYD{mJpnHp0F>ngpD#DR1nHB za}$G@!d{ZmJ#Eg+=(gS=*f$53_Z{SJFwab5aY`&)_Q*4uGx2Sh{|v~QNo$K&mWUz| zk6x-$^g``MuN8~lgkf-V*L>|iL%T?Utg1^$IkMxrjC35?QC&egf$XpzL+T-eW=JQI zIUW0_X6thct-25-9(0*_1e?|7+Vz&OncGE?wVD?j?NNqNrabX!II7xrbEjj9yQcFB z?cPuB=`Pty#5t~nSu=Wk{OkWt<9WVGJk6| literal 0 HcmV?d00001 diff --git a/c64tests/laxz b/c64tests/laxz new file mode 100644 index 0000000000000000000000000000000000000000..9b24d20a0beab2a631251b8ab67ce4f7a330c389 GIT binary patch literal 614 zcmZ{gy=xRf7>8%~Ncio*p*DipjFlcJtk)<3i=1Avr;C9jh^7i^u|k4>fs(?t2u_HV zU?Imskb#|pRN_~oB3`kwScupOvbnEZHkVu?Sj3sjsv!6lGxPj-XXcqP;2s8fR6J>q zJt^8}Y(j`Ie3PA{`G@ZK)fpm=@&w{NUxQfXO^7+(f*`z&7fT(zNFWpVA@754fp0^$ zzz2|RSa#t~Jwa?*rkW0#)&k#w?11m0-oazl;m9@An+RJt@ifF2zK*3H9&EtlsXBcV zD;cEuxHN4%2 z-$KqsRjf$8!U4-}j4hkDMqPC?cc{lJG%#LI(sWe0G~>b9#d(MF8&r__3gtJcd!7CQ DEE4|U literal 0 HcmV?d00001 diff --git a/c64tests/laxzy b/c64tests/laxzy new file mode 100644 index 0000000000000000000000000000000000000000..a9de62c2778804a1c6c3a9f340a278cd0928277d GIT binary patch literal 623 zcmZ{gy=xRf7>8%~H2ikpP#YoGjGYGxYZ@h17rpbMi!nf_&B6fm>)$Qg!@^wkhnR8VTe2bZRe!MgD%ouQvgFG2KZI3@2 zv(MRt5MlTxE7SaAr+9Pr77-_S0`Z=w5UYFxqRQJ4gm>^_sjC+WR3H=hA@76lf$u}M z!4DuiuyOYJkmj5+lp{OCrmp76ikX6aAEbSU%&Sy+7l|M~^`DDF{+jsY zzZCFad7g9kn|j|rC3}eahzoKP(H`QHatqNu;!(Mc=m7CCxr1nc*pj=5h!q=i`fnym z7IA7&!YJ`RSe&0K2CDe;_guA21+;eA;r zt0A+gV5(<0eE7@%T?W_avKg#b7Stv$xS`>52DXN?8BAz+lffko?=qOw(9B>~!`BQh zYIyq#ehXEusA3nWS2$wX&GBXP_K2fy=F`;UE)9&=*J(PUTzd$ literal 0 HcmV?d00001 diff --git a/c64tests/ldaa b/c64tests/ldaa new file mode 100644 index 0000000000000000000000000000000000000000..55be82f2c7d27abf5160409c498a8ee911038b67 GIT binary patch literal 619 zcmZ{g&ubGw7=~xJTHhTA;zbZIHPKB38G(1ed*J(!E$}{M z41NIFhGl2(tjQjlBs@{EOx@Djv5K{_Rvkbl;D=aG@K{Y2a{;J;gPpMTw4`EhrBiKiHPVOM+BRnH_5gZ^qCA$a)2rapX;1Hp)p#LRbn4T*a z7$bgE2fJ(OEH^!0C^MaP{$%BuE5-R?)*EIb!#*AjU7I6`v7pRHl=PBWzu&kg>tv(B z#;9OwW_Wz~%l~ct60Mp3X0f6!x&CzxpHi?jTudRa;Y|ut8s4QaqoJ9?O$}dCxUAvr zFZeA~ysC;#P&a$hvYV4Nb8*yBoB1qtd5QYQYlkMI%H@05y;NDArQD^0ESD%>q|Pn+ E6HPe;x&QzG literal 0 HcmV?d00001 diff --git a/c64tests/ldaax b/c64tests/ldaax new file mode 100644 index 0000000000000000000000000000000000000000..130c5c4e43912ff16284b90382bd97aa94287288 GIT binary patch literal 645 zcmZ{g&1+LZ6vZd+`I0%4rfK>S5jW$`fWosIrMuK7ruwiLim15g%08jRzd)!T&qZ)T zT(t;F2)LM%DRd=%bfY3>@xtIj#GT-xtB{Q=7j-5+6$J0%a({#Mo?pHf-G1?Z9*Lp%w6Oyv+yK_5}$h^L_oDvx*u z8fpS@5jwSEe{8-|U8+|&CmpX1{sdMlSC=bwZnf+mt-g4!wmi}bBTeS`$AeMUo;ysf znB=Yrz2>wZbnmM++3oTwlici#+K0dV-?4L%wVY1B)-aF4&SeXq67VgYN?_i?n*(=>fV#Lc)fpm6O*=`OX2iC!#*A}TJrvR7#7Ur?xz>moQI zu37{o1YAtX6uOf7*rK7>4nmy&s zJ)QN=dV~;}2pxWtWgqzqrP6gGj|&&_y+}dsi8SP@ppZlWFPh92E{vc|&OqcLCZW<0 zQ&1FQ8VZ0{+}Kfh^oUM3;MkJ2jx?~j)0}}~5C!ZqJT{$GmBMZsU5bVHCI5apqZY7EgN^a+(kGzEQ3jU$?d&Z``v z8EB{pL4)y@be4#VJcM}1cOiCo1hK+f5QN8gUTK>qgbcwu;63n1;C;vl z{0OoIK7fp2JDGc1vWF&7XUeu^T3Q_~+iP2uW5_o63AWqV(35$&i|q)F7A^~d&wLM+ zeLU#G;|F@#A=nQ@AyhSrq54{ojkDs-GfQlnc?yNFaNi#7iiV0f5?~hC9i(lz^4Qp16LEs8hD++tbw-)%o}JXuxQ{*0y75Q z{DR*?`5U^}B=s_9ZKpX^wU)Q0td3zRQYK~{^D-=VHY Fe*(6R1n>X= literal 0 HcmV?d00001 diff --git a/c64tests/ldaix b/c64tests/ldaix new file mode 100644 index 0000000000000000000000000000000000000000..31c5945b0291091c10e6946a95458394dba83a1c GIT binary patch literal 639 zcmZ|Ly=xRf7zXg!-TRnlE}KglL2Sm(1BEq>lFGzfyfaGzM+jGBWRxa+_fS#90i(WN)- z{{8r#>XYM`UtyB#J>$>&zy9wSEwi2-oisZ7ryyE0_?W{pxR_(!;B}4#gSR=F27?^8 z3_j<$YVhVa{uF9l*NZQ)pjL%9nC;oOOTIo?tg}FDu*iDVW}}ks@;&`=xwEy-#5R*; MYlDd$=HF$%0Bh6ajQ{`u literal 0 HcmV?d00001 diff --git a/c64tests/ldaiy b/c64tests/ldaiy new file mode 100644 index 0000000000000000000000000000000000000000..6f7bd116537d0b08674d83e74095753db69f4fdb GIT binary patch literal 648 zcmZ|L&1(}u7zXgkrq+EX*`#UHw9(6WGhkuuMd>ZIsfjKv#30yyI# zPeM}g0%Qt&3Nj72rR{y0N1v#(O;~26?U5#S_FL1C4tNm<4j$>9RS6tWgehF?h4x3D zMQaTAbMX1NK6C=?9F9X}9ZUUgWgW_+6i#fYGbd>blHQW7%d;7_eA6LMtbxtGoDP0? zWJjmB8s!xtNI-*UVkCGfz6CFY9lZ2?@7`zq;r}d|L6nCo$t*i%Hndp!Wik=9WZ_Ati0H$)S1aLf3kY*dbKgk^21Cx?EUGm zYCkzhtm@)P-FegM?1j6sLwX^rQNi?{;qBdD|99*z(YDn+sy6jQe)qP)hZwHG)bDGRqh*S6M1J$*7?r#|1H-NdUkIvCYm XzN+t6n_KIY2UL))4a)bZw@ZHl1pViK literal 0 HcmV?d00001 diff --git a/c64tests/ldaz b/c64tests/ldaz new file mode 100644 index 0000000000000000000000000000000000000000..63ffdc77bf010702302bd58f262c25a4bd85a676 GIT binary patch literal 620 zcmZ{g&1(}u7>8%KT7Nqb#ET$a#+v~PYcH1G`jMLInm{NbJ@vSi7XJdFhpvaQk0IXiZHO)2fLP*92*MLQue5X%L&o53@GiW7_aGbK z2arwhK4b#R&fedUUDQc*rfiwIrPWhqYh|Ny2-yNZ!e$GP)ns07W3z#viOcH&zVIDX zcJZ(Sm+z@v`(QuOh!L$d5=1@a$3|H3W`?Yr3E21Jr0QjOF_XEO zVkyTM@#7lUs-?4unYmnv>8$-HE6rZd&keHfAQKt(>3HB;A4-e`Wj>^&m(1FOU{%)0 zR=`H6U}|P?y#LGpZT$kRn*N7;SzU7d+ZsNnU~9OV!lZ`RDNJj4o5HMydJ6LzzNRpx z;mvP25z60C#m1zVYf7O@@`rkEkQP4zUr$X6!srSW~E^yO@g?T?`x{IZ~xuAwkqyNa3b9o#U)T z3po}nChP=Ki1^j0h*xYFEJW=D3#;Rr&3z>~XU5&a&@J5FQWRT6Pu9?}Eo)?JxUp5AKs5l7!|ee)GLvPs2iskUdT{D#1fRt| z)DPg^A^2is))C~B*nSARU1%qu@3#A(`^J=?;R{#t)*^P|2b+1F-2Wa`w%;*PpSimGpLWNLx{7ekE#*G6R1%UjB}{z zs{Nsv(%eFoC*CUAi^E6y#JD%@tnKUrn|Qh9Nl(I%QXndcuzW7SrsLsyM>#yGDz z&CTeJYLcCZpJS4nnQ{5>m;c*_S6Raecgr<%$q$z-d`iK!a5jY*3vW`GweT*5c?+!+ zRxEr?;i84Nzu>n}`La2@$o#?)bX(I6=UUD)o5eEoMU{p0^%CpkjLQ$5T&S%tGjWqi MvR-B47V~bfpS)Z9a{vGU literal 0 HcmV?d00001 diff --git a/c64tests/ldxa b/c64tests/ldxa new file mode 100644 index 0000000000000000000000000000000000000000..d2c8558b0164cfe2663672abac04f62f2e76dcd9 GIT binary patch literal 619 zcmZ{g&ubGw7=~xJTHhTA;zcN4#+!i(YcG}F8k?HxHib|`J@w`mTKo%yg06?)gw%`R zLBfKEDVab|;;)N}n8TLEgNQf5gRt#p(>6`hRO(Dz6$HP-@I5cz@I5mIoYNqW#zyUl zCu8=wO$ZT&XR;j4tU6QICy6-2BZ&8W6JnijK`ikYg76kzR1)1pkP&zrybIog+yvi; zjKL2eTd?fxoi*7-lY}SAmZ@7>Jyy0>)+&9-1pE+<1dr8ZLEUU@p&sL0qYZrK+oG)9QU4y4ezCZ z_sVsh+h5h&{wdi;&_$S)+X(g%o|QWYdI(44E`kGur(_2~AE71p5F8>j7WBX5^3!vr zJY&R9=Sxgy?LS#*=5k?vkaY){$gqz`1J~wIVk{{0Atk+J*6!Eu$r@R& zvr#ITni(7){_=lYzeua5zfmZwORj%S!>1H%4Hr_#X?T;ul!kXH%xGw)a8tvV6fS9a z`wM;x6|SgaS84ZsrAx}?Fuda1ws_pLvTVo zwTMUvc$ktY^dx>BRKy%M3?4+h2_AY1xp?wWXX2_L_#R%~-^2Uy%p|BkP09A`32*N4 ztasWYgvdnb@M|plz+YUMze?m$;X=L_Dad`1hTIexNFpenH((1FMo=a*h&;qNR0^U1 zm4TRmqJTGZYggsbB|1}wV@uX_>!|HECZPZ^g+1V*=`5Scy)-%*9DmI~KZ_AGMsYuj zK#ZAdIq+%px2aC{cc@vflf50<%b@QI7(&9COs|AbNYi4t+#r5luiB)EJ^k zXs8^bDd@zS{jh~%X}MD5oV48*_#;?tzEmw%xYgJnt+I5kTpeopp(eBZ)cf>vftrFCb{VurVoGlzh(O(YdY;-xo(Dn_7w}CV(=`SiebURn-~@? zyo+JULN|t03twV5YvJuL_-&|s-UPqIf|(q=?p)Kkk@n4HvCaaq!P<#e*V!O#yd3E7 UXX;z)Ox$LYY;7=chxs-36aNI_3jhEB literal 0 HcmV?d00001 diff --git a/c64tests/ldxb b/c64tests/ldxb new file mode 100644 index 0000000000000000000000000000000000000000..ccab216c8146e4fc58471b4537256ff4d9d9b7e9 GIT binary patch literal 620 zcmZ{g&ubGw7=~xJrM^25#ET$a#+v~PYcH1GOq-hOnm{NbJ@vSi7XJdFhpva>?UKoss*9j-VWQfan;?S~MS%$<7vv zS;k1%sDiCICc8R2pDi+zb^c_$Q3{~qRv9+khN3`>@UAQ0tc@{})8K~@Ts-=UsQ Fe*yt;1r`7R literal 0 HcmV?d00001 diff --git a/c64tests/ldxz b/c64tests/ldxz new file mode 100644 index 0000000000000000000000000000000000000000..792838e6102a438e185a03b0e8cc43ecca1a355e GIT binary patch literal 622 zcmZ{g&1(}u7>8%KT7Nqb#ET$a#+w1fwHGBfYg1EQOdE=5Pd%=h;$I;2;Pw!l7*B!+ z34sbzb_zX-Ul$cIhn3ZXh&RE5r|sseZIZTeCS4T@eGkL?{CJ1=nK9rT2YE7f#?Cw& zvoF|$5Mg*G%hJ?iXX54@5hr;B@sY1XtnnD4$QuxZH}R_6(oF;z!Si_!d>e8dybsv` z-+^qxveWlhWDj)`9w}L-ZfWIE$y!_~??Se~2Uu<4shZ5Go2xPW22MZs@tt>2-oV36 zxO_`3>SEdFZ7^a*5yD4N6Jb{wva>9IEk%~i80^;|?mJ{rrP}%y5yYe3OL5qHA-;I8 z1-v(|>)iXPp0}@L8$l0YT6Pfh5uTD82(}TPkedj05FV3T2zC)#vWsAV(3sa>GoGEy z7qX0zT2uvFvUGN7ayDCFI&1&S3R72dv%{=6%tVTP9SmLTBe5~B%tw@T(X1}{4`h|B z`Rp7OOwA0BPyhMAwsxIX%-ZK%NnLVlH#B@pz}9d+fpHD*5}45NA%Q6k^#tZL{7B%k zhWC5$S15N?70XaJebln+nTmOP)KQ!HG6gG#*thzr)VO(!w<5cc~x?Gn5yp HbBF!`Ng@Xx literal 0 HcmV?d00001 diff --git a/c64tests/ldxzy b/c64tests/ldxzy new file mode 100644 index 0000000000000000000000000000000000000000..727a70a10e67f6ce2d2e37173fe357c195aff27e GIT binary patch literal 631 zcmZ{gJ!lj`6vtG3<2^LnzHL|&{oHOUDAoz;m{r<+MRqfXx=TRPSLvqX@9 z2G2z%cqYCCF9ZZHec!wORloC}l0%3cR0VkqaR${HIf8fs)oDpE&Z0UgEsS%hP}&#+ zDr?>R(OhwHrCel;gh>zssL_H_+?89iR+HyM9x)yh| z^M>8L8{LsjvLCT&Dwv)bAMgM2f7@`GHtg`QRMSg-c-6qi6kG!rQkXOFI)w!TZ&O$@ z&`P0d;ByM|2HyOF-$JF!y4XDR3n$QR%{1(5Sx?{0E7a#z8d|T`XeX;(zN;V8wap6U PH>n_-RmyKs?*{z|a$os~ literal 0 HcmV?d00001 diff --git a/c64tests/ldya b/c64tests/ldya new file mode 100644 index 0000000000000000000000000000000000000000..fef0d4b5270f521c48171901b7a554110d2133f5 GIT binary patch literal 619 zcmZ{g&ubGw7=~xJTHhTA;zcN4#+!i(YcG}F8k?HxHib|`J@w`mTKo%yg06?)gw%`R zLBfKEDVah~;;)N}n8TLAgNQf5gODcKv`y1Al{ynw1;Otye9y}_e9w#p?=;Axu~B#8 z$(TFt5<-L(*epX+tKQU&Ng~ehI>dXv1+l>!5KFuXL3j%As;BkXc{X=7MV{I**tes&?~xUq8s+Omkbnly#qr>o*bH6@ z1h0JGyZu$a?VpluL|v$~+(xtybyn^m>OqajT|@^^r(_3FAIgz?hz_Bw1@kYN?DSkA z%NPmk6|lRG$tI`gvjt|d_MfaUb2&FZ$hw0}q}a!!fop9jwidMckd|JuEBCASWQA;0 z*(eoE&kT+afBC;{n5Shs+{_jAB|p4o;8OywfeQ&_47^ET%D}q>W(?F4xM|=^0+$TD z{RO{;a#wV*aq6c}I&N*EY%dObdNZG;KF`z8dhOA8Si5{zor}fgS;~DX$a0?YMe5z6 FKLMoc1m^$% literal 0 HcmV?d00001 diff --git a/c64tests/ldyax b/c64tests/ldyax new file mode 100644 index 0000000000000000000000000000000000000000..57defb991214afee4c7b28f805ba38eec70f601d GIT binary patch literal 644 zcmZ{g&1(}u7{(`?&1Rly(Eci6~J2Xo6cd1?r-Le?l>YIYb3Df-sNhlo~}ij_8ESAe=yyS7Qh# z5kX}UP9aLHnh%>VmX<0-&Pm&Dfj@!K=1SFKg&U3i(JG6V%GIHk8)`DcKOPUQc9Vm| zsy3d~o;R%4gU)@`A_pB_WRmNiVfyfw|68`NvZmGUmFs%QZ{INRDF)ZTxftdRyoq7K zz`Gb04Rm8zG4LgZiw55Qg5QS9mv!)K%r9i&c4wQ`9mms`#TxU)I%_9h-(~|xdpU}} UU#M@cF>#kkvboO0J?7QePxRX21^@s6 literal 0 HcmV?d00001 diff --git a/c64tests/ldyb b/c64tests/ldyb new file mode 100644 index 0000000000000000000000000000000000000000..1e011d2f509ba68c5b26977265ad776214884d88 GIT binary patch literal 620 zcmZ{g&ubGw7=~xJrM^25#ET$a#+v~PYcH1GOq-hOnm{OmJ@vSi7XJdFhpvaib?SuV5+=8mb2~=MTvT;_rmLX5<1nk>!GVsW%PPOy`5hS3&Gcg)G6)Jck z5WMt#@Ag;yxPMA^5cQz4atBc#>YUs~bO3cmb`cGrPRTt)hft2(M|1>bEt-$X(MGw?cv83S)qm^08!VZp$c6s8Tl z`31j)3RiWpN$O`$I&O2SW-pC-dNVIlpO8#!8h<-*h>ajNW9Nb5nnt%Wa#CyIDvBndKGT(q8yondpmTqFm7+%18;Jc9P;C;vh zdbf{vPx}~)P6>D*&x(C?;A7HhG$7-^mZmuQ>HgNK3fUmrR>L%`Q z!R6a(Q5VYrZ-WsljuAbGn~1u~kez15D;ctECSX4XN#7xhD%IB4i69>Jo{NLtGx5oL zDd4?wUFXhs^}K&dwh{IaWn~9pAJGZ9iEszeF}a0s7ts;9jc^ZUstHRJio zVkyrU@#8w!lBKf?le75}(^>mZR+_q0m>p)lVJ0%{^I+)O7)gwIWj>;$%VvEkxF_pm zEnsJ;U}|P~eE7@%ZT+jXX8Ios6?Mt=uW9&_g010f3ga5yq%fi3T?$hg8Y#?a_?E&& z4R811w@~4-Dwd;e_ON9)ay9ejsG~OXY3lMB>Km_%G#OPcKcmk1%EC0|x2YftGnAL9 HbBq20MXv`O literal 0 HcmV?d00001 diff --git a/c64tests/ldyzx b/c64tests/ldyzx new file mode 100644 index 0000000000000000000000000000000000000000..4205dc74b1462562d30da33532fad0e49f638f40 GIT binary patch literal 631 zcmZ{gPiPZC6o+Sb)8xH@AYKIVGTsa*ti4!z>z~wAmli^iCZ`@(Xz`#Pg&thN;KX=Q z@E~EKhbcRSf*@ACsE9di89a#SN$}t) z06d2>1wMhY59pR|ZA%9`L=_rno0hh64cy#r7Elg=1MUpqv7W5x&7BmYLpbv^f=~Pi znj^SJ(B~HJHErCA_z)Ok_aW@3&`m(y?e;;X+LfJS%a@B}%kBaDHtO{~vZ+(;KSKlw zXz*O*f@k7O@IpZF()YbxmLrHKP@R+n<2ZPat3$Ucn5svW0it!Z&b zJFnaAJJD^~Cc6=vqJrs}@$vpI|F;d7Xv+@wD-FHmhgS@I%)m8pK7&~UuQQl8@HT@* z1Dy=&20mvnXW-2*_$^eqq>If_zjO@U&UDMZn)me0yheRqr=j&~mG<)5<-7VZ)!3*} PeuE0KQK$SS^{&&OYBc$T literal 0 HcmV?d00001 diff --git a/c64tests/loadth b/c64tests/loadth new file mode 100644 index 0000000000000000000000000000000000000000..9125b8e082a18b3a2bf04f8aebf67ff9c17f72af GIT binary patch literal 619 zcma)&J!lj`6o6;lzfrO|S7IyADhL@|VsRnedAIS-j5}d7a@t*a7Qx0MSlR3q!hoG% zA$r+c6gxcmvnShh1u-pmkOJ%M*8@Du|9wi%#&!LB^`j466H{q-uJ z;ewPlee!;a=G!x~Em3wU`!Ly;v+Se9*(dt=>sVxXEGBqr9fYCTH=^>#+VhpUzYKfh8I*Y=J_r$GE-19EhSBX3%QYznyDV2L7qjFOaNFppe>)S@8RHalnSQo(gDHRMV zqhbzY7W{>T9ibopTbVL(1>Nc&lrjdYc>186x-E&9jZp%)`u+75*WcWt}*Q)z!%z9eUFq z-W}gjL$WvKr{Q^}l=9~Zk literal 0 HcmV?d00001 diff --git a/c64tests/lseax b/c64tests/lseax new file mode 100644 index 0000000000000000000000000000000000000000..2468fd7431700b47a65ec0d9c0a24554678ce5df GIT binary patch literal 660 zcmZ{gJ!lj`7=~x}Ox$-Mh;aXxpSk>q2MTK%C0(L-UgB!tjG{JPxnhEqNn?@1wK$yP zVk20{aiC$2n?Ne@uTc@N*kiE}u@fw;j%~!kBF>zvg5VS%@AEPr-}`-ra~fA)wy z_i)xeZWBU;;hF3@9ocfu7w0b#k>hcQw>$x{%aahRJOx2`8qew(E#gqFR5gnw&TuvX zo`+0=PeP`^ry$dSUAWbjd2~szzXnrF+SpgaW?MBDj8I9VU7v=`fX`qjg9oaqEECvC zqLaemt65kdc@Fha+#Q3<$JOu&utVrSwt`rH+fws_SZ~|vCDD%~80x1H#+;I+_FzZZ z@|h9x$P6v^WiR~UkWJ<4-7XVBJnB6aL*5hd-Fq%9?}h6+H$JN){PScMK0{EDIrw=5 zc{vJy5#c&MgTbhe+Ge3)dyTCmX<3;#z-sP1nWS1^QDzyg=sJQ$Ez%! zF0TwcHt@sy&R%LDn`Xzek-0{Ru0l>XQHf literal 0 HcmV?d00001 diff --git a/c64tests/lseay b/c64tests/lseay new file mode 100644 index 0000000000000000000000000000000000000000..f7dfac28794a279282eafa198f745f5e47e832ac GIT binary patch literal 660 zcmZ{gJ!n%=7>3WivGu+Of(ZFfe@^-%1{AJcly0piCiQ9|R`F-a7_r64c5&$7bqJo2 zx(E&u0$NVUDRdJ578NnW4HpLyH^IRv+(jH5>N)YMAb5t4_jx%V-}`-rX}f9{Aq z|8UMeZWBU;;hO9^jcz&T3k#Qt$nqG(TONnlDUVe^5@qn}H8G32zp@QPl@rEEJb31;$7_)&lE7dke*tLWOBB^T(@{ zPnTAP9vgZh%HHn{v-To^QB}z!D)g$^y3@TaTV%J(E>OYLpJ93Tm;Wo<=V;Sx_e*uv zRBK<<@F4_S!?6$+HM|Ppl!iAUlr{81xT4`x2q!hX{sq4Sm6p_FRa(m*fZdyKn%71h mHJPu|8sDI81JzcQlAaPBHF2o5TT{*?$E*K5PKm` zf`f#B!i8L*llX5@5i`8)aB`@3@u?vA8;}|F*NGr5b)Skc_lfxCJ{OkzqF#5lKdbuxjLg8x!!ODScm?<;WES2u{G6PG zHv>N@r{K-Phs?p7gKuo;uUjlFS8FB4NGH|?dkpQJUtTNKnD#P%yjtaAd2Qt7N1lkX z_eZ0wgGgX(sN@k9dedy*>D`uXa?oQ{Dww)6I^O-||H{rPZJC|JazicEJ6AP)2*K8H zCWJ)|uR^$>;Y|n?4TBKYHGB$TNyF=3@HMGaf0^2Q16XT1;I01zTd|^obMdNvQJp#@x;l} z>zq(CB@8pZFBo4Znt@y%_ylf+&O{*k>Df`~n5sa@D9 zHh(cno|%Egz8?k$HrY^atv0np1aYYIQVcjR#DVi#Sk9Yz-M;xv-Qk~-8F)GPML7g7 z4?io1;f=yiNCs~V{&AUwHx3_i1YQBYv8-=6U7ne*l^G+QSR3p)v^O=gSgtYcW&U`z z>V?W;-^=wq5oMna`%!z5z*ttnBP#QX*}m)Ek!`Z&vMW?D^{4-Q{LBB9ojKYvJ3Ezz zYN~fGYxo>ONyF(7rZv0^;k?%SKcs@Ju2cSq+7IYYU}o=! literal 0 HcmV?d00001 diff --git a/c64tests/lsez b/c64tests/lsez new file mode 100644 index 0000000000000000000000000000000000000000..d6f75b7453ba5c983db4aa2eb7ad1b1c225ce50d GIT binary patch literal 640 zcmZ{gziSjh6vt_hg$({m@VlZZ0-A?y=m&VC8G9W-5?nV;lK=RLAx*88F*d5f`L&1 zD+WFlaMr-9U+_Cndr=n;SlFn+AI*YXC7HcdN>nx@(uCctVvwX|GpXqL{F>#Yg MvboO0Ef#FCpC?A%(f|Me literal 0 HcmV?d00001 diff --git a/c64tests/lsezx b/c64tests/lsezx new file mode 100644 index 0000000000000000000000000000000000000000..d5063d031a5687690c130cb86ab9550aefa833ea GIT binary patch literal 649 zcmZ{g&ubGw6vt}Bv!HB}|WUJ8C1 z$FKS3M?Qsi4)>nWrb^FFvh@oV=_ewSeL0MN zIAlk;YNHh*h)2DrV#0eOzIo4u>Ai4W=hkPn`9CGI2=WL^atc8K;W3#*Fo&=xrxDB} z%*h!9MTC&E2o?|;4SluMa%H_M$7@4HZ18GB*?5UH^{kl6{}ms9@^P_<8r2|0{c!XeZG-sJ2v-+qN@8)GcLU50^WM8E39Ri99V5kRQb!$ZatIxh94ni5S7F_SiHDs02g`f?}Pb+5=&s z8i24-4MF5kjR2j}{jQ?eCsD42R#y*{Xslb>ZRb&qK@@On3{SPSrZ3nUKyL_V>nXsF z*oXE3JU#?ZO!P*A{21;g5aoAA5Zi7AbWnbtFJ3Q_=T;2-$0SZ&@<6L5e3MAxGykQ` z`!D2<|5}3o#`E0U-}Nj1E0sb>F)FEj2rZ1xr~?RXj83UT2y+;nP!kCA7@;B<7BHf# z=7%cP`Nc++a}p#S-~x?So?ogqxY5$TT4UjAZE32}4r-q)@-LHV*1jFnRh`_{q1UX= zquxW+A=^EEkx8yS)8o@WKC%t!Y{LpZ*IIhW3ziLh&A>5mA%lv6cNxqX_>jSZfqn)z z4SdVsih=jP;ZLC2HC?>SywY)W`m-C>t%9pJixuXHCJX4>Wfm87mY-2_xwXE+#9b!I MdXtHJ%)P^Y0m(i0o&W#< literal 0 HcmV?d00001 diff --git a/c64tests/lsrax b/c64tests/lsrax new file mode 100644 index 0000000000000000000000000000000000000000..d87966c294972ff62dcb12816153d3f9331b197e GIT binary patch literal 651 zcmZ{g%WD%+6vppNYMJk*lSdy((^RPm3YhKP$BatmFFuZ@bB#e~6yh&#cBt2i51F6x~)DhQs%;ru?%h z@OelRya1U3Uw}*lR_S_A<}o0_L<@RP4V1J{m0GV|gv@|1VmE__seTHT5yYe3Q!(K^5#PM$!th?Wu6^yZdiy^iv+(l>N^%qL7Q+CK+pV?F})iX}-{_=mzZjEl~-C?z*hTQJ?2tLGM zMQ|*J)d*h2a4Lc~F|0)}h~ZKMpJF%}!Rue}+fen43U-0Ir8KO;@|J#e(pHywle&D9 fcD0uc8cr%NUxV)_TFoZqcc>uEP0H_5`!@XvnMdT^ literal 0 HcmV?d00001 diff --git a/c64tests/lsrn b/c64tests/lsrn new file mode 100644 index 0000000000000000000000000000000000000000..48fbb501940f579a8e831c0e8c0a93ebecf2a22d GIT binary patch literal 629 zcmZ{gKWG#|6vk&}@6PuI4zUp=&DeRMu%=K+m(z=vxLn{2Nl2A)g#=Ms3k%ocaE_!B zEaX_QnByjpO8nQTh*zvE7NT~7g;m(*{wFzS&Q&4cD~9*`=9_un3ORN}>H(lzxZBhW+a%7^kTs39Koir_W<85~2r`E|LwIbgWwW=_gH|8TEWj6Y zVf_Fe9)d5&W+Xvz4EMSaXZHq>I9?GmnTnXcuEFb>yf7`Iaw^;bGTr-FKaM{A=6kH4EQz%+^lfo4X?^2kz&`x2^ z!nYJITX_2${sby7m=d$xFC0g=J+sAb=1I zvL$*&S3lQD7e@)2=-$F*a0lOO@U- zI}gJLvP1Smc99CEGSlV#KR#9ltF&zfAF55Y$qTM)_>_U8;d}-q4X-m;((pEe6%D-% z8XCT2a9P8f-|(kU^@}No3YgKPD zOC*U{^h`R@Q~51=A>HU@7zWqA=#Bp=RYKw+ttuDE1kz&)NXkf$D28MbX+@18sUU?K zM>2(!uA1Mf)f)?~I_IQEyWkIDwAsdDy~T}II?!5k=bMWo%^PXb;~(}%Q3rNLS9Ne( zXWp>7cjG&%OLk*kW0Gsn=y?B^|J(NF*_PGYYqs^Ju(xF3V-CK7Q#sTOyw2gAfwwu# z85rcSV&HQQXAQjh4SxbPFX-ZzSXeE?AIxl7SBrt3EY?^k)>)6fy27%e&hkC|ai+bw R#>7n~$>ur}w^(q4{Q_*x-;DqO literal 0 HcmV?d00001 diff --git a/c64tests/lxab b/c64tests/lxab new file mode 100644 index 0000000000000000000000000000000000000000..24e950db2a6fcecf21e3ea663d582911171f1eeb GIT binary patch literal 662 zcmZ{hO=uHA6vrnUsrw%Y8V||lqwOU9O2ER}i_%+HQ&U|m#G<9A;%N&F9&Hao53Yye zl=uOH2MqxagPCAY;@3q5&0%HnAmUB%;3?#w7d_OOxGD&~!_52rnVI*0Z(^pKGRf_k z!}jdm8T+VB2oW*gV0D_f?k>+cMC5o1;x$i0>~afYoo65j&*I5WPA4hI6nGxI2!79$ zX`nZ)gfZ}O$PD-dWEQZ?mpfw!4H#-WXkd#^Lgv7yAd{iJUmgm(rH5ZTIowgFtLl}G zg?0v|2gLlqhp{t)YoqWuQ&kIKCG^s;RNb|ts^7>CY*^CLY@tCFTj*uckGqbkT4B>{ z@pOXRH~J>~yx0HXk}aj4b(U3o#HapavCn@bzWYyw=|A&4_u?lthJQll5fl-YyxP7Zn`F1m&QrnEnZferFaI}fouLh*^|rdL zE_tnU8s0}>Yd8{tqv1saCp5f@U_nDSf)x!PBRH<%*zWdVG_%V$Uzp{*dzWCH!`5yS_pBP4#Q_P0DXk_Xhn5LjCD6 literal 0 HcmV?d00001 diff --git a/c64tests/mmu b/c64tests/mmu new file mode 100644 index 0000000000000000000000000000000000000000..f1140ad9f42d96789c2ff20af74c0496bed5fedd GIT binary patch literal 694 zcmZuuziSjh82x59nD2%hv9PeX9}~L+#q|eV2y9_O;wElLI4+oS8)2^qHXk(=e^nYy?Hak(7%STR~~n6 zIui$Xo$@^Z&`gck{%M9F4aS(om}}KdZMlRE2fJ=+3v7K`f-Xz89EeF=)s})p-}4b!455ESWD6NFzfcGu`4~$o3_MulbUSgn`=xi@LHn2v95xi^s^^DjhY+b^3inF8_-+SF( z=XRF`@rd2EeOU9Ky)oOqn4ez)y5=0JJgNe!A_^ZP*n~~CBXDO7`?v6xzIE6aXwLrQ zUntINH)KOY4P`8zU^9mo+oe%*OIpo*iu0Jn%|eO`m>f2XDK27Crv&1bSa_5L6ASw( zDVup$`ZcwqUCF}&n#&jvB@bpeEy|=snNI#tL#rwu$y;fiP@TA_D z6GE`Gqh2`W^J62pVdQpGe^+De_4TclXPe7`&=38+k20EUMP*(vve%D;-X%1EuAu8U z;CMJK?@ z1+b|C*mPkl1+Z%IA1fCJ?cksj0B*OU4$m8jfXEP#83LuudKm&E8P9j;&?_=B9WrgV zH#WAEg7i|5BPqjoVK4n^O-$!$e+v?R^}^F_+mizT#>y{U3qk-hWGU8?a%c0;@h2bWq&CaI~U5{sBox) URXqByqUyM+e_MK2dhXcfKR%7+Y5)KL literal 0 HcmV?d00001 diff --git a/c64tests/nmi b/c64tests/nmi new file mode 100644 index 0000000000000000000000000000000000000000..445bf26742027635e919ae62b50d0365c7037874 GIT binary patch literal 3337 zcmd^CU1$_n6uz^wn!B6%b;qjIHbapbCB;=M@#jTNsGGVqphBC6BqR8+mP(N}eX&q| z*dn15EIwF;t(&U_FU?2;wPNamK7_iUb*e%|T&vZGuuvP2QdG$H-1*;Zv`Qa4H#@)I zcfRkOd*|$i!&wcZ!|kinZRxdNuSmDALIPNd6g55{&etO1c=%TQ!W6-%tp&rI*H z*^iw=uY2gjM5XF_+MefF^jn4_`+wez4PC41c zxPUl#Le&iX83UiK`XAph5Cd|&?+?fLXiPUHLfZ#{*7Wt#tHX`RA8EPpmw?tcEP1|#ZH zwQ25BCx2Fhf;bNOkIVk}cRs6MNnu=<&+5mj=MI-2)<3HMJoW#te59ALz7UJ=ZtdQ( zNnh02neIf{O(MJX<(7B4(Adxw0bbU)KxgSYFuclTWM86j@0_#GQ{Fq@Z+{Q5thi9F zWj_+A2yFl^^iHhbuT4HF^ERJF`)Hgb=kJaS2e}FFkRSQnDx%R5^RRFc_FoCQsy>Jd z_7B-U5nkjWD$L)dngkdZzc?;j?#1>?m-?`+TK#y5W+yEJ4rR^e45A*5h|*=Ce`*-K z>z7L`n{C@SbZpjjWc6Y2Wc9K=)tN~aD7awZm}g*Y?b?*t&KSp878YT9hXFDDGY9MD zH_2y@2$sOZ5$(%4-3|?0A;SecLPccS(Pq}WV9&iCxoAe1?6}Be!}2l z9^>AO3>!n9U2*82rG!N81>74hmq{&@B2pApJ*ia^Sy+^ODI>-+Y(}E7z}7c0AG<>$ znJCr;4@fjV19(Ux19jk-3qL7Q9^eEOk(>7EApQl3oD3+pjhM%{DbZO^VLX(`&3cB% zNy?6jt6)vm{1g_+Bw3WbbnhBG&&OH9Yh*{F0lrNpYwF=Z@MdC#EBB?o5UdrNkzg*;rMPsT`kko~f%wa}`GbZVHK4wumDlF%bs^{Ezk zb79fJO-P3=t!EKgccIPGh+G}fb`=#@QDKVe42nvF;>^SbMMiucMb>dB>w|udQQ`xq zIG&h5tTa73_aEcSP`Yd8Z@x_R&fx)*CvlH(~a=d9&*RzHA8f>wc0$Ut5gxK6(O+`9!HRm<$YKmM9==Thci!m&x zIX#b}j4NC9U(*E|;fk84b_d{GED|-_ruha-9U5tiAQ9qdKU;(vTZCbk{{ZO$>-jc(-@j;NEPz+0!>bwWO04(s++0!( K@ZNt5obeCwd^f-V literal 0 HcmV?d00001 diff --git a/c64tests/nopa b/c64tests/nopa new file mode 100644 index 0000000000000000000000000000000000000000..40784d9d4ffa27c966efaa3d59d993c269ec80e0 GIT binary patch literal 594 zcmZ{f&1(}u7>8#!SbiA{QUsw0GTsa*thGfc^w8SWRF|ZLBGOZjtF-tpcyK)w-%?M4 zh=he61~P>nMEts_h&ik*X+E}Tn>MWnPm+r#4|OK43WD!pnCCa|%sj6J_Y~OU;q%Ve zvtj45!x)p6Z;LF?JSr4tCzw15bcKJc&zACegia5!o&^`U-(_jAYHYo5_JNTSm z)|b5Crh#Sxj)98_Od5EXz?6Xx3CtL%CNOWHoxoKC?|;E>q5O4S;tcn)C(=%JY}LL! n;Od`ggnKl~1MBT2-W$*^U!(6=mX}626}e?A4SU|QXPD%=XK=jx%l}Oqb8N$EbjoY`lGnIw;6ntC zfs+wT8F&@JIRkGZm^ILjV8Otr2+kUK{R@5@DxcTEtIQkEz-dozST)<#n}x?bQDcqR d_I1{`wU=+<_tR_39us$%B+E4>R+xL6{RE}z=K}x$ literal 0 HcmV?d00001 diff --git a/c64tests/nopb b/c64tests/nopb new file mode 100644 index 0000000000000000000000000000000000000000..0b6516e84c1b7e8087c70af05872d7812da5b879 GIT binary patch literal 624 zcmZ{g&1(}u7{+HeQl1?M#fuhc0=Bpn`8)xFGAow1J_xH^E@;oyJoD(1qM~CgP z$D{T+n-C%l-((Xsy*i!0njzv8k0D<39f&nvhbZs{1mR6QTW;y5hDr^aZxN-Ob?{ZF zY2F6!f0+%(sN?=k$HGw$| zpA)#G;pH#*9VmB26}v#ap+U>8j;)wC1{~$gUFz`}8W@|`Xgr{@e2-e^7mF_CMJh;f KhVq-#DbSw+2m$H< literal 0 HcmV?d00001 diff --git a/c64tests/nopn b/c64tests/nopn new file mode 100644 index 0000000000000000000000000000000000000000..7d9264ab1a89b22442f45902f8bc54b6c18b2295 GIT binary patch literal 622 zcmZ{gJ!lj`6vt=xB>Z>akTinYjGY0+HH~ter}5bHdGDDf5q;cdJwcXU!mt&Yu)2ougr@G?|2 z?}GOscfot$1IP&c2(kr!4B3Wd^ApGp_z<-Yo+~A*N^23SEnM8eSJhPB!;^iu{6Gyk z1S3|nt=@0e;iRFQvCAw!npBmmMyK_n3~TNnbx|0wBpQkc7CMwN18~ot>MUXBM}*kYJ-F_UotDp)yJ|z z)~oCa6-?EPj!%F2zp0<2tET@syP}$0|Bi+)G1wZe#*o(VE{0ngKEyDip%KG^hV2+` zYIy$(ejCc(R>4x#oj7gTjnt}ncg#_fd4aloj{3%CokePyXY`F$$L(j4U_ I>fED00XgXe$p8QV literal 0 HcmV?d00001 diff --git a/c64tests/nopz b/c64tests/nopz new file mode 100644 index 0000000000000000000000000000000000000000..30ab9268203f181ae73cee1378d217fc5a27b88d GIT binary patch literal 624 zcmZ{gy=xRf7{+J!G(0ajNlg@y`CXEtoJafq!|xvzZOCFjh!DhR&C@cy28U!G^ifO7)m(byS# z{K=So&L)Hi!#CL!%|4thURfaG6i*=D@NI}S-he3aCIsOvJX>z-rjBYIo9_^3oON&x zHO+hQL%9vU1AYM606&Cmg7+a?uxw5&*#!kr0sn>PIk&&62mVvCgQ$miMD8FuKs+pW5gj5vDfbZd5g(WPh=>(ivWv*DVq;N% zPA)%Lbn}dnAgO@ex3qR~az5`et#$rr?(|e)exUURn#i&b{XyVbCNUOO{ESLoGAsAO zyRt&oLN-bTQ!|6(?O*}6s9%QQdrRN zC51~GUj2gKfeJIK*ahm19JB1&_=N7fw6g&CPOOA_qct2sq9i-rh=5` KD8EIW68#Br9s%6| literal 0 HcmV?d00001 diff --git a/c64tests/nopzx b/c64tests/nopzx new file mode 100644 index 0000000000000000000000000000000000000000..ec8770e78e23726f4b8a658b30f9a40d322e2fe9 GIT binary patch literal 636 zcmZ{gJ!lkB5Xax{UM@2)IX^%Iv3Yg|6xJXp0gFWM+~|^%^AHJ`q+B7v#zL(uT#Mj@ zLJs^%M0~$ib5M3HZWg(TYY2hQSc)GROgE)i3-(&cwrOF(F8k3D;7jE2#P7gW^Q>W7gzXIB*I4Y{=OKjEd?h#+J?k}I+X8VrUuYdT# z^s7E%oJkh)@Tn|>PvqzDxrFdV5ct===wts0Wn%)EjwlBc#PpCVV8Ssypaw7*!gQ}H zVls>=szFRjm|An@qbACgYOO2;i?$jd9-z_2EA?_s7|m{AuGJ>bdiA~reNC3c`>b!d z<#eq%eSo9A&)bc=@g3D*Yq2=RrO-Y7^zJYJw~VIvvK?)Bi+U)CE*aR&!8LF!hY16( zayVn)O%9U=S~*M`_>{wG1FwI>A4A?b9m3%Ag?nS7GsAg(?mOT?Kz{UWTF<6c2Qpnjl57rt6_<+gJ4F5pI?~6V!{5&}*uy`B!Pzgw#np|WVkJW_-<@9mJ1gsZ zdGD-j1QI$xnyHuN4p4^mj=~O(m7G8oYx(Y+cgi#lVmO=zSdKF=I226N`D42=fd;<|P0CRdAeu literal 0 HcmV?d00001 diff --git a/c64tests/oraa b/c64tests/oraa new file mode 100644 index 0000000000000000000000000000000000000000..fe07787e3484d52a999ce7db4310e19370d54d92 GIT binary patch literal 665 zcmZ{hKWI}y9LFz-miIjf+C`fGm$pgss=~92(k<20L>~r15$)7Pc!d_7ZG{d#hv0=c zXu&~3z~Pl#A(QxTQ4updc{qr;2@Xz@#YrLlE#ATxMQMCg8o6NqBvkg0~^l@R-ctNh_;G0yL$l&p{SY8_COt zO44XD(nY8gmDq_Hb15HG=JWOI|uVq4IA?LB5#eG^>r9<{p=%rDL z=U{x00Av zLqmKX4ZquLhg^NZOUz>~cOQEP-ACRJ_o-*N&m70T`iWlRpQdu~3kXal;1?0(RUZBv zf`poeUqUdcX5gC$pl0FEBZ#c&S6r$r*BccfSU1su=tFzu<&{c9XfOB2Yt+tGSH@mp z?0IqVZZyt1hz%oalsrbEH=>4T`aQAAJwa>6-J8GsU)jCD+tKdZYLhlO-HRID zhhS+q5yFy&7a^R{@G69whCv9c8a{?_TEoj<@H7a*I21 hn|CA6uk+yqW%&|(JJsCW;_@DS+vYZxyWGCZe*zIB>d62A literal 0 HcmV?d00001 diff --git a/c64tests/oraax b/c64tests/oraax new file mode 100644 index 0000000000000000000000000000000000000000..642f0a4f71cbfac2b47069ba59589edd509122b1 GIT binary patch literal 688 zcmZ{hJ!q3b9L6t+miIXbS_G+zaBc<^-n{v2nzT(cHPIIXp@<4X#}rz`U7>?f2wq6r zL2!@|5PKyT=p=qED$)!IFAgGZf`e1Y;^Ywj7o&pU4R_D)xsU&IcRtHKYO#mT89VjZ zu@g39O!=yQai0e_OXY0#DpMz<4fS4zq4uN$wI(A_Oh)md9y7uQP0@rV5r<5pIFdIk z9i}nFNN1oO$a&}pkZbOJjVV^;)#vJ9^_eycg9MDR;=^d1wHp}vRw#LZLa+Io_u6-LlkK&|Ev^Ku8F%}C z`Myzj}{`WBa(zHNP*%MN$j{3i=r`hx%f literal 0 HcmV?d00001 diff --git a/c64tests/oraay b/c64tests/oraay new file mode 100644 index 0000000000000000000000000000000000000000..3a67e19bea41b0e1593fcb971e52ff522f895135 GIT binary patch literal 688 zcmZ{hPiPZC7{wAdVz*=hJ&FG=D$*P_EFMI>2_8I!Ts(P*-^Nuza1Jx?_h#msH!~sKJg&2c@iRv5 zaoorlj4>xyJZh+YbhXkmql^y26y zaC$Zk{gcd~nZ<)SSTaYa&qI_je5!ll;jT{Az3^aHA0#kCN!F$*SL?(i-VBu?j-kbg zV;Cke3Y%4(?kLWR+NB74qK$O%bv*iEvQ2X7-qowjVK%p)JBRIO&N2I?1N)U_nK!@C z1O3xf8g3q5RAt~6;GI%gxC`)R)g0VKc+)BecL^TUJlrC@(5nBqrSfvEUKWCNj5fpp ze6P5?QmzZ%OaJle)eDuCiI<;vPDFedPqOyIqtGfP4^!xMt$nY1SGC!GSKQ)`pf!{3 z;4lAIb}sXl))`b9w8`pR@!?|th7Yj-N^;Jgp-0;u}X58%2Fp947O!`ol*J5c2! yHF29;(IYVWxt6vzWzxxVn_F^+cS5hX_-KlYj5@1i2+u(Eg%@g{iiB)NDJjNispL2wSk`@A#XeDBOeOy`Knb{7}y zrF)C^37avdBCa8>^4P6vZMn!)LdKz9%LLScOhRqS6cm$bJZWVD5eF@4ngwJI@_|_y z%1fqBpfa==={$52vH+cew4l>~Z8i3E9)0GIHDLtuFo~VL)*N&Oavu8`+@+0WI%GeI zUJ3;;^MlNyHHDkgsLL5@J`1scNou??K^fZdQItt4Ax@ypi4*vm#vtmHOuCLZCaULR z?7lHD#pmJRyTf+Kr7Ny6#a!+_R%7lX^}~ItO!ry6?p*mqPw~&t0$vWjrL*wz@Uwaf zUIG45Jq^!-KcQ#f&B2GBg*OjBvK~BRv9waHm4sm3cn9Jk0&jU`wNw*v}ZKE`OE*6-SfO{bl;YnR8;R? z2;hAPb^ymiC-g kHm}PD??#?qs>;M1& literal 0 HcmV?d00001 diff --git a/c64tests/oraix b/c64tests/oraix new file mode 100644 index 0000000000000000000000000000000000000000..68d2fdf85be0204bfe51d47ae2964f36df6df54c GIT binary patch literal 682 zcmZ{hKWI}y9LFy&THf~{XcwuvoSXUolD0{jy0n^_=)+(rqE20eS8Q=}6Ds%|VlKo< zaF7u2&nvk~C-L7>Ma=NZ!$HJNaBwPFoE+ls;!{EJhP&_Qd;h+_yNGEYGTFU+$|^s| zTSbd8=0#jX+~l#l^~OT&BJ+;Q1iW`L32$4b;H}9tJSH=E(avg-08Qx$%k6t`l_JA} zETA@$S4@?pG0sRAp;C|~s5ImpR0go(H#Suf0~YLS!qD;{iH*&687d1okF6~3)50np zvXw$VjpLEN`AO!`&Z9LAN6t`)S%?$Zdur~cFhzH-PEw-Ik#Vpo+DM#4hZ85Um%%V< zpEs#Gkrwr{G4{|Hn&Rtd_`_x!tbc8-lzz{dWkN?4z#zhv|MQj z?OA`kM(uQUdF&O&o);4zM&qo5=rFQE$)gl{&FJ3l-%?$+-4|E6Cuq&Md;gdJD|_d7 z$LQ@=o3zR4UC{6`1WQ9MghdTIA)M0iHiVjnK?s*Md=BBHhBv?9ccAJSYT`O~;s;<2 r${k~M!ls*Li#t;CUgY&1KAfN|--7R@=6Z|E$MkLMlFKLDe#CzQ=X>{B literal 0 HcmV?d00001 diff --git a/c64tests/oraiy b/c64tests/oraiy new file mode 100644 index 0000000000000000000000000000000000000000..5c3fce3d7b26efba30939145f2c2d244b1212230 GIT binary patch literal 691 zcmZ{hJ!q3b9L6tiO38B&G>cYU&dq?rYxA9cJ-_Gf{`cISFHk)cVE1NE+UWd6??nv6p+nZUDF(ufFX%6KWqRdBQ>BL$g3 zWhAczbd<(0Bb|kgLFS<2ka_3?V27`7>n!@rn`*)`@*s(g?N$Lg30cHW68C9gnTqVh z;Kp$x^!H-y=XM5S3lDm z{nK;`gABZ|PGgXTcU;e5kb`$b&ts5>7t#wD6yQNGVo-$VTQTpOFD=#TB_UWh(t&sf zo?OLbwq)E}>2Ia6L9dzrDPg5v#X9JTKs`c^2opE9pmom=ir-C;dfT;od6nsN8` zFaK9|&-1p`-77a~Q=@y)z=sLg22M{PZ{XDgiU!_Hpkkmufy)LyO`u@l^)L7xsC<^1 zxWOCY1F-w)wzWE4rIY0*Z^$j)^}W2yhtrhhtM@(GT;JsKG5y;57MDF{93ij+d3$1SvY@Z872^$?s8 zPihYm0zFLGDHH_pbx{#>SXn%XcoRH$l3YA_h%<3j5S+uz_xtAY|7OOp+>;i$H(PY( z9?m-F9YTmOe3RXz$-A}s{0b3gcnabTPeUB>48#V{LJ-dIw3*W)1vMp8@B>~zwa=F= znO37sl(r!=;M0&<@EJ%3IQG_ow9zHeu?9>nPbjf_&@4jcz)LvHVNWfrs6!4j2(l;) z1=dGChUPf#Ou*xls_+!{1D*#vi&0g1eME(5ogQQvRr?gD(V~je_{PvnxMfS-hm~0E zYLe`mJ&S$m_kOr!SGoF*%R~^L`cK4=|5)_>XTtKId!BpavwDnwn#?0CAhP8cLK{&| zjw75#bV^PjoIx}qClMAAK~5noAu`tVLoSpTYxOc?q?2lcJ%aY;7njO)roH?huU@@e zSsHkSfhUseeSeU(o9G#9DtSVM-Z0y@gIlsqjsmty1ygGV-P^zXU)i}vTW057rJ*)? zo$DGt#NcQ+7sG;vmoZ$@@H&R7hHeZi8a~BvQNycW@H{93ib(O$lWd_yyestJwk0?r zo&*mPS1N4TDfA>hdQlN`NLf6HcoRH$D!F*_5dRxj1;K%t{eIuf?EjmYm~Nfa*@IHv zoPSg@=S;?!7jramnU~aMlae&Y(FD_LY zBJ^^9yhiO}b!q4ohn|-Z9|psy-FQE?Lc!ydc}?qV`gc`_?fc>e_XMpO4)6c+f2Dhc zw>9^$+N4dkdo_fQ5ttzqBUlLGbp#hecpE`2gl+`OA$*SDdZnDPrC#jqC0{{R3 literal 0 HcmV?d00001 diff --git a/c64tests/phan b/c64tests/phan new file mode 100644 index 0000000000000000000000000000000000000000..c0a02475b2881e61f8506e0060c514887ed3dd8a GIT binary patch literal 628 zcmZ{gziSjh6vyB0U5+;chp`dFX3`l@SOY;xWnwOFk|ha8ynt284J7#EFR*YeLgq*+ zArLthEe37^u@QfyQ4vqrFjz>i6D+O@SM2>xa?YF^1;HtX`Fwfv-e<-_?*hWpkt@#F zvk~XI0|3GbY&J`?TMO>^9EeLiM)8T)QS9*sidEi30lbB8ift^u#1Qtu+JV8UYU(&f z86yXx%eh5l1G!CP6M2fr77~Z2$!;6BzZ3@yyRweE4JgGMH z>c+f-EJF_3cod_0e$+zM4q@BO9NYm*&(xyqDx06p!V9~G>}Rjm_27|C7d#^m0S#V@ zbnr?X25$uh?|k38_d`GOpCvmO0a3%Ui;+dtkUYl7ChDR*!6-%4d3lOankXWB7!43* zEt?OT$W6`XbBsY4mym4`lZ{U;=JL#Boj+NA`nJ2+&!9wfoyfAUy}oKCRkN10cuG63 z+NCGu$Fc-_Wj0C$(>49=^I!h&F`T2Dc6i{f>q~xEFz_t_$H27&CJek!VA8?ZYx&k?6GwrQ_qJUy8gsLz*ZXzkyjwTyPDs``!fwF2c2 OsDQO4${$kiKK%s_=>6^h literal 0 HcmV?d00001 diff --git a/c64tests/phpn b/c64tests/phpn new file mode 100644 index 0000000000000000000000000000000000000000..be4b9870a2367e4c2f5169ee395126f13abfef70 GIT binary patch literal 623 zcmZ{gy=xRf7>8#!5`H^y7#l%s#?FAknnsD0(K|P~B$p*vSfyO?4*vxUS0Ok@tO9|A zW6@&ZCXh<}NTVX2uwhXUu@fw=^7g)RNiNAbvu+dwrx@mWc;|h8GX~s~Aj=cy?8&tW z`=U(<5k_FL0?j=sI>i|xPV*+jd!9gS@D@agw;>4c;AN$YibO~@iLpw?8gW0>vI&`h z??bl04AUZ^RLhd3OBDUlnB4WkHg8rMSd|}qh zGe*K@73`6v-Ic<8-ecPJ{y1;?x-*};LFz<~eHx}w>m!M=pn{L6%q6q>u=YS!$wrOY zR4`SOZXf>ge~;k|T{6QhXHi}9!&@4@WMFH!kinFOHyK>h@GgUC4fPCeYxtJIRSj={ z!%-mThFa`0^~aA}c71Zmyff;m$$XCb+@qnfS)|FR%F>8?mln%&l$WR=WsmYQb??$& D8BGJ; literal 0 HcmV?d00001 diff --git a/c64tests/plan b/c64tests/plan new file mode 100644 index 0000000000000000000000000000000000000000..785291bb7df899fbf9255ed4569ce14458c0282e GIT binary patch literal 652 zcmZ{g&1(}u7{+I}rS3B%%}3ibX<8X?1{Bs_l-^oRO?7QUC?cK;y{ynQe}T}0>qqE> zcoGVgu;^h*rqGl4(Tj>0VP)|k;!W_7Q^-X;c&IaRRS&ipbFc^-p!!{ZPKd=z4XCm;w<;#nhw#yiU=hs4+=$!_>v z$uY+)at-Z!H_EXsDHfHqxE-}<} zNyf21igp4gUF#DcLt`A<6L5J(ot{LO9Y-&PUJT)OFNyGuPjxVTa&GDiGZ3+xfJHov%9tT3&m|7ew^i>1|p zmK|s!&ORIstagU_#+oudq&#n!t=sKevPBNs>7o`V-=M>e&DQ literal 0 HcmV?d00001 diff --git a/c64tests/plpn b/c64tests/plpn new file mode 100644 index 0000000000000000000000000000000000000000..9e179c6626b887fd1ed0e839e21363cd38bf35de GIT binary patch literal 623 zcmZ{g&1(}u7>8%KQhqxStQSGNjJFmP)?So)vYMFalBP=$@zmpr3H}QnT!qpJ?Ws_x zhD8qpnL>*7djv)j*9?j_e$pyOAQ#%oyy)FdjJMzDjfXTgsdG)PEt4`On2? z|CNCM+Vh-y-_`s6S+a+4fM`nYAUr^HM)naNB042^5gs8rA@>jt5m|B{A+aK3QUA?s zIy2{{86!cn0`|z#+2zba+GRTH{mIZ4KWN zxT4|hFZeB#y{;C!M7^owmR*}!G4G5!YBHav9(QSAY!_%eu3YL-@8VKvp7J6Uq~uaw IqRw6V6PcL>LI3~& literal 0 HcmV?d00001 diff --git a/c64tests/rlaa b/c64tests/rlaa new file mode 100644 index 0000000000000000000000000000000000000000..6fe1d283d36c101a52c5889c8d89ec8219fa71aa GIT binary patch literal 639 zcmZ{g&ubGw6vtSXn%XcvC!hDtqzdVV#L9g5Wz0-_LjE@xE^?>Yt+IaQ=d~ z@Mzw<>=8nw7215Al^?YIdY#BKBBk=JAdttxg4_}|BoPjt^>Rj}R5@5yDHSfxiz4O- zL)2>=HhC*$vGLO1IiC!y!zr=v(1g?4v=~6r5mlasaKqOvdllE)2tIGu{t`rqeE}m zgZ=S+H6X`hew9hC-%O8pfBC<1c$4+*;rmusHwD9W10OT+3|z{fVc=B;*A2YMV9CHF zgWCo^XK>BH>)-GvP-|HiUtvM50&lX=x9{YAJy~q9Ky0$1^|Hf~yw37H{&A(dy}`sT OlVp37iF?f7VZQ*}QQ*e_ literal 0 HcmV?d00001 diff --git a/c64tests/rlaax b/c64tests/rlaax new file mode 100644 index 0000000000000000000000000000000000000000..712eaeb7c254570bf0b620f4075cd72f8de4b89b GIT binary patch literal 662 zcmZ{gOK4L;6o%*C*n0ngplr zScrmWA!Fdvka6%CeGfZ#y)Coo5r2OTrk1p^uZEqrYCNcf(XP)zCc)>>P2z!SDak0h zF?8aXKaqma&JX?PRBiiTbQmo$6|;G~AvzuK5g9sUX#D%I{I<4*dzR{_5KR literal 0 HcmV?d00001 diff --git a/c64tests/rlaay b/c64tests/rlaay new file mode 100644 index 0000000000000000000000000000000000000000..ce337cdc516457eb1e7326dc2dc65ad1a0714f4a GIT binary patch literal 662 zcmZ{gOK4L;6o%*C*n0ngqHgkTJ4yPASh#kh)K#j9NxfJI#n-C1iqPQF7F=}UbrGBp zA0W7p5D=V@33MgCHY#EkH(XqZxD#Bs3fZ_27j-6H6$H;>_`iSVaQ-uf<%BJAf9Z(5 z{BX%WW)nh$;hL;UCvKOWT<#(f2_A-c%OeoGJPNVNV-SSL@vNTEA`E57I98=nNgU>B zEJnaHkWug%$QbynzK5N?-j*5kh`+xEQ%l;|SHn(QH6B#LXxHZ;6X5gcCh$PD6lDb6 zC^|7LoJhj@$R|;s!mVjkI8)Io-xu2H^I8lUaqj7FEi~W|9Iun z>EimxOOHG;!QStUvi3qlV?!kmsnDBd^JeFUY?9p$J5L2uZ$`(vzx-d>I!ha7t6!|C zrb_Fah7SSQ8jc3AqTy8lr!>3?proM}z$Fcz0ywGR^)L7xsJN<%U8a@n0oc9ehIwV& nQIq)=t?+HyGG1Pz!*P}6tN-nIt-3||T`EX*oAP_qxkG;fyv^$3 literal 0 HcmV?d00001 diff --git a/c64tests/rlaix b/c64tests/rlaix new file mode 100644 index 0000000000000000000000000000000000000000..f60672eafcac43478504cc5ca3801008a59b2c71 GIT binary patch literal 656 zcmZ{gPiPZC6vk&aw(d6&%>On`(oXbZ#KPK((p#&kNnKhDMXY$}%@tb2_UfSr*F)%p zcoIBF2nbHd6nhf?T~x#zwk#e*ya^sWg@AbSP-o(*Aovc$_xolZ^Sx(SPR1hlW=`6( z4`%GsHX%e9p2@D!=-rw#SG`O`j>jP0@;JmEPe82mBn06pJZq%2h(Ws`!h?0lq zz+ztx20t9Ktz13VDiOq^-cvE+JrUo$=fd({xUO^Kvs%DEB{T5z2ugAcegQ#Ij>Dfs zkd;~ZQwZX60zN|knS)X*8n-HoRdLdlV@F|3|8eac`-+?NNs@PTPmX5&g%{I;JqmKHSZ&H_U f(YEpOCLN5bEMJ4~XX+c9lyfS`#unub>g>>;QoiTf literal 0 HcmV?d00001 diff --git a/c64tests/rlaiy b/c64tests/rlaiy new file mode 100644 index 0000000000000000000000000000000000000000..2391a95301aaa619c583c022828bb3fd06e45c5a GIT binary patch literal 665 zcmZ{gKWI}y9LFy&wZ88`P!}QpFKv@1(L$_)(yi6hq&`}RMKDtr;R!7|+YB9i4#5j? z(1L@6fWw7%g-qhVMWvYGm4}0fn;^xhWN{Lyck!tp_#2Mz=X>|#_q|`pv`(62d-il` z?(uBtT!|1OLXN?1(a8OpHDA3(M4U$2Fd+WXCJZfUd#s7Ao@zXqHQTI?u$I^HltBUI^29Y1`J#&uSC@luX0R!Y@b$ zF9$y(Gw`P2N96>(Jp2=K5?%p5d4EEJP~2<4@Xf4;bCY^1rMvt>qh6Udq;Li-(__wn0hlh-u>nO%I-348{NH1 zQ#IM$s~SE8P||QFfCUY&1GuQ+Z2(mbg8=FpJ_T?=!<%35J5Xgw6}wLD!ZDNvb8X|s oxTPlZO=|N7?S@|6ro(ZS<*Wbgd~;)y@`qHAjRxi0)OtXF0`WfY&;S4c literal 0 HcmV?d00001 diff --git a/c64tests/rlaz b/c64tests/rlaz new file mode 100644 index 0000000000000000000000000000000000000000..bdacdb12b8ee42b756b8c95094f254fb24aff61d GIT binary patch literal 642 zcmZ{gy=xRf7{+I3?_-}y_C693#AdAY#K4+HNtcTkFL6oW2%@P1Ca{47{{b;qWGxQo zI4dEA90w`p*a@T(zZw?)C`1%-SgY{)~Af!q>VNFs80+Rht6p>kMM6k&8;6fk8& z6rnN@C8#V!*<8b`-07<#1|-S1K#gRbObgAv?kj0w_1hCrd5B3IdMAJ22mF0 z&PL8h0kj$Jk0B7_da{fCNI2jpa72-0k8&8=e$~;b`4nHi=8}CnboiI!;SZlQwQDxH zK_m%T_(W#I$MS3VOgiE7AnwFWny^T%r}T&=H+yu!$nE`NVK$~v%z)|yUk z>(E=YdoS8mU2+)lIVQP&GdkY><^Rgw66?_3yLwAE1-++xF=&hjn!ez~>1 Q&cqIrWP5{&CiCyIpJCbF_y7O^ literal 0 HcmV?d00001 diff --git a/c64tests/rlazx b/c64tests/rlazx new file mode 100644 index 0000000000000000000000000000000000000000..24e26844f9ded175ff1f99261d9d83127bb46871 GIT binary patch literal 651 zcmZ{g&1(}u7{(`?TKAb`o1`E4Xex|1BNk#WmEKZKOzUDH6qTNerxlX=4|wRo^&>bT zo&*mPB1Iy45PT2A^Lu7q-shc&X{Sx{VBu78 z>Cr-Qu}BCJ5!YZ>sdc|*mo}~tk>@dpcRUWU$1R9DpMW4df#T47WH+nLQJ_(LCVQ5L)V@+)LR9{kwNUxQLOoGp0H;IR;r7Gjt zwct(Q#G+?@;*)4i;odYHKBI=GvE%U+*f9(&>_0IFF$6~j2@Iol#Z>v(JX^b9ksV`b zvabijpElW6uG*FvAu@2Z{Xs=XRFV~p%Qh&VK%K7U0$jgj8 zVX+Sfqp1DpFtVwFM^)y!(YfW_lpV6?F`Eje-i(g-fBC<%dy%${?tZnYnw;(>4Ie`& zYB(LjvWC|ooYU|&gcS|_5H>V?4&khZH^1O_pz5kBc9}Yb1d9EowsCFTR+D*yI(&5%$K<*I literal 0 HcmV?d00001 diff --git a/c64tests/rola b/c64tests/rola new file mode 100644 index 0000000000000000000000000000000000000000..f79f6b8094cb75fde8b3e7f90cd4c30d330149a8 GIT binary patch literal 647 zcmZ{gziSjh9K~n%Om^SgZSF3YToP=?&I6S-jgl^>7dN_ia0U?zNx2si{0A%!%vv1I z5i7w$j|Gc4ZUU*qUyX`*#mZtKVkcOLMcBs5BF>y^1i>kW_jxnl@4W9AwqLc${lydR z(!)jfj7ta+Mrg7d)VbGc`pZNdkNDJHn?CVma>!#dwb|E$^rufc%GKjs zBZ7o9d@3fwC*phfT-f1@An2DEXWe#Dw47+Bc4M7 zIgNN8iLtK#tln5@wi=9)$m)YVg7%hI)*3CQJ?GGCtzPif#$ILY35R_+7-t>jQe#~u z&#BOxX8+D`TlUG`ka<)vb!WW2`^*28(Pg@0M(@3@Dhi^j8a`&=YB-%iUBjyk&TDv+ z!K#K)2G=!w&fuJe*T3OUAn&4D>;@FlPb%%O~MqGfDa<+a`7GMd?9kH8Ittfu)FekRG?t;>Dxb9E^wH zgnAMyNCss2LA>V^5IvrT*yId?@C;rwvs$E}T&Zdfl-rOQ z*hbQZmJ{H!kZJHaNCsZen{e!#9ciOa!m$QSEsrQs>!>U2TBM}WX%-=~;PcqaVpsK4 z)J=P7bQ$tzbFe=1Ni?T$cN#vQQ8DshCoz0tg^6L$QqP5nLC+ebF-##mG|V7MxMfRC z#EPtXDM=oik;T64M?YOsQ?6I_R*4{WT7NFa>d(~lF9qtaeBZtPRsF_4OXd*R2yHou zU>0FUP9c~>cw9~+C?Gs4XAl$-Lgo?7BQ)0aPcE0rRj&DgXcg literal 0 HcmV?d00001 diff --git a/c64tests/roln b/c64tests/roln new file mode 100644 index 0000000000000000000000000000000000000000..b3c468407e77dd6c7348e0e711b100aad3d15a3b GIT binary patch literal 644 zcmZ{gy=xRf7{+J!_V)IfWOKLq09@X;>@`!2)@Pe{GOSY_j$)~!dZtrm^&TJ zKb{ND1%wb`#3s8z-TTc(xJ1NpZb7``MTmWFLu~RA1mO;zcc4WP(gLU8704ne_aGhk zhU-B~8+;P71U{v01pe*5^e`l;)rP5MMTu5lb^5JLNu%GHh6MNw_JD_~r>^eyYz#^` zdCK|B$IuzaJr@z5PzlOlvp6gwEgm|^3Srez!PyzsxayK8X6CSON7;{%w3MrsSs{YN zG=3(m_^CLEUkE3D8Aai(uWIRkN>U^hq`n+O;vqdD$B|4TJtkcwQ%F5Ifn*vfWEsf} zQe#zrShcp$Xx11bJ*x}$2->@_uv}|0?a@D8bMbP0dE`|_o^aX6qfyjhAv0E0@Pf*` zX?E`pc4U|A4_J)~rrwN>_ka1nvbRKc&EAK4TQxl!}g5NJ4?Lsi4;94={io5P}p zVGb)AzT|LG!<%35J5c?KDt3)Vei^}Ve%IWvLp7PN(TK0pp7H7?&1{wBApL&6y|qU9 O9V*DyI_29mY|)>R>)t2; literal 0 HcmV?d00001 diff --git a/c64tests/rolz b/c64tests/rolz new file mode 100644 index 0000000000000000000000000000000000000000..d694c138776eeae5ec1cd813c78b21d2abbd39e0 GIT binary patch literal 650 zcmZ{gy=xRf7{+J!OxR~~dms7O2cBOWNMX_R!HUc8vagChh<6}t`I;Xhz;g&XB? zj#vp6axA2n<0gz4qmgiXH!P04W z`O%Vl&LxBhBQV)@YTs`*yiFp?oI1mQV6?d7$gkQBj?atAVpieWp@ zateGNG7G){X@i&aA>7KXfpjn;@v$yUEelF?2C74)lPGBndW(>G@G|!Ec&KXXs?&ZJ zLmQ_~4y}*8h~6~r&A{igD#0A~hP(iF9ETL~#9QhYHeeQ+}6vJM^Ui|yo)!RHXX zm`;L&gg}Rj?<$?de~XHkA?4v9;wCsag|~=>3l;rrRv>XFxkV)_YWD0y*Z^AC#?#euRBp7MH)bfZD^{%?1SPzvny3HBL4EQW|GI*$Z z%Ic<_B>WVPpZ2X!d>qXj?oGhulPbg%wtb!jJBGm%YcGjG0>Pm{8ez;?veZA=NmjWO zC);Ldv9J5#Plwc%tNyk?1o5c%OpJI>#Sia=u)LS9>)iaJX7EqREc$r_MLCW>Lr{=8 z^a}{GasvHn1V`m0`ZEY1r_i58V65u-EtZxl)e>W*lW2oIhV~YgYNaaEUiObyUA|DR z4ZZx(6LI!oe;BnF3yoD3JfMRFm7e zqTyo%wuVy?ENXZi!FdgDBUskZi(o~==LpVec=HQ>2P$7w#ja7eco=qXzGYq?b=1pz jgSvc^c8piIXgI2}d<(vxZLDul-lBr6Z&JQRo%{3v014@7 literal 0 HcmV?d00001 diff --git a/c64tests/rora b/c64tests/rora new file mode 100644 index 0000000000000000000000000000000000000000..32d8fa473cfe0459c1a089bc7334a9084895b249 GIT binary patch literal 651 zcmZ{g&1(}u7{+Hew(K+M=A$1;(^MF51}dz*D7`hBn%2cYC@P+crxlX)AMlWa>ql@x zJqaEpL_AE$6nYZBE-GRUD~ksaZ-NI;VK1IM)S0*{2+m=6eh=^a&hw68xjBp6UtMw5 z9~iw80CIDexs-0H<_)pejZrJko)wWk!kiK#ft&N*aT15i$e5jQtEAsGh2t zv~OdW!tquX)+auT?i}vU!{ZAoM-J>L#z}-z<20g#Teehuc7oN;+vKqsS?ud!^ur}> zRVTJfT82%-+r64cQ|HL*`P!RL$gi_m}@G`xoe**?(W{s3xy}QNza=91SO9C~J5X z!&wb)V%XF$is6ce&oP|Q@cI}04piMzhh3sxDGg_|wr5_OcGb(gNj=`8edA?=M$;ydg1QLea%ukcwMqLD2c=tL6Vv)=AQTa&;uN95)j=fK#36X0 zPJ&S&!Qq`c;Vq7;wCsag||34)Vnk)2>ym2-_Mud@9ukNSng?yJj|w? z<=w1v-XVktqiM2RH2k1auH>!~ah69Q-t$?AeIA9_;xP!q<9N|dXc2*OrRqtn@ib%{ zwh>q|4b(Nxf-gcw!IvOo;Eo=EW8dzni2?DaS}?UdsYJb}j#0}>8ohP~G69~&UILHQ zPD!1#7ezmYxjRW%pZOfxHtx@($`@3W6xcb8o>_iqbYQ9L{Lt{g8b&dSz@Hw)5ro{L zrC!C-tb934o|=Khz8wWWT~b$WZha+B1ZmRdp_pnu7t_s`0?k*|s(bUR`jLN1CgG*w z+j0)xBK(N7;Vr>GBj@2c@K4DFcp3PRDR^1<#-{$we4$vb6c{7jNC)f?+RGI;3Kgck z^c=p&5YZJzx-d>U8g%{ zcUWqvrE2$zhEEf4G-M`_*YIWnD;nNSU{%9l0@pNrnZQL2Z;#=3pwgNuR-;w>1f0S0 qj(KCoRX6i(TICJeHD2GP!HmlC-T!f+RokX~mkLsAQ2vCvkLfSw7x8ug literal 0 HcmV?d00001 diff --git a/c64tests/rorn b/c64tests/rorn new file mode 100644 index 0000000000000000000000000000000000000000..46a5435c40eab8c4e49701a48ee80bce93066e45 GIT binary patch literal 648 zcmZ{g&1(}u7{+Hewd^y==A%v0Mla*dfWq2Kr8lFgNnILPf`?x0ahtaI4|vF-+e7Gt zdJ;TH2zZ!~DfA?MT~x#zRu&H;-UJUGr0m6$hdL8i1;Jq$p5OD%%RKKGmRq*S{iTb} z%EKjR*&&1oBQV)*YTxr(-Z~NIxCQZs1LBxdh#j7WAUuPoeOn7aTHsmmA|$ZJOOP2< zjo6YUpsSIBmm$;O3%UfSdUvF16B5nzU}~9HqB~OEs!d5_)L(?O!7Dhj@j&%7RPBgj zoW_NY^^xb$&*Pu~pUWMx#CTic?S6?EUF9>Le8#n<{up zW!^Cd`{O-1Ajf0Yq=KnC)8p-5{;wRa(?fIkuF+FX{_vKD4+%ILE+~2%OPu)HG6Nd@miU0rr literal 0 HcmV?d00001 diff --git a/c64tests/rorz b/c64tests/rorz new file mode 100644 index 0000000000000000000000000000000000000000..31e907e8187db7382b23423f4817a48f8e3d4cac GIT binary patch literal 654 zcmZ{gJ!lj`7=~x}OxSne{x6r@U4F*S1BEq>lFrkMm$-Ov1d*%KC@Ul+=`F5sEzZml zE5Sm-L4-MW0;$BmMn$}0Ww8*k6D+L4T3A`cnaipmIK}WjFW>jg`;B2aMTQ@hy$L1SmRj;!gF}m%WIK>Ou_S)c^NW?su5YT z40JT6!7Gp%@M*{__>3-qUA;X}6+;r9=)%-8qeN$*rl@8mjX`e~G7mn7{X8D3o`#yV zpMjsnshhs_iBF(c#P%dyKBZEWu;=pv7{g%-;n-mgQNpQNY6EtLHLoPeo*7x}>rwR6 zAsyxFt*#S6JnB6aW8M?--Fq%9?}h6+8(-A={~TFBP)1ml69_5@Ps$>KX@n&?iC_j{ zR!$+9MF?3!Fo)1s)n8YuFE(3s#z;T43-%b=yRf)YZ!zr^{&=mW%Z-(hR~~sH$vzy7 zvJMlGv8s|MROmHx_pX0O?vewaHK|~#W^}##%m0=At8~Zgzi)I^liRu*jpC zllJVB8T*V)2oZ*BvTHPcuU@OKEEAFD35XAT1Y(ybA=Y>bg77q6wlZ2Ipj?@N>n-v; zWEw>yv}7J=XdD5bfJ}l-1sTV-$FpEX^q*OKN%Rv4j`Y(AW7V>yW?`pT z?P8p4o1w+NAB6i=(on9NZ;lA!Qul=za-WNR_m!~R*N#)Y{!Q)SpChyI^9YJ^6#fK) zoE(Eci6AK%{3!&-We)x{0?2Xr1q8;b-r;?yQ2S6(XBnf9`Oy!yh0 z%F@8g4?GcPpAH65d$G`1Rl#E_^P1VdJ*Q{?#*tQSBI8%~Nci2rAvS`DFm@MESYx3COt{laF1i?4g2YrQSILpaKfuDZ2u?_< zfQ1|j76UhdR3T9jRKzP*77G#C`^+V|d>z|ZS;U!hRS=wFc%L8dJM+vKu+M<34qvoJ zo)24BEkcMeJd<6anH9&$<%l@PBZv>Y2C>fT5c9kNL3k5eOD$bQkWCb`G6HYo0q>$z z1K$T+egs(uKY(n2A40akkFnOmGufq^)n%Y$d?}7Euix3X< znut?&9?FMZVpF#>eZ9p`{-4&ysBf zU4%n&8^J!p3$laY0O47=gWwS1X}OEw2w__8Avi{8%;}HF7sjWY0%OFF%3u%EI?Ihu z7aXRu_Mgm|oG4EBvu-~V8TR?4?^;d8#+))wDd~B${G{?&mdSdBou`7Sp8odnFaNjn z@6ct_|5RL5L#}^U!q7i^x)=Dol;MN z2MGZW1DQfk;@3q*%wfagp@=uZgQpNkHXlvfI1^V3g70B?eh=^a&NE}dJpuA`?o4L> z`CR5gh7cmHz~)OV{lxRK*&9Tj5*^4-q6@hrV#qbogCwGl*P8<)I?%4_qcEei9O8}` zquhlc6uxk%iXkkjdJr~M1BfZQJ-{>5ue#WdQSV{q{t);o_OLm^<9$7Kpm!gFr)Voc zk8ykCk_Xx~(Qgt-0v5cIsoG9_XmnETBeZFBTpb{EXhhW^!YLYAtLA?e za`|O1$2qBWs^E{P@v`}1&f~@#{`I`YtA*mk8&5o$=3mB>tPQ7at?J~C4!veqEA@w} zN_Oh}Jd<4aOpeb-{9jqS&bI7Yv#_Cu{94JtZUPwt=Mq>j@IHYn20kXRXrPh6Ed$>Y zxNP9VZ}=0au%wG$V*czgnrX~$*|(=%eY03$z9_Mp^{&X;(>lw~D89H+USZ-clcZc? J;vRF?*)JWJ{|5j7 literal 0 HcmV?d00001 diff --git a/c64tests/rraay b/c64tests/rraay new file mode 100644 index 0000000000000000000000000000000000000000..d55640f1c44bce5b30b267f86bb580a551ac2328 GIT binary patch literal 627 zcmZ{gKWI}y9LMjy*Oc!a1aT3><=k3Oh(%DkNNN+4`mhkvpiUj1(omgU9DEt7SK3K% zkPvV<$Q3$?{}vT7!wV0GB5s0%Q+Sa7P1|@EpB4mfIDVfGzu(>W&VqXik!lr5fF-3Ox2cKu;a&vyZ?NwB;jo zS{3N=&}mlC?4i|0m}vD8Ic^p@CO^-YuP4b1I|BbPjz%tdsI88kzeyzVng2>A{Fidi ze5zeZ81cZiX)d+z_!_(>jflb4c>JWiLL#mDtOwrIaz_%E# z8u;)V{shV`>BX-wZ}tRDHRiYMJJYVdS*$QmlvvGrS7gz&&hj(tUfw9LFmaDbQZ6xZ IpSkPo7bzhB4gdfE literal 0 HcmV?d00001 diff --git a/c64tests/rraix b/c64tests/rraix new file mode 100644 index 0000000000000000000000000000000000000000..cbdc97f837f0c01232a2c672b4b719354ef0107b GIT binary patch literal 621 zcmZ{g&1(}u7>8#!wEQv<#ET$arneSU)?U=!`jML0B`Hf0^;Gb(tquMQ9$XK_DfJ}u zAYsA7z)qp3;@3q*%wfyoLByNj!Amxqq-mR`ZJdd#g3$Lc%=6=Yd7l{r_BoJe;}@-o z=i}B@ix46V&tx++_tbGFi?@lm!0Qknc?_||8xSizfgrqzS8FYOsY9o2FA(sgY@#qK zRn*2Z@1hce9|A5vhHQZMAQSK-$QJksHe1-x{W8X813`k(djY=kU95HRWKRw4s}%=e zeZ(9)4a9XsLva&H#x6k#vP-Nymm@FC1nfsY>DlC=O11PIB8W%5mtx4<7LoT_nZ0pc z`@whhy8lYH5q1%c$z6nph(=@wVGq%Hxrguw(OJ2V@EB269w0nHWGw2RnaasiLt26GfH~JtUeAN$tu|j*kvl1 z>KPoL{_&|-zeLwff2XjjhFt%ahA$~t8m^=;rQux)Ga5dmP}ERM;jV^nDNJj4{~P`Y z6>h3x*Qq;pCTrCu*3G41TW#iL>hgK&8*fWA8CEVoqt3O}N}2LyDoACX^83_YqQ3xz C;0BBU literal 0 HcmV?d00001 diff --git a/c64tests/rraiy b/c64tests/rraiy new file mode 100644 index 0000000000000000000000000000000000000000..82d7e4d2cc4bd3b2c227251ddfb12c0235d6782f GIT binary patch literal 630 zcmZ{gziSjh6vtA7J5H1m}oV zAcY(Y76UthRASUdC3wY#!9paRAi*kZVx4zE5Z;6RdfzlHFu@>*1O!s{pgb;h zG=O{D##$S=gW&TV$`0@h$}aFM%0BQh-0j1TnU`(Y?LgFp@r?++@KdOt!PB8$BDi0- zkO3Y?%08BQSJ?;hunQ+GP}!3nB#yfXT9sX8OSkgmg`EKVHca|1d8E_1*@aaiNI-*E zA``q6N5N~Y_{R6$`(O1l|0y|u*hV!WPa$?tU6yAMXHZ>~Lx{7e&P#%E4i!oZ<1tj$ zn)#w)X@1EoF-F2x16UnRHZ#9m@|ej6e=@Ifqr5!I>;~#Nk!PQVBh{vpSZi9`(a!63 z<4N>bHppJYrl??gW^{b~%l~b|MY?5&hviMZmWih*Vd zs|Jozm^JYJ7yK3~-_*s5)Sozqh352@eK+UooB0a$d6kCN+dDMLX_xQn$MwzH3gsJA NkXn`Uhtz#Qe*(mo{Yn4; literal 0 HcmV?d00001 diff --git a/c64tests/rraz b/c64tests/rraz new file mode 100644 index 0000000000000000000000000000000000000000..dd79bc2e9a13cc3ae2ce6d71a2ea503411c06ce7 GIT binary patch literal 607 zcmZ{gJ!lj`7=~x}NO*7H5F0^k#x6mHHHAtlZ}pN(vKUx`NK{DYDmg4|EnJJ>gjfj{ zaxA16*a@Tx{xwm=D^?Z@5u3f=;f%3b=~4T5vOCnvJIYMt&QipUDmPIK-k2{oe*F77M8d1q^pK@)Umr*4S5IbJNgOY zp?(W#&at7C*f};kQy{Bm3f4YMe>&u$O10(y!1L}a zxJFmZ;8S@?4SB(J4PP>_G@Q@C*07nuRSoYmn9@+oU|z$w46bN+cLcwM%F}AGGt?VB umbYr-E9Tu{N8QYe)Z;b{jJKC*I;>o}@sCSOl_KT0s2~-a^4rw8Nq+$)%KKsf literal 0 HcmV?d00001 diff --git a/c64tests/rrazx b/c64tests/rrazx new file mode 100644 index 0000000000000000000000000000000000000000..532835824259e23293f2ae11a5a5508487ca0de9 GIT binary patch literal 616 zcmZ{gJ!lj`7=~x>G`u%(h>aj=#x4g6YY>z)axr(_&tl*RBB@fStdhghHbpi?a6+sE z3po~24D19_iGPiXc;JS`Lc~t6*!$aTlDqt95ogX-L2!!Udmg@T=AAKModS6@e%73L zGHzZp2_eF8QtUF#KCIR9vp0wsY=iGXcEI-`d*Fvy@8Pj-mo2Qf;dL-}-@|9Vg_Rf&w$;#%I(Zjs9*@Aj zBWh!F5mAWXc+^Flwu(^U*f};`&62fL4EF6P{$Y^?WmVuj5yYX+GjYs$Dn2+b1e}+) zZQc8-9`?_Y5&S-aoZNyxKyXIJ@b?g$mfP_65uB7e@DC7VjI} zxM2fqA){TsI8&%G?V>-fR=!%A8M^+^i7fkgG>qCz$Htrro>rOXQ;j8WQ8vhi$8uCK z)id1Q|K|A7z{2g*DI9YqJq?`l;5V-P5Kjg Cr~;$_ literal 0 HcmV?d00001 diff --git a/c64tests/rtin b/c64tests/rtin new file mode 100644 index 0000000000000000000000000000000000000000..d3b63227538fd95c5735a640fd5f68bed9891b96 GIT binary patch literal 667 zcmZ{gJ!lj`7=~x>H0(Rvf0D~xE|IY_5MfQDq|)fcySOBH9tx5oof}9HtWB_RErJtb z6%9m=6^ntJgJ2>4q)`zsu(DW)*a;R_9ovY7MVvX;9|C?bAM?EM&G)`zn0DSIn-k;K z*@E zo`6h%=fDe)N$?_M3Vawc4PJuG02UvC%%ZRu=c8z4v8BY$HZjDbUN?1DPgK-&D}`nn z$4;A{ct6$$aCZ<6&#R?FU`No+qMJZ)xSK&3w=XImTiQxS%_}P^06Wg+E+on0SZK1Z z`{56p+*0byrP>uDh)dmP;*k4PgzgJrx-T8azWzmpKTt9Uzkpy&_QNkCI4TF=4R@?E=SZM8;|0Ys7;wr*YtZ}D#TQmWC4%Olf!(!8r|YBB*L;M{rfc=LpVfc>N208>-BxV%MlMmWI`y+=wmq*=jRi jp$=cAp0RtAhJDIQC-`=1ZFzFXPRE!rF_{o7L2`U0aEvf~R=fVuJsI2e(RbLcJ&y zDq+FHKqkXPmpyTVdn4%8QwtU>*0ZXEp`axOSIzw!a@N^A737eV@ zJhIA|dc$!HfBs-+4yn$@CAt1MnASI1gmtjQw(kdCYNoW!biy7>1- zdJjjhP`6tf?R%;PyKTPAB-fVlc=w0@dkt6EmL0w?Z)%ett{M24fotGg2J;49WpLTR zn+z5W^fI_<;By9-47~mYzYCR@^xl# literal 0 HcmV?d00001 diff --git a/c64tests/sbca b/c64tests/sbca new file mode 100644 index 0000000000000000000000000000000000000000..5bb1e960eed27aa4fd9eca9a960d0904b677ba4b GIT binary patch literal 834 zcmZ{h%}*0S7{+H?tn+lKg^K~btPx^2(WG**Ax8PISa2f-i7}iwcqkF#p8zq|L&K1I z(ZqvknsC^LC2%r+UD{GwVA}*Jo_Rl>ol&@Pma|tq zm!rLJdZO2&j4@M5`Ls?o^y2=&U_Ud@ivrBDD8gJ7C79D<4JH$1ykA(CK>>7Rm7#Oz zkws8}s6jmD`mA`$JLG}lDlu*q(O{x3GZEFVXM9ldr0KJf25W0gQ&MXheR<<0m+_%h zN0m7(Y54LKwox#bU)X_h2`4l3uyDB7E>GVP*)H5*S+;UI)(Gg~ET?(%hny;OH+0Aa zg_PpP8jSC+w8R>d8>H7kS&@4IF2_fXCwbit3OKevldTej18WUp8`e6+E|%Bvni3P# zbGd}2HAD_7;9o@*3mcf=^7Tm}W5r3RGcqj>k_!q#za%dP* zPbM5p)5OCx41tqT@uJ39lah@w#9yB2_2H%tw6BFk!`##@!^WHb}R-x7@ zN**^|Fq@w=nU_sM2v_2&Zfe0tH`_bf?ht;4<$=Fr1>lRU2z->S04Hn}Ud*h?AP;zi z2VxZrYTp;gC15+i#;GyErf7paP+TQKMFAYb$}$s7qcy35l0nUw2s@;%Hi1dC3AmE6 zW~q$7i!x-1U6TMcgJB&8lbIO@tn+Z(!w9iY)GL?4Z;vb&a!86SoQybrBb1`pZ~B1Z z4Z{r{P=+CEMR9*1hxxe1y}{d8n8W> zUxQgpjAG6CBFwEo_*V(&7q$*F8!){IF}8)zv<>=K*zW_|x8E;|*uLd{SS~^Xx*Dlx zc}O-^-?0J9AQvDRKrX=kD!4wYo8mC^i+b<%AbF~~RNp>ye_CV`RXL!$gp+t6{+yqP zKjTaBmmK0tv6wZ!fs_1ai4x>?z&6A>56&sM-1^cwvgj@yeda(sL2W$}AklO=W z8J2%RduLbgK&P&gbUp?8gMif9x&}K3bg7k&wSn$y(ZQ;=Q`LA-|9DvSn)SKLFgo|4 z=}|Q`HTO`Y$l{#dsBs;0s@wa&{NFHrBal?n%h3d0ilv7neD=VUaLI#q39mi4D&egM z-4e1M+>=o7phLo&Blu$|+Jj3!r^SpAnAzr}I^wsmGi%XetW`@ZubMU2k6tSFk4R#y RMPox6Cu6M|yRBKbwBOs-TrmIu literal 0 HcmV?d00001 diff --git a/c64tests/sbcay b/c64tests/sbcay new file mode 100644 index 0000000000000000000000000000000000000000..dda6c459eac3220ab2891bd31dadf07329dd89d5 GIT binary patch literal 857 zcmZ{i%}*0S7{+I}Sm*816fOqwvK~yjQInO64R8<;Y;hwWB7U5D@K6#6@h^ab<sCAzsmx1j7o21$lo1rb@KysuIz9sPiM6)-C}=%r$O@Mx0T?OOqkEZ}6m3Tzj630MvII<@`@%d;{BD`oJf&uD+4pVO415V{JHcEj&`!cIukxS3e%sz2-cQ6h-GA zG(9e-X0i`?iY#T-R>f2?r@p=a%l{42H+)Gsy%J7fQ7ka6c~foD$Olpy%3?@|f4a$*e<(u}&o|y=qq+FM6q2KSGI# S4uy>>CYk6|*loqQrThly@?1Co literal 0 HcmV?d00001 diff --git a/c64tests/sbcb b/c64tests/sbcb new file mode 100644 index 0000000000000000000000000000000000000000..806ecd83b9469f1f1e4a4f3b0fa4f9bff199f73a GIT binary patch literal 838 zcmZ{h%}*0S7{+H8Qs(W_6g(Kzn2aa8i6oVa4e_9bV!@4=N<45dy;%~_KLHM|hlU~b zWb|N~CLX3?2%L;x7d36Su&}gHh&K}t^q|>;UhshLl=UMf&SCcbJ@bA%JEKwSBqfiB zF2skQ4aG0T2_ZtWb#~T>Ji3(}NfL2}S3p#F6~r2^ftckE2*T^|YH3{s6~H4|2a|et zCBg>q2Jj5pmdAXp2Rz}U7kF`l(Zyu9+^KhkXJ)tW8 zCY#_8uR9NV8N)sd7RpO4um<7pF=mvvXwb2Y-wD+*+9pM^+LLI9%xIC~$i+j7MW!D) zq#Q#`@e^%A4_3Pq?Q9+OCSX?VW{4^WvEyMuw=Weqc7elX4fqa72ly_?b>MrjvJOu% zF^xS}YOw48{tVscE-Y=r;uhq%hZnUCY##>D!Aw7|K;d-f+6J%$xeA3aauvST!SAwC z6tA8QvdQZa@?7^R`+Vg8u*d?c_#D$j5IbzY6y5d5D-UTqK;6ni83Y-9@6?_a}M8W%G_+=%jhW!ZAp7E6c08vZBiFoV(GzC!GkHZ2>t`@!3c&< zi6=o&Lcqg>PH9i#uZxNplTEk3)3hE04-KO1K~F;Kn`Hfg;2d_}=R5Dmmp2-0nwhUY> zSP!X+zsV{TiPM?^y?|jm26KglJ+OM=?=fbO*QnRAfd3KIF<2)#vV1&J_nE;Q#gX%e z6pKtZa7a0ZnBqq2gdQxnM(UIAQLh4Kg~ohTIS4g}dELI0py>jKOB?tu$O`ZpNC)^n zEIIH16XV!($%e%Wggz5mQaV-5rETx|dNWVy>teYS4 z?fyA(4eT9oOt}tr6`Zqj1MFRJPRUKMYv6RqEwJ~%0l5wKJ~-N>diQ8-XfzpPjO0r> zVAuUh8yFgoC7IIJerw6ZaD2R>?KCtIVCzQ>uf-Nun?&a=XnI=D-C4XXb7WFm BPEh~= literal 0 HcmV?d00001 diff --git a/c64tests/sbcix b/c64tests/sbcix new file mode 100644 index 0000000000000000000000000000000000000000..88f08281947e437f9ad0afb06838f9f1e519861e GIT binary patch literal 851 zcmZ{hJ!lhQ7{}jBYrKE1AuWhh9Xz+3D8y=OC=S}%n%2X9Sfo02a7eMm(XkzjL+Bgg zBsfS2I9$k;c2WFVRKy4=hxusIuOw}SX0Y6#lS6&p^sFHG4tLM*|2`jo-ba%4qcVHa zaVF6HtRrwSz!)>6h)X@Kcpu;F=^Yqn#tEK-@rmbQEb;=3DPDxZ_%dF{N+QUCuEa$- zk~R=A&1Gn^b=M@l3|;|$AZs%`Cbx?V$(Dk$nMa-RDo8*;yA*dpN|C0``0K2-B}z#x zQCv>xNm;}{%qlX>YL3E{qOg^M*;H%``gt78(0qJNcG{)rKPcMy>MX$)4hQRQ&6kjA z-W(GZn(bxa6jF*EtTTCMp*dKe_(FOWl;t0G%VNBLf0EPfdk*^+XtG%VufZ&WZ^A5r zZ)3iMr<53?p7RByi}2Uda*3}Xwu-qmg!wwX)&|sX*d51G0qx{tvW@2uKi+u3b}A&! zBkm#2V|N*LlRhHT8q~Au&~-0+?y_Zdd(Zx*vsqHbYHl-wMLdyL#-Yed<3;2RJ^tHp zSifJR9sYC7GO`s|nz@2(71k+p71 zsw|mHK)vS?+LivXzEM?Z8K}_u;xP`(;atBx^q`gR0gz=UIh1ebpMO#g6P3vlFEn<7>!9xlyUIdTr!SxV2 zA)W*e5&|AJWJ-Gyzd%%q5mFWpB9b&s+NRllv4WmF)Hmr`L2wSU@Aseg@n>cgY8<8H zamVR!*VB&hxiBHbQcRU~YJo>LqrC%T#5%!?U@h?ySc`lGtSMdwi||!=nXJg52zVs5 zs+qIE6k-*0YTps4SAo}o->3QvPttaIptwqeiV`@4JAeX&_46qelq_ocOvoXvEeT9& zNx;Rdk)bmFAsomPyEy@B7Qb1+_cTlzqIwVaNjzk=v9!yi5 zH%DZJ?gj{O3^B!xIE2<0nj_A{C)6FltkAHJ%JHFtNnW?zA{UiTW+pz_52~vLK66~#l+hp9J_#o^I8@d`G&s3MP^?mo3L1t0yy*3;r7BT(i3#-|D zZoM^M;VZn3$Bnxce9V8As6wF*wl3D7;DCKftV3Z7>|zztk@EkM@l)sZ|fPk%23*(S}xUXjXuI-fvjVH@V6L8gD|+ zQ)>EQ?tw^?#T+}SSqyU;+sD8B-!OCCpHef+u>=;yGq)ss@gOYWtOrpE?>x9H;e!VQ z67n95OZetNuY~sp@W)VW5Elz+aXkp(d{;`H^cgsrcWZIpqh*vg7c|$0Uh4MGNMgEM Q<71jdrh7C#t{Jzr-$r9!n*aa+ literal 0 HcmV?d00001 diff --git a/c64tests/sbcz b/c64tests/sbcz new file mode 100644 index 0000000000000000000000000000000000000000..4d446e48e1bb7f2e66ca6f677742146b52db6c0e GIT binary patch literal 836 zcmZ{h&ubGw6vt;bZJd{FNP3ZKFYBRg78GJHhT@@3O-<`!r52Imq2MKz7XO4+a6N=h zi3brpNC*_!kSXm+{B_YynoYauroRwxf8Y#mI(s_=Tr7J&u$i&sIT z?p^e+m;2nh+!0ih2qjK=sj>ULW{6E^}7}EJ0`kCnj}wFPbHc`Et01=Zt;*}f#!t| zDZ>y`yhM}GgVnY~bGn9l128LgBS^*c*zq90+cyi29pGSI0k#c%9oPC#suSSCZpf~jF0xu z;Wcnva5cUGP6OO?d=s2)aL;fDoE>mGc^#ZxaDi`uvj?s;Egn3X8X2ERsVXU0c~I|! zgf=uXnVL|AR{Nt(j9yJowlue;nPGMNsO8lTc+xaF51{E;Isd5ikmt!-No`k56?0lw z^)LT7EL;!ePtB0#Uyim3QH>bpz<4aT}#mb literal 0 HcmV?d00001 diff --git a/c64tests/sbczx b/c64tests/sbczx new file mode 100644 index 0000000000000000000000000000000000000000..fde9acc3a8a0fa9c833cb5713f8cc1a626707dec GIT binary patch literal 845 zcmZ{h%TE(g6vpoqQt#KH7B&WSGbS!NiOR^vhPV(AY@q>z#28j2#-t>me*!EV7Y&!x zmC=Q1ny{FrLttfmZPXZRGVM^_Qo zI(P5c4$Oksgm}R9DPi(fsVklm<8}!(CaN+KhJGy*fRZOopNiI4b5oj`fjouH6inx5caYR^GD44t3irF^>EAEAMQSX|7EZ-#K|PY?G;ZdQQ-SV< z54oU_QoLA=@x6t{SZ(YJ=~Ylx^j46|>CxjsezzYEjvdfoy9}`f+lAPMU4huedr9u)Y7Si$TnX4a4r>-0t&m@9~7XkW2Eh*BA?WM;fYILMr>KVBO=CGH z3+;YLYF&LJy~CQ+mj7tOiJS3}y0%%@tgu!&s#`5Kc*+nLw@-Pg7AUcSpjS4~B#*K6FcX@52oVAALwjDEcreq3T1Agb&AX zVkq8EM{844dIUzXGZPpOCTX&0S5v}JbIQBRsuv_Ld+tFjJ=v~`e$`@=hAIZsWJ3K7 DGYV6j literal 0 HcmV?d00001 diff --git a/c64tests/sbxb b/c64tests/sbxb new file mode 100644 index 0000000000000000000000000000000000000000..7c6a9b5b179eea81233b1e66f63044de601b4f4b GIT binary patch literal 664 zcmZ{hJ!lj`6vt=xFzkQe&@{5Q_mR2e^08uIO=C!Rrx!1}7`Oy6Rw*ntkdWHMB86)a zoZ|#Pz(S4#ioYHKzI(%8+mmwAypyQ0(c3$ zWrz&;C?+jT|1e?jF^DYqI7AL`?CaezL^^c29n-P(*t4}*+igrhIor=;msy>+v5L$t_Fhb_^7$(;W3{xARc*uF@cdi!H- zTVC?omlS+Xz)^52fr^6H37l2%Hi0<>y#%f(_?o~O1#f=AZ$q{7GT2q>*+=2@W}5oS ofGaEW4eIet+SXoOqw#?BvK#%J-d@|F{I2}AwN1+JQTGl#1hp~fcmMzZ literal 0 HcmV?d00001 diff --git a/c64tests/secn b/c64tests/secn new file mode 100644 index 0000000000000000000000000000000000000000..391795d2638b4a5bb68e0757ba823d0cf9aa760a GIT binary patch literal 588 zcmZ{fy=xRf7>8%~B>ZmR5F1f!Mr;h2WRu1aurQa4dvQtN3>H=?ELKSHU$Ag3Lf#N7 z!9tD&i-DV9D)FmP5f5(f<}S(Qa!CZi!b-NWvWPS1svtPUFwet$JmVlZ4fbf_k~j5a z!n^D-#-tOu;sP%`yiqF7GkK00kRK?4+@dDrGPNKXX}nx-Lp4AhP!B2r?L##|eW(`b z07@f2PKQu!&=EG1Tc~Gn%R)bcqJ?+A;CGNeXNEY#!{L*8uRgWm-Wdwa%QVVE g8so9^W`w6hrsb>tKDoLw%BjpHTN&dt#{-}L1hzfwz5oCK literal 0 HcmV?d00001 diff --git a/c64tests/sedn b/c64tests/sedn new file mode 100644 index 0000000000000000000000000000000000000000..a9f1e1f6d45a7102e5f8a80b364ba91de4100d55 GIT binary patch literal 588 zcmZ{fy=xRf7>8%~B>ZmR5F1f!Mr;h2WKClTSeWGEUR)A5gN0QJixm?57c5+hkT=9i zND+<&i-DV9D)FmP5f5(f<}S(Qa!CZi!b-Lg1dBLxt_p%v4D&q9$1@Is(_oKBFL~n| zquv#dF(#eJ6&HBn(aqx2ER*M`4*8xE$SrC>E>aVck;aSF7E~S726dql&^}ZH)Prh* z4xlvhV{{1B0v%zqg>_?mvv0G3Y7-Z~qf6UZ-NDK(Lh6|7_8>mut45j&uEGR}Au)HO zz@E4%#OLGmN5JkII~kNr6pMKDT%L%Y$*0jviRe`r2KPRh_ zp_74U;c^BO7T#nqW#L^0B@49-Zd>SOFlpiKFZdng&zK?3@Nn>C-m8tTxpxNw^D+(d hkVbgyydL7|fNA-nzl|*~4Rb1S$(BYq&G5kIKLIRH?TY{a literal 0 HcmV?d00001 diff --git a/c64tests/sein b/c64tests/sein new file mode 100644 index 0000000000000000000000000000000000000000..e69ce7c3a6fb27b9ff8a8dc6b6437740fb0a401d GIT binary patch literal 588 zcmZ{fJ!lj`97kvOB>ZmR5F1f!Mr;h2WDSB6urTrBUR)A5Lkg=D7Aqv!T3Wa%g8z_I z0Sh@6ECz0Zsl=~FMLf8@o4X{J%Ow#63oF^i$|BC3tAgMZ!@S3Qym1hm1X~}y;Eg>Q z^)7piG3i9EIL8ZXw~D1{CeKhE@&hH1o78|@pe7_Ejh8Des5+<(>Ov);J*Wn#2h{}a zLuuqM(E(Hobcl@>9vkDEeH#r_n>c?TUE0FRHXiLDq>j067vdAXX{5Q}DolVF5;Hdo z?5UeVd^t*g1nhya6TzH`ViAvC$YarS`7C-R5xow>;NE8w|IbiuBwgr1wS{C4`mEYU z(t|#&c985tpHLkn2he%7i{ud6nYSMwFHX*si$butUV*rix9-~HY_Tk?YyWZO(hYyM z@49^_3!;70Pp#!rXWoS8O!Il4S(4j3gbBo zoeVq+7c&^Q@HT_%7T#x2vQW$5wuN2>6Bge6g5N>@lo{d_4+oFuz1rBSdv_o(FVip& gX@tkln<1VKn3k{l`<3OzVNNA3+2RPNDIWOzCt9!V82|tP literal 0 HcmV?d00001 diff --git a/c64tests/shaay b/c64tests/shaay new file mode 100644 index 0000000000000000000000000000000000000000..df7b51c44729a7cf29b59b02859b690fc6ce749e GIT binary patch literal 684 zcmZ{hPiPZC6vj6R*8K)Ti3h0)GTv;+CY$t6(zF#)O-*#M5R0Iv9=Fio)uW*6p*U$g z34$>M1V=K(p2U9_En*HE77rrc1P`7<4tnws-^5ixa1M|8eQ)Ny@6AL^=dfwq&86&O zD`)3z!!TsTi}D*Re&=GPRJv@)V_TcScXaj_Ca+h=pBFZZ8wX1l&w&S-88xxoP01! znjggs8nd`P2UpBf&pgy9DRSVaFt~39u|dnE!a=OxGW!`!QLD`a8EPISYiVLjvxO!b zTOHUK#+<52^Kpx>osSz2qeGK_84Z6p#&uF@<|@r>c+7hy4|q@Ir1wI?d+EB))z9=e z|16b*UqCReX5cR%IH6|Y7ZDs$bMO}tB-A|oB?M4;_{#_)8~R~a%ByR&GUrAo)dt^( z)=I1E#o?vGZho~^8pwZd4FasGZZ_S%aLBOByAMy9u-?OWZOs%`9bd7Vj4XU5^( zU;gj5bAdIZoqlDTF1ejc8a{+zYsiMMqTzK2XEf}GP}R^2;fjV&A)MCm<`?`nR5?eB xUt{j{BL55s2y{5iC3X`3Eh^OvuN)2{Zh{mi$)J-%{9Sx12;Okq=W~C4-@7xT?$M}m&pyox z4{VlWhG7WPx9A3mHI|)H<*Ff0@DzwW&Oq$)G>A2BgE066Jl)FZ0Ryz!4g8Ks_+6O- zK1fK^)3DPWtC>j#NnB9`iTw;n8~7~92>{0DKxTl?gN!S7SdOY*;?cKG2JYjmgC}&- z(6-^!-A?oapM|80~wGE&6PsAbru^9EA3GknL zo_qZhzRy2RW+5no8kdt0OoKWpa}dmcIwtcF%z}!`DG263fh<5U56WECZ@W-lT&k8S zHCm}A&^Mr6X>p}orP^ixxN7B`vodtWp%XFsZZOQ+i}cM^Odi3|YgTikeOoq--8Q{J z1jRMO?(JXx@33`|)UDROvx%F$)@2RvLtq-xAuMQk8Nyi&uS2M4=!I}i!^aTLXn6Gt zeg|^SW1}~TH+}?IuTZyYBQ93v4dU@_(lTGvNq+>hd{N)?o9hk2+xTtk+k{KvJ|sT@ Dr279C literal 0 HcmV?d00001 diff --git a/c64tests/shsay b/c64tests/shsay new file mode 100644 index 0000000000000000000000000000000000000000..88ac4ce345eb01a7221b3ef42b3031254acbf688 GIT binary patch literal 714 zcmZ{hziX309LDcWq`uEVuyK&8Am?Vm$ZHovx1^?~$(tWd(xgotIwsKKzu@5OP`wZr zg-WHq;P7Iuv6J|ti%M;VlotmPH^re-$e=hl#P7wZAb7)ZpXdAB-SfROO#6h%?oFMy zrXNgMmn_DZXE*`zkcaLRlf~E)^G?eYygiwQwcqdGd8T zhYd0$skm*UmBG3DgQ)pI&ZAMl?ILQjL?ITS22q)ZxQgDk=?8mllg{>o2W|5pg9*B= z9+ozmrzo9GoYtI1lMmDOvgilxis^!ilA zGjZlIhda-_BhFLrg7d}o`9E4=?n<&W)XGE63yF7wVbo5r zZ>&)8AZ1<+Y~5_#P+M%LC2ny~kY_mU|K2i?*JMr!6G)U-01iC{C%T z77ryvJPc%tJ&CW2ikQQO!Gnl5!GouegPuIZ*|;hQ{tm-@KJ)l}XAINHm}GbEq&>es zXP>qSA;Rz?>>9Q1FIQJfYeW=y4B{;xgE-_CM4iVW2v6YIb~2b)&_c$*2Sqsso`c*o za~sC2_E|_h<{{(YQ;-S3<^{+k_%vin*+*nrb&fs$c96say;{}h4=l9fII%w{njd)@ z+vB)50hdqeZW+iyk*C0pqPJ_RXm8Kd7prJ@&+Nw0v!F(L3G|~*#nkcHEL*y0kw=lf z$-WHwKOAyH+vVz7X_W}#QSYf3@t%mD_gt9X3)gk7f7WmRr(_C#7HUSO;pd=^%W?R5 zsJxtjKLwSNlkf{rkQw;XP{w-jZwuwhQmxDwX~mjg4-vRhWu;tWflK{ywZ-$*m7&WH zov_&Z!7ytl+Bep9@~947k2G(!Z^|Y)Y%_-nruPhocYpc6)7B-r6KQp;Tl$dOx*WiV z5bOX>g|HC7s}Rlw@Fs-C06HOD4d7D5u>b literal 0 HcmV?d00001 diff --git a/c64tests/shyax b/c64tests/shyax new file mode 100644 index 0000000000000000000000000000000000000000..74b4f840b2135d0048612c8f0035411c807154cc GIT binary patch literal 651 zcmZ{g&ubGw6vt;1TK7BY=2zSNXsV1i3l`QMqV$$(;#L<6Nm1*mc-lfz{{;`OKZ;Z8 zsX;_S#KS;%r#=V-gR=P|?fyW@;@d=21Za~y|9D?u!o^L0E#DEfH418FW6W}?> zrk>l-=HuX5NL9^4s(c1A0hqi1nFODOO!?*^nfAL!o_ya+;=Za{s(;TwCyrwehDH4o zPh)!$ccT0|n?KSnDfqoqRSU-V5)UN2tKAUGN=MC~W zGSJ!A;o!g~*OgkcYNa(Ih)dmPV$6Li`tA#%yDuHbzV=1E{hyF2cv<*!G7T>W|EQdV zmxrI1Q}AZsr{pxe0({5}yjl3#dhl;c<;qI6%ou6MT40Y5Xr;<(xyk}9^+&5NpS4y; zT6UxfgMAo|ymq4lZCyE!D%15y>t^SMY?1vAv#DU}&ggjmm;al#FVLMxyJu~wCZ~Nd zfR7=V0h|b7DS+1@oC)A<2+IL8#!7=AZ!h>apPqm=;zYnoirUG(Bb7Xz0=#464dHr<>_a0#cYaYo(f;d&G3yx_%;aqhaK~bf0k+^?m~~KEyR1! z7u7c69`t#&gLohMjM_zf0G(1D#D~z%y#0cy-1KZACj^VCC5Q(p>$20uTtQgZ{^JTW zH}b`S>kgbui?1hxtd*g@GjEa)na~Sv=}GyqDzS~SILD!CQMf*=T% zu+YOmrqGl4>!Kp&uwn2Z;!W`2C7Vssv`y1C&cszg@H-6O^Dy(xJ7d8;4)SF5v@^Cg z>YR57A;R))HbFCwu9mXd>qMO7b%+l^ujw8IY|Ti}P-XyK_gdA)U`fl7?wXKmmM-@-}<54Yj*9X)s#tdHm(R4Q6B z!&Iuagjxep1ob#-LUnaOc7_$MWXQT5gMIJEJ(t|o)`Y%61o5f=LLBj*3+2BO@LzkL zd*_>e-9IJU2)j@tatq-e)G66P*n>JDw-N3`9g{l<51`U=7vUk4HD`WiJU3Y=<`^SE zy$t53jmu7!az$ob`;RM5UCx&Vt~+od!#?!~S*xkon$yWsI`o2Feo(nD%Ve{{&Qihj zp270*FaNgP0+$TD`vt!P z<)?MAi_{xAns%yVtM>emt8eB7>hW0`SZ`)%JfySyP@N0Qiv`MWQ9%}GDZfqKdHNHq CItX9@ literal 0 HcmV?d00001 diff --git a/c64tests/staay b/c64tests/staay new file mode 100644 index 0000000000000000000000000000000000000000..6783682a4b06e553e129312013cc96576c6f0aec GIT binary patch literal 621 zcmZ{g&ubGw7=~vzSl$c-@gj(q@n%6~?M3Y^wW*0NO^HF&Q;%D1@m~<@dMHk5K@dGi zSnx2ADfA@%x~PabY#2O#fQEj@S}Y=Gz< zQ2w$mc7b}Mhtp1Ne8rv{arMo-NIgD71MBTHjYo8rpQ?L)X`x8@Eh@;u4CS|}J4b&3 Dx4j5w literal 0 HcmV?d00001 diff --git a/c64tests/staix b/c64tests/staix new file mode 100644 index 0000000000000000000000000000000000000000..9752dc68e475357169e6793a4874b62b96a0dc9c GIT binary patch literal 615 zcmZ{gy=xRf7>8#!7=AZ!h>ajNW0!!!8Ve6;%wW~7s7+pQO~cm=EDfhKnAGqtgNqtIWZ-D1WpGo&_Y5v*c>f3f2C|E) y*cs}L9?n^{@dfklu&Zw74)u7E2F6>Pro$>rBkrH8%sG_brh?2BDZfMATl6=f83gkH literal 0 HcmV?d00001 diff --git a/c64tests/staiy b/c64tests/staiy new file mode 100644 index 0000000000000000000000000000000000000000..a70dfcf1a50ef5ce0ddfa5ae678f2a51d3db4d1c GIT binary patch literal 624 zcmZ{g&1(}u7>8%KQhqxS#ET$arZ)=;+g_C7rLk!fT`VR+)KiZuB>FFSa7Bt!+LO|Q zgar=+JB6OauZv1Chb@DMh&Mrsr?UBM)1-|vaa9m}55xOB%)IlPvEZEqc|3jAoq0O# zo_7f$!U}A*Kr?Hl@@(NI5vO?qvBet@o4g58;VlTl+jzOsF--$Tbc0ABkTL=9LTYyi zK7ee3A3?UjhmdVJE+>xcfLqQ+2kYA8_129hq884qMfk$^u(FRwJ^1`U&+miT&Q7H4 z9jRw1drNM&u-kxovfGC0>5%LkTfCAX&+G*3`!MNyI;|B%r|yaV&T)J_WCI zxYxe#-TkH?_)p0$;sMm8+(Uc_H6iyAA3>dxJ;Xz(6Y>Btag-zbh%HB1OXhR3x%tIn zjxiD@HL!<{akKN~T#*^q{o{&-g?xGB1|ugj?Bj40wLX?uOFH}Z0JHMJ6Pt tIi<{seYfA$H}etd@lhIBZ!)youd{U2_bW?_Bb3ilK^8|TzfIj+^cT53`Ro7y literal 0 HcmV?d00001 diff --git a/c64tests/stazx b/c64tests/stazx new file mode 100644 index 0000000000000000000000000000000000000000..9bd9a774671a6e2ed7aed759412bb208de49738f GIT binary patch literal 610 zcmZ{gJ!lj`7=~vz65bm)#6}RCku(NW)--CmOKy{kSqz+qND94jg#>#m1vf=-LM%kE z2**N-ft^6A;9sK>ykf&*A!6s<-cSBEn?wt-h%@J^Aovx-_dI+v^UfG>PJ%ogI%f?p z4Oy2gLWnRtlU6=8H<_(B--h^1?F~kgSK@i@?i-nGEnow3Y;002(d*BIV z44y)^!1p2B$XWaVvIBmIl@6XMQ&OWVF@hG(J_+!NZ(?B!kGA3R9d+z3mIK}e`-%d9rM#VDVA5RZD##W8P9ta~p7yjQO4-2I}S z^iRny!UWNv+(fvC=#1P#m?AnQw-N3mIw5xu9w5reU4(~-jH>>Q5qoT^Y%@muMh)y< zPP@Wb#V#}Lx_?}GV!Tx8xuoYro_#p#MXmRxMpXsxQ<-PX+FbBZ*2rqW2B=_arnkKR z%l~ctYjn}{H%jwrlk4Bm@G%2R!^I3nG`z{6sNr1(6B_CnOl$a@!Kj9}zu8%KrTj7wiiZl~WxQEhVJ+B5Z;ee&b!jyQQBOT?A;o{egWE%KLOlr{ zBrFIHWC}g`QN6Sx=CCqIy7}l=(x&368meIDMK`OR2xPlG%e8+9h0 zjX5cY5F#w!W+OED_*VYTBoSwM72*Tmf>`4bM1j{J2(RN!v0<7BvI@T}x4_$w5%>Xk z3$g}&2w6wM;T^~Z_z_kcc&bfSkFG{2*Koer1nPVn#T`7_g~#{wq5EK8a2!FsIIcr| z*Fo3?Hg`Qqp4(lp&Pn%&OCD(JPTfrtL44}J7XAK9@ycHp@ZWl#d%vw8@lVMn!WPu9 z+(y`jIwyA!9zdOuy9f`VPRTul9jJudM|cEf&6^KMXQt+xME=Q7yJ&Cy{3yX>J1MjoXW(C py)fYFoB25Pc!~zryGyh?ptF2c-!3mNj#GY<3bL4@JV)Id^e0vh^_>6! literal 0 HcmV?d00001 diff --git a/c64tests/stxz b/c64tests/stxz new file mode 100644 index 0000000000000000000000000000000000000000..9bf1c92148e1ee206fe55ae18697c222a638c5c9 GIT binary patch literal 601 zcmZ{gziSjh7=~vz7~UH=#70n?u?QGYSkow%G)6DE=wjeJqozu^LW1}oShy)dCd5jx zkYh2$z)m2QsIgHIuUHu@#Jjy8x#TXnL8!`sp z0dGTA!8?#Oq#V8rSqI<4Y8}tC$?4J67-1FX=0kkr8(3;$aT6Zj(r31?67mMvckIVd zFZOFtKXn*(flb~>lNGxQ);j3^a>*lYO~89Z5TE+5#4-P+Sohxu`0JkMK4|Kf{8O@l zs0}qJHxO+@os~^QJ5ZfvX1IAHttNx$C;v0QCls ur<_t|*}mWJ>YMp6_4o)4thX83?blg4>c{1Uxnatus33DAl;5H5ZTcG-0s0;Q literal 0 HcmV?d00001 diff --git a/c64tests/stxzy b/c64tests/stxzy new file mode 100644 index 0000000000000000000000000000000000000000..ff194a263a55f9b3fead413ac8348e3e5fad5b5c GIT binary patch literal 610 zcmZ{gJ!lj`7=~vz65bm)#6}RC5gP+4YZ^6OlG}LE#lU%prqC-_NU*n3a4mupVxwRY zj)fEhJAqWz*nR8VT{EFdwp80!cEO>`Oo(!IJhUN#I zvkoCdSb@#X)8eBm)oYX2i8#ue5X*cOVu>dZQ@jO1cpEQfJEmztTiHYq$yM-e$OJqC zPa*Zp4rChzhwnmm!1u7&!BcI@dg)?M#)`puux-Ab2L0gO>uqE8q8Sf6-6+ zr(_p#3N;|t5N|^rlk12xs3UR%@eb4>xrulesvx%z??G8L^Bp7Z*hIx;jD*cP*qwrL z!(&yq!i?+wah354<{GAmAghoY;Jc7D@IA-~ zyaV2btRvy@eaHs*0Tvs0rA=11F4jO2{3A2T<0e8GkG@o-bq=BSEzU_9S6kdc2q^Fyoqk zU18!@w%Bv+o)bw{J?=%V^mVOC9lTFxp0Z0X%FktqES1?=Dwyu+ZR`K|#4^ayc{}); zoza)P;J$%+432>-F^n1b62nact1(O%sKoHdKr4nD23CHM^u=TNYq@a&?bU96@}^2eJyj z3mJoVz}t{Dq#V8nSqI<8S{+Zd$?4IxD#94&=0kktn^lU2J5);jF|bjc%aO~AWE5TE)l#WDYd*zjKq_#2+*K4|Kf{8O@l zs0}qJHxcbXos~^QyHKa(7NQQ+3Av4E4=N>Fi1wkZ8S@LH*|EudmN62Pi(n5^#$6dJ zWb@3p#$T787|#`YuHADY%|0LYvX=U~){IWxr$f)$#f5NQ7Rh?ZPE*13OmF#k#Q$xB zn{>qvKIInmCNG#W@FfAqz{Lbc4ZKa@nt}HTOc*F7Fm0fcz*Ph9e#4(Yx$C;v0QCls ur<_t|#lGL~>YMp6_4o)4tT!3j?blg4>igxzxnatus33DAl;5H5ZTbrvs`?)Q literal 0 HcmV?d00001 diff --git a/c64tests/styzx b/c64tests/styzx new file mode 100644 index 0000000000000000000000000000000000000000..18e0b24cd37c0fdd056e961da5217978aca4dcc3 GIT binary patch literal 610 zcmZ{gJ!lj`7=~vz65bm)#6}RC5gP+4YZ^6OlG}LE#lU%prqC-_NU*n3a4mupA_#&- zI2KY2>;zJYe~n7;iVcH>h@F?cpZsk$i56lJXUbo z3{vYI@D#F*g2Q(qJK%d*?BJ<3Wj(r>AZp>n;|QPl8fMq=a05Qy)W>dNA>v)IuSoA< zB|+MPnorwM-*qf@icMT9k_9^hOZKxL9=WTnjyg;P325+K90;C?<=~}2@XGhS+h6pP z{wdi-oI(xAHN@Lc$K*QV4C;v7K)eHWNNytDg(}D`#CuRy&3wm*J2p{q86#n{4tA$t z-0)b{tuW)de_Un!Lb=*=Y0rrw`>@}O+UU!ynhxHlGf&y|2hn|5Crc4KP6g95z2*I1 z{%;#zrgL_|6bwzL}S(&s`c?uSaRtud{U3w{tVoCCYD7L8e{GYt*|ze*zz~0Z0G< literal 0 HcmV?d00001 diff --git a/c64tests/taxn b/c64tests/taxn new file mode 100644 index 0000000000000000000000000000000000000000..ab0eaa067ecf7d5f59c31406d09fb7ffd576d0e4 GIT binary patch literal 616 zcmZ{g&1(}u7>8%KrT%sxh!;V;j5h-cYY{BHNUEv%SXu}{)Kd>CE41`45OQ#P2u_F~ z2p%K^JWR+GdJ?}bDq_Hu#e;}9!9&t~blWCrqlY>ZR|UcMFuc!?cX*!}1I|&92h*qQ z*+#TlN5BsNN4}Kp(TyDW1AUGjI_(KH8CSvU4!C1915gJQMd_p-do0YZt9a$k8 zbrz?BshRQd?l1qhtuD~AS^bbIs!MM5vW8C)*c#46FsI>F1Q#{Di6E_^5y3SLUn01m z;q@>0EtJZrVrQuvKWy2J*|K?S%2AtnhPpgUtH#ST4X2b#GZ@SiS2C2}pn|MqDZfdb G>+~m$&jRQG literal 0 HcmV?d00001 diff --git a/c64tests/tayn b/c64tests/tayn new file mode 100644 index 0000000000000000000000000000000000000000..b1bff05d5a9232e0635f8cbb3dd131bd26575025 GIT binary patch literal 616 zcmZ{g&1(}u7>6g@Qhz%T#ET$a#+w0!wFpWtl4@!`mKH(~_0)sP3N8KxLJqEn;DiW* z;6cKI;FL_EC-Li|A_iPpJcxJ`JS1td-L^^7=%LQURYCAQ4Da*f9o}aq0sA1x{pn-Y z%)@Exltl;;3D;m}X!33;eQBPE!@LFYmbW3+cn4yMuR{>t#j|QpH*Lrkcpp53Y=aNL zhmalc9mp;jFdpF6+#er>Z3tc>Qmws|S^}-ho!w|9N^o0L86Vfo8pIPx% zSaOT!3}H0Z#M#DO@%=_u%rts!qj$<|t%=H3Yfb%cPek2j)!f48ve}y*q>lGa47TU) z{l}S|Z6E7BOupM4T-@rNHu0U>>dn#j*{$9g`gXQ@4t<|Id8fNl_BqnhN77goO4znf4G0+Vad6BN4rt8W&H zl=5H6gy8&FcJpfA{0*jx9l-AT}Q1|MF$b$#7x z{@xPC^#@k-9n1fnmAis}&R?u*@@Xrzed&8oEt9umY^=O*b&R)+*z3l#JA=JSwfR}Q z+B{*ey>IR8{Ftsh`??Xs6)~H`|B5hjBGG)96#Y)ruAOx*+2)^{r_Gf)^R+W(wdt6Z z+M3~j0vNQqxzQ&WvcPh4CP|B&NP z(V~O<9`95UC!~4$C}tXHIw!uI6YIGnkbOyhnaG59c5pZkgg!pb#>(w!=aD65x1&L< zg46yBQz*W1_#CZ`)5rg@*(JT`$qiGwVe;g1EZI*+?PIO3 z-?7Dk-<$mV;MJP+uG#|2nzJ*V>>hpvYHR80H5b@*`i-FCLfqt;5Gz!8ev4c$^=6P|V}}z=M)~ujV;F_>kY& ze8`V{$bj>M4~lu5A9zsY3$mQwIrxwt`9}G{hy0kw`N0RpJkAe3DDsuU{O70XeynE~ zO33f8$aIvSA7mpt{x(hydT@U5L6Of7pyF724n8RI6?5*}l9z%H`LPfAeFNQGpK39v zD_4tK>b}8;{Mc95JSgI&uVpwt_>kY&e4Bbc&JR8)<}GO+6!9{Cp3fS5$d7!Z{IHLX z=5c=TK{0Pt^Pq@V3WMR<^)krsy#x7`=$VfHQS}&}KQ9ACz7i!V^MenHd_~{=!E|C5 z%Jt}3W#2GA7f*dzW8b{; z1z~yKj;IFTyz+V3MR`BI^*@xb?4lM?riCoXMpQc=go|~}t7~3e^XiJ1&J52V=G#=h z(en}H-0#K>o^MI>mNf5%=G{=daFJ%Isr`18FDwTO>X`|0!2{;y7JoVh@it+`O-}MxDiUOa^?;f6>w7fIl1f_`cN8PBe zQpBrko>Eb|kmctWK4e9+jPgU@O*J28=I0karHHqrc}n5^=W%}UQ5tH$Tm!G8dHnps zrxfv4HBTwzB6kEzkf!(F&lQjJ%NOwco)W0R$Em>wMZSCi>J;S%9~AlW1)0@-%8K59 z%;Wh+HSjn!)S#GG*E}fVrL$k<{NO`=I6wHHn768VP{cDn1xd$Si~s-t literal 0 HcmV?d00001 diff --git a/c64tests/trap10 b/c64tests/trap10 new file mode 100644 index 0000000000000000000000000000000000000000..039c61e0020a294642eb5d18ab5df2d408b02f3b GIT binary patch literal 4269 zcmb7_UuYxO6~;&Ft}`>X931+vR9<@;`mhQqk<+kQQu;8`D3Nx@vZ5I;@>2z+VccrT zLr5v?%TmzGHc~5C2o#(O!#><}RGtYm^Fbt7sPLBCsHz5tfxnm{U zVZ|-aXAEI9*2THTE%B>HET$UWj?tYl+v}pX-CkF}ov~irTrs!t_XlQodN1=>_ldoo z+1vkcrl&inyZ6$+kM}NYch8#m%xrgO>GRxncaA=t?XE+gXU^P=SL{Z7v%6w6x__H7 z_s0AmS^jrSk#yca>=?ZmALyX}3I`ICIDfQgTKB~;UvV4*-B6K>w0@S>m34L~=d>h` zGhkGTFBL*CI;YWR2%)b0?ctJVf`?{x{&INm@13zdvpYFNh#ye5uzxr|1+_IwPyVhD_>mBQ09BuaZ z{(0g0l`X6Jp(Ttf?^?}|EdK+ma1lSwCsvex+{)~{@bgnEHHxB|c%a6@gC>55 z9Zobpe)1B^I0dGD{#MM?VesK(Jw|5(GEzV`pv?CbiXM>ovq zhUqgaiF7~R>zr=Ker$^)-*@@@(bc;2uG#{ZHP210rT1GOCDVA_wqwdUl+mYY8efkz zMe0#=ZM42ICGS9Id}n$v;l}lJ%Iu7{pO=FoUxkvC`N0Q8 zzOwIjCsPMdu1C)*`v&<{zLekFDnIy;ANx2z@Sup7y&MeApO-^^Bl96Yo^Npeyc`ts zI6v^9$QR@}zvs{w`H^p!AAHD2d22vM zRx+2MP`x!+b$_Om?=8!$QW@W){~sxkeXmNj6qH+~8YvI?A!q4>VjtC%k7`h%tMcpL z1`ibSg>IEH?c<5BQq8s{Prm;o4~ltIQ#`6cWpjh`2OiEJ`G)ynKC00b-m*M@k_W}S ztC|NzzMOwq-e0-`XHCr)RNtIR^^LmWyTSZa${^(}%kw9BP|U*>JRe<4yt2x#KA&4C zBP-lXde_NJ>lrV%uxWpdYVgVYq)(}ym&cP#tK?IvS1hUgu4KSd6!>I*xAF93<(>IH zC}o^K>PCH)B3?`LlIs~?g*41OYgt86_4{Pmhk+}2-M)?)Zl|6U$F!=L;1l6MZRK5 zW_5?MqW2&3c)no`JWdTYDCV^^4~lr%{L7ple8`V{!~D>9SNVqd!H4{q7ik_8@q#?( acL6@+cXU4RV$I|H;Dch`s^&ov&-elWKxH!k literal 0 HcmV?d00001 diff --git a/c64tests/trap11 b/c64tests/trap11 new file mode 100644 index 0000000000000000000000000000000000000000..2bab32054a7364715afd5b5dfcc02f6326412579 GIT binary patch literal 4248 zcmb7_Z)hWF9mgjv+nbp-U8)N%mu`1_Bb!4dU5~xx@DGzr&SY{!AV%U;BzG1&DC46y09;7Xivo4A?TY!4n%vt(88$|MeFzXJinP- zn}w~*l6>=<@ALWnp6@&}P3Z0!UHkrXmop#DJpaRsndd&CX_`ocGn4Lzbx2LKUNw?! zziL+&7d4?ZH^hbJJ@LI}SIjnh9j!O7w>Lzv)80`3JCprxxT5di^GkYfZkTzh_krQ= z!u`Klb90?jy+`RcyTi*ny>mLgGdsNn`o6H!J5S%%PS2w6vuE#iSIlPjZf`|v_Wm-j z4=3HP8t$ibk+j}A>}dTizR)556c!{VvEDLhTKfe*U$ra^-B6Ji>H0akuB;0qc|Mlp zu_8vb_}PLFM&}gui6OG9`t^7j&1A?~tv?*@|9f|GsP|?j_orO#ru$tzz=+nztfd!| z8dY`a!6lSs$`>hRv-wjo)%=OL-Tav_nm@1C-LJe;4_`Ox;REAN;^B{t{V8usZ+K5b-npa0Ip3V8!FkbrhSgDf`k8p%UT5<66^wFRG(Vth* zw%b1li-;WTiDcebMlFc1Mw%h zXqpxs-S>E>K%9~0nUk1lpqYZO3u3cy02b=63tT zM1a%Y)rG=5j4)#V`Ed%NcTIZ z+Ff_u6i0q<^Y5cq8`8UG3M>mhID03(xB81@8gJHimvZ)H^l6&LrH_A}c&@G0)3fpp zbf$Laq6xQdrBixms@>gbckAibI>zI>e4e_@(#Ml_zqR_cs0-fne5dgMZ@qzk`mN4W z=tEtCZ1u&@O{WI^#?exq-fbEr*V1$eEP2gSTr%!49cw&MO)`rbp|?Z?cw z9nTlUJSgS`F%OD(IX8z{cpvM^hgrCWeXPg4wb%#6ytSAIMZ7Cs^+4vAvC9tfqrHvt ztGdYa(iCdhqR;uk2SvW>Qj{Nj$d7y#w_?crHsRx};2X;iJkAe3DCTi~;6cg0r6T7C zAMzWU5BZS~8E}5^K{1c>0}qOPUY_$?gb(?VZwxs3g`d!UsjZO2Ph>*SE%J4f=X(led>jp`AdKPLx8zA7at^MenHd==OJ z!Axo&%68~kWnYwE^?muR@ws<$$d7%TA9zs2%U<)M^XKG{-`IS}kLQcdpOb@P9_I%h z6#2Y7=l3k;Lw@8N3}rkYSq(^m$2Gg=ZJIaL)#Z}e zU|&i3Jik^l`&5IkqBH?zmMYAY}ERcX*mzF)^A+&{N+~6YsI`)%xfuLHW!^g z%(tz4qvyjb*te1z&lkkJAm-hOc{dc#U#3|aYQO8s=hwWe>Y4Eh-UH?pmVXqHk(JEF zE7V?&uG-&J%5|1yR;i5Z(BF>~$gWePS_;apQH_*?{E)NsL9vf&%11RQ-&Xkz?t=#k z`Fy)ZnGW#8*QjQik|*DPk_W{+swp1Tpt8B>{DFt_N4`;hn2&0-!daH*Px7FccO&LO zkuT?7llPZa;H;_nyxL2%se#teT-%$UO=+Z@WqJN24~ltM!Sm5t;#E|Bjm2E4f~;^a z>0Ku?ZDjDMZkkV14L+Hl^eNSM@_3TzD*2S^7t1QY>lyGA1wNVIeLOu`d1t-|N(JYS zx=~-Hh}VjFO7*klJU_qiAuF0?lpp$TtNAc9KfmxPMZ6&9DTVi+!}-BSX{h~j4ZQW3 z$ImZ(N)c}@<|&0-h`vh@CYRq;5#Vj0ixyg&^;P7OXN@)gTa^OPTaP~#;ukf zN<&~TOF@@SMy((aC^!`cA6`20u67Tlb{zI3>;_Xe1d}$G3DbMhG~Rsfa`xNV=ij=ReeM~a)wT_ELq#sq`gvMc*6E>~(ULs& zfKe^ISPa1EoJF4@gu3##M@yaw9-7tu%fbGa+atSXcYI`j)H7~+Z-4-`bd(F`xgn_Lhn`qjM zW=x7kw4(nWh_UG4;MG+lS{b7|yqbvK8q55rnK+UxVmtyAlQ2y-janFnb#b7^!h9XQX-jG-euTyeO^}#l7Mw$etv>Mr6XGOxo;>w&SgK9A@rzl8^54Q)+O^F1H3<@bc$7ji-72_xLey zbsj?>>Qc{Dul`^x-S0J?ov%6@R{BA&ai{17b7S)Vl;h8DSeO2VT6w;*V398i9~Ai< z-&?RQQ4KyQ@>PlzKQ-`O)xH<4^y|Gw&nf3oJA*60YiS-7^IDn*MZ8?admw#ZpzqEj z=G)Qpg_;M&yioI?h?n>Bn1%NdD<5Xz8uk%u-m>;VF>hJ(pon+Hua1vPo>O*_AMI_J zU)4jVmqt;`l>*KWJ}B~4=Lh-0hy2J_@ha0YzkBd;R`4Cm4?NBfJ}BmKe&9jLzH=qc z4?g5~Y(C^iK4if8!3V`W&JR2&^7#eMZx%k}N4{Zx@F73uaenYYF^}_u4~l%%p!8jt z-@U?o75ROFOo#b-eqqB(y@!*79-JS1P~`J`s8qk#n1v6De3hc}XLUc|Lw@W-em_Jv z$D>*T>dIW@fjswF_>dp_TABw%yxg@s=LaA1J2u~ro{#f`4~luA=0OoJ@0Iwh!H4|F zH_Q+Fh&7M%gAa;%%bEv8ylUVN&aRtBexDx7uS(B!>I2ndaQ@sp6#1%@q|6UKDDqW2 zr#qhBhjLtcR@pbmulkkz-d6d+hy2*b`GE&TyxcW^aQ@sp@;f#k^5gji=g-YUF^}^D z4~l$#f%AJ7eUTsehWWvV{Fpa5e{LR%d7K}7Q0&7lafY&ffUNqYz~h=z^Ea%UYISkJ zYOrrX`TU@^VD+d5--7bFg++Nke*6_mP;*f0QKsbr$VRVm(GM0|n%C02mgcn-FP9&j zKg_qIe8cC%FFLQAii?{AGP07n z_{G}o!K(8Mr95|0W|hu*F8%*VgY3CAs->Zv8r4X-$PYP79~AqjrhHU`3LKSR{|V4X5A#utu5cIS`I9^-=H1Xd zDDvgKYx4fm6*y~ZKEL+nM7nP@4A1drC(;HfcTt`{$%A4ZuHgCTTH;kyevR4uTm@O- zUedcxX4=TQ`MC}2>r{hJ<|lnh_1prUWLhPkQoT}H<##;`o}$1f^SgtmCnxXBOQ2M6 z{-_)ERf>2m%~PtED;N0rg%4TLEW`ZJcSp^KnfdvJPbuPsnx_=re=g?-AElx8%Qf&~ z&Ew}6KBb7ata(Zy7r7%){2aai-c~%$uT;kKJ0(zqk5hvWihQLq)D-0h9~AjYWtr7o z%8K59%;WinHSjn!)S#Hx(mW{QdV`H_Q$FzRz+ zU;Tpkx!w|ydeAh2-RAV1C@)RVso!Q_yVW>pF5&ZOGZ^Z`b_RELmWMC?=?o1ucg%*r zYIR1Jf;}d_V@ts>eeYWe_R_br6gc#~Yu9Y+q+M^#1}BYr@W*bm)8{>Bd5@bS;(Wc{ zG}+Repz4rd%3S;27`U8{hm?t-ZaaY(0RZaKN>NpYDy1op)466BF1+8 zBhg>~P@Jh>5mx=sx&^Z&WEmEvR3;MztZ_@^vtQtR^tmx7^gn48edx8 z=Tv(6h=jnF&BftAi$xzf1Xt~Bnn=YF$RR^FyN z2i`G4xFd$r_$><~Eu!_XSUlfuR`)p%+vc~8J?7bA^Yy)ErQw+6>YU;1vdbdc3{B5T zwMGgLt>J2RtsX9mBU>u3ZLTy!B8<%=3>AXQV|2N$FVAhfJc1VC`Wh(Rq^9t%p>htD zbyX1|*<$nf;`*lbEM5@h=F8J_zg`fv+k0X&0n88vlg6;w*lQ9J@qFXoburLbUw>gX z)OcxN|3CH6Mvj2CDMbv`L#0ZkQWgrIfpa7REN7s8bGv8D;yXF{06nu|!CU*3#SZBm zybUi+Gnf`5X>mEdeXb{SPf#v}J1f|Zx3bOHFIK zMXb(AeCw3z(T7AJXWAxz{_H0aNwL|FwKD4b*bu`K(R87<^FVbA2ysAEp|7P~^*}^9Leb-xJ#R zm>qq+U2VI$1ZrVCfxMc|gW|lJ&V!=7c;5R;`mUqz!vD;-py!*^c~G1;sq>&HFX1IH z3$J5F`7jIDu#Op>H>G`0oHwQOpeQfv7k-!gVs0)8ezdk8zk&y*hx<{BXNt@ZJ}B}P z#=HFB13&WRz5I+yloX7l-2PONCWtbm);J0Ny@FO1>fExPJ zI-od@`5_OAe13}gjlc(fT+5BxZf`N0RpdCU(!DDoAGnS0cFQ{x5j`w>ig{5(Gu z*pbh$bI^nN!3RY?&xeX&<`MXy$d^yMS7crcKJa57_&r5y^Qabr%8uo)s=ph2;K#n2 z&V!=7`0)hugAe?+%(tNDV}9^Kao(iPgQC2Im%%KUndSpO^7Z&(9Wy$Q`N0Rpc~d$M zit-9YpYz;g0{pIR;8&nC9r;G}=}OMYP2)ZK}!U1eWZ`TSxjYqzNeUsm~& zsR{Y_c;=RrV#!6VO-yqsBpdDOgMM+Mrt@k#ucq^ADleYs?mx`8pnSda;iugb5rgNO z)OnLS@3hW4t@4T!G)q;jcSiY&CErzN#!vg*y!1p@6~Rh!@zbSlP51SZ6OvUl<|XO> zM-<6kvP88glv|=2sU-M;v-Cl+k7~+CHK?Mi_$^*U9#Y6xbW6l^5huPxHQSbXHJt~= zc~nz*RD+5qy891#*ni~f@xy#nqbHIRlR6KI^G@qLDDow|<1~w0CH9({&o6z6|9M8$ z@Ld1tNYo&eoRIrZt`~~)@C46C&r)7q@vDv`#`0i=WO~;u-q)(}K zGKG^&cVqA=)z0J;zf&>fsTBAmzl%6Maru`yfs{PN@-=PA{W=Tdxr;R7q0 zrN<9_7u0;1S@Oe*##m9_q|Q?c@4qDTgO6ya^>Ph)GdhpYFMLW--jvQ$3S8uhkmASb z{r8^AV}6+&&hKu48hlI*J}B~Ka!|X8AAC^c%j6`hOT>!af1Jnj^=imtYN$bRUQOpg zQC>WCjQPO_e&p-%L*E7E>+ypRBsp(V=Rr}PpJINa@PXgP`H(lG^OzreP@FfV^Pnit F_z#mV2QmNv literal 0 HcmV?d00001 diff --git a/c64tests/trap14 b/c64tests/trap14 new file mode 100644 index 0000000000000000000000000000000000000000..1bb487673ce4af6a6b473b0fd27855cca2292d36 GIT binary patch literal 4090 zcma)-Uuav`9mkJq>fU>8F+BEAqQtp-OG-zTHcLaHj4NGbSLwB^-Fpf0o1h*jtwLW) z7=746K_IfqOl`n0)*=EnoK1491~cZQF!ta--HTSXwS5?)w3IxxF5TupX}$07oS%+j zJCGP#`s#PS_xt;ukIubLS>X>XvH0xS?33B&-g!Fv>@z|LnQBdrg+H_)g>YBxbUTT> z@~P88ipGjO(YPV+Ho7w1=ygQzsMTJP)vfl5{_TwQyRD1X7G7VndQ*e!W4-SWwx?JB z<4#R=9$gZD>kiIt^^RG1&u;am>HWl3?>N1?TRoTFAAfwQd(mlhmwFdPqxZ#8YcLkR zYKPBTGVOk_*Ae|L-q66jN*5A?xF6XxtamOcM6N5A1PW@6mXFc0c21AvaU;p&4kM!C zPlE&zok!7T6hck;)BPon1P_hsezv#s&Gy*9>P?RAjECY%_?9J~YKSVPbbsW|zK|BQ zVksY%X$?z?^^b|Q)A*AdZ~Rfd*|;U`#_d`yeC3l`>y}+>-L|i%-dneK#?j`^;J;_D zUb9*ba&<_7$2j}tQernfFe$UQsKlhtQE|Rw@))&6CuZ#CY>TU7FoxyIk z);i|YT1T9fFYP;beoHG)ye(2#ky8PFt5O6q(-3mwdcRXY;d+ksQR|qsFm1hY+^V%) zt6E9{892{SMePBNuH)OT*dVA&b8}iD-U2%{AW)NV~nzmZUEkYuH z+4^ozPPF#+ez7E4Z%)t`yOe4zOq~3-fo%p16XXs=$tkQ)fi{R&YPDKbYL)^wm;4L% zHqp4d{|h;sQI%h)ZA{QL`*wdn?-Avld z%lbll(iM)J+U^fhRh;!dSW>6_d6*)19=h{a=9&kzt!-}{X!jIdnx>bB-zYr*^)(M{ zmmRjl7T>bgub#|Uo$+>etKF@ge79q_yTt06!na4MA-yOBYNiL|uP=OwT}3N9_?@fxM>4gW|lV$%CT2Tsiz$ z`MyTq&HK!^Y37?Zc~G1;Z}OlhFCXSH3-4oD`!EaFu#aVvw`hD&oVRH5peXNr9DS$w zWxbLQezdm{zbFLLGvlb`iV5?B4~l%z?2sRP;77i4Se{V)ZoP-{KB}f=A{3MlY<`24?ZaJg)vkb*Pen8ihSk38>qZ2 zeBj4E@OzQ=7E&z*b$+J&f&Sj$13&gPO&%2G&&RaBjP?Q%XG3R-H9{fJp$1kFLI{kOuV|f1jJQVpN zBB}Vn2SvVe=>2Xovjc@Zuwoy2D1OmB{NCYn@8`jfeasJeP?VRu5D(9vp9jA~^MN1F z2WrFxeW5sy`5_OAd~t#KorVwm$T#8#ANXa4DtQ40xs0?eSZ|Kh{R+((*)BleQl0&~jwG5P3p&BV4{J>fHpx8$>?V}o0;%R;x ztH?tN`4X=}OgC`HSE%MVDz9nspg50eI*)2lx%}|_ArI$|d?S9Ck7{&G|TyXLx3dx(L1aSLuu(<xatA4Sh`CZB)Pp81A_^smZ$*FJV=SV5z z{82aRs}Tq{;rZt?Klq4--Y?gX zw`}tG{)JB~%3CyfT7iq&5mMqDJ^y~M^O#?;g!}iXL=8Ts1|JmpiY2I{#1B3w@)b*p z)w{%so`0Oj^NniAV``{DabDBpK~Y|=@H6HIANY}P#1DNpwQs}^K9JDHhh_!BS(a|Kh=;Mqtldr=ug9sJzF-M~Cg6$( z1VZXdh2#gyj=@r;6-WjvQXlRzPV4pok!<$SN?1jh)k?dIgsMe=@`SQ1e;)W_zH{&K z^`@@W5JmClbHDkWbHBMWNtph}P2-j4FQq?|e&J`&rl0@3VHhG2%})8BG9eAaxo;&~ zm9kq}`GO&ajcxIp#$EA?Ml9wU-Hy>+Fk9QAw%^)Tzn!UG9BrEW`1=jBJ3mN2)&1Du zVDaAHoca0A*=~RE+jwwkzkA-qXL`T8NS_z>yG!)x>~|gdJa_I+ylFS$JKasA(f!MU zIhgXlYx!R?Mbde5*fDxBKF~q`6%HgOaeimfwC%Wm?0MO#7lCjE3F#m6&e)QrvFr3ajy282aCOFO2rAFnZnEO6tzM^o!SQVKo#?#TTr^)^ zGQ-F*YxQlzdD^atR438emdYR{QrOMY_8kKk*TmXn>GnjalMsCzB{5JOeEr19uh&j~ zEuu@mF%$#YsRsWLm22aQNXQ-&TM!>Sx~cwMQR{rawf*P2;^t|uc{B(?TSYd}q8Tlj z6pi>n^xvVFiH5`PA&2%1-Qhcl=qEGF|7j#BSrsZ0e1s+Du|D50Wc1ZA3~OSj#=?V! zXAn>xSAIa@~0sClKev=6W;kNPU?v}Fgg29 zb8FT)V~hEN-XKxK(T`1`FmH}9;`sEvKSCEJ>CclIhX?&f8fNvi|Ho#(qc3`L!?bQV zIJcQt?l1Q`XIrr!+v3FcL;ikpwJyDFTi~+j!ra#2sQGSk8L!(`OgUeZ(GO@EUyn3L z>Pd6$G(SBj??7kzV16{=&aLH?*_m#|`>i-!zTdGP-{srX;FMi%jk@6F&vzQ{jh$cP z$Gp{f3VoIYo&FYd};Wg z$ma(Bx_yyq@IjHUlrIIzk?)H3y=bRi?$vv4F^k$6TmfEF^Prg5)I2ESWlH`->H7eE z4<9q%p`I_)JSgUcng>O^te?d!ypLG|nk4!I4qn0UDI6wHH$X8w)kU3d08m(l_^P?AAC^c zEBS7BHgyc;di1QaZOhbWb*i&~E|E#^Qrdi7_6%0^T3nwr?O86#J;Ad{l#~xGKN? zJ@7ywU&XCbrhPo|RjS#xjJz{n z1EqxXN8PBeQp9U&o>IL`F~`p@e8`Gs8Rv(-hiX2|%+D`;N)a#AJf-md^Ef~FC=In= zu7MY89zVbEDMh@t<|&0-fIGW7m?Rq;5#LJ`mJfo;S9-%nvF4Ug>+)VZXfEI4f3#3v}D6iL!;}wF&6Fro%87` zjso$FvHtfv|MNfJ`JHp+i0&NMwI827m;PeyC$ zz9x?Qk(ziB;;bJL-$%7(-is%jUfC+0KBI|;{)QO&x5U5wwwUufo%x;gGo8=uY%kva zhxs{O)Pm8-pYfwDt+SvvH(JqdJNSXVg}-m;=KQ?*qTV{%xf}g`d*{nros&8~m$y2L z^!bIY&MEr*{8q=L&lJ2TZnm!&e*0$UispCzwxI7sowwpnRmYG>n!BTx)@|bh@!?-# zLSk)GGpKLtyq7DRriL|9k%KgTlE#&FaUxHJl04=(qg;43?;)dg6zfbvXjOiCvgDrN zpSj> z^nWel{%`7a=Uan%a6euT9>i}%-u-iY7{fAqJD;Are)WDlco-Mj)d%rl6nFj`&tJfg znK0^0$KvVjSAH~eg}gOwbM0BX8hd*`p^@j`)*=`Y z^LhN%gq9bn;BHj(Z**IY=ge;y`n}+!zP6~pc}lMbre14oXlCB1!8IC*H?ReIz^B-6 zMVcETJ6IJna=oeDiBBHiZ~vC4wO(&-{PmW&cGx+OGZGrM4{X7r9-PvNns5RwE&4$u zEfT>@8it1>ktT#_NwEgl$8zLJROzy;RZNdn(eJ-yT0^JEB?d-c@M439qK^t&GCWYUj-isUh&QM@uOdF zJ%dGPiCU(7v6V>myN#Du%GS_GecWx_&O6>(LjKpY+?Anm=AWn)S4yh}`O@$~k>xFqxl$R+v3$njYux>0d z-Cry*?r%NJgW|mPFb|6IvQ8Gg@ID60hhDgbeGJ0=?uI@n&f5+1peXNxTQ1JZJgaDf zAMI_zuk3*7nHXxBg2(*egCbvfWy}vg@FQQzDIJsi?!d>a;G5!yJmv=<6z4HN&@|C^9 zb;<8eZlw%%7J<5OsdQYO8+_o$zFwFIMR}RaS>^{H_)YZ}ON{$te(*tY-g=k^MR{4Lz;_Kk z@FU-ZANDZ__sjg?gW|m1Fb|6I%APyEyLJ}*1_$_+>77pgL9H>qe|8p%d}Sgj`N0Q8 zzLI0Tl}rtxESug{_Ko?KAK~}0d@s}Rfgk&rAM&6mFLT))-#-aP!vhW;O0_JZPIfJ5WBa;(F?xar5rqIWJ$m zKTZZKxvrb9{Bb;L{X!|nu1Z#^v}4o%j}(#}yF#@TlvSY`DI5I2S^A*ZM>XZ68kA=# ze*N3XLkjskt3pisc;hQnGYpw0zyD+&6z5S*LC_$0sEczZJP zWWJ7+67Cdlc}n5?&t`t` z5e>Cpt|4!r_KQ4zf8kS#@^-^KrNBk*2q|uczW;uv@|a(ti1&9vpavgPgAa;)g(B1f z@q-VFe1)Q9^$xM3??2At{w6i#F*VenIIkDxK~Y{N_Zstq5B$hC;fHl&3F({ggAe>T kZ#~R|qC7Xp{LaA#eh2$Q-az>#{NMvW&f5+1peRrKA9*T)g#Z8m literal 0 HcmV?d00001 diff --git a/c64tests/trap17 b/c64tests/trap17 new file mode 100644 index 0000000000000000000000000000000000000000..f0fd40c57b83fb7ba8b7113a865aa4d2ad07a7e8 GIT binary patch literal 4344 zcma)-QD|G&8ON`z*uA>4TwMGRPfl`2U*@hON@J3&qk}75Wm0-0Yr0w{?dd`pC{&s0 z)7aDM!CfKCH8U7CMmt2n52r|;l?29I^<@vnjvwZhKJ=m62u@q$hhb<}7Y6nI-#OpC za-x>l*w$a)`JdnU&i|ex#dK#v*Zy$vQs(*0i+_G0bMd^UX(ASk#+{dRNWA%VkorjM z_?npUW1ct*anX;7c~m{~qeN=4TCvLKE^6Y?U%}sB#20>BjQO3;_;%*0&NJJa6RV$_ z-`0f}93J{Ze!Qi1ru4;?R=nE|eyeZb{~NkFK5m}XTf?25nfKb;KiKG;((!tJqjQ>G zzq`>nL$A+nbWD0p!+UbMeckZe%bn|*-}%p!z8!boOgMENLn39qf7sHxZM*;<{TC)A z);3QV)VFoHny;9qhBZ-3p6%{TnN z3B&)ZSo7Zz3BT89ICBpg!KaBvu$#CYd-s#X{s@-Z-Tv>Tn>Rj91Ve_U-EB3$WB$U>KMYRk3#av4XY@v3>Rxk26K|k<$M8g&Uk_Tb z#TC3eKy~>5(>>whkfr?-R5&3Em?M5S;A_Ri&f?03m|0wr#5i0NeynqEg8H~Ofg&^j z4ZQJ0I6NnZ=j8C58lJ;2ExO~Mz%d_|G^~jQ4$#{#{R33LjMnhr8rZ7%?D5UZOXCF( z507JhJSm}}Z-f_|)`K%TWhdgnSBJv!<6;BrC;efK8`F1MiEnx?s|x#-tnBYItULKN{Y^&wEk!&i<}F1$DB|Uu9D3n>>?t35;Tra_r+lbwMLsCz zZACmN;$3koKOB`jt7IcT+FL)rii1oqjG&e+RyjZTpvYI54fBH!`H`>el)p+5?=F0t z6?_Bvfyep52gN+j4?HNj?$sja2Oshq=nwgk5Buf(;Dcfw=La4X`P@9`cMd+}N4|c3 z@F73uaenYYF^}_u4~l%1YVkFh-`)Id1^N9GnfCK@+x5sMLD5 zc@91(@|6qL-(`Lo_>dp_kl!m<&2p#~gSv9HoKnvXKIF%~Uc`eUUiMm!^Meoh4fHn| z^~d?a2gSUlhzCWyoKxhp1|RYxUq3(WV^8@|V{|6&LO`CkK|XO zJDvJKtr4C-I|oI+3MDD?gAa;)WycCq>3t~6rn}0%Fu%%?{2s`AnSl@av5)fu4~lr% zYi@Y{>>TnN=nwgEf8qJFb5P9V{J?`EpPT3WX0R^uBVRv1_>dp-!t-b6pqR(`!3V`Y z>=I`v<5rQ?Iw|nDX4Tw8@^v*@pEsK9n>VD-t=8s^F4f?hH>A(b*X8qg^$4X}vry|& zrlmZ{TDSRvTdnsZUN7SHB3@7Nvbpg5p}$GhU;lo%1*<)(aeqq@ZzOf@Wp!uVg8L!!3ibOT8Cj|Q7HYk4)Ou4X$F9q)(iz95?~gRdj$NZ#8p^6s zjg*c2khAnbv5#uXM>VLbrSe-}1rHSRRjnFjx{e!Pqncqzp8WiiJSgT-P4TD(mCc3c z4?LVd^7ZpWe^jFxc3qx7$%A6va>RooU(UHEpD)e8SyTPFwSVC|Pitz9<<59hPWtCs^T<&TaS>ajIXPwNnnXz+M6UlE;4L+Hl^eNS~^SH@0NRoC^ literal 0 HcmV?d00001 diff --git a/c64tests/trap2 b/c64tests/trap2 new file mode 100644 index 0000000000000000000000000000000000000000..d0ed817421c2e94c6646bfe4568b13a3f8126247 GIT binary patch literal 4246 zcmb7_e`p)$8OKjGaqiBRi^B?`N}L<)kE(P`NlO|+$2jSfN%2M2bk`umFoH3VnL-KM zABFxCiUcF6%!J1_1|33>v3HZ4TpZZut`KSv_R2PGY%myO6t>m>Y#92(fwFqv=Y1c& znyo;*5Tvi3`@Wy&dB6AGIcEBwF^%uPcp>#%>f(>irCxmAFbolEPEYusH6abd`H2;8 zg(bIm&JdqA*2EVYcf@xaT`|+>wT<2>v$ZBFTdg(qzdaFkn^kiQpUY-%c91&WJ2BXv zyZfOtJKH|idyxEncW_~=ciO~vYO6O#-_LCI&d|5B)pO|kuF z2NV8v%YVrfapw>FZ6oU93mx>Qa3C>>Gq7k__fnWGIgWvDsK|?S{WM)y*13^9qa}Hq zA)}Q4axMg;eGGj@5bDam9xZt$cxYDV@B6!-Y)=f#-t@%oq;K5tSIr7WbUyDa%*PF? zn$m+yC{xJK8^UPVjbDmmjh~BKjkko=_*J#)zw%zSxo%aP_pMIs?R(blB}Un9bpTMHo4eXg)}aekW?zo^dYP=AWCV&6PRxjWcGo z>6n$;n&F(ZDcdCdJ(mZ_>GYvGI6JN@S_1qE2z9fH($b@%xa5xWyK0eOI%B^YVp(SRw zqd}~K)BZD4D9l?!jMzPT?|_>8;* z?aA%g;e;DElL@mu+3Ie!y4B>pw)N;PU!^WH^zpdeZ>)TC*afe7zSDSsH-3$O=FRqT z^r0@5bZP$OsYE}jy|7SnBRlc8sCGB!hnXq)2gwZ$7O!&@Nrh~jpYX(=La7Y^Ef~7pk&`GdCm_$ z)C}8^7|_?9p&c-*~pH+i<5&MoF9Bp_dKELpRr_ zS`6y)mExAVZ}1^M_SH2Hig@X(8O{$rEThhEG&AYC7*A*{Zq*-ceza8ZZ%fW(rW`bOBpLw~(9}mgMO6C&e z%0C!hbzfD=_ZDSViInfr-;V^yzE`GN0?I8@jg*J{khAnbv5#uXM>VL>Rr&Srf(Huu zLbptr_VL7*sb<@fC*OaP2gN+9DIV3J(wX7;0}tnqe53p@AJu4uwQV zFXLa8_m@`Stf~2e@{O59->4bB8$3OeFi3fe^88626!Wlx=cBd6E2{izXERrd$O`w8 z-gPq5TFT2@iR`DT2A|AN`jm>iES_Y#ND_o@66XhDdPN5 zH|nbt@#>nVRFp1c`T2zpSOQh5J)oF9CYhT1RJ!0Tup zKfmxPMZ8tbQwq7r9f1<0>HYUp#pC?)1w6l}1ZwbcYVbjkFJFK{mEH_>dp@M){%drt*#QgAe&JZ%Ol@h!!A4?Za7t!f?=@r?fhBqLmt literal 0 HcmV?d00001 diff --git a/c64tests/trap3 b/c64tests/trap3 new file mode 100644 index 0000000000000000000000000000000000000000..8b16ad9de371d42a77af676a18f9854a494281b4 GIT binary patch literal 4246 zcmb7_e`p)$8OKjGaqiBRi^B$?N}L<)kE(P`X+s)9$2jSfN%2Kib+;fxF@jN$nZgL$ zABFuBh6E$2%!J1_1|33>v3HZ4TpZZut`KGr_R3nVY%myO6#B#eY#6%Mfw6ht=Y1c& znyo;*5Tvi3`@Wy&dB6AGIcEBwF^wO-a3S?<>f%qHOTF;CVHhIToSyJMXF?i=^D`^n z3QKPBc|+_s*2EVZcf|J_T`|+>wT<2>v$ZBFTdg(qzdaFkn^kiQpUY-%c91&WJ2BXv zyZcXPcD8-2_aOO)?%={!@3e{U)K+hfzMtOeouO}MtLM=7$&Qa3C>>Gq7k__fnWGIgWvDsK|?S{WM)y*13^9qa}Hq zA)}Q4N-hMWeGGj@5bDam9xZt$cxYDV{r%m4ZBGo$-t@%oq;K5tSIr7WbiUv$%*PF? zn$m+yC{xJi3}H0v#;?V(#xKRK#v8(F{H9vy7A1;V6Reb ze%7uwPuOc8SvxyFrYq09Zp3g!%;xaFB8;3!G#?~IzZ11s6%s((jR+TUrdeRxOQIO>|iK?nm|MK;Yjvw6m( zXvDXh|JfH)&HepXZ^xRqrjq||#0~|D^bT>vY$H~#R;v}Eay0NriCcdCdJ(mZ_>GYvGI6JO4W_1qE2z9fH($b@%xa5xWyK0eOI%B^YVp(SRw zqd}~K)BX!nD9jr}jMzPT@4xFsk851r?jLISEUk^x$N#a}CB5kJ4O6;d^5k+X*-u98 zW38^=vBiPkoBaFW)tdCK+5*d(vooFK&dP7&NxWEFUCKF>(I;sdpFTc4@?0A$@fmps z+LPO}!wENTCKG0Rven&cb*ssHZR^opUZyTH^zpdeZ>)TC*afe7zSDSsH-3kI=FRqT z^r0@5bZP#pQ;B|5JGW4BBRlc8sCGB!hnXq)2gwZ$7O!&@Nrh~jpYX(=La7Y^Ef~7pk&`GdCm_$ z)C}8^7|_?9p&c-*~pH+g_DCGoF9Bp_dKELpRr_ zS`6y)mExAVZ}1^M_SH2Hig@X(8O{$r^~J}VL>Rr&Srf(Huu zLbptr_VL7*sb<@fC*OaP2gN+9DIV3J(wX7;0}tnqe53p@AJu4uwQV zFXLa8_m@`Stf~2e@{O59->4bB8$30WFi3fe^88626!Wlx=cBd6E2{izXERrd$O`w8 z-gPq5TFT2@iR`DS2A|AN`jm>iES_Y#ND_o@60Qp6mkBj z8}(I+cy-NFDoPi!{QSa)tZ0@|e(1ZY=EKbV{KBUc@s>1CDZKwY&JR9HL+zJq;B_>Q zpI`WtBHpUzDTQ3*jz9_0^#1#~;&FcY0-oPf0yX$JHTa;&moGq_qWs{4B455Bv${uF z(ff~iJm07W9;b#H6!Yqu2SvPe_9e~_KIBKfQGV#VseGgS;6r}QThcrz;ssgG?*e?t W@8Epkbu^FjgAa;%tC|NzJmbGp{9Kj* literal 0 HcmV?d00001 diff --git a/c64tests/trap4 b/c64tests/trap4 new file mode 100644 index 0000000000000000000000000000000000000000..124ac747c293690a592f7a8d72c635448a303299 GIT binary patch literal 4246 zcmb7_e`p)$8OKjGaqiBRi^B$?N}L<)kE(Q_bXgig$2jSfN%2M2bhjYGFoIE#nZgL| zABFuBh6E$2%!J1_1|33>v3HZ4TpZZut`KGr_DVZ#Y%myO6#B#eY#6%Mfw8*Z=Y1c& znyo;*5Tvi3`@Wy&dB6AGIcEBwF^wNRef%qIOFjQZ!!SgwIX&Tj&V)1!=jT?u z6_(uMIYStYH8E)15kF{j#Z05uHhQPb)|#knwbs=C_C(ZeR?RJZE}OmCLF#z##9({w z?!TSc+4iyCgXAB(g9}@|(+l}t+-m=l?{p*xD znDDP#{tKpvJAc}58&MZu=%7D^1BpqTfknf*m%?nxaSU`rMP8)qr|G(~&W+?5Ey?2y z8KwMJb0HY*W9T!2P*?u-Xvs6dL$f;X?(hC*dtzYrrYCkMedC6|YF03!^95&NK5kIe zlpb6{nL_>&g={x|BaStGC2lod7gpo9)vEvPcdE^GtJ=J8bz*Pavvwyz-x+*#;pVk< ztNFGijBEF;<{vEoEh~2!|D3;B)#Q^_YWw2%pI9bu#n@Q+!0H%p7_rxkXLbgAm1^^| zcC~rJUi-k>+4%`wdFC}EhAUz=hyN8}-HWNSHz|9(yg&lJ0>3B1c{{L;OCPEe})HtUP6}# zjXjZUJfyzx@1YWoDk3I(jBP=Dcz9F&JEGG5ZfouRJL1Ms*BlN)7}zSZY0jC=GbTkN zzSI0{4$XV@9f}k9teGWoQ;)R)6PRn%x*`6 zSOus3m!?pd*M}Ifd-UG_)QcY1xVqgx)bLqa8>f%|W3x+o(c>GYbi?Gy0Px2mNjQ*I?0`t-^G)7v9`LDb10)v(lkDOe0=1&Hdf*@@(#2o zw`YeFZrn^J%=TofyVdGellR)zqq}^Ay3EkW<95HX^3t#iUh{mX@c?i99{UbRZR+`! zG!Ke-OPU8oyo{g0EWD47@?jRPVILjMTh%@&=B;WT6!9(xrH^EODYxJuKiboEe!L65BZU==ogR6{MO;)tl%5V4?NBfJ}BmKe&9jLzE|>`AAHDf zY(C^iK4if8!3V`W&JR2&@&#GW?<{=Ck9?#2;6r}QebU)U! z3nk?DcVs%s&kwSZ9e)!i2R%4H_@Kz=2T*aWJqsTc`HDIBP035ahy2)w{Jx29u1~cX z)a5J1Ep^}ELw@Y5YaSHw(pNK_AAHDfY`#rBALj=j6!Vre4~lphKhI|kKIBKfQGVD* zNAoy8_@J1#s(DbvD}}-E?0OmG_s)U*O7u*}|Ezip&!3lpB43G;l=;C2MZTi%{%|_6 z3*~zBtg>&IAB;M`RX+D#2Klj%^MehFcq{Fpa9e_jTPd7K}7Q0&8waE4Mrh^+dgz~h=*4kG)8y1F=T*Vs3& zd_h>Aw^=G8T?u6cFEOJ|1X5A$s* z-{|=Wa_;xy2G6&oc}tpiUGuIhUbslJ)YN`E$`_V{1@+7Xx!^wYa*ID3l983nCCHV3 zJiO|@qLl9~%B&J8-=n`D36OoSOtl1*Tc#Q*5BVWy>4Rb))s&BFP@${x>)!`PI&5t`w0K?j^nJ zWTv&0m$?$zPf-m%nVrY7eOiF{82aR zs}%9-nx|BhE@b)ng%4TLETjC;cT>%WnfdvJPbuOpX`WJe|9PAre3XXTFW129XdXYm z@F_*SRn1chxyT)X5~S(<_Y1}2{PG1nzo!Ih@NsJJL6I+CfI3C_!3RaYd_iV)kFuio zAM<#=Q4Ks!4K*m{)in=_chjq-yJ`7v)v^Pq?qWI4YJ@FBm0 V^MTjVJkAe3DCVtd9u)D6PXTIQTsi;% literal 0 HcmV?d00001 diff --git a/c64tests/trap5 b/c64tests/trap5 new file mode 100644 index 0000000000000000000000000000000000000000..f8ab1f60a46aa3ea54b0ce0d2f903e366418c126 GIT binary patch literal 4246 zcmb7_e`p)$8OKjGaqiBRi$e#YN}L<)kE(Q_^hX*($2jSfN%2M2bk`umFoH3VnZgL$ zABFuBh6E$2%!J1_1|33>v3HZ4TpZZut`KSv_DWlAY%myO6uQ>`Y#92(fw6ku=Y1c& znyo;*5Tvi3`@Wy&dB6AGIcEA#n8uG^JfC_db>U~vre1u`FbolEPEYusHz5tf`Gpm4 zg(bK6f+0R@tciCUx5W<|T`|+>wT<2>v$ZBFTdg(qzdaFkn^kiQpUY-%c91&WJ2BXv zyYsO#JKH|iyPy0+cW{2IciO~vYO6O#-%oAz&d|5B)pO|koD z2NV7^%YVrfap#ZwZ6oU93mx>Qa3C>>Gq7k__hOhWIgWvDsK|?S{WM)y*13^9qa}Hq zA)}Q4N-hMWeGGj@5bDam9xiz%cxYDV{r%m4Z%+)&-t@%oq;FjJSIr7WbiU{;%*PF? zn$m+yC{xJi3}H0v#&5;3#;?WA#_Pgr{H|K{zx7_Vxo%aP_pDCrjl0(FB{m+;T|t5r=tZl$&_{NS-=@>YzEl@G0s@rDt5&3Jleuve)z zKWA5)C+xKkt(~2p(v_!QGh(3m$;Jcf3;!M};iw{Fvd7pK#7BoW)xRw&?eDeLKDaHeA9c;)AcTRfBAe!%**s%X zG~&C>&-TSsbASJpTe0TNspNkeu|t6(y+a%^+lZB`)oMkk91T2D;y2jTRO7)T7gxkT zs{Wz!J0D z(I8gAY5$ce6z26IM(iHF_doTbM>Vc)_YXCEhStXE?fo4 zu~ygb*y6zNP5yoGYE61qZGmOY*_lpqXXVX!5--+PmvRne^huh=r;ksMJlDobd`8}Z z_T={LaKeon$%NUSY<0I<-D>h~+j@AHuThs7`gqjtH&(tq?1I-k-)TI+8^6at^G5qP z`cRijx-|dtRH7f%o?j@rk)8N^RJ)V&!_1WYgX9Jak$vt{)Cvp5d7FGG_@Kz=2L8N# zj%x5hk*}C5z7!w&TMQ$O3+GAJ&US0E`m{-?4DB`7y{-34qBlO*T$b6f6 zz9r3rV&0PGK@l(GXD|!zqoaJ7g=^SHNAp&-4~luKng>O^OF`)qnP18+c*u|THp;K$ zBhzz}sHO8E=La7Y`AQ4J{NO`=_&6*0#_|J?^MenHd7K}3P_pmkJm&`= z@*A5E`H>G9aDMPXF^}^D4~l$2mh(FcAMzvLC_ng+AM-dr_@J1_`N0Q8zEYU~!Zh8F z_3T0k`TY%CC!5(UdGS!S%VMxk#CeA z_R-Ni&JR8)=B;WT6!A)7Fg&|n2Kl{rAiokl)A2v49>eqJWuVAcq9kR0@IjHU=(|6f zPV7Rt9zCn<8|DY2&To~^y_Z3L?Bo1kgCbt~N-#WsUIzJ%&4>JWzTx@vGEmIp{J?`E zUy$Yep2vL1k9?#2;6r}Q8=gNe1I0Yf4?ZaNVMjPasUSpFeNy0Y%`FF!eO+B$oVRQ2 zn^(RdEYI5!)!>^~J}Yq*-ceza8ZZ%fW(rW`bOBk9oPppAX5%O6C&e z%0C%ibzf1+_ZDSViInfr-;V^yzE`GN0?I8@jg*J{khAnbv5#uXM>VL>Rr&SrfCmcs zLbptr_VL7*sb<@fC*OaP2gN+9DIV3J(wX7;0}tnqe53p@AJu4uw4bB8$3CaFi3fe^88626!Wlx=cBd6E2{izXET?J$O`w8 z-gPq5TFT2@j_fC?2A|AN`jm>iES_Y#NnVRFp1c`T2zpSOQh5J)oF9CYhT1RJ!0Tup zKfmxPMZ8tbQwq7r9f1<0>HYUh#pC?)1w6l}1ZwbcYVbjkFJFK{mHI_>dp@M){%drt*#QgAe&JZ%Ol@h!!A4?Za7t!f?=@r?fh!Hiuw literal 0 HcmV?d00001 diff --git a/c64tests/trap6 b/c64tests/trap6 new file mode 100644 index 0000000000000000000000000000000000000000..0221dcd69e1193d591f29ee891f9c3a94c3fef0e GIT binary patch literal 4246 zcmb7_VQ3rY8OKjGaqiBRi^B$?N}L<)LsdFZx{`#@GEO>WQhbp$-7Uy4j9?68rclE6 zq0ld3NKlf>On7W#&>;jFdpF6+#er?^3SkCeudG$a28A+4VO#xW!_c)3l+FD=@B8T0 zYz5+lApP~+|NTAB`@i?jG1LE?Y5eH?h19dDi$8rXb^gnSVTf3BdcyyL327M4&#ibX zEV;#VhS+bciFX=z#19%>G1KU^jovAdLlex2nziRwwr6J!^Lo^qs-S7j9l# zx0-KT!nk(dYQAInf3R|w@y~hRswSVbQrj25|HLwRE5^pkhgQdU(}=xpJhL;{t5lnx zx2w$)_S%Qm&dyKh$}_JUF675)PO{zUoBGK5xuiJZAToISXOSi^K?U;Cg6C{#~gP%_x{23nnc?n$} zH1@p{o-rvJ z@k;Z*`(moOzyI>>So79Y@;{B(p+J$|A&!`B#LCrbwIWoG1|BK#Yiw$&@$j*WE8_2R z{3%*=aNpydD&mARPanlh15M||S8`%KcLcI8$=@Y1;hh~E&I6&3kF&9IYub5eiP`OF z5Ub#{|I!o+^TrS(c8}ispL)^b8dtabhZ;UhYvc6se{6P1FM52#lx~wmNt(u|k57&~*TzbGM&5z; zP?s6{c--zcR=zXrg4aCXX*|FizsEoGX8Sn$ zP?t)&H2?LfL_exMzff``JMq`3b~opTnJM`P$qg1F``jm}6&8x~Hu+NUL6Of5{CWEv z)!>67UolsFAwKlE+V`TJcrB_$ZXtu(6IcOWUGt!rSJyl!;-!oJpQZ03^xb^Ke4Bc{ zCC!6k-je1)5ijFsFbnUaqkNc!YuHCe^H#MFig~M=2SvQgLFr?eU&<|b$dC3m%CF=j z({q!krSl=@2OkvqN(;mM;6r}oEBeLbGQV~BI4k(Z@&k|agAa;%oF8~lvhS5V=LaA1 z8=DXLkq;Sge(*stkMjc$ihMzq^E(S4@+03UKlqRz^Ef~FpqR(`!3RaYQkehZG~JK& z>_Q3o{RNqh^7DgiWXIpa$w3d!4?ZaJ`2kcMYtO<5MZRLreM|CE@F73;A-`{;o9k08 z26g#LaZBAd_>dp_>Y4{dy!6!!=LaA18=G%a&&T<}2gST4&4VId#?SLvgAe(UZ_WL7J*(^+<_DwBZs>NAVgMuQs8mTEeDZ(LtR~*w`=U1 zSH2)D&)X5z;G0)IFS{u3$G8875|&-mBFeOo1=)yd&jsOPUGwUiSJ%9{;-xdg^N0C1 zm2dQX1UdKBxWV%+Y2K3NUDv$piWe@@EH$;?j`D@&U_m`IK`yw@yxii?hGb+Va|v?g z9}lm(FDvDHi!!T3%J=B+M*?KuD^o22<(8>N%0qt0S^A*ZM>XZ68dT`2{Q7sn1BHB{ zTc%9=c;d@cvu(+f??1_dVjk5Lk7`iq%<%kyhx13iQGS?@YP7;zl;=^b85{NRHkU%nu-x<^^j z`;U1%->3#2r-m97^Xi%hMZ9$OYn&f^$d7!Z{Lpt(`9}G{hy0kgq5LxPc1X2N3|gAO6c*t z%~l{@2+~*2ec#XXyx)8895ekdn8r^p%q5>qUi`&#$qQdG3`4{klVkoDO-RFVer3g* zVbLvIFoaQG6KCsp#E|%p%Vu}FpFG|@(chlA z`>8WM-8$BN(0{knpWEu5Hu0U@>dw&j*{$vw`gXRu4t<|IdAqZ0*E_en%SOHX@hP)E z=3lq`7fca%{j^)2?WiR8O^B1c!`=piJzWAdjmdRT-Hda2e+Qu73>{a8Lo&H|A(s;_Q zG)~xSA6Yv)Kc_3tylTX7MNDV$zbuTbNHiYwMXw#Ts%M>xw)yAAX>(=9eC3Q;X*g!N zx@I^h?XpO;V$C(F_DG3DeGk8G?_qISTpBIi8Y#76;sH*O=qnC>K6&tGc<|>Xba_zU z6aD%_>I?rKD&epqVzS4`7Q`oqH`Ti%%B>$X*Zy%w+&Jo*!$AlGTSYdF8MAT5q-ezV z8~@oC6OH}-mv6@!wZWLA7FE7r3|Ap4U1Jt7m{*}>sF5c=pi8!NXaorji~-j4dQ zGEVz%OrbEZ4KQN&=)M1`7d@_VWxIE%;j^?hP9OirW|#D$$2UyshW(SvvDw~i)H>Ge z_-$Jp_`S)$4_>WG@2V}ZtT8>+?(eMpAwG*2YqLW+hcfy;P2raJxZQ88e0R_VuX(=Hcz`$F#6R<9>p1#Q zmvX8&|ILX+FRDJjP;?_Z@j+C*oAtx=g#3f#1`CmW{&Upw3x#=`d`bAA$ma(BynUW( z@IjHUkS)9rANXAD`>LIIC8|blK8@NFSOH#5^Prel(>y5Rr3(K0()S7aZa!kZO+DX| z=0P!UN%NqHm-f?`h4;}`KFq>3?4zxDtJ(*}yj9JEBHrbo_?gTv>E=D;M|&IQSM-tT z`Ek@zxsdaN4~l%ng+YGsAwTjJ{K9dW-#UDp6?`N4fyep52gN+j4?HN@_ezfQgAe(Q z%!mBQhYUDB_@J1_`GE&Tz97T-or4egk#CqEe8`V^oF9Bp%;WsvgCbus%zbH+?#Fs& zp@{tcicE+3`9UVK<8R^QpaS~(vgAe(Q%(toM;5oq@O(>}x1@R3HSfCOg^M&xRqeN}d|@eAP|r+|4em29yZFli8Cl6(f^6w$ zgRAb#O8MTR%qo%eJ^K5R0NM9SR7*g)C909~kRNiEJ}CB4P5Gz>6}l?F-d*rOAz$d0 zDAOLE_!8A@Tk_=lPx7FcM>WNx8dNGhIDg>b{E=^%ALgSPt?(A*`I9^-=3Uo3DDtKK ztMdNR3Y;}HUr@R+mFO8&!*_$HrxFG!Z&98<$%A4ZR`7hZmUsn~U-ex2NnUedcx zW?D^p=_`@_G}Yjf`AMHrk(a@fOjpULRFuoB{H`UzQxy1Qes}Toq~x7>5tIVXA9bU? zN)fN7c}hj8e1@N2_>dLNGRzNsH`RQYnV(h7#ponMu7i{WsZ2$lO literal 0 HcmV?d00001 diff --git a/c64tests/trap8 b/c64tests/trap8 new file mode 100644 index 0000000000000000000000000000000000000000..b47e19b48d4179a23746dd671ca5e3ebf4ef92c4 GIT binary patch literal 4089 zcmb7_QHWbr8plr@I=%PKgk_3CG41p&>_aOqq$+hRF3ZimsY&NH6LYgA^D+cvA!Spf zun&R=MUt1+6o)A;EGQvR@VLpew5O@54=X^P_ z9bv{YB>#N(e}CV1{`Z{QgcaUvi9bC$m3}aN@|B0uk3KAfkcrm#Ncc+&QV91|J2_u2 zdBrIqMRQReZC;mK&8|!~du`D>WX&(i>e~FG{%eoK-B!(7!{<4xH_=b;?;Yr`Pu}>S zJ2BDT*AxA}cl%Roy~7s1(`&s+`aZhWJ3`;?TF<5Lg9op5&pFNRwca_=?EUwU)gK8j z*x}=rOuGNrZi~2!FLW@U(uKq%Zr`S1y;J3E$#n&~p`tF*^}}>sTPKI|h>_%R2aHnw ziCh_s_CE9(LZ~bM`f15C!9%mU|J>gEZhfS0^~OgwM?-NjT(GJb(fzeMGo2JvwUh^! zP^OR{qmZ5E8**Rsukv#9O=&mZs@1}$zo@mA>{{z}yOVhProA}|`bPhosY~aV?A8ai z6z5;JTes}+eLHs=|J+aQ+Oc2Q>GhK@-gAz;Rk3{KE4w4!7KxX|0~`IVYOQsjQ)?Y? z7QeDLHvUXk9(Y+Ka79k!@K=>0CsQram#dw)T|ercbgWNWhpj7<)(c0hTFbSn^+n+x zbgDAdPRuVVwM9y%np^mFZ3{P7<*A*e%R5T#gcR68vadP#IYU2hnV(nh{CNspL~~2_ zo42Vi{9CA8Mdg;R$b{;#V+r!>yBD>3T~^!A&oBP_y1cm8d+rWG3M>`bv?i_A5sRXc z&$j-*Eyr5h+s|A}v@VYw`@V@K-q9QB-Nlg;%|xYEt5v1WQQ%0)zhO~h&D*=)T$TS) zE0xL{EWrUnVWWRm>x95G8e4nOUF`Hdvw0L zHs7rsyV(ni%3V(pi=EWxas5UvEc;{Xo$p06v2)^E)Cx1jX@`7i_@Kz=Md7q_f@<(Vk*}C5 zKAs%-JmdR~lX@Yp$6mol?H=3#Uc>O9nAb2oDB@*`;YZ5%HTtgn#C$7ezB$8#V&0tL zK@raneayn^=x85i;TqP_F}wxigJRx-;Xx7abX59A<(Kvf0rI1@4f897$n?Z0YMFeQ z^MenHe5IK|e()hb@)g74ewE)6e4G`0JMsgM^MenHd7K}3P^#~lJm&`=^4l>V@*^KI z;QZi&VjkxQ9u)baEa!I|KIBKfVSex-Kjv|M@If(;^MenHe5G>!SL5_Nma;P?ohTco#sZA&^ptH)p zL4Gir{1$lM2R`y+ALj=f6!9`=qrv_QeB`%dKIF&q4fbE)Lotu@0}qOPQI_+21oI(3 z@(uHY5BV`~u>S%dig}zLd{FGeim->$Q5jjSk^+xwUL}g1i~8#9v{Pr_wDv{i%Cr+x z4ZdmZ3$nB7dHmr=lyb#GEv8HhS&&6se<&)?HVm&}cn!mAXkNx2>_5!6qJ6{j5#_vR zl7i=(GrT#&yI^=1G_O2Mv()u^JK9&SL^Jx#M7e0d%gqi{8Cj`ZqFiNAGkwEgR%Mk+ zhXMWnkpejkDpX5Bc@?UW3XmUiRz4{9QBC`(237WSeycaY1BHBLuR@uw;>1^|<~WL{ z-hYY*#XPEM9@U^S{$T%shy6#sVSbp8YIH|1tM;GbK{4-w;X#ql56`OSOLt(e>G`6{ zmw0E3x(L1KxnxR^3TD;*Q#>f<;SQdU?j>GP=T|@OpD7|MJWG1lsZ8tXz&{f^_fri% zm7nry6$e?IWV%W|t>Sz^=XX90o~FR3^1Ff4lTlCR_n;K9|EL@F)rxox!_z9x6taAN z;X_t5%P>FmUD5MlWwMZSCi>Ja4z9~AlW1(nrJ%8K59%;WinHSjn!)S#Hx zFgz&YWwK9le()hb@(uGt-xci}<_910W8R$MK@l&?a(+|rA-_B41FvIvoF9Bp%v&%# IDB_7906`5MzyJUM literal 0 HcmV?d00001 diff --git a/c64tests/trap9 b/c64tests/trap9 new file mode 100644 index 0000000000000000000000000000000000000000..68e8a7fcf2dd0ad102111449b7c01d9ea4331282 GIT binary patch literal 4247 zcmb7_VQ3rY8OKjHaqrHSi`y~MDsgTf22oi-=}MZlYw1a+PD(Gbsyl-GVOTH*GF2E0 z9c<7K+2B4j%bALKD;so(m@wW=aw4ap)NLV9BkXN#>KJ1mHb!9-?@KYXt2@T#{-5`K z^s2T3aYK;)dhY-Jp6C7Fd*_7df59|fdF)K)E1AcC`AFumuNsCS67kfy|0NUBFdShe zn_1Xcg+}Gcl zz44JVGt)ZKxt)Hu-9NM0Id0-Rv)P%Y?~|LI6ZGwDb{zUXdh}X*(T>{JI*Ufs`QVt@ zANRj&`Cm6h()rU~%jmZ8g%0{tIFOjcdDo(0-Dkpl#c>RDLq%Ss>&NN3vd#|W2`$Ov z3>cN-Hwqybtt03&giu%hb!W*l!9%k;|J>X8@78$V>`aaCO!&qn|0iY*BRUT|bI&FX zs+!V+ODI#wr!thX9laqYqSwWbqc?>Wy;ZOK-+8Ydzh>3rTh`UY+c&M93E;Q;|2}j1 z!fRIiM@twNZdq~P^8a8J&f=f*H>;k$*UD@?{_@x&d27b{(zbQgc-u(4YCN>v->uc- zFWU9^etUJ>+TQ*JU3utLBY`Vorhxx7VH89vzMU4mtKC-Pr1OMr{xv>sF3p-(PMG!B zF>8%g!+F52iBv1mT$O5!lt@Km_;qazi)-S!(bCUGO09&rjUyz|ii4l`?*AF?|M?8M z+>UldI{JkA!oQ13IIM_->@l(h@!`Qu^{$Ir>qpJi_pggfhh1|p2w`BW$R?gO;}a%D zBVLUEzb7W+y}j>WOTuChdQI%AN$^aGH?XP6=##rHu8H^M zqDfk`f8V2>YT|xro;r+~2AV2}rwig{;SgkBlD|h}!aM)M;oKMc=s4?3SEii*SYl?Y z+fUSR+J9pTg?Vd$5j%(P{efO|x5o9Y-hqY>)7m6`e2&d7=tXyLn9&W>M;8<6Ub@>l z(ro)Hw%GT3gMaV8+K}F5TVPpy-}Ke=_R>4aG~TSuHsu`3=+iWfPanI7o@;$+dRpFr z*2LD#V8Zpw>6F=;Xtp<-?Rt8xW!<^UH>t}secWyL>q{>Ty5K#}cN!1y`fu^iyxh76 zeW*(H}HM? zG}YjPB44>selj`mWwq}qJ9VYo=(?pGYGYUdUZiO^vq9x!nP0{&dB~6UHq5W$ zBh%9psAY>G=La7Y`6_dR{NO`=bDST1$Zur64Lu*{2Okvk7BmlvcsakwXAM5&N4{Zx z*vE?IaenYYF>hJ(pomuqgTdMLa>(z!efd@BnNI#$^%$H#F9$`w3MDD?gAa;)W#4^e zDzyXUdi1QaZ;)T*Gx;s^x%YC&kA0jUcu>U4o(~4+&&wgdk@=7x&o?-KUJip@dZzwJv2^%7bil8;=Cxe584i=0%zpDPA@=IDeRL zL-~f!M^JEIN*X-hg61t~-bKy3sCeN#&C*c&T~WTU8kE&D6BL45%qz_QYCuL-GMAuG z{rTXk`vawXZ(e4V%J?4r{YZiAdsV8Xpxi3eNO{N)IZGcD`>3XTRD%j#m0#}$c%YCk zbgPtU4^MoRYPKzT^8F`yP|Ty6;!zDMn;V=z@NoXfH_Q+7QH@r3^YZ*j9u)H~Y918% za{hUFe`y8Inwl@D{%|_gGa82P2C3ZSAFU-`S>@L_l{;5PR=Ah+ zu9KNIGG6Z7n*AWv;FI}DpHf{fk0+U~l255_v83|5kO5Co;FI~?z|)hJcjnumlyUy3 z8}(I+c#-BQ)yHYU>#pC>nB|N{!1ZwbcYVbjkuULXQM)|=9MZRK5X0=9H z(ff~iJm0Ve9;b#H6!Rj@gCbrw{~YHBAMzvLFhBI&P`+V)@F73uEodGT@q#?(cLqM> Ww|_qHRy2?EgAa;%%bEv8JmXVZ)>d%< literal 0 HcmV?d00001 diff --git a/c64tests/tsxn b/c64tests/tsxn new file mode 100644 index 0000000000000000000000000000000000000000..d94b43872af9ff0d7239c76d8c308d1c86b561fc GIT binary patch literal 644 zcmZ{g&ubGw7=~xJX|nIM+idy^#LIXyps@C$^ky|R)uoj*NYP6#wkx#w7YI>Y55Wl$ z1ff_73m&Fq3O$L{UaE*WtPCDRya^t1D!GV=hdL8i1;Oty%=7XM-}8;-1d|SVGZm(5E{d{?;_+QdTbtS5(j{Kc;G;NkI9B{@HUC19ke(*$rdiTwA5!oQoJwKFzOv7RxerLLA-^d1fGGCz~U!}3Ncb)dK+NG<$ Uo~f^|P=1>Vvc5|B9U9c=Phi~U9{>OV literal 0 HcmV?d00001 diff --git a/c64tests/txan b/c64tests/txan new file mode 100644 index 0000000000000000000000000000000000000000..e9e137e628357c03cfd0251e8bf48edf54658ef2 GIT binary patch literal 616 zcmZ{g&1(}u7>8%KrT%sxh!;V;j5h-cYY~)Qq}9}X(LxBKo_bJOp~b&I$ieMlaY6(^ z@E~Eq!<0;+C-Li|A_iPpJcxJ`JfxeCZrh}7^iXHwsv!6thWGjL4(~H#pm-SM!Q=^h z>d~Zq#wLUa!!_ACnz~oMJUvImQQm@h%hw^+cm%P?+Yp3z@T}U^O$6Bj?}PUsBk&#Y z0c0C|7qSD(PTyXU12jo^z_U!<(%QIZRaUBdkX`U0R=aqpCbM!Ks}UM)9QW{}$;{4| zGK>+wRR^nBI-8y?XG%_RH;Zy=M8eS!ELBpE_avGWmT-ER;f%6(( z|AOB_*}N)tnmXx&mff7HnKvhjYBSGMhZm@Cyv)&fLbqQVRr7k~1i!=ZJr6VUy)zcP(;$z>FF2D= z#+^$JAw*b#&1Pu!QR(*0JP~Jk1L8g3hS=aS#3FA(5T4*=c?acZ2+1a~*2u_~>S!H9 zHo&{!Ey!)~9%KxD0Dc771n)y8$T<8E>pQ6E-qoAdW7L{BU%?l?i}D^Gw&C-AeSHV) z2jUp27AH`>kW|d9ku_rJSvnvaV})y3^3+biz8@!jkKEVxhC8K0lYj;<#EIa!P{AvK z;I;32_rB@J{Zq1qs0%eJcMmQ{c**)D{g7vx&tS&?9=feYJDiN=5_EPoq5r&KBz6rD%q&9 zF)EneGgv8%KrT%sxh?jzR8E*y@)*@JXkycalv9u6_sHYxOR%r1r5OQ!m1Sdog z6b}*t9;RdpJ&9iz6*1t-;z7il;33T>>9$SUMi1>wTonZ0!|*;o-r;>_3^?N;45VQ7@o<_(8RsM<>@&hj_@YLJH7_7%3BbNJcJ;;jpyZ#ZbHZ=cn`b_8G`SC z_aR&0+mLNocJkJ;?4v<~10~DUEv<}}tm1Nc7qSCBz)A;?)MQ$&VWow7h+_}&g|DL= z;qC@pzNr>%f&D-?L~y^`Mleuv>;#+7CCC#q0{gxf{d7oCrG*QZlrZtA_e_j>PsIoC zg@E_cb)B2v)WiNM*@fRjkd*82`v{K82>v#L!*T=u4uV5+6aFp&OK!m*ATSp6r_7{g z=kqDXNUd1~D_T06o-L&EOlRFcSw3?eYW3V-xjA2H@>ln^ycpF1TLnDSO8otJG zR>PZL@LMRIRmDzGH+j&q8&ehY#+aiv^DK3Fj@FD<85)f#muAqPEG=azzeWXF%29ru HI#=mFkZl6% literal 0 HcmV?d00001 diff --git a/sim65/bcd_vice_sim.c b/sim65/bcd_vice_sim.c new file mode 100644 index 000000000..4d8cfab96 --- /dev/null +++ b/sim65/bcd_vice_sim.c @@ -0,0 +1,160 @@ +#include + +static int flag_Z; +static int flag_C; +static int flag_N; +static int flag_V; + +unsigned int ADC(unsigned int A, unsigned int value, unsigned int bcd_mode) +{ + unsigned int tmp_value; + unsigned int tmp; + + tmp_value = (value); + + if (bcd_mode) { + tmp = (A & 0xf) + (tmp_value & 0xf) + flag_C; + if (tmp > 0x9) { + tmp += 0x6; + } + if (tmp <= 0x0f) { + tmp = (tmp & 0xf) + (A & 0xf0) + (tmp_value & 0xf0); + } else { + tmp = (tmp & 0xf) + (A & 0xf0) + (tmp_value & 0xf0) + 0x10; + } + flag_Z = !((A + tmp_value + flag_C) & 0xff); + flag_N = tmp & 0x80; + flag_V = ((A ^ tmp) & 0x80) && !((A ^ tmp_value) & 0x80); + if ((tmp & 0x1f0) > 0x90) { + tmp += 0x60; + } + flag_C = (tmp & 0xff0) > 0xf0; + } else { + tmp = tmp_value + A + flag_C; + flag_Z = (tmp&0xff)==0; + flag_N = (tmp&0x80)!=0; + flag_V = !((A ^ tmp_value) & 0x80) && ((A ^ tmp) & 0x80); + flag_C = tmp > 0xff; + } + return tmp & 0xff; +} + +unsigned int SBC(unsigned int A, unsigned int value, unsigned int bcd_mode) +{ + unsigned int src, tmp; + src = (unsigned int)(value); + tmp = A - src - (flag_C ? 0 : 1); + + if (bcd_mode) { + unsigned int tmp_a; + tmp_a = (A & 0xf) - (src & 0xf) - (flag_C ? 0 : 1); + if (tmp_a & 0x10) { + tmp_a = ((tmp_a - 6) & 0xf) | ((A & 0xf0) - (src & 0xf0) - 0x10); + } else { + tmp_a = (tmp_a & 0xf) | ((A & 0xf0) - (src & 0xf0)); + } + if (tmp_a & 0x100) { + tmp_a -= 0x60; + } + flag_C = tmp < 0x100; + flag_Z = (tmp&0xff)==0; + flag_N = (tmp&0x80)!=0; + flag_V = ((A ^ tmp) & 0x80) && ((A ^ src) & 0x80); + return tmp_a && 255; + } else { + flag_Z = (tmp&0xff)==0; + flag_N = (tmp&0x80)!=0; + flag_C = tmp < 0x100; + flag_V = ((A ^ tmp) & 0x80) && ((A ^ src) & 0x80); + return tmp && 255; + } +} + + +void print_result(int result) { + printf(" %02x", result); + printf(" N=%d", flag_N? 1:0); + printf(" V=%d", flag_V? 1:0); + printf(" Z=%d", flag_Z? 1:0); + printf(" C=%d", flag_C? 1:0); + printf("\n"); +} + +int main(char* argv) { + flag_C = flag_N = flag_V = flag_Z = 0; + + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 0; + printf("adc,normal,carry0: %02x + %02x = ", A, v); + unsigned int result = ADC(A, v, 0); + print_result(result); + } + } + printf("\n"); + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 1; + printf("adc,normal,carry1: %02x + %02x = ", A, v); + unsigned int result = ADC(A, v, 0); + print_result(result); + } + } + printf("\n"); + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 0; + printf("adc,bcd,carry0: %02x + %02x = ", A, v); + unsigned int result = ADC(A, v, 1); + print_result(result); + } + } + printf("\n"); + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 1; + printf("adc,bcd,carry1: %02x + %02x = ", A, v); + unsigned int result = ADC(A, v, 1); + print_result(result); + } + } + + + + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 0; + printf("sbc,normal,carry0: %02x - %02x = ", A, v); + unsigned int result = SBC(A, v, 0); + print_result(result); + } + } + printf("\n"); + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 1; + printf("sbc,normal,carry1: %02x - %02x = ", A, v); + unsigned int result = SBC(A, v, 0); + print_result(result); + } + } + printf("\n"); + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 0; + printf("sbc,bcd,carry0: %02x - %02x = ", A, v); + unsigned int result = SBC(A, v, 1); + print_result(result); + } + } + printf("\n"); + for(unsigned int A=0; A<256; ++A) { + for(unsigned int v=0; v<256; ++v) { + flag_C = 1; + printf("sbc,bcd,carry1: %02x - %02x = ", A, v); + unsigned int result = SBC(A, v, 1); + print_result(result); + } + } +} + diff --git a/sim65/src/C64KernalStubs.kt b/sim65/src/C64KernalStubs.kt index c79567579..caf6e9a33 100644 --- a/sim65/src/C64KernalStubs.kt +++ b/sim65/src/C64KernalStubs.kt @@ -4,6 +4,7 @@ import sim65.components.Address import sim65.components.Cpu6502 import sim65.components.ICpu import sim65.components.Ram +import kotlin.system.exitProcess object C64KernalStubs { @@ -14,10 +15,11 @@ object C64KernalStubs { when(pc) { 0xffd2 -> { // CHROUT - val char = C64Screencodes.decodeScreencode(listOf(cpu.A.toShort()), true) - if(char=="m") + ram[0x030c] = 0 + val char = Petscii.decodePetscii(listOf(cpu.A.toShort()), true).first() + if(char==13.toChar()) println() - else + else if(char in ' '..'~') print(char) cpu.currentOpcode = 0x60 // rts to end the stub } @@ -26,18 +28,18 @@ object C64KernalStubs { print("[Input required:] ") val s = readLine() if(s.isNullOrEmpty()) - cpu.A = 0 + cpu.A = 3 else - cpu.A = C64Screencodes.encodeScreencode(s, true).first().toInt() + cpu.A = Petscii.encodePetscii(s, true).first().toInt() cpu.currentOpcode = 0x60 // rts to end the stub } 0xe16f -> { // LOAD/VERIFY - val loc = ram.read(0xbb).toInt() or (ram.read(0xbc).toInt() shl 8) - val len = ram.read(0xb7).toInt() - val filename = C64Screencodes.decodeScreencode((loc until loc+len).map { ram.read(it) }.toList(), true).toLowerCase() - println("\n[loading $filename ...]") + val loc = ram[0xbb].toInt() or (this.ram[0xbc].toInt() shl 8) + val len = ram[0xb7].toInt() + val filename = Petscii.decodePetscii((loc until loc+len).map { ram[it] }.toList(), true).toLowerCase() ram.loadPrg("c64tests/$filename") + cpu.popStackAddr() cpu.PC = 0x0816 // continue in next module } } diff --git a/sim65/src/C64Screencodes.kt b/sim65/src/C64Screencodes.kt deleted file mode 100644 index 5497de1bf..000000000 --- a/sim65/src/C64Screencodes.kt +++ /dev/null @@ -1,550 +0,0 @@ -package sim65 - -import java.io.CharConversionException - -object C64Screencodes { - - // decoding: from Screencodes (0-255) to unicode - // character tables used from https://github.com/dj51d/cbmcodecs - - private val decodingScreencodeLowercase = arrayOf( - '@' , // @ 0x00 -> COMMERCIAL AT - 'a' , // a 0x01 -> LATIN SMALL LETTER A - 'b' , // b 0x02 -> LATIN SMALL LETTER B - 'c' , // c 0x03 -> LATIN SMALL LETTER C - 'd' , // d 0x04 -> LATIN SMALL LETTER D - 'e' , // e 0x05 -> LATIN SMALL LETTER E - 'f' , // f 0x06 -> LATIN SMALL LETTER F - 'g' , // g 0x07 -> LATIN SMALL LETTER G - 'h' , // h 0x08 -> LATIN SMALL LETTER H - 'i' , // i 0x09 -> LATIN SMALL LETTER I - 'j' , // j 0x0A -> LATIN SMALL LETTER J - 'k' , // k 0x0B -> LATIN SMALL LETTER K - 'l' , // l 0x0C -> LATIN SMALL LETTER L - 'm' , // m 0x0D -> LATIN SMALL LETTER M - 'n' , // n 0x0E -> LATIN SMALL LETTER N - 'o' , // o 0x0F -> LATIN SMALL LETTER O - 'p' , // p 0x10 -> LATIN SMALL LETTER P - 'q' , // q 0x11 -> LATIN SMALL LETTER Q - 'r' , // r 0x12 -> LATIN SMALL LETTER R - 's' , // s 0x13 -> LATIN SMALL LETTER S - 't' , // t 0x14 -> LATIN SMALL LETTER T - 'u' , // u 0x15 -> LATIN SMALL LETTER U - 'v' , // v 0x16 -> LATIN SMALL LETTER V - 'w' , // w 0x17 -> LATIN SMALL LETTER W - 'x' , // x 0x18 -> LATIN SMALL LETTER X - 'y' , // y 0x19 -> LATIN SMALL LETTER Y - 'z' , // z 0x1A -> LATIN SMALL LETTER Z - '[' , // [ 0x1B -> LEFT SQUARE BRACKET - '\u00a3', // £ 0x1C -> POUND SIGN - ']' , // ] 0x1D -> RIGHT SQUARE BRACKET - '\u2191', // ↑ 0x1E -> UPWARDS ARROW - '\u2190', // ← 0x1F -> LEFTWARDS ARROW - ' ' , // 0x20 -> SPACE - '!' , // ! 0x21 -> EXCLAMATION MARK - '"' , // " 0x22 -> QUOTATION MARK - '#' , // # 0x23 -> NUMBER SIGN - '$' , // $ 0x24 -> DOLLAR SIGN - '%' , // % 0x25 -> PERCENT SIGN - '&' , // & 0x26 -> AMPERSAND - '\'' , // ' 0x27 -> APOSTROPHE - '(' , // ( 0x28 -> LEFT PARENTHESIS - ')' , // ) 0x29 -> RIGHT PARENTHESIS - '*' , // * 0x2A -> ASTERISK - '+' , // + 0x2B -> PLUS SIGN - ',' , // , 0x2C -> COMMA - '-' , // - 0x2D -> HYPHEN-MINUS - '.' , // . 0x2E -> FULL STOP - '/' , // / 0x2F -> SOLIDUS - '0' , // 0 0x30 -> DIGIT ZERO - '1' , // 1 0x31 -> DIGIT ONE - '2' , // 2 0x32 -> DIGIT TWO - '3' , // 3 0x33 -> DIGIT THREE - '4' , // 4 0x34 -> DIGIT FOUR - '5' , // 5 0x35 -> DIGIT FIVE - '6' , // 6 0x36 -> DIGIT SIX - '7' , // 7 0x37 -> DIGIT SEVEN - '8' , // 8 0x38 -> DIGIT EIGHT - '9' , // 9 0x39 -> DIGIT NINE - ':' , // : 0x3A -> COLON - ';' , // ; 0x3B -> SEMICOLON - '<' , // < 0x3C -> LESS-THAN SIGN - '=' , // = 0x3D -> EQUALS SIGN - '>' , // > 0x3E -> GREATER-THAN SIGN - '?' , // ? 0x3F -> QUESTION MARK - '\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL - 'A' , // A 0x41 -> LATIN CAPITAL LETTER A - 'B' , // B 0x42 -> LATIN CAPITAL LETTER B - 'C' , // C 0x43 -> LATIN CAPITAL LETTER C - 'D' , // D 0x44 -> LATIN CAPITAL LETTER D - 'E' , // E 0x45 -> LATIN CAPITAL LETTER E - 'F' , // F 0x46 -> LATIN CAPITAL LETTER F - 'G' , // G 0x47 -> LATIN CAPITAL LETTER G - 'H' , // H 0x48 -> LATIN CAPITAL LETTER H - 'I' , // I 0x49 -> LATIN CAPITAL LETTER I - 'J' , // J 0x4A -> LATIN CAPITAL LETTER J - 'K' , // K 0x4B -> LATIN CAPITAL LETTER K - 'L' , // L 0x4C -> LATIN CAPITAL LETTER L - 'M' , // M 0x4D -> LATIN CAPITAL LETTER M - 'N' , // N 0x4E -> LATIN CAPITAL LETTER N - 'O' , // O 0x4F -> LATIN CAPITAL LETTER O - 'P' , // P 0x50 -> LATIN CAPITAL LETTER P - 'Q' , // Q 0x51 -> LATIN CAPITAL LETTER Q - 'R' , // R 0x52 -> LATIN CAPITAL LETTER R - 'S' , // S 0x53 -> LATIN CAPITAL LETTER S - 'T' , // T 0x54 -> LATIN CAPITAL LETTER T - 'U' , // U 0x55 -> LATIN CAPITAL LETTER U - 'V' , // V 0x56 -> LATIN CAPITAL LETTER V - 'W' , // W 0x57 -> LATIN CAPITAL LETTER W - 'X' , // X 0x58 -> LATIN CAPITAL LETTER X - 'Y' , // Y 0x59 -> LATIN CAPITAL LETTER Y - 'Z' , // Z 0x5A -> LATIN CAPITAL LETTER Z - '\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - '\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) - '\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL - '\u2592', // ▒ 0x5E -> MEDIUM SHADE - '\uf139', //  0x5F -> MEDIUM SHADE SLASHED LEFT (CUS) - '\u00a0', // 0x60 -> NO-BREAK SPACE - '\u258c', // ▌ 0x61 -> LEFT HALF BLOCK - '\u2584', // ▄ 0x62 -> LOWER HALF BLOCK - '\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK - '\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK - '\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK - '\u2592', // ▒ 0x66 -> MEDIUM SHADE - '\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK - '\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) - '\uf13a', //  0x69 -> MEDIUM SHADE SLASHED RIGHT (CUS) - '\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS) - '\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - '\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT - '\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT - '\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT - '\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK - '\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT - '\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - '\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - '\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - '\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK - '\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK - '\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS) - '\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS) - '\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS) - '\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK - '\u2713', // ✓ 0x7A -> CHECK MARK - '\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT - '\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT - '\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT - '\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT - '\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT - '\ufffe', // 0x80 -> UNDEFINED - '\ufffe', // 0x81 -> UNDEFINED - '\ufffe', // 0x82 -> UNDEFINED - '\ufffe', // 0x83 -> UNDEFINED - '\ufffe', // 0x84 -> UNDEFINED - '\ufffe', // 0x85 -> UNDEFINED - '\ufffe', // 0x86 -> UNDEFINED - '\ufffe', // 0x87 -> UNDEFINED - '\ufffe', // 0x88 -> UNDEFINED - '\ufffe', // 0x89 -> UNDEFINED - '\ufffe', // 0x8A -> UNDEFINED - '\ufffe', // 0x8B -> UNDEFINED - '\ufffe', // 0x8C -> UNDEFINED - '\ufffe', // 0x8D -> UNDEFINED - '\ufffe', // 0x8E -> UNDEFINED - '\ufffe', // 0x8F -> UNDEFINED - '\ufffe', // 0x90 -> UNDEFINED - '\ufffe', // 0x91 -> UNDEFINED - '\ufffe', // 0x92 -> UNDEFINED - '\ufffe', // 0x93 -> UNDEFINED - '\ufffe', // 0x94 -> UNDEFINED - '\ufffe', // 0x95 -> UNDEFINED - '\ufffe', // 0x96 -> UNDEFINED - '\ufffe', // 0x97 -> UNDEFINED - '\ufffe', // 0x98 -> UNDEFINED - '\ufffe', // 0x99 -> UNDEFINED - '\ufffe', // 0x9A -> UNDEFINED - '\ufffe', // 0x9B -> UNDEFINED - '\ufffe', // 0x9C -> UNDEFINED - '\ufffe', // 0x9D -> UNDEFINED - '\ufffe', // 0x9E -> UNDEFINED - '\ufffe', // 0x9F -> UNDEFINED - '\ufffe', // 0xA0 -> UNDEFINED - '\ufffe', // 0xA1 -> UNDEFINED - '\ufffe', // 0xA2 -> UNDEFINED - '\ufffe', // 0xA3 -> UNDEFINED - '\ufffe', // 0xA4 -> UNDEFINED - '\ufffe', // 0xA5 -> UNDEFINED - '\ufffe', // 0xA6 -> UNDEFINED - '\ufffe', // 0xA7 -> UNDEFINED - '\ufffe', // 0xA8 -> UNDEFINED - '\ufffe', // 0xA9 -> UNDEFINED - '\ufffe', // 0xAA -> UNDEFINED - '\ufffe', // 0xAB -> UNDEFINED - '\ufffe', // 0xAC -> UNDEFINED - '\ufffe', // 0xAD -> UNDEFINED - '\ufffe', // 0xAE -> UNDEFINED - '\ufffe', // 0xAF -> UNDEFINED - '\ufffe', // 0xB0 -> UNDEFINED - '\ufffe', // 0xB1 -> UNDEFINED - '\ufffe', // 0xB2 -> UNDEFINED - '\ufffe', // 0xB3 -> UNDEFINED - '\ufffe', // 0xB4 -> UNDEFINED - '\ufffe', // 0xB5 -> UNDEFINED - '\ufffe', // 0xB6 -> UNDEFINED - '\ufffe', // 0xB7 -> UNDEFINED - '\ufffe', // 0xB8 -> UNDEFINED - '\ufffe', // 0xB9 -> UNDEFINED - '\ufffe', // 0xBA -> UNDEFINED - '\ufffe', // 0xBB -> UNDEFINED - '\ufffe', // 0xBC -> UNDEFINED - '\ufffe', // 0xBD -> UNDEFINED - '\ufffe', // 0xBE -> UNDEFINED - '\ufffe', // 0xBF -> UNDEFINED - '\ufffe', // 0xC0 -> UNDEFINED - '\ufffe', // 0xC1 -> UNDEFINED - '\ufffe', // 0xC2 -> UNDEFINED - '\ufffe', // 0xC3 -> UNDEFINED - '\ufffe', // 0xC4 -> UNDEFINED - '\ufffe', // 0xC5 -> UNDEFINED - '\ufffe', // 0xC6 -> UNDEFINED - '\ufffe', // 0xC7 -> UNDEFINED - '\ufffe', // 0xC8 -> UNDEFINED - '\ufffe', // 0xC9 -> UNDEFINED - '\ufffe', // 0xCA -> UNDEFINED - '\ufffe', // 0xCB -> UNDEFINED - '\ufffe', // 0xCC -> UNDEFINED - '\ufffe', // 0xCD -> UNDEFINED - '\ufffe', // 0xCE -> UNDEFINED - '\ufffe', // 0xCF -> UNDEFINED - '\ufffe', // 0xD0 -> UNDEFINED - '\ufffe', // 0xD1 -> UNDEFINED - '\ufffe', // 0xD2 -> UNDEFINED - '\ufffe', // 0xD3 -> UNDEFINED - '\ufffe', // 0xD4 -> UNDEFINED - '\ufffe', // 0xD5 -> UNDEFINED - '\ufffe', // 0xD6 -> UNDEFINED - '\ufffe', // 0xD7 -> UNDEFINED - '\ufffe', // 0xD8 -> UNDEFINED - '\ufffe', // 0xD9 -> UNDEFINED - '\ufffe', // 0xDA -> UNDEFINED - '\ufffe', // 0xDB -> UNDEFINED - '\ufffe', // 0xDC -> UNDEFINED - '\ufffe', // 0xDD -> UNDEFINED - '\ufffe', // 0xDE -> UNDEFINED - '\ufffe', // 0xDF -> UNDEFINED - '\ufffe', // 0xE0 -> UNDEFINED - '\ufffe', // 0xE1 -> UNDEFINED - '\ufffe', // 0xE2 -> UNDEFINED - '\ufffe', // 0xE3 -> UNDEFINED - '\ufffe', // 0xE4 -> UNDEFINED - '\ufffe', // 0xE5 -> UNDEFINED - '\ufffe', // 0xE6 -> UNDEFINED - '\ufffe', // 0xE7 -> UNDEFINED - '\ufffe', // 0xE8 -> UNDEFINED - '\ufffe', // 0xE9 -> UNDEFINED - '\ufffe', // 0xEA -> UNDEFINED - '\ufffe', // 0xEB -> UNDEFINED - '\ufffe', // 0xEC -> UNDEFINED - '\ufffe', // 0xED -> UNDEFINED - '\ufffe', // 0xEE -> UNDEFINED - '\ufffe', // 0xEF -> UNDEFINED - '\ufffe', // 0xF0 -> UNDEFINED - '\ufffe', // 0xF1 -> UNDEFINED - '\ufffe', // 0xF2 -> UNDEFINED - '\ufffe', // 0xF3 -> UNDEFINED - '\ufffe', // 0xF4 -> UNDEFINED - '\ufffe', // 0xF5 -> UNDEFINED - '\ufffe', // 0xF6 -> UNDEFINED - '\ufffe', // 0xF7 -> UNDEFINED - '\ufffe', // 0xF8 -> UNDEFINED - '\ufffe', // 0xF9 -> UNDEFINED - '\ufffe', // 0xFA -> UNDEFINED - '\ufffe', // 0xFB -> UNDEFINED - '\ufffe', // 0xFC -> UNDEFINED - '\ufffe', // 0xFD -> UNDEFINED - '\ufffe', // 0xFE -> UNDEFINED - '\ufffe' // 0xFF -> UNDEFINED - ) - - private val decodingScreencodeUppercase = arrayOf( - '@' , // @ 0x00 -> COMMERCIAL AT - 'A' , // A 0x01 -> LATIN CAPITAL LETTER A - 'B' , // B 0x02 -> LATIN CAPITAL LETTER B - 'C' , // C 0x03 -> LATIN CAPITAL LETTER C - 'D' , // D 0x04 -> LATIN CAPITAL LETTER D - 'E' , // E 0x05 -> LATIN CAPITAL LETTER E - 'F' , // F 0x06 -> LATIN CAPITAL LETTER F - 'G' , // G 0x07 -> LATIN CAPITAL LETTER G - 'H' , // H 0x08 -> LATIN CAPITAL LETTER H - 'I' , // I 0x09 -> LATIN CAPITAL LETTER I - 'J' , // J 0x0A -> LATIN CAPITAL LETTER J - 'K' , // K 0x0B -> LATIN CAPITAL LETTER K - 'L' , // L 0x0C -> LATIN CAPITAL LETTER L - 'M' , // M 0x0D -> LATIN CAPITAL LETTER M - 'N' , // N 0x0E -> LATIN CAPITAL LETTER N - 'O' , // O 0x0F -> LATIN CAPITAL LETTER O - 'P' , // P 0x10 -> LATIN CAPITAL LETTER P - 'Q' , // Q 0x11 -> LATIN CAPITAL LETTER Q - 'R' , // R 0x12 -> LATIN CAPITAL LETTER R - 'S' , // S 0x13 -> LATIN CAPITAL LETTER S - 'T' , // T 0x14 -> LATIN CAPITAL LETTER T - 'U' , // U 0x15 -> LATIN CAPITAL LETTER U - 'V' , // V 0x16 -> LATIN CAPITAL LETTER V - 'W' , // W 0x17 -> LATIN CAPITAL LETTER W - 'X' , // X 0x18 -> LATIN CAPITAL LETTER X - 'Y' , // Y 0x19 -> LATIN CAPITAL LETTER Y - 'Z' , // Z 0x1A -> LATIN CAPITAL LETTER Z - '[' , // [ 0x1B -> LEFT SQUARE BRACKET - '\u00a3', // £ 0x1C -> POUND SIGN - ']' , // ] 0x1D -> RIGHT SQUARE BRACKET - '\u2191', // ↑ 0x1E -> UPWARDS ARROW - '\u2190', // ← 0x1F -> LEFTWARDS ARROW - ' ' , // 0x20 -> SPACE - '!' , // ! 0x21 -> EXCLAMATION MARK - '"' , // " 0x22 -> QUOTATION MARK - '#' , // # 0x23 -> NUMBER SIGN - '$' , // $ 0x24 -> DOLLAR SIGN - '%' , // % 0x25 -> PERCENT SIGN - '&' , // & 0x26 -> AMPERSAND - '\'' , // ' 0x27 -> APOSTROPHE - '(' , // ( 0x28 -> LEFT PARENTHESIS - ')' , // ) 0x29 -> RIGHT PARENTHESIS - '*' , // * 0x2A -> ASTERISK - '+' , // + 0x2B -> PLUS SIGN - ',' , // , 0x2C -> COMMA - '-' , // - 0x2D -> HYPHEN-MINUS - '.' , // . 0x2E -> FULL STOP - '/' , // / 0x2F -> SOLIDUS - '0' , // 0 0x30 -> DIGIT ZERO - '1' , // 1 0x31 -> DIGIT ONE - '2' , // 2 0x32 -> DIGIT TWO - '3' , // 3 0x33 -> DIGIT THREE - '4' , // 4 0x34 -> DIGIT FOUR - '5' , // 5 0x35 -> DIGIT FIVE - '6' , // 6 0x36 -> DIGIT SIX - '7' , // 7 0x37 -> DIGIT SEVEN - '8' , // 8 0x38 -> DIGIT EIGHT - '9' , // 9 0x39 -> DIGIT NINE - ':' , // : 0x3A -> COLON - ';' , // ; 0x3B -> SEMICOLON - '<' , // < 0x3C -> LESS-THAN SIGN - '=' , // = 0x3D -> EQUALS SIGN - '>' , // > 0x3E -> GREATER-THAN SIGN - '?' , // ? 0x3F -> QUESTION MARK - '\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL - '\u2660', // ♠ 0x41 -> BLACK SPADE SUIT - '\u2502', // │ 0x42 -> BOX DRAWINGS LIGHT VERTICAL - '\u2500', // ─ 0x43 -> BOX DRAWINGS LIGHT HORIZONTAL - '\uf122', //  0x44 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS) - '\uf123', //  0x45 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS) - '\uf124', //  0x46 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS) - '\uf126', //  0x47 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS) - '\uf128', //  0x48 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS) - '\u256e', // ╮ 0x49 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT - '\u2570', // ╰ 0x4A -> BOX DRAWINGS LIGHT ARC UP AND RIGHT - '\u256f', // ╯ 0x4B -> BOX DRAWINGS LIGHT ARC UP AND LEFT - '\uf12a', //  0x4C -> ONE EIGHTH BLOCK UP AND RIGHT (CUS) - '\u2572', // ╲ 0x4D -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT - '\u2571', // ╱ 0x4E -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT - '\uf12b', //  0x4F -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS) - '\uf12c', //  0x50 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS) - '\u25cf', // ● 0x51 -> BLACK CIRCLE - '\uf125', //  0x52 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS) - '\u2665', // ♥ 0x53 -> BLACK HEART SUIT - '\uf127', //  0x54 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS) - '\u256d', // ╭ 0x55 -> BOX DRAWINGS LIGHT ARC DOWN AND RIGHT - '\u2573', // ╳ 0x56 -> BOX DRAWINGS LIGHT DIAGONAL CROSS - '\u25cb', // ○ 0x57 -> WHITE CIRCLE - '\u2663', // ♣ 0x58 -> BLACK CLUB SUIT - '\uf129', //  0x59 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS) - '\u2666', // ♦ 0x5A -> BLACK DIAMOND SUIT - '\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - '\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) - '\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL - '\u03c0', // π 0x5E -> GREEK SMALL LETTER PI - '\u25e5', // ◥ 0x5F -> BLACK UPPER RIGHT TRIANGLE - '\u00a0', // 0x60 -> NO-BREAK SPACE - '\u258c', // ▌ 0x61 -> LEFT HALF BLOCK - '\u2584', // ▄ 0x62 -> LOWER HALF BLOCK - '\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK - '\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK - '\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK - '\u2592', // ▒ 0x66 -> MEDIUM SHADE - '\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK - '\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) - '\u25e4', // ◤ 0x69 -> BLACK UPPER LEFT TRIANGLE - '\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS) - '\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - '\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT - '\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT - '\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT - '\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK - '\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT - '\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - '\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - '\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - '\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK - '\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK - '\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS) - '\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS) - '\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS) - '\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK - '\uf12d', //  0x7A -> ONE EIGHTH BLOCK UP AND LEFT (CUS) - '\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT - '\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT - '\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT - '\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT - '\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT - '\ufffe', // 0x80 -> UNDEFINED - '\ufffe', // 0x81 -> UNDEFINED - '\ufffe', // 0x82 -> UNDEFINED - '\ufffe', // 0x83 -> UNDEFINED - '\ufffe', // 0x84 -> UNDEFINED - '\ufffe', // 0x85 -> UNDEFINED - '\ufffe', // 0x86 -> UNDEFINED - '\ufffe', // 0x87 -> UNDEFINED - '\ufffe', // 0x88 -> UNDEFINED - '\ufffe', // 0x89 -> UNDEFINED - '\ufffe', // 0x8A -> UNDEFINED - '\ufffe', // 0x8B -> UNDEFINED - '\ufffe', // 0x8C -> UNDEFINED - '\ufffe', // 0x8D -> UNDEFINED - '\ufffe', // 0x8E -> UNDEFINED - '\ufffe', // 0x8F -> UNDEFINED - '\ufffe', // 0x90 -> UNDEFINED - '\ufffe', // 0x91 -> UNDEFINED - '\ufffe', // 0x92 -> UNDEFINED - '\ufffe', // 0x93 -> UNDEFINED - '\ufffe', // 0x94 -> UNDEFINED - '\ufffe', // 0x95 -> UNDEFINED - '\ufffe', // 0x96 -> UNDEFINED - '\ufffe', // 0x97 -> UNDEFINED - '\ufffe', // 0x98 -> UNDEFINED - '\ufffe', // 0x99 -> UNDEFINED - '\ufffe', // 0x9A -> UNDEFINED - '\ufffe', // 0x9B -> UNDEFINED - '\ufffe', // 0x9C -> UNDEFINED - '\ufffe', // 0x9D -> UNDEFINED - '\ufffe', // 0x9E -> UNDEFINED - '\ufffe', // 0x9F -> UNDEFINED - '\ufffe', // 0xA0 -> UNDEFINED - '\ufffe', // 0xA1 -> UNDEFINED - '\ufffe', // 0xA2 -> UNDEFINED - '\ufffe', // 0xA3 -> UNDEFINED - '\ufffe', // 0xA4 -> UNDEFINED - '\ufffe', // 0xA5 -> UNDEFINED - '\ufffe', // 0xA6 -> UNDEFINED - '\ufffe', // 0xA7 -> UNDEFINED - '\ufffe', // 0xA8 -> UNDEFINED - '\ufffe', // 0xA9 -> UNDEFINED - '\ufffe', // 0xAA -> UNDEFINED - '\ufffe', // 0xAB -> UNDEFINED - '\ufffe', // 0xAC -> UNDEFINED - '\ufffe', // 0xAD -> UNDEFINED - '\ufffe', // 0xAE -> UNDEFINED - '\ufffe', // 0xAF -> UNDEFINED - '\ufffe', // 0xB0 -> UNDEFINED - '\ufffe', // 0xB1 -> UNDEFINED - '\ufffe', // 0xB2 -> UNDEFINED - '\ufffe', // 0xB3 -> UNDEFINED - '\ufffe', // 0xB4 -> UNDEFINED - '\ufffe', // 0xB5 -> UNDEFINED - '\ufffe', // 0xB6 -> UNDEFINED - '\ufffe', // 0xB7 -> UNDEFINED - '\ufffe', // 0xB8 -> UNDEFINED - '\ufffe', // 0xB9 -> UNDEFINED - '\ufffe', // 0xBA -> UNDEFINED - '\ufffe', // 0xBB -> UNDEFINED - '\ufffe', // 0xBC -> UNDEFINED - '\ufffe', // 0xBD -> UNDEFINED - '\ufffe', // 0xBE -> UNDEFINED - '\ufffe', // 0xBF -> UNDEFINED - '\ufffe', // 0xC0 -> UNDEFINED - '\ufffe', // 0xC1 -> UNDEFINED - '\ufffe', // 0xC2 -> UNDEFINED - '\ufffe', // 0xC3 -> UNDEFINED - '\ufffe', // 0xC4 -> UNDEFINED - '\ufffe', // 0xC5 -> UNDEFINED - '\ufffe', // 0xC6 -> UNDEFINED - '\ufffe', // 0xC7 -> UNDEFINED - '\ufffe', // 0xC8 -> UNDEFINED - '\ufffe', // 0xC9 -> UNDEFINED - '\ufffe', // 0xCA -> UNDEFINED - '\ufffe', // 0xCB -> UNDEFINED - '\ufffe', // 0xCC -> UNDEFINED - '\ufffe', // 0xCD -> UNDEFINED - '\ufffe', // 0xCE -> UNDEFINED - '\ufffe', // 0xCF -> UNDEFINED - '\ufffe', // 0xD0 -> UNDEFINED - '\ufffe', // 0xD1 -> UNDEFINED - '\ufffe', // 0xD2 -> UNDEFINED - '\ufffe', // 0xD3 -> UNDEFINED - '\ufffe', // 0xD4 -> UNDEFINED - '\ufffe', // 0xD5 -> UNDEFINED - '\ufffe', // 0xD6 -> UNDEFINED - '\ufffe', // 0xD7 -> UNDEFINED - '\ufffe', // 0xD8 -> UNDEFINED - '\ufffe', // 0xD9 -> UNDEFINED - '\ufffe', // 0xDA -> UNDEFINED - '\ufffe', // 0xDB -> UNDEFINED - '\ufffe', // 0xDC -> UNDEFINED - '\ufffe', // 0xDD -> UNDEFINED - '\ufffe', // 0xDE -> UNDEFINED - '\ufffe', // 0xDF -> UNDEFINED - '\ufffe', // 0xE0 -> UNDEFINED - '\ufffe', // 0xE1 -> UNDEFINED - '\ufffe', // 0xE2 -> UNDEFINED - '\ufffe', // 0xE3 -> UNDEFINED - '\ufffe', // 0xE4 -> UNDEFINED - '\ufffe', // 0xE5 -> UNDEFINED - '\ufffe', // 0xE6 -> UNDEFINED - '\ufffe', // 0xE7 -> UNDEFINED - '\ufffe', // 0xE8 -> UNDEFINED - '\ufffe', // 0xE9 -> UNDEFINED - '\ufffe', // 0xEA -> UNDEFINED - '\ufffe', // 0xEB -> UNDEFINED - '\ufffe', // 0xEC -> UNDEFINED - '\ufffe', // 0xED -> UNDEFINED - '\ufffe', // 0xEE -> UNDEFINED - '\ufffe', // 0xEF -> UNDEFINED - '\ufffe', // 0xF0 -> UNDEFINED - '\ufffe', // 0xF1 -> UNDEFINED - '\ufffe', // 0xF2 -> UNDEFINED - '\ufffe', // 0xF3 -> UNDEFINED - '\ufffe', // 0xF4 -> UNDEFINED - '\ufffe', // 0xF5 -> UNDEFINED - '\ufffe', // 0xF6 -> UNDEFINED - '\ufffe', // 0xF7 -> UNDEFINED - '\ufffe', // 0xF8 -> UNDEFINED - '\ufffe', // 0xF9 -> UNDEFINED - '\ufffe', // 0xFA -> UNDEFINED - '\ufffe', // 0xFB -> UNDEFINED - '\ufffe', // 0xFC -> UNDEFINED - '\ufffe', // 0xFD -> UNDEFINED - '\ufffe', // 0xFE -> UNDEFINED - '\ufffe' // 0xFF -> UNDEFINED - ) - - // encoding: from unicode to Screencodes (0-255) - private val encodingScreencodeLowercase = decodingScreencodeLowercase.withIndex().associate{it.value to it.index} - private val encodingScreencodeUppercase = decodingScreencodeUppercase.withIndex().associate{it.value to it.index} - - - fun encodeScreencode(text: String, lowercase: Boolean = false): List { - val lookup = if(lowercase) encodingScreencodeLowercase else encodingScreencodeUppercase - return text.map{ - val screencode = lookup[it] - screencode?.toShort() ?: if(it=='\u0000') - 0.toShort() - else { - val case = if (lowercase) "lower" else "upper" - throw CharConversionException("no ${case}Screencode character for '$it'") - } - } - } - - fun decodeScreencode(screencode: Iterable, lowercase: Boolean = false): String { - val decodeTable = if(lowercase) decodingScreencodeLowercase else decodingScreencodeUppercase - return screencode.map { decodeTable[it.toInt()] }.joinToString("") - } -} diff --git a/sim65/src/Petscii.kt b/sim65/src/Petscii.kt new file mode 100644 index 000000000..009edcf22 --- /dev/null +++ b/sim65/src/Petscii.kt @@ -0,0 +1,1121 @@ +package sim65 + +import java.io.CharConversionException + +object Petscii { + + // decoding: from Petscii/Screencodes (0-255) to unicode + // character tables used from https://github.com/dj51d/cbmcodecs + + private val decodingPetsciiLowercase = arrayOf( + '\u0000', // 0x00 -> \u0000 + '\ufffe', // 0x01 -> UNDEFINED + '\ufffe', // 0x02 -> UNDEFINED + '\ufffe', // 0x03 -> UNDEFINED + '\ufffe', // 0x04 -> UNDEFINED + '\uf100', // 0x05 -> WHITE COLOR SWITCH (CUS) + '\ufffe', // 0x06 -> UNDEFINED + '\ufffe', // 0x07 -> UNDEFINED + '\uf118', // 0x08 -> DISABLE CHARACTER SET SWITCHING (CUS) + '\uf119', // 0x09 -> ENABLE CHARACTER SET SWITCHING (CUS) + '\ufffe', // 0x0A -> UNDEFINED + '\ufffe', // 0x0B -> UNDEFINED + '\ufffe', // 0x0C -> UNDEFINED + '\r' , // 0x0D -> CARRIAGE RETURN + '\u000e', // 0x0E -> SHIFT OUT + '\ufffe', // 0x0F -> UNDEFINED + '\ufffe', // 0x10 -> UNDEFINED + '\uf11c', // 0x11 -> CURSOR DOWN (CUS) + '\uf11a', // 0x12 -> REVERSE VIDEO ON (CUS) + '\uf120', // 0x13 -> HOME (CUS) + '\u007f', // 0x14 -> DELETE + '\ufffe', // 0x15 -> UNDEFINED + '\ufffe', // 0x16 -> UNDEFINED + '\ufffe', // 0x17 -> UNDEFINED + '\ufffe', // 0x18 -> UNDEFINED + '\ufffe', // 0x19 -> UNDEFINED + '\ufffe', // 0x1A -> UNDEFINED + '\ufffe', // 0x1B -> UNDEFINED + '\uf101', // 0x1C -> RED COLOR SWITCH (CUS) + '\uf11d', // 0x1D -> CURSOR RIGHT (CUS) + '\uf102', // 0x1E -> GREEN COLOR SWITCH (CUS) + '\uf103', // 0x1F -> BLUE COLOR SWITCH (CUS) + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '@' , // @ 0x40 -> COMMERCIAL AT + 'a' , // a 0x41 -> LATIN SMALL LETTER A + 'b' , // b 0x42 -> LATIN SMALL LETTER B + 'c' , // c 0x43 -> LATIN SMALL LETTER C + 'd' , // d 0x44 -> LATIN SMALL LETTER D + 'e' , // e 0x45 -> LATIN SMALL LETTER E + 'f' , // f 0x46 -> LATIN SMALL LETTER F + 'g' , // g 0x47 -> LATIN SMALL LETTER G + 'h' , // h 0x48 -> LATIN SMALL LETTER H + 'i' , // i 0x49 -> LATIN SMALL LETTER I + 'j' , // j 0x4A -> LATIN SMALL LETTER J + 'k' , // k 0x4B -> LATIN SMALL LETTER K + 'l' , // l 0x4C -> LATIN SMALL LETTER L + 'm' , // m 0x4D -> LATIN SMALL LETTER M + 'n' , // n 0x4E -> LATIN SMALL LETTER N + 'o' , // o 0x4F -> LATIN SMALL LETTER O + 'p' , // p 0x50 -> LATIN SMALL LETTER P + 'q' , // q 0x51 -> LATIN SMALL LETTER Q + 'r' , // r 0x52 -> LATIN SMALL LETTER R + 's' , // s 0x53 -> LATIN SMALL LETTER S + 't' , // t 0x54 -> LATIN SMALL LETTER T + 'u' , // u 0x55 -> LATIN SMALL LETTER U + 'v' , // v 0x56 -> LATIN SMALL LETTER V + 'w' , // w 0x57 -> LATIN SMALL LETTER W + 'x' , // x 0x58 -> LATIN SMALL LETTER X + 'y' , // y 0x59 -> LATIN SMALL LETTER Y + 'z' , // z 0x5A -> LATIN SMALL LETTER Z + '[' , // [ 0x5B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x5C -> POUND SIGN + ']' , // ] 0x5D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x5E -> UPWARDS ARROW + '\u2190', // ← 0x5F -> LEFTWARDS ARROW + '\u2500', // ─ 0x60 -> BOX DRAWINGS LIGHT HORIZONTAL + 'A' , // A 0x61 -> LATIN CAPITAL LETTER A + 'B' , // B 0x62 -> LATIN CAPITAL LETTER B + 'C' , // C 0x63 -> LATIN CAPITAL LETTER C + 'D' , // D 0x64 -> LATIN CAPITAL LETTER D + 'E' , // E 0x65 -> LATIN CAPITAL LETTER E + 'F' , // F 0x66 -> LATIN CAPITAL LETTER F + 'G' , // G 0x67 -> LATIN CAPITAL LETTER G + 'H' , // H 0x68 -> LATIN CAPITAL LETTER H + 'I' , // I 0x69 -> LATIN CAPITAL LETTER I + 'J' , // J 0x6A -> LATIN CAPITAL LETTER J + 'K' , // K 0x6B -> LATIN CAPITAL LETTER K + 'L' , // L 0x6C -> LATIN CAPITAL LETTER L + 'M' , // M 0x6D -> LATIN CAPITAL LETTER M + 'N' , // N 0x6E -> LATIN CAPITAL LETTER N + 'O' , // O 0x6F -> LATIN CAPITAL LETTER O + 'P' , // P 0x70 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x71 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x72 -> LATIN CAPITAL LETTER R + 'S' , // S 0x73 -> LATIN CAPITAL LETTER S + 'T' , // T 0x74 -> LATIN CAPITAL LETTER T + 'U' , // U 0x75 -> LATIN CAPITAL LETTER U + 'V' , // V 0x76 -> LATIN CAPITAL LETTER V + 'W' , // W 0x77 -> LATIN CAPITAL LETTER W + 'X' , // X 0x78 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x79 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x7A -> LATIN CAPITAL LETTER Z + '\u253c', // ┼ 0x7B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x7C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x7D -> BOX DRAWINGS LIGHT VERTICAL + '\u2592', // ▒ 0x7E -> MEDIUM SHADE + '\uf139', //  0x7F -> MEDIUM SHADE SLASHED LEFT (CUS) + '\ufffe', // 0x80 -> UNDEFINED + '\uf104', // 0x81 -> ORANGE COLOR SWITCH (CUS) + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\uf110', //  0x85 -> FUNCTION KEY 1 (CUS) + '\uf112', //  0x86 -> FUNCTION KEY 3 (CUS) + '\uf114', //  0x87 -> FUNCTION KEY 5 (CUS) + '\uf116', //  0x88 -> FUNCTION KEY 7 (CUS) + '\uf111', //  0x89 -> FUNCTION KEY 2 (CUS) + '\uf113', //  0x8A -> FUNCTION KEY 4 (CUS) + '\uf115', //  0x8B -> FUNCTION KEY 6 (CUS) + '\uf117', //  0x8C -> FUNCTION KEY 8 (CUS) + '\n' , // 0x8D -> LINE FEED + '\u000f', //  0x8E -> SHIFT IN + '\ufffe', // 0x8F -> UNDEFINED + '\uf105', // 0x90 -> BLACK COLOR SWITCH (CUS) + '\uf11e', //  0x91 -> CURSOR UP (CUS) + '\uf11b', //  0x92 -> REVERSE VIDEO OFF (CUS) + '\u000c', // 0x93 -> FORM FEED + '\uf121', //  0x94 -> INSERT (CUS) + '\uf106', // 0x95 -> BROWN COLOR SWITCH (CUS) + '\uf107', // 0x96 -> LIGHT RED COLOR SWITCH (CUS) + '\uf108', // 0x97 -> GRAY 1 COLOR SWITCH (CUS) + '\uf109', //  0x98 -> GRAY 2 COLOR SWITCH (CUS) + '\uf10a', //  0x99 -> LIGHT GREEN COLOR SWITCH (CUS) + '\uf10b', //  0x9A -> LIGHT BLUE COLOR SWITCH (CUS) + '\uf10c', //  0x9B -> GRAY 3 COLOR SWITCH (CUS) + '\uf10d', //  0x9C -> PURPLE COLOR SWITCH (CUS) + '\uf11d', //  0x9D -> CURSOR LEFT (CUS) + '\uf10e', //  0x9E -> YELLOW COLOR SWITCH (CUS) + '\uf10f', //  0x9F -> CYAN COLOR SWITCH (CUS) + '\u00a0', // 0xA0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xA1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xA2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xA3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xA4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xA5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xA6 -> MEDIUM SHADE + '\u2595', // ▕ 0xA7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xA8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\uf13a', //  0xA9 -> MEDIUM SHADE SLASHED RIGHT (CUS) + '\uf130', //  0xAA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xAB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xAC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xAD -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xAE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xAF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xB0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xB1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xB2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xB3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xB4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xB5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xB6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xB7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xB8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xB9 -> LOWER THREE EIGHTHS BLOCK + '\u2713', // ✓ 0xBA -> CHECK MARK + '\u2596', // ▖ 0xBB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xBC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xBD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xBE -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0xBF -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\u2500', // ─ 0xC0 -> BOX DRAWINGS LIGHT HORIZONTAL + 'A' , // A 0xC1 -> LATIN CAPITAL LETTER A + 'B' , // B 0xC2 -> LATIN CAPITAL LETTER B + 'C' , // C 0xC3 -> LATIN CAPITAL LETTER C + 'D' , // D 0xC4 -> LATIN CAPITAL LETTER D + 'E' , // E 0xC5 -> LATIN CAPITAL LETTER E + 'F' , // F 0xC6 -> LATIN CAPITAL LETTER F + 'G' , // G 0xC7 -> LATIN CAPITAL LETTER G + 'H' , // H 0xC8 -> LATIN CAPITAL LETTER H + 'I' , // I 0xC9 -> LATIN CAPITAL LETTER I + 'J' , // J 0xCA -> LATIN CAPITAL LETTER J + 'K' , // K 0xCB -> LATIN CAPITAL LETTER K + 'L' , // L 0xCC -> LATIN CAPITAL LETTER L + 'M' , // M 0xCD -> LATIN CAPITAL LETTER M + 'N' , // N 0xCE -> LATIN CAPITAL LETTER N + 'O' , // O 0xCF -> LATIN CAPITAL LETTER O + 'P' , // P 0xD0 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0xD1 -> LATIN CAPITAL LETTER Q + 'R' , // R 0xD2 -> LATIN CAPITAL LETTER R + 'S' , // S 0xD3 -> LATIN CAPITAL LETTER S + 'T' , // T 0xD4 -> LATIN CAPITAL LETTER T + 'U' , // U 0xD5 -> LATIN CAPITAL LETTER U + 'V' , // V 0xD6 -> LATIN CAPITAL LETTER V + 'W' , // W 0xD7 -> LATIN CAPITAL LETTER W + 'X' , // X 0xD8 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0xD9 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0xDA -> LATIN CAPITAL LETTER Z + '\u253c', // ┼ 0xDB -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0xDC -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0xDD -> BOX DRAWINGS LIGHT VERTICAL + '\u2592', // ▒ 0xDE -> MEDIUM SHADE + '\uf139', //  0xDF -> MEDIUM SHADE SLASHED LEFT (CUS) + '\u00a0', // 0xE0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xE1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xE2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xE3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xE4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xE5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xE6 -> MEDIUM SHADE + '\u2595', // ▕ 0xE7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xE8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\uf13a', //  0xE9 -> MEDIUM SHADE SLASHED RIGHT (CUS) + '\uf130', //  0xEA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xEB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xEC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xED -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xEE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xEF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xF0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xF1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xF2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xF3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xF4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xF5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xF6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xF7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xF8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xF9 -> LOWER THREE EIGHTHS BLOCK + '\u2713', // ✓ 0xFA -> CHECK MARK + '\u2596', // ▖ 0xFB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xFC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xFD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xFE -> QUADRANT UPPER LEFT + '\u2592' // ▒ 0xFF -> MEDIUM SHADE + ) + + private val decodingPetsciiUppercase = arrayOf( + '\u0000', // 0x00 -> \u0000 + '\ufffe', // 0x01 -> UNDEFINED + '\ufffe', // 0x02 -> UNDEFINED + '\ufffe', // 0x03 -> UNDEFINED + '\ufffe', // 0x04 -> UNDEFINED + '\uf100', // 0x05 -> WHITE COLOR SWITCH (CUS) + '\ufffe', // 0x06 -> UNDEFINED + '\ufffe', // 0x07 -> UNDEFINED + '\uf118', // 0x08 -> DISABLE CHARACTER SET SWITCHING (CUS) + '\uf119', // 0x09 -> ENABLE CHARACTER SET SWITCHING (CUS) + '\ufffe', // 0x0A -> UNDEFINED + '\ufffe', // 0x0B -> UNDEFINED + '\ufffe', // 0x0C -> UNDEFINED + '\r' , // 0x0D -> CARRIAGE RETURN + '\u000e', // 0x0E -> SHIFT OUT + '\ufffe', // 0x0F -> UNDEFINED + '\ufffe', // 0x10 -> UNDEFINED + '\uf11c', // 0x11 -> CURSOR DOWN (CUS) + '\uf11a', // 0x12 -> REVERSE VIDEO ON (CUS) + '\uf120', // 0x13 -> HOME (CUS) + '\u007f', // 0x14 -> DELETE + '\ufffe', // 0x15 -> UNDEFINED + '\ufffe', // 0x16 -> UNDEFINED + '\ufffe', // 0x17 -> UNDEFINED + '\ufffe', // 0x18 -> UNDEFINED + '\ufffe', // 0x19 -> UNDEFINED + '\ufffe', // 0x1A -> UNDEFINED + '\ufffe', // 0x1B -> UNDEFINED + '\uf101', // 0x1C -> RED COLOR SWITCH (CUS) + '\uf11d', // 0x1D -> CURSOR RIGHT (CUS) + '\uf102', // 0x1E -> GREEN COLOR SWITCH (CUS) + '\uf103', // 0x1F -> BLUE COLOR SWITCH (CUS) + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '@' , // @ 0x40 -> COMMERCIAL AT + 'A' , // A 0x41 -> LATIN CAPITAL LETTER A + 'B' , // B 0x42 -> LATIN CAPITAL LETTER B + 'C' , // C 0x43 -> LATIN CAPITAL LETTER C + 'D' , // D 0x44 -> LATIN CAPITAL LETTER D + 'E' , // E 0x45 -> LATIN CAPITAL LETTER E + 'F' , // F 0x46 -> LATIN CAPITAL LETTER F + 'G' , // G 0x47 -> LATIN CAPITAL LETTER G + 'H' , // H 0x48 -> LATIN CAPITAL LETTER H + 'I' , // I 0x49 -> LATIN CAPITAL LETTER I + 'J' , // J 0x4A -> LATIN CAPITAL LETTER J + 'K' , // K 0x4B -> LATIN CAPITAL LETTER K + 'L' , // L 0x4C -> LATIN CAPITAL LETTER L + 'M' , // M 0x4D -> LATIN CAPITAL LETTER M + 'N' , // N 0x4E -> LATIN CAPITAL LETTER N + 'O' , // O 0x4F -> LATIN CAPITAL LETTER O + 'P' , // P 0x50 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x51 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x52 -> LATIN CAPITAL LETTER R + 'S' , // S 0x53 -> LATIN CAPITAL LETTER S + 'T' , // T 0x54 -> LATIN CAPITAL LETTER T + 'U' , // U 0x55 -> LATIN CAPITAL LETTER U + 'V' , // V 0x56 -> LATIN CAPITAL LETTER V + 'W' , // W 0x57 -> LATIN CAPITAL LETTER W + 'X' , // X 0x58 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x59 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x5A -> LATIN CAPITAL LETTER Z + '[' , // [ 0x5B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x5C -> POUND SIGN + ']' , // ] 0x5D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x5E -> UPWARDS ARROW + '\u2190', // ← 0x5F -> LEFTWARDS ARROW + '\u2500', // ─ 0x60 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2660', // ♠ 0x61 -> BLACK SPADE SUIT + '\u2502', // │ 0x62 -> BOX DRAWINGS LIGHT VERTICAL + '\u2500', // ─ 0x63 -> BOX DRAWINGS LIGHT HORIZONTAL + '\uf122', //  0x64 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS) + '\uf123', //  0x65 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS) + '\uf124', //  0x66 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS) + '\uf126', //  0x67 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS) + '\uf128', //  0x68 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS) + '\u256e', // ╮ 0x69 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2570', // ╰ 0x6A -> BOX DRAWINGS LIGHT ARC UP AND RIGHT + '\u256f', // ╯ 0x6B -> BOX DRAWINGS LIGHT ARC UP AND LEFT + '\uf12a', //  0x6C -> ONE EIGHTH BLOCK UP AND RIGHT (CUS) + '\u2572', // ╲ 0x6D -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + '\u2571', // ╱ 0x6E -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + '\uf12b', //  0x6F -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS) + '\uf12c', //  0x70 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS) + '\u25cf', // ● 0x71 -> BLACK CIRCLE + '\uf125', //  0x72 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS) + '\u2665', // ♥ 0x73 -> BLACK HEART SUIT + '\uf127', //  0x74 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS) + '\u256d', // ╭ 0x75 -> BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + '\u2573', // ╳ 0x76 -> BOX DRAWINGS LIGHT DIAGONAL CROSS + '\u25cb', // ○ 0x77 -> WHITE CIRCLE + '\u2663', // ♣ 0x78 -> BLACK CLUB SUIT + '\uf129', //  0x79 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS) + '\u2666', // ♦ 0x7A -> BLACK DIAMOND SUIT + '\u253c', // ┼ 0x7B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x7C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x7D -> BOX DRAWINGS LIGHT VERTICAL + '\u03c0', // π 0x7E -> GREEK SMALL LETTER PI + '\u25e5', // ◥ 0x7F -> BLACK UPPER RIGHT TRIANGLE + '\ufffe', // 0x80 -> UNDEFINED + '\uf104', //  0x81 -> ORANGE COLOR SWITCH (CUS) + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\uf110', // 0x85 -> FUNCTION KEY 1 (CUS) + '\uf112', // 0x86 -> FUNCTION KEY 3 (CUS) + '\uf114', // 0x87 -> FUNCTION KEY 5 (CUS) + '\uf116', // 0x88 -> FUNCTION KEY 7 (CUS) + '\uf111', // 0x89 -> FUNCTION KEY 2 (CUS) + '\uf113', // 0x8A -> FUNCTION KEY 4 (CUS) + '\uf115', // 0x8B -> FUNCTION KEY 6 (CUS) + '\uf117', // 0x8C -> FUNCTION KEY 8 (CUS) + '\n' , // 0x8D -> LINE FEED + '\u000f', // 0x8E -> SHIFT IN + '\ufffe', // 0x8F -> UNDEFINED + '\uf105', // 0x90 -> BLACK COLOR SWITCH (CUS) + '\uf11e', // 0x91 -> CURSOR UP (CUS) + '\uf11b', // 0x92 -> REVERSE VIDEO OFF (CUS) + '\u000c', // 0x93 -> FORM FEED + '\uf121', // 0x94 -> INSERT (CUS) + '\uf106', // 0x95 -> BROWN COLOR SWITCH (CUS) + '\uf107', // 0x96 -> LIGHT RED COLOR SWITCH (CUS) + '\uf108', // 0x97 -> GRAY 1 COLOR SWITCH (CUS) + '\uf109', // 0x98 -> GRAY 2 COLOR SWITCH (CUS) + '\uf10a', // 0x99 -> LIGHT GREEN COLOR SWITCH (CUS) + '\uf10b', // 0x9A -> LIGHT BLUE COLOR SWITCH (CUS) + '\uf10c', // 0x9B -> GRAY 3 COLOR SWITCH (CUS) + '\uf10d', // 0x9C -> PURPLE COLOR SWITCH (CUS) + '\uf11d', // 0x9D -> CURSOR LEFT (CUS) + '\uf10e', // 0x9E -> YELLOW COLOR SWITCH (CUS) + '\uf10f', // 0x9F -> CYAN COLOR SWITCH (CUS) + '\u00a0', // 0xA0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xA1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xA2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xA3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xA4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xA5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xA6 -> MEDIUM SHADE + '\u2595', // ▕ 0xA7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xA8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\u25e4', // ◤ 0xA9 -> BLACK UPPER LEFT TRIANGLE + '\uf130', //  0xAA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xAB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xAC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xAD -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xAE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xAF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xB0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xB1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xB2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xB3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xB4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xB5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xB6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xB7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xB8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xB9 -> LOWER THREE EIGHTHS BLOCK + '\uf12d', //  0xBA -> ONE EIGHTH BLOCK UP AND LEFT (CUS) + '\u2596', // ▖ 0xBB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xBC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xBD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xBE -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0xBF -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\u2500', // ─ 0xC0 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2660', // ♠ 0xC1 -> BLACK SPADE SUIT + '\u2502', // │ 0xC2 -> BOX DRAWINGS LIGHT VERTICAL + '\u2500', // ─ 0xC3 -> BOX DRAWINGS LIGHT HORIZONTAL + '\uf122', //  0xC4 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS) + '\uf123', //  0xC5 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS) + '\uf124', //  0xC6 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS) + '\uf126', //  0xC7 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS) + '\uf128', //  0xC8 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS) + '\u256e', // ╮ 0xC9 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2570', // ╰ 0xCA -> BOX DRAWINGS LIGHT ARC UP AND RIGHT + '\u256f', // ╯ 0xCB -> BOX DRAWINGS LIGHT ARC UP AND LEFT + '\uf12a', //  0xCC -> ONE EIGHTH BLOCK UP AND RIGHT (CUS) + '\u2572', // ╲ 0xCD -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + '\u2571', // ╱ 0xCE -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + '\uf12b', //  0xCF -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS) + '\uf12c', //  0xD0 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS) + '\u25cf', // ● 0xD1 -> BLACK CIRCLE + '\uf125', //  0xD2 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS) + '\u2665', // ♥ 0xD3 -> BLACK HEART SUIT + '\uf127', //  0xD4 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS) + '\u256d', // ╭ 0xD5 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2573', // ╳ 0xD6 -> BOX DRAWINGS LIGHT DIAGONAL CROSS + '\u25cb', // ○ 0xD7 -> WHITE CIRCLE + '\u2663', // ♣ 0xD8 -> BLACK CLUB SUIT + '\uf129', //  0xD9 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS) + '\u2666', // ♦ 0xDA -> BLACK DIAMOND SUIT + '\u253c', // ┼ 0xDB -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0xDC -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0xDD -> BOX DRAWINGS LIGHT VERTICAL + '\u03c0', // π 0xDE -> GREEK SMALL LETTER PI + '\u25e5', // ◥ 0xDF -> BLACK UPPER RIGHT TRIANGLE + '\u00a0', // 0xE0 -> NO-BREAK SPACE + '\u258c', // ▌ 0xE1 -> LEFT HALF BLOCK + '\u2584', // ▄ 0xE2 -> LOWER HALF BLOCK + '\u2594', // ▔ 0xE3 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0xE4 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0xE5 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0xE6 -> MEDIUM SHADE + '\u2595', // ▕ 0xE7 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0xE8 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\u25e4', // ◤ 0xE9 -> BLACK UPPER LEFT TRIANGLE + '\uf130', //  0xEA -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0xEB -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0xEC -> QUADRANT LOWER RIGHT + '\u2514', // └ 0xED -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0xEE -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0xEF -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0xF0 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0xF1 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0xF2 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0xF3 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0xF4 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0xF5 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0xF6 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0xF7 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0xF8 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0xF9 -> LOWER THREE EIGHTHS BLOCK + '\uf12d', //  0xFA -> ONE EIGHTH BLOCK UP AND LEFT (CUS) + '\u2596', // ▖ 0xFB -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0xFC -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0xFD -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0xFE -> QUADRANT UPPER LEFT + '\u03c0' // π 0xFF -> GREEK SMALL LETTER PI + ) + + private val decodingScreencodeLowercase = arrayOf( + '@' , // @ 0x00 -> COMMERCIAL AT + 'a' , // a 0x01 -> LATIN SMALL LETTER A + 'b' , // b 0x02 -> LATIN SMALL LETTER B + 'c' , // c 0x03 -> LATIN SMALL LETTER C + 'd' , // d 0x04 -> LATIN SMALL LETTER D + 'e' , // e 0x05 -> LATIN SMALL LETTER E + 'f' , // f 0x06 -> LATIN SMALL LETTER F + 'g' , // g 0x07 -> LATIN SMALL LETTER G + 'h' , // h 0x08 -> LATIN SMALL LETTER H + 'i' , // i 0x09 -> LATIN SMALL LETTER I + 'j' , // j 0x0A -> LATIN SMALL LETTER J + 'k' , // k 0x0B -> LATIN SMALL LETTER K + 'l' , // l 0x0C -> LATIN SMALL LETTER L + 'm' , // m 0x0D -> LATIN SMALL LETTER M + 'n' , // n 0x0E -> LATIN SMALL LETTER N + 'o' , // o 0x0F -> LATIN SMALL LETTER O + 'p' , // p 0x10 -> LATIN SMALL LETTER P + 'q' , // q 0x11 -> LATIN SMALL LETTER Q + 'r' , // r 0x12 -> LATIN SMALL LETTER R + 's' , // s 0x13 -> LATIN SMALL LETTER S + 't' , // t 0x14 -> LATIN SMALL LETTER T + 'u' , // u 0x15 -> LATIN SMALL LETTER U + 'v' , // v 0x16 -> LATIN SMALL LETTER V + 'w' , // w 0x17 -> LATIN SMALL LETTER W + 'x' , // x 0x18 -> LATIN SMALL LETTER X + 'y' , // y 0x19 -> LATIN SMALL LETTER Y + 'z' , // z 0x1A -> LATIN SMALL LETTER Z + '[' , // [ 0x1B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x1C -> POUND SIGN + ']' , // ] 0x1D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x1E -> UPWARDS ARROW + '\u2190', // ← 0x1F -> LEFTWARDS ARROW + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL + 'A' , // A 0x41 -> LATIN CAPITAL LETTER A + 'B' , // B 0x42 -> LATIN CAPITAL LETTER B + 'C' , // C 0x43 -> LATIN CAPITAL LETTER C + 'D' , // D 0x44 -> LATIN CAPITAL LETTER D + 'E' , // E 0x45 -> LATIN CAPITAL LETTER E + 'F' , // F 0x46 -> LATIN CAPITAL LETTER F + 'G' , // G 0x47 -> LATIN CAPITAL LETTER G + 'H' , // H 0x48 -> LATIN CAPITAL LETTER H + 'I' , // I 0x49 -> LATIN CAPITAL LETTER I + 'J' , // J 0x4A -> LATIN CAPITAL LETTER J + 'K' , // K 0x4B -> LATIN CAPITAL LETTER K + 'L' , // L 0x4C -> LATIN CAPITAL LETTER L + 'M' , // M 0x4D -> LATIN CAPITAL LETTER M + 'N' , // N 0x4E -> LATIN CAPITAL LETTER N + 'O' , // O 0x4F -> LATIN CAPITAL LETTER O + 'P' , // P 0x50 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x51 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x52 -> LATIN CAPITAL LETTER R + 'S' , // S 0x53 -> LATIN CAPITAL LETTER S + 'T' , // T 0x54 -> LATIN CAPITAL LETTER T + 'U' , // U 0x55 -> LATIN CAPITAL LETTER U + 'V' , // V 0x56 -> LATIN CAPITAL LETTER V + 'W' , // W 0x57 -> LATIN CAPITAL LETTER W + 'X' , // X 0x58 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x59 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x5A -> LATIN CAPITAL LETTER Z + '\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL + '\u2592', // ▒ 0x5E -> MEDIUM SHADE + '\uf139', //  0x5F -> MEDIUM SHADE SLASHED LEFT (CUS) + '\u00a0', // 0x60 -> NO-BREAK SPACE + '\u258c', // ▌ 0x61 -> LEFT HALF BLOCK + '\u2584', // ▄ 0x62 -> LOWER HALF BLOCK + '\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0x66 -> MEDIUM SHADE + '\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\uf13a', //  0x69 -> MEDIUM SHADE SLASHED RIGHT (CUS) + '\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT + '\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK + '\u2713', // ✓ 0x7A -> CHECK MARK + '\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\ufffe', // 0x80 -> UNDEFINED + '\ufffe', // 0x81 -> UNDEFINED + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\ufffe', // 0x85 -> UNDEFINED + '\ufffe', // 0x86 -> UNDEFINED + '\ufffe', // 0x87 -> UNDEFINED + '\ufffe', // 0x88 -> UNDEFINED + '\ufffe', // 0x89 -> UNDEFINED + '\ufffe', // 0x8A -> UNDEFINED + '\ufffe', // 0x8B -> UNDEFINED + '\ufffe', // 0x8C -> UNDEFINED + '\ufffe', // 0x8D -> UNDEFINED + '\ufffe', // 0x8E -> UNDEFINED + '\ufffe', // 0x8F -> UNDEFINED + '\ufffe', // 0x90 -> UNDEFINED + '\ufffe', // 0x91 -> UNDEFINED + '\ufffe', // 0x92 -> UNDEFINED + '\ufffe', // 0x93 -> UNDEFINED + '\ufffe', // 0x94 -> UNDEFINED + '\ufffe', // 0x95 -> UNDEFINED + '\ufffe', // 0x96 -> UNDEFINED + '\ufffe', // 0x97 -> UNDEFINED + '\ufffe', // 0x98 -> UNDEFINED + '\ufffe', // 0x99 -> UNDEFINED + '\ufffe', // 0x9A -> UNDEFINED + '\ufffe', // 0x9B -> UNDEFINED + '\ufffe', // 0x9C -> UNDEFINED + '\ufffe', // 0x9D -> UNDEFINED + '\ufffe', // 0x9E -> UNDEFINED + '\ufffe', // 0x9F -> UNDEFINED + '\ufffe', // 0xA0 -> UNDEFINED + '\ufffe', // 0xA1 -> UNDEFINED + '\ufffe', // 0xA2 -> UNDEFINED + '\ufffe', // 0xA3 -> UNDEFINED + '\ufffe', // 0xA4 -> UNDEFINED + '\ufffe', // 0xA5 -> UNDEFINED + '\ufffe', // 0xA6 -> UNDEFINED + '\ufffe', // 0xA7 -> UNDEFINED + '\ufffe', // 0xA8 -> UNDEFINED + '\ufffe', // 0xA9 -> UNDEFINED + '\ufffe', // 0xAA -> UNDEFINED + '\ufffe', // 0xAB -> UNDEFINED + '\ufffe', // 0xAC -> UNDEFINED + '\ufffe', // 0xAD -> UNDEFINED + '\ufffe', // 0xAE -> UNDEFINED + '\ufffe', // 0xAF -> UNDEFINED + '\ufffe', // 0xB0 -> UNDEFINED + '\ufffe', // 0xB1 -> UNDEFINED + '\ufffe', // 0xB2 -> UNDEFINED + '\ufffe', // 0xB3 -> UNDEFINED + '\ufffe', // 0xB4 -> UNDEFINED + '\ufffe', // 0xB5 -> UNDEFINED + '\ufffe', // 0xB6 -> UNDEFINED + '\ufffe', // 0xB7 -> UNDEFINED + '\ufffe', // 0xB8 -> UNDEFINED + '\ufffe', // 0xB9 -> UNDEFINED + '\ufffe', // 0xBA -> UNDEFINED + '\ufffe', // 0xBB -> UNDEFINED + '\ufffe', // 0xBC -> UNDEFINED + '\ufffe', // 0xBD -> UNDEFINED + '\ufffe', // 0xBE -> UNDEFINED + '\ufffe', // 0xBF -> UNDEFINED + '\ufffe', // 0xC0 -> UNDEFINED + '\ufffe', // 0xC1 -> UNDEFINED + '\ufffe', // 0xC2 -> UNDEFINED + '\ufffe', // 0xC3 -> UNDEFINED + '\ufffe', // 0xC4 -> UNDEFINED + '\ufffe', // 0xC5 -> UNDEFINED + '\ufffe', // 0xC6 -> UNDEFINED + '\ufffe', // 0xC7 -> UNDEFINED + '\ufffe', // 0xC8 -> UNDEFINED + '\ufffe', // 0xC9 -> UNDEFINED + '\ufffe', // 0xCA -> UNDEFINED + '\ufffe', // 0xCB -> UNDEFINED + '\ufffe', // 0xCC -> UNDEFINED + '\ufffe', // 0xCD -> UNDEFINED + '\ufffe', // 0xCE -> UNDEFINED + '\ufffe', // 0xCF -> UNDEFINED + '\ufffe', // 0xD0 -> UNDEFINED + '\ufffe', // 0xD1 -> UNDEFINED + '\ufffe', // 0xD2 -> UNDEFINED + '\ufffe', // 0xD3 -> UNDEFINED + '\ufffe', // 0xD4 -> UNDEFINED + '\ufffe', // 0xD5 -> UNDEFINED + '\ufffe', // 0xD6 -> UNDEFINED + '\ufffe', // 0xD7 -> UNDEFINED + '\ufffe', // 0xD8 -> UNDEFINED + '\ufffe', // 0xD9 -> UNDEFINED + '\ufffe', // 0xDA -> UNDEFINED + '\ufffe', // 0xDB -> UNDEFINED + '\ufffe', // 0xDC -> UNDEFINED + '\ufffe', // 0xDD -> UNDEFINED + '\ufffe', // 0xDE -> UNDEFINED + '\ufffe', // 0xDF -> UNDEFINED + '\ufffe', // 0xE0 -> UNDEFINED + '\ufffe', // 0xE1 -> UNDEFINED + '\ufffe', // 0xE2 -> UNDEFINED + '\ufffe', // 0xE3 -> UNDEFINED + '\ufffe', // 0xE4 -> UNDEFINED + '\ufffe', // 0xE5 -> UNDEFINED + '\ufffe', // 0xE6 -> UNDEFINED + '\ufffe', // 0xE7 -> UNDEFINED + '\ufffe', // 0xE8 -> UNDEFINED + '\ufffe', // 0xE9 -> UNDEFINED + '\ufffe', // 0xEA -> UNDEFINED + '\ufffe', // 0xEB -> UNDEFINED + '\ufffe', // 0xEC -> UNDEFINED + '\ufffe', // 0xED -> UNDEFINED + '\ufffe', // 0xEE -> UNDEFINED + '\ufffe', // 0xEF -> UNDEFINED + '\ufffe', // 0xF0 -> UNDEFINED + '\ufffe', // 0xF1 -> UNDEFINED + '\ufffe', // 0xF2 -> UNDEFINED + '\ufffe', // 0xF3 -> UNDEFINED + '\ufffe', // 0xF4 -> UNDEFINED + '\ufffe', // 0xF5 -> UNDEFINED + '\ufffe', // 0xF6 -> UNDEFINED + '\ufffe', // 0xF7 -> UNDEFINED + '\ufffe', // 0xF8 -> UNDEFINED + '\ufffe', // 0xF9 -> UNDEFINED + '\ufffe', // 0xFA -> UNDEFINED + '\ufffe', // 0xFB -> UNDEFINED + '\ufffe', // 0xFC -> UNDEFINED + '\ufffe', // 0xFD -> UNDEFINED + '\ufffe', // 0xFE -> UNDEFINED + '\ufffe' // 0xFF -> UNDEFINED + ) + + private val decodingScreencodeUppercase = arrayOf( + '@' , // @ 0x00 -> COMMERCIAL AT + 'A' , // A 0x01 -> LATIN CAPITAL LETTER A + 'B' , // B 0x02 -> LATIN CAPITAL LETTER B + 'C' , // C 0x03 -> LATIN CAPITAL LETTER C + 'D' , // D 0x04 -> LATIN CAPITAL LETTER D + 'E' , // E 0x05 -> LATIN CAPITAL LETTER E + 'F' , // F 0x06 -> LATIN CAPITAL LETTER F + 'G' , // G 0x07 -> LATIN CAPITAL LETTER G + 'H' , // H 0x08 -> LATIN CAPITAL LETTER H + 'I' , // I 0x09 -> LATIN CAPITAL LETTER I + 'J' , // J 0x0A -> LATIN CAPITAL LETTER J + 'K' , // K 0x0B -> LATIN CAPITAL LETTER K + 'L' , // L 0x0C -> LATIN CAPITAL LETTER L + 'M' , // M 0x0D -> LATIN CAPITAL LETTER M + 'N' , // N 0x0E -> LATIN CAPITAL LETTER N + 'O' , // O 0x0F -> LATIN CAPITAL LETTER O + 'P' , // P 0x10 -> LATIN CAPITAL LETTER P + 'Q' , // Q 0x11 -> LATIN CAPITAL LETTER Q + 'R' , // R 0x12 -> LATIN CAPITAL LETTER R + 'S' , // S 0x13 -> LATIN CAPITAL LETTER S + 'T' , // T 0x14 -> LATIN CAPITAL LETTER T + 'U' , // U 0x15 -> LATIN CAPITAL LETTER U + 'V' , // V 0x16 -> LATIN CAPITAL LETTER V + 'W' , // W 0x17 -> LATIN CAPITAL LETTER W + 'X' , // X 0x18 -> LATIN CAPITAL LETTER X + 'Y' , // Y 0x19 -> LATIN CAPITAL LETTER Y + 'Z' , // Z 0x1A -> LATIN CAPITAL LETTER Z + '[' , // [ 0x1B -> LEFT SQUARE BRACKET + '\u00a3', // £ 0x1C -> POUND SIGN + ']' , // ] 0x1D -> RIGHT SQUARE BRACKET + '\u2191', // ↑ 0x1E -> UPWARDS ARROW + '\u2190', // ← 0x1F -> LEFTWARDS ARROW + ' ' , // 0x20 -> SPACE + '!' , // ! 0x21 -> EXCLAMATION MARK + '"' , // " 0x22 -> QUOTATION MARK + '#' , // # 0x23 -> NUMBER SIGN + '$' , // $ 0x24 -> DOLLAR SIGN + '%' , // % 0x25 -> PERCENT SIGN + '&' , // & 0x26 -> AMPERSAND + '\'' , // ' 0x27 -> APOSTROPHE + '(' , // ( 0x28 -> LEFT PARENTHESIS + ')' , // ) 0x29 -> RIGHT PARENTHESIS + '*' , // * 0x2A -> ASTERISK + '+' , // + 0x2B -> PLUS SIGN + ',' , // , 0x2C -> COMMA + '-' , // - 0x2D -> HYPHEN-MINUS + '.' , // . 0x2E -> FULL STOP + '/' , // / 0x2F -> SOLIDUS + '0' , // 0 0x30 -> DIGIT ZERO + '1' , // 1 0x31 -> DIGIT ONE + '2' , // 2 0x32 -> DIGIT TWO + '3' , // 3 0x33 -> DIGIT THREE + '4' , // 4 0x34 -> DIGIT FOUR + '5' , // 5 0x35 -> DIGIT FIVE + '6' , // 6 0x36 -> DIGIT SIX + '7' , // 7 0x37 -> DIGIT SEVEN + '8' , // 8 0x38 -> DIGIT EIGHT + '9' , // 9 0x39 -> DIGIT NINE + ':' , // : 0x3A -> COLON + ';' , // ; 0x3B -> SEMICOLON + '<' , // < 0x3C -> LESS-THAN SIGN + '=' , // = 0x3D -> EQUALS SIGN + '>' , // > 0x3E -> GREATER-THAN SIGN + '?' , // ? 0x3F -> QUESTION MARK + '\u2500', // ─ 0x40 -> BOX DRAWINGS LIGHT HORIZONTAL + '\u2660', // ♠ 0x41 -> BLACK SPADE SUIT + '\u2502', // │ 0x42 -> BOX DRAWINGS LIGHT VERTICAL + '\u2500', // ─ 0x43 -> BOX DRAWINGS LIGHT HORIZONTAL + '\uf122', //  0x44 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER UP (CUS) + '\uf123', //  0x45 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS UP (CUS) + '\uf124', //  0x46 -> BOX DRAWINGS LIGHT HORIZONTAL ONE QUARTER DOWN (CUS) + '\uf126', //  0x47 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER LEFT (CUS) + '\uf128', //  0x48 -> BOX DRAWINGS LIGHT VERTICAL ONE QUARTER RIGHT (CUS) + '\u256e', // ╮ 0x49 -> BOX DRAWINGS LIGHT ARC DOWN AND LEFT + '\u2570', // ╰ 0x4A -> BOX DRAWINGS LIGHT ARC UP AND RIGHT + '\u256f', // ╯ 0x4B -> BOX DRAWINGS LIGHT ARC UP AND LEFT + '\uf12a', //  0x4C -> ONE EIGHTH BLOCK UP AND RIGHT (CUS) + '\u2572', // ╲ 0x4D -> BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + '\u2571', // ╱ 0x4E -> BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + '\uf12b', //  0x4F -> ONE EIGHTH BLOCK DOWN AND RIGHT (CUS) + '\uf12c', //  0x50 -> ONE EIGHTH BLOCK DOWN AND LEFT (CUS) + '\u25cf', // ● 0x51 -> BLACK CIRCLE + '\uf125', //  0x52 -> BOX DRAWINGS LIGHT HORIZONTAL TWO QUARTERS DOWN (CUS) + '\u2665', // ♥ 0x53 -> BLACK HEART SUIT + '\uf127', //  0x54 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS LEFT (CUS) + '\u256d', // ╭ 0x55 -> BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + '\u2573', // ╳ 0x56 -> BOX DRAWINGS LIGHT DIAGONAL CROSS + '\u25cb', // ○ 0x57 -> WHITE CIRCLE + '\u2663', // ♣ 0x58 -> BLACK CLUB SUIT + '\uf129', //  0x59 -> BOX DRAWINGS LIGHT VERTICAL TWO QUARTERS RIGHT (CUS) + '\u2666', // ♦ 0x5A -> BLACK DIAMOND SUIT + '\u253c', // ┼ 0x5B -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + '\uf12e', //  0x5C -> LEFT HALF BLOCK MEDIUM SHADE (CUS) + '\u2502', // │ 0x5D -> BOX DRAWINGS LIGHT VERTICAL + '\u03c0', // π 0x5E -> GREEK SMALL LETTER PI + '\u25e5', // ◥ 0x5F -> BLACK UPPER RIGHT TRIANGLE + '\u00a0', // 0x60 -> NO-BREAK SPACE + '\u258c', // ▌ 0x61 -> LEFT HALF BLOCK + '\u2584', // ▄ 0x62 -> LOWER HALF BLOCK + '\u2594', // ▔ 0x63 -> UPPER ONE EIGHTH BLOCK + '\u2581', // ▁ 0x64 -> LOWER ONE EIGHTH BLOCK + '\u258f', // ▏ 0x65 -> LEFT ONE EIGHTH BLOCK + '\u2592', // ▒ 0x66 -> MEDIUM SHADE + '\u2595', // ▕ 0x67 -> RIGHT ONE EIGHTH BLOCK + '\uf12f', //  0x68 -> LOWER HALF BLOCK MEDIUM SHADE (CUS) + '\u25e4', // ◤ 0x69 -> BLACK UPPER LEFT TRIANGLE + '\uf130', //  0x6A -> RIGHT ONE QUARTER BLOCK (CUS) + '\u251c', // ├ 0x6B -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT + '\u2597', // ▗ 0x6C -> QUADRANT LOWER RIGHT + '\u2514', // └ 0x6D -> BOX DRAWINGS LIGHT UP AND RIGHT + '\u2510', // ┐ 0x6E -> BOX DRAWINGS LIGHT DOWN AND LEFT + '\u2582', // ▂ 0x6F -> LOWER ONE QUARTER BLOCK + '\u250c', // ┌ 0x70 -> BOX DRAWINGS LIGHT DOWN AND RIGHT + '\u2534', // ┴ 0x71 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL + '\u252c', // ┬ 0x72 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + '\u2524', // ┤ 0x73 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT + '\u258e', // ▎ 0x74 -> LEFT ONE QUARTER BLOCK + '\u258d', // ▍ 0x75 -> LEFT THREE EIGTHS BLOCK + '\uf131', //  0x76 -> RIGHT THREE EIGHTHS BLOCK (CUS) + '\uf132', //  0x77 -> UPPER ONE QUARTER BLOCK (CUS) + '\uf133', //  0x78 -> UPPER THREE EIGHTS BLOCK (CUS) + '\u2583', // ▃ 0x79 -> LOWER THREE EIGHTHS BLOCK + '\uf12d', //  0x7A -> ONE EIGHTH BLOCK UP AND LEFT (CUS) + '\u2596', // ▖ 0x7B -> QUADRANT LOWER LEFT + '\u259d', // ▝ 0x7C -> QUADRANT UPPER RIGHT + '\u2518', // ┘ 0x7D -> BOX DRAWINGS LIGHT UP AND LEFT + '\u2598', // ▘ 0x7E -> QUADRANT UPPER LEFT + '\u259a', // ▚ 0x7F -> QUADRANT UPPER LEFT AND LOWER RIGHT + '\ufffe', // 0x80 -> UNDEFINED + '\ufffe', // 0x81 -> UNDEFINED + '\ufffe', // 0x82 -> UNDEFINED + '\ufffe', // 0x83 -> UNDEFINED + '\ufffe', // 0x84 -> UNDEFINED + '\ufffe', // 0x85 -> UNDEFINED + '\ufffe', // 0x86 -> UNDEFINED + '\ufffe', // 0x87 -> UNDEFINED + '\ufffe', // 0x88 -> UNDEFINED + '\ufffe', // 0x89 -> UNDEFINED + '\ufffe', // 0x8A -> UNDEFINED + '\ufffe', // 0x8B -> UNDEFINED + '\ufffe', // 0x8C -> UNDEFINED + '\ufffe', // 0x8D -> UNDEFINED + '\ufffe', // 0x8E -> UNDEFINED + '\ufffe', // 0x8F -> UNDEFINED + '\ufffe', // 0x90 -> UNDEFINED + '\ufffe', // 0x91 -> UNDEFINED + '\ufffe', // 0x92 -> UNDEFINED + '\ufffe', // 0x93 -> UNDEFINED + '\ufffe', // 0x94 -> UNDEFINED + '\ufffe', // 0x95 -> UNDEFINED + '\ufffe', // 0x96 -> UNDEFINED + '\ufffe', // 0x97 -> UNDEFINED + '\ufffe', // 0x98 -> UNDEFINED + '\ufffe', // 0x99 -> UNDEFINED + '\ufffe', // 0x9A -> UNDEFINED + '\ufffe', // 0x9B -> UNDEFINED + '\ufffe', // 0x9C -> UNDEFINED + '\ufffe', // 0x9D -> UNDEFINED + '\ufffe', // 0x9E -> UNDEFINED + '\ufffe', // 0x9F -> UNDEFINED + '\ufffe', // 0xA0 -> UNDEFINED + '\ufffe', // 0xA1 -> UNDEFINED + '\ufffe', // 0xA2 -> UNDEFINED + '\ufffe', // 0xA3 -> UNDEFINED + '\ufffe', // 0xA4 -> UNDEFINED + '\ufffe', // 0xA5 -> UNDEFINED + '\ufffe', // 0xA6 -> UNDEFINED + '\ufffe', // 0xA7 -> UNDEFINED + '\ufffe', // 0xA8 -> UNDEFINED + '\ufffe', // 0xA9 -> UNDEFINED + '\ufffe', // 0xAA -> UNDEFINED + '\ufffe', // 0xAB -> UNDEFINED + '\ufffe', // 0xAC -> UNDEFINED + '\ufffe', // 0xAD -> UNDEFINED + '\ufffe', // 0xAE -> UNDEFINED + '\ufffe', // 0xAF -> UNDEFINED + '\ufffe', // 0xB0 -> UNDEFINED + '\ufffe', // 0xB1 -> UNDEFINED + '\ufffe', // 0xB2 -> UNDEFINED + '\ufffe', // 0xB3 -> UNDEFINED + '\ufffe', // 0xB4 -> UNDEFINED + '\ufffe', // 0xB5 -> UNDEFINED + '\ufffe', // 0xB6 -> UNDEFINED + '\ufffe', // 0xB7 -> UNDEFINED + '\ufffe', // 0xB8 -> UNDEFINED + '\ufffe', // 0xB9 -> UNDEFINED + '\ufffe', // 0xBA -> UNDEFINED + '\ufffe', // 0xBB -> UNDEFINED + '\ufffe', // 0xBC -> UNDEFINED + '\ufffe', // 0xBD -> UNDEFINED + '\ufffe', // 0xBE -> UNDEFINED + '\ufffe', // 0xBF -> UNDEFINED + '\ufffe', // 0xC0 -> UNDEFINED + '\ufffe', // 0xC1 -> UNDEFINED + '\ufffe', // 0xC2 -> UNDEFINED + '\ufffe', // 0xC3 -> UNDEFINED + '\ufffe', // 0xC4 -> UNDEFINED + '\ufffe', // 0xC5 -> UNDEFINED + '\ufffe', // 0xC6 -> UNDEFINED + '\ufffe', // 0xC7 -> UNDEFINED + '\ufffe', // 0xC8 -> UNDEFINED + '\ufffe', // 0xC9 -> UNDEFINED + '\ufffe', // 0xCA -> UNDEFINED + '\ufffe', // 0xCB -> UNDEFINED + '\ufffe', // 0xCC -> UNDEFINED + '\ufffe', // 0xCD -> UNDEFINED + '\ufffe', // 0xCE -> UNDEFINED + '\ufffe', // 0xCF -> UNDEFINED + '\ufffe', // 0xD0 -> UNDEFINED + '\ufffe', // 0xD1 -> UNDEFINED + '\ufffe', // 0xD2 -> UNDEFINED + '\ufffe', // 0xD3 -> UNDEFINED + '\ufffe', // 0xD4 -> UNDEFINED + '\ufffe', // 0xD5 -> UNDEFINED + '\ufffe', // 0xD6 -> UNDEFINED + '\ufffe', // 0xD7 -> UNDEFINED + '\ufffe', // 0xD8 -> UNDEFINED + '\ufffe', // 0xD9 -> UNDEFINED + '\ufffe', // 0xDA -> UNDEFINED + '\ufffe', // 0xDB -> UNDEFINED + '\ufffe', // 0xDC -> UNDEFINED + '\ufffe', // 0xDD -> UNDEFINED + '\ufffe', // 0xDE -> UNDEFINED + '\ufffe', // 0xDF -> UNDEFINED + '\ufffe', // 0xE0 -> UNDEFINED + '\ufffe', // 0xE1 -> UNDEFINED + '\ufffe', // 0xE2 -> UNDEFINED + '\ufffe', // 0xE3 -> UNDEFINED + '\ufffe', // 0xE4 -> UNDEFINED + '\ufffe', // 0xE5 -> UNDEFINED + '\ufffe', // 0xE6 -> UNDEFINED + '\ufffe', // 0xE7 -> UNDEFINED + '\ufffe', // 0xE8 -> UNDEFINED + '\ufffe', // 0xE9 -> UNDEFINED + '\ufffe', // 0xEA -> UNDEFINED + '\ufffe', // 0xEB -> UNDEFINED + '\ufffe', // 0xEC -> UNDEFINED + '\ufffe', // 0xED -> UNDEFINED + '\ufffe', // 0xEE -> UNDEFINED + '\ufffe', // 0xEF -> UNDEFINED + '\ufffe', // 0xF0 -> UNDEFINED + '\ufffe', // 0xF1 -> UNDEFINED + '\ufffe', // 0xF2 -> UNDEFINED + '\ufffe', // 0xF3 -> UNDEFINED + '\ufffe', // 0xF4 -> UNDEFINED + '\ufffe', // 0xF5 -> UNDEFINED + '\ufffe', // 0xF6 -> UNDEFINED + '\ufffe', // 0xF7 -> UNDEFINED + '\ufffe', // 0xF8 -> UNDEFINED + '\ufffe', // 0xF9 -> UNDEFINED + '\ufffe', // 0xFA -> UNDEFINED + '\ufffe', // 0xFB -> UNDEFINED + '\ufffe', // 0xFC -> UNDEFINED + '\ufffe', // 0xFD -> UNDEFINED + '\ufffe', // 0xFE -> UNDEFINED + '\ufffe' // 0xFF -> UNDEFINED + ) + + // encoding: from unicode to Petscii/Screencodes (0-255) + private val encodingPetsciiLowercase = decodingPetsciiLowercase.withIndex().associate{it.value to it.index} + private val encodingPetsciiUppercase = decodingPetsciiUppercase.withIndex().associate{it.value to it.index} + private val encodingScreencodeLowercase = decodingScreencodeLowercase.withIndex().associate{it.value to it.index} + private val encodingScreencodeUppercase = decodingScreencodeUppercase.withIndex().associate{it.value to it.index} + + + fun encodePetscii(text: String, lowercase: Boolean = false): List { + val lookup = if(lowercase) encodingPetsciiLowercase else encodingPetsciiUppercase + return text.map { + val petscii = lookup[it] + petscii?.toShort() ?: if(it=='\u0000') + 0.toShort() + else { + val case = if (lowercase) "lower" else "upper" + throw CharConversionException("no ${case}case Petscii character for '$it'") + } + } + } + + fun decodePetscii(petscii: Iterable, lowercase: Boolean = false): String { + val decodeTable = if(lowercase) decodingPetsciiLowercase else decodingPetsciiUppercase + return petscii.map { decodeTable[it.toInt()] }.joinToString("") + } + + fun encodeScreencode(text: String, lowercase: Boolean = false): List { + val lookup = if(lowercase) encodingScreencodeLowercase else encodingScreencodeUppercase + return text.map{ + val screencode = lookup[it] + screencode?.toShort() ?: if(it=='\u0000') + 0.toShort() + else { + val case = if (lowercase) "lower" else "upper" + throw CharConversionException("no ${case}Screencode character for '$it'") + } + } + } + + fun decodeScreencode(screencode: Iterable, lowercase: Boolean = false): String { + val decodeTable = if(lowercase) decodingScreencodeLowercase else decodingScreencodeUppercase + return screencode.map { decodeTable[it.toInt()] }.joinToString("") + } + + fun petscii2scr(petscii_code: Short, inverseVideo: Boolean): Short { + val code = when { + petscii_code <= 0x1f -> petscii_code + 128 + petscii_code <= 0x3f -> petscii_code.toInt() + petscii_code <= 0x5f -> petscii_code - 64 + petscii_code <= 0x7f -> petscii_code - 32 + petscii_code <= 0x9f -> petscii_code + 64 + petscii_code <= 0xbf -> petscii_code - 64 + petscii_code <= 0xfe -> petscii_code - 128 + petscii_code == 255.toShort() -> 95 + else -> throw CharConversionException("petscii code out of range") + } + if(inverseVideo) + return (code or 0x80).toShort() + return code.toShort() + } + + fun scr2petscii(screencode: Short): Short { + val petscii = when { + screencode <= 0x1f -> screencode + 64 + screencode <= 0x3f -> screencode.toInt() + screencode <= 0x5d -> screencode +123 + screencode == 0x5e.toShort() -> 255 + screencode == 0x5f.toShort() -> 223 + screencode <= 0x7f -> screencode + 64 + screencode <= 0xbf -> screencode - 128 + screencode <= 0xfe -> screencode - 64 + screencode == 255.toShort() -> 191 + else -> throw CharConversionException("screencode out of range") + } + return petscii.toShort() + } +} diff --git a/sim65/src/Sim65Main.kt b/sim65/src/Sim65Main.kt index a922b1a85..7af939813 100644 --- a/sim65/src/Sim65Main.kt +++ b/sim65/src/Sim65Main.kt @@ -3,6 +3,7 @@ package sim65 import kotlinx.cli.* import sim65.C64KernalStubs.handleBreakpoint import sim65.components.* +import sim65.components.Cpu6502.Companion.IRQ_vector import sim65.components.Cpu6502.Companion.RESET_vector import kotlin.system.exitProcess @@ -20,42 +21,38 @@ internal fun printSoftwareHeader() { private fun startSimulator(args: Array) { - val cli = CommandLineInterface("sim65", printHelpByDefault = false) - val enableIllegal by cli.flagArgument("-ill", "enable the illegal instructions") - try { - cli.parse(args) - } catch (e: Exception) { - exitProcess(1) - } - - val cpu = Cpu6502(enableIllegal, stopOnBrk=true) + val cpu = Cpu6502(stopOnBrk = false) cpu.tracing = false - - // create the system bus and add device to it. - // note that the order is relevant w.r.t. where reads and writes are going. - val bus = Bus() - bus.add(cpu) - val ram = Ram(0, 0xffff) - ram.set(0xc000, 0xa9) // lda #0 - ram.set(0xc001, 0x00) - ram.set(0xc002, 0x85) // sta $02 - ram.set(0xc003, 0x02) - ram.set(0xc004, 0x4c) // jmp $0816 - ram.set(0xc005, 0x16) - ram.set(0xc006, 0x08) - ram.set(RESET_vector, 0x00) - ram.set(RESET_vector+1, 0xc0) - bus.add(ram) - - ram.loadPrg("c64tests/0start") - C64KernalStubs.ram = ram - cpu.breakpoint(0xffd2, ::handleBreakpoint) cpu.breakpoint(0xffe4, ::handleBreakpoint) cpu.breakpoint(0xe16f, ::handleBreakpoint) + + // create the system bus and add device to it. + // note that the order is relevant w.r.t. where reads and writes are going. + val ram = Ram(0, 0xffff) + ram.set(0x02, 0) + ram.set(0xa002, 0) + ram.set(0xa003, 0x80) + ram.set(IRQ_vector, 0x48) + ram.set(IRQ_vector+1, 0xff) + ram.set(RESET_vector, 0x01) + ram.set(RESET_vector+1, 0x08) + ram.set(0x01fe, 0xff) + ram.set(0x01ff, 0x7f) + ram.set(0x8000, 2) + ram.set(0xa474, 2) + ram.loadPrg("c64tests/nopn") + C64KernalStubs.ram = ram + + val bus = Bus() + bus.add(cpu) + bus.add(ram) bus.reset() + require(cpu.SP==0xfd) + require(cpu.Status.asByte().toInt()==0b00100100) + try { while (true) { bus.clock() diff --git a/sim65/src/Sim65MainBCDtest.kt b/sim65/src/Sim65MainBCDtest.kt index ad3c4dd60..b63f6c7f9 100644 --- a/sim65/src/Sim65MainBCDtest.kt +++ b/sim65/src/Sim65MainBCDtest.kt @@ -19,15 +19,6 @@ internal fun printSoftwareHeader2() { private fun startSimulator2(args: Array) { - val cli = CommandLineInterface("sim65", printHelpByDefault = false) - val enableIllegal by cli.flagArgument("-ill", "enable the illegal instructions") - - try { - cli.parse(args) - } catch (e: Exception) { - exitProcess(1) - } - val bootRom = listOf( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -50,7 +41,7 @@ private fun startSimulator2(args: Array) { 0x00,0xa0 // IRQ vector ).toTypedArray() - val cpu = Cpu6502(enableIllegal, true) + val cpu = Cpu6502(true) cpu.tracing = true // create the system bus and add device to it. @@ -78,16 +69,16 @@ private fun startSimulator2(args: Array) { } - if(ram.read(0x0400)==0.toShort()) + if(ram[0x0400] ==0.toShort()) println("BCD TEST: OK!") else { - val code = ram.read(0x0400) - val v1 = ram.read(0x0401) - val v2 = ram.read(0x0402) - val predictedA = ram.read(0x00fc) - val actualA = ram.read(0x00fd) - val predictedF = ram.read(0x00fe) - val actualF = ram.read(0x00ff) + val code = ram[0x0400] + val v1 = ram[0x0401] + val v2 = ram[0x0402] + val predictedA = ram[0x00fc] + val actualA = ram[0x00fd] + val predictedF = ram[0x00fe] + val actualF = ram[0x00ff] println("BCD TEST: FAIL!! code=${hexB(code)} value1=${hexB(v1)} value2=${hexB(v2)}") println(" predictedA=${hexB(predictedA)}") println(" actualA=${hexB(actualA)}") diff --git a/sim65/src/components/Bus.kt b/sim65/src/components/Bus.kt index b05a10683..d9495be6a 100644 --- a/sim65/src/components/Bus.kt +++ b/sim65/src/components/Bus.kt @@ -32,7 +32,7 @@ class Bus { fun read(address: Address): UByte { memComponents.forEach { if(address>=it.startAddress && address<=it.endAddress) - return it.read(address) + return it[address] } return 0xff } @@ -40,7 +40,7 @@ class Bus { fun write(address: Address, data: UByte) { memComponents.forEach { if(address>=it.startAddress && address<=it.endAddress) - it.write(address, data) + it[address] = data } } } diff --git a/sim65/src/components/Component.kt b/sim65/src/components/Component.kt index a0d01071e..921e946e2 100644 --- a/sim65/src/components/Component.kt +++ b/sim65/src/components/Component.kt @@ -1,6 +1,6 @@ package sim65.components -import sim65.C64Screencodes +import sim65.Petscii abstract class BusComponent { lateinit var bus: Bus @@ -10,8 +10,8 @@ abstract class BusComponent { } abstract class MemMappedComponent(val startAddress: Address, val endAddress: Address): BusComponent() { - abstract fun read(address: Address): UByte - abstract fun write(address: Address, data: UByte) + abstract operator fun get(address: Address): UByte + abstract operator fun set(address: Address, data: UByte) abstract fun cloneMem(): Array init { @@ -22,12 +22,12 @@ abstract class MemMappedComponent(val startAddress: Address, val endAddress: Add fun dump(from: Address, to: Address) { (from .. to).chunked(16).forEach { print("\$${it.first().toString(16).padStart(4, '0')} ") - val bytes = it.map { address -> read(address) } + val bytes = it.map { address -> get(address) } bytes.forEach { byte -> print(byte.toString(16).padStart(2, '0') + " ") } print(" ") - print(C64Screencodes.decodeScreencode(bytes, false).replace('\ufffe', '.')) + print(Petscii.decodeScreencode(bytes, false).replace('\ufffe', '.')) println() } } diff --git a/sim65/src/components/Cpu6502.kt b/sim65/src/components/Cpu6502.kt index 81446d2c1..e618d2157 100644 --- a/sim65/src/components/Cpu6502.kt +++ b/sim65/src/components/Cpu6502.kt @@ -21,7 +21,7 @@ interface ICpu { // TODO: make a 65c02 variant as well (and re-enable the unit tests for that). -class Cpu6502(private val illegalInstrsAllowed: Boolean, private val stopOnBrk: Boolean) : BusComponent(), ICpu { +class Cpu6502(private val stopOnBrk: Boolean) : BusComponent(), ICpu { override var tracing: Boolean = false override var totalCycles: Int = 0 private set @@ -68,7 +68,11 @@ class Cpu6502(private val illegalInstrsAllowed: Boolean, private val stopOnBrk: IzY } - class Instruction(val mnemonic: String, val mode: AddrMode, val cycles: Int, val official: Boolean, val execute: () -> Unit) + class Instruction(val opcode: UByte, val mnemonic: String, val mode: AddrMode, val cycles: Int, val official: Boolean, val execute: () -> Unit) { + override fun toString(): String { + return "[${hexB(opcode)}: $mnemonic $mode]" + } + } class StatusRegister( var C: Boolean = false, @@ -166,73 +170,69 @@ class Cpu6502(private val illegalInstrsAllowed: Boolean, private val stopOnBrk: var line = "\$${hexW(address)} ${hexB(byte)} " address++ val opcode = opcodes[byte.toInt()] - if (!opcode.official && !illegalInstrsAllowed) { - line += "$spacing1 ???" - } else { - when (opcode.mode) { - AddrMode.Acc -> { - line += "$spacing1 ${opcode.mnemonic} a" - } - AddrMode.Imp -> { - line += "$spacing1 ${opcode.mnemonic}" - } - AddrMode.Imm -> { - val value = memory[address++] - line += "${hexB(value)} $spacing2 ${opcode.mnemonic} #\$${hexB(value)}" - } - AddrMode.Zp -> { - val zpAddr = memory[address++] - line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} \$${hexB(zpAddr)}" - } - AddrMode.ZpX -> { - val zpAddr = memory[address++] - line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} \$${hexB(zpAddr)},x" - } - AddrMode.ZpY -> { - val zpAddr = memory[address++] - line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} \$${hexB(zpAddr)},y" - } - AddrMode.Rel -> { - val rel = memory[address++] - val target = - if (rel <= 0x7f) - address + rel - else - address - (256 - rel) - line += "${hexB(rel)} $spacing2 ${opcode.mnemonic} \$${hexW(target, true)}" - } - AddrMode.Abs -> { - val lo = memory[address++] - val hi = memory[address++] - val absAddr = lo.toInt() or (hi.toInt() shl 8) - line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} \$${hexW(absAddr)}" - } - AddrMode.AbsX -> { - val lo = memory[address++] - val hi = memory[address++] - val absAddr = lo.toInt() or (hi.toInt() shl 8) - line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} \$${hexW(absAddr)},x" - } - AddrMode.AbsY -> { - val lo = memory[address++] - val hi = memory[address++] - val absAddr = lo.toInt() or (hi.toInt() shl 8) - line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} \$${hexW(absAddr)},y" - } - AddrMode.Ind -> { - val lo = memory[address++] - val hi = memory[address++] - val indirectAddr = lo.toInt() or (hi.toInt() shl 8) - line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} (\$${hexW(indirectAddr)})" - } - AddrMode.IzX -> { - val zpAddr = memory[address++] - line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} (\$${hexB(zpAddr)},x)" - } - AddrMode.IzY -> { - val zpAddr = memory[address++] - line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} (\$${hexB(zpAddr)}),y" - } + when (opcode.mode) { + AddrMode.Acc -> { + line += "$spacing1 ${opcode.mnemonic} a" + } + AddrMode.Imp -> { + line += "$spacing1 ${opcode.mnemonic}" + } + AddrMode.Imm -> { + val value = memory[address++] + line += "${hexB(value)} $spacing2 ${opcode.mnemonic} #\$${hexB(value)}" + } + AddrMode.Zp -> { + val zpAddr = memory[address++] + line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} \$${hexB(zpAddr)}" + } + AddrMode.ZpX -> { + val zpAddr = memory[address++] + line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} \$${hexB(zpAddr)},x" + } + AddrMode.ZpY -> { + val zpAddr = memory[address++] + line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} \$${hexB(zpAddr)},y" + } + AddrMode.Rel -> { + val rel = memory[address++] + val target = + if (rel <= 0x7f) + address + rel + else + address - (256 - rel) + line += "${hexB(rel)} $spacing2 ${opcode.mnemonic} \$${hexW(target, true)}" + } + AddrMode.Abs -> { + val lo = memory[address++] + val hi = memory[address++] + val absAddr = lo.toInt() or (hi.toInt() shl 8) + line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} \$${hexW(absAddr)}" + } + AddrMode.AbsX -> { + val lo = memory[address++] + val hi = memory[address++] + val absAddr = lo.toInt() or (hi.toInt() shl 8) + line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} \$${hexW(absAddr)},x" + } + AddrMode.AbsY -> { + val lo = memory[address++] + val hi = memory[address++] + val absAddr = lo.toInt() or (hi.toInt() shl 8) + line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} \$${hexW(absAddr)},y" + } + AddrMode.Ind -> { + val lo = memory[address++] + val hi = memory[address++] + val indirectAddr = lo.toInt() or (hi.toInt() shl 8) + line += "${hexB(lo)} ${hexB(hi)} $spacing3 ${opcode.mnemonic} (\$${hexW(indirectAddr)})" + } + AddrMode.IzX -> { + val zpAddr = memory[address++] + line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} (\$${hexB(zpAddr)},x)" + } + AddrMode.IzY -> { + val zpAddr = memory[address++] + line += "${hexB(zpAddr)} $spacing2 ${opcode.mnemonic} (\$${hexB(zpAddr)}),y" } } result.add(line) @@ -266,10 +266,6 @@ class Cpu6502(private val illegalInstrsAllowed: Boolean, private val stopOnBrk: currentInstruction = opcodes[currentOpcode] if (tracing) printState() - if (!currentInstruction.official && !illegalInstrsAllowed) { - throw InstructionError("illegal instructions not enabled") - } - breakpoints[PC]?.let { val oldPC = PC val oldOpcode = currentOpcode @@ -425,17 +421,17 @@ class Cpu6502(private val illegalInstrsAllowed: Boolean, private val stopOnBrk: pushStack(status.asByte().toInt()) } - private fun pushStack(data: Int) { + internal fun pushStack(data: Int) { write(SP or 0x0100, data) SP = (SP - 1) and 0xff } - private fun popStack(): Int { + internal fun popStack(): Int { SP = (SP + 1) and 0xff return read(SP or 0x0100) } - private fun popStackAddr(): Address { + internal fun popStackAddr(): Address { val lo = popStack() val hi = popStack() return lo or (hi shl 8) @@ -447,262 +443,262 @@ class Cpu6502(private val illegalInstrsAllowed: Boolean, private val stopOnBrk: // opcodes table from http://www.oxyron.de/html/opcodes02.html private val opcodes = listOf( - /* 00 */ Instruction("brk", AddrMode.Imp, 7, true, ::iBrk), - /* 01 */ Instruction("ora", AddrMode.IzX, 6, true, ::iOra), - /* 02 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 03 */ Instruction("slo", AddrMode.IzX, 8, false, ::iSlo), - /* 04 */ Instruction("nop", AddrMode.Zp, 3, false, ::iNop), - /* 05 */ Instruction("ora", AddrMode.Zp, 3, true, ::iOra), - /* 06 */ Instruction("asl", AddrMode.Zp, 5, true, ::iAsl), - /* 07 */ Instruction("slo", AddrMode.Zp, 5, false, ::iSlo), - /* 08 */ Instruction("php", AddrMode.Imp, 3, true, ::iPhp), - /* 09 */ Instruction("ora", AddrMode.Imm, 2, true, ::iOra), - /* 0a */ Instruction("asl", AddrMode.Acc, 2, true, ::iAsl), - /* 0b */ Instruction("anc", AddrMode.Imm, 2, false, ::iAnc), - /* 0c */ Instruction("nop", AddrMode.Abs, 4, false, ::iNop), - /* 0d */ Instruction("ora", AddrMode.Abs, 4, true, ::iOra), - /* 0e */ Instruction("asl", AddrMode.Abs, 6, true, ::iAsl), - /* 0f */ Instruction("slo", AddrMode.Abs, 6, false, ::iSlo), - /* 10 */ Instruction("bpl", AddrMode.Rel, 2, true, ::iBpl), - /* 11 */ Instruction("ora", AddrMode.IzY, 5, true, ::iOra), - /* 12 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 13 */ Instruction("slo", AddrMode.IzY, 6, false, ::iSlo), - /* 14 */ Instruction("nop", AddrMode.ZpX, 4, false, ::iNop), - /* 15 */ Instruction("ora", AddrMode.ZpX, 4, true, ::iOra), - /* 16 */ Instruction("asl", AddrMode.ZpX, 6, true, ::iAsl), - /* 17 */ Instruction("slo", AddrMode.ZpX, 6, false, ::iSlo), - /* 18 */ Instruction("clc", AddrMode.Imp, 2, true, ::iClc), - /* 19 */ Instruction("ora", AddrMode.AbsY, 4, true, ::iOra), - /* 1a */ Instruction("nop", AddrMode.Imp, 2, false, ::iNop), - /* 1b */ Instruction("slo", AddrMode.AbsY, 7, false, ::iSlo), - /* 1c */ Instruction("nop", AddrMode.AbsX, 4, false, ::iNop), - /* 1d */ Instruction("ora", AddrMode.AbsX, 4, true, ::iOra), - /* 1e */ Instruction("asl", AddrMode.AbsX, 7, true, ::iAsl), - /* 1f */ Instruction("slo", AddrMode.AbsX, 7, false, ::iSlo), - /* 20 */ Instruction("jsr", AddrMode.Abs, 6, true, ::iJsr), - /* 21 */ Instruction("and", AddrMode.IzX, 6, true, ::iAnd), - /* 22 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 23 */ Instruction("rla", AddrMode.IzX, 8, false, ::iRla), - /* 24 */ Instruction("bit", AddrMode.Zp, 3, true, ::iBit), - /* 25 */ Instruction("and", AddrMode.Zp, 3, true, ::iAnd), - /* 26 */ Instruction("rol", AddrMode.Zp, 5, true, ::iRol), - /* 27 */ Instruction("rla", AddrMode.Zp, 5, false, ::iRla), - /* 28 */ Instruction("plp", AddrMode.Imp, 4, true, ::iPlp), - /* 29 */ Instruction("and", AddrMode.Imm, 2, true, ::iAnd), - /* 2a */ Instruction("rol", AddrMode.Acc, 2, true, ::iRol), - /* 2b */ Instruction("anc", AddrMode.Imm, 2, false, ::iAnc), - /* 2c */ Instruction("bit", AddrMode.Abs, 4, true, ::iBit), - /* 2d */ Instruction("and", AddrMode.Abs, 4, true, ::iAnd), - /* 2e */ Instruction("rol", AddrMode.Abs, 6, true, ::iRol), - /* 2f */ Instruction("rla", AddrMode.Abs, 6, false, ::iRla), - /* 30 */ Instruction("bmi", AddrMode.Rel, 2, true, ::iBmi), - /* 31 */ Instruction("and", AddrMode.IzY, 5, true, ::iAnd), - /* 32 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 33 */ Instruction("rla", AddrMode.IzY, 8, false, ::iRla), - /* 34 */ Instruction("nop", AddrMode.ZpX, 4, false, ::iNop), - /* 35 */ Instruction("and", AddrMode.ZpX, 4, true, ::iAnd), - /* 36 */ Instruction("rol", AddrMode.ZpX, 6, true, ::iRol), - /* 37 */ Instruction("rla", AddrMode.ZpX, 6, false, ::iRla), - /* 38 */ Instruction("sec", AddrMode.Imp, 2, true, ::iSec), - /* 39 */ Instruction("and", AddrMode.AbsY, 4, true, ::iAnd), - /* 3a */ Instruction("nop", AddrMode.Imp, 2, false, ::iNop), - /* 3b */ Instruction("rla", AddrMode.AbsY, 7, false, ::iRla), - /* 3c */ Instruction("nop", AddrMode.AbsX, 4, false, ::iNop), - /* 3d */ Instruction("and", AddrMode.AbsX, 4, true, ::iAnd), - /* 3e */ Instruction("rol", AddrMode.AbsX, 7, true, ::iRol), - /* 3f */ Instruction("rla", AddrMode.AbsX, 7, false, ::iRla), - /* 40 */ Instruction("rti", AddrMode.Imp, 6, true, ::iRti), - /* 41 */ Instruction("eor", AddrMode.IzX, 6, true, ::iEor), - /* 42 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 43 */ Instruction("sre", AddrMode.IzX, 8, false, ::iSre), - /* 44 */ Instruction("nop", AddrMode.Zp, 3, false, ::iNop), - /* 45 */ Instruction("eor", AddrMode.Zp, 3, true, ::iEor), - /* 46 */ Instruction("lsr", AddrMode.Zp, 5, true, ::iLsr), - /* 47 */ Instruction("sre", AddrMode.Zp, 5, false, ::iSre), - /* 48 */ Instruction("pha", AddrMode.Imp, 3, true, ::iPha), - /* 49 */ Instruction("eor", AddrMode.Imm, 2, true, ::iEor), - /* 4a */ Instruction("lsr", AddrMode.Acc, 2, true, ::iLsr), - /* 4b */ Instruction("alr", AddrMode.Imm, 2, false, ::iAlr), - /* 4c */ Instruction("jmp", AddrMode.Abs, 3, true, ::iJmp), - /* 4d */ Instruction("eor", AddrMode.Abs, 4, true, ::iEor), - /* 4e */ Instruction("lsr", AddrMode.Abs, 6, true, ::iLsr), - /* 4f */ Instruction("sre", AddrMode.Abs, 6, false, ::iSre), - /* 50 */ Instruction("bvc", AddrMode.Rel, 2, true, ::iBvc), - /* 51 */ Instruction("eor", AddrMode.IzY, 5, true, ::iEor), - /* 52 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 53 */ Instruction("sre", AddrMode.IzY, 8, false, ::iSre), - /* 54 */ Instruction("nop", AddrMode.ZpX, 4, false, ::iNop), - /* 55 */ Instruction("eor", AddrMode.ZpX, 4, true, ::iEor), - /* 56 */ Instruction("lsr", AddrMode.ZpX, 6, true, ::iLsr), - /* 57 */ Instruction("sre", AddrMode.ZpX, 6, false, ::iSre), - /* 58 */ Instruction("cli", AddrMode.Imp, 2, true, ::iCli), - /* 59 */ Instruction("eor", AddrMode.AbsY, 4, true, ::iEor), - /* 5a */ Instruction("nop", AddrMode.Imp, 2, false, ::iNop), - /* 5b */ Instruction("sre", AddrMode.AbsY, 7, false, ::iSre), - /* 5c */ Instruction("nop", AddrMode.AbsX, 4, false, ::iNop), - /* 5d */ Instruction("eor", AddrMode.AbsX, 4, true, ::iEor), - /* 5e */ Instruction("lsr", AddrMode.AbsX, 7, true, ::iLsr), - /* 5f */ Instruction("sre", AddrMode.AbsX, 7, false, ::iSre), - /* 60 */ Instruction("rts", AddrMode.Imp, 6, true, ::iRts), - /* 61 */ Instruction("adc", AddrMode.IzX, 6, true, ::iAdc), - /* 62 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 63 */ Instruction("rra", AddrMode.IzX, 8, false, ::iRra), - /* 64 */ Instruction("nop", AddrMode.Zp, 3, false, ::iNop), - /* 65 */ Instruction("adc", AddrMode.Zp, 3, true, ::iAdc), - /* 66 */ Instruction("ror", AddrMode.Zp, 5, true, ::iRor), - /* 67 */ Instruction("rra", AddrMode.Zp, 5, false, ::iRra), - /* 68 */ Instruction("pla", AddrMode.Imp, 4, true, ::iPla), - /* 69 */ Instruction("adc", AddrMode.Imm, 2, true, ::iAdc), - /* 6a */ Instruction("ror", AddrMode.Acc, 2, true, ::iRor), - /* 6b */ Instruction("arr", AddrMode.Imm, 2, false, ::iArr), - /* 6c */ Instruction("jmp", AddrMode.Ind, 5, true, ::iJmp), - /* 6d */ Instruction("adc", AddrMode.Abs, 4, true, ::iAdc), - /* 6e */ Instruction("ror", AddrMode.Abs, 6, true, ::iRor), - /* 6f */ Instruction("rra", AddrMode.Abs, 6, false, ::iRra), - /* 70 */ Instruction("bvs", AddrMode.Rel, 2, true, ::iBvs), - /* 71 */ Instruction("adc", AddrMode.IzY, 5, true, ::iAdc), - /* 72 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 73 */ Instruction("rra", AddrMode.IzY, 8, false, ::iRra), - /* 74 */ Instruction("nop", AddrMode.ZpX, 4, false, ::iNop), - /* 75 */ Instruction("adc", AddrMode.ZpX, 4, true, ::iAdc), - /* 76 */ Instruction("ror", AddrMode.ZpX, 6, true, ::iRor), - /* 77 */ Instruction("rra", AddrMode.ZpX, 6, false, ::iRra), - /* 78 */ Instruction("sei", AddrMode.Imp, 2, true, ::iSei), - /* 79 */ Instruction("adc", AddrMode.AbsY, 4, true, ::iAdc), - /* 7a */ Instruction("nop", AddrMode.Imp, 2, false, ::iNop), - /* 7b */ Instruction("rra", AddrMode.AbsY, 7, false, ::iRra), - /* 7c */ Instruction("nop", AddrMode.AbsX, 4, false, ::iNop), - /* 7d */ Instruction("adc", AddrMode.AbsX, 4, true, ::iAdc), - /* 7e */ Instruction("ror", AddrMode.AbsX, 7, true, ::iRor), - /* 7f */ Instruction("rra", AddrMode.AbsX, 7, false, ::iRra), - /* 80 */ Instruction("nop", AddrMode.Imm, 2, false, ::iNop), - /* 81 */ Instruction("sta", AddrMode.IzX, 6, true, ::iSta), - /* 82 */ Instruction("nop", AddrMode.Imm, 2, false, ::iNop), - /* 83 */ Instruction("sax", AddrMode.IzX, 6, false, ::iSax), - /* 84 */ Instruction("sty", AddrMode.Zp, 3, true, ::iSty), - /* 85 */ Instruction("sta", AddrMode.Zp, 3, true, ::iSta), - /* 86 */ Instruction("stx", AddrMode.Zp, 3, true, ::iStx), - /* 87 */ Instruction("sax", AddrMode.Zp, 3, false, ::iSax), - /* 88 */ Instruction("dey", AddrMode.Imp, 2, true, ::iDey), - /* 89 */ Instruction("nop", AddrMode.Imm, 2, false, ::iNop), - /* 8a */ Instruction("txa", AddrMode.Imp, 2, true, ::iTxa), - /* 8b */ Instruction("xaa", AddrMode.Imm, 2, false, ::iXaa), - /* 8c */ Instruction("sty", AddrMode.Abs, 4, true, ::iSty), - /* 8d */ Instruction("sta", AddrMode.Abs, 4, true, ::iSta), - /* 8e */ Instruction("stx", AddrMode.Abs, 4, true, ::iStx), - /* 8f */ Instruction("sax", AddrMode.Abs, 4, true, ::iSax), - /* 90 */ Instruction("bcc", AddrMode.Rel, 2, true, ::iBcc), - /* 91 */ Instruction("sta", AddrMode.IzY, 6, true, ::iSta), - /* 92 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* 93 */ Instruction("ahx", AddrMode.IzY, 6, false, ::iAhx), - /* 94 */ Instruction("sty", AddrMode.ZpX, 4, true, ::iSty), - /* 95 */ Instruction("sta", AddrMode.ZpX, 4, true, ::iSta), - /* 96 */ Instruction("stx", AddrMode.ZpY, 4, true, ::iStx), - /* 97 */ Instruction("sax", AddrMode.ZpY, 4, false, ::iSax), - /* 98 */ Instruction("tya", AddrMode.Imp, 2, true, ::iTya), - /* 99 */ Instruction("sta", AddrMode.AbsY, 5, true, ::iSta), - /* 9a */ Instruction("txs", AddrMode.Imp, 2, true, ::iTxs), - /* 9b */ Instruction("tas", AddrMode.AbsY, 5, false, ::iTas), - /* 9c */ Instruction("shy", AddrMode.AbsX, 5, false, ::iShy), - /* 9d */ Instruction("sta", AddrMode.AbsX, 5, true, ::iSta), - /* 9e */ Instruction("shx", AddrMode.AbsY, 5, false, ::iShx), - /* 9f */ Instruction("ahx", AddrMode.AbsY, 5, false, ::iAhx), - /* a0 */ Instruction("ldy", AddrMode.Imm, 2, true, ::iLdy), - /* a1 */ Instruction("lda", AddrMode.IzX, 6, true, ::iLda), - /* a2 */ Instruction("ldx", AddrMode.Imm, 2, true, ::iLdx), - /* a3 */ Instruction("lax", AddrMode.IzX, 6, false, ::iLax), - /* a4 */ Instruction("ldy", AddrMode.Zp, 3, true, ::iLdy), - /* a5 */ Instruction("lda", AddrMode.Zp, 3, true, ::iLda), - /* a6 */ Instruction("ldx", AddrMode.Zp, 3, true, ::iLdx), - /* a7 */ Instruction("lax", AddrMode.Zp, 3, false, ::iLax), - /* a8 */ Instruction("tay", AddrMode.Imp, 2, true, ::iTay), - /* a9 */ Instruction("lda", AddrMode.Imm, 2, true, ::iLda), - /* aa */ Instruction("tax", AddrMode.Imp, 2, true, ::iTax), - /* ab */ Instruction("lax", AddrMode.Imm, 2, false, ::iLax), - /* ac */ Instruction("ldy", AddrMode.Abs, 4, true, ::iLdy), - /* ad */ Instruction("lda", AddrMode.Abs, 4, true, ::iLda), - /* ae */ Instruction("ldx", AddrMode.Abs, 4, true, ::iLdx), - /* af */ Instruction("lax", AddrMode.Abs, 4, false, ::iLax), - /* b0 */ Instruction("bcs", AddrMode.Rel, 2, true, ::iBcs), - /* b1 */ Instruction("lda", AddrMode.IzY, 5, true, ::iLda), - /* b2 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* b3 */ Instruction("lax", AddrMode.IzY, 5, false, ::iLax), - /* b4 */ Instruction("ldy", AddrMode.ZpX, 4, true, ::iLdy), - /* b5 */ Instruction("lda", AddrMode.ZpX, 4, true, ::iLda), - /* b6 */ Instruction("ldx", AddrMode.ZpY, 4, true, ::iLdx), - /* b7 */ Instruction("lax", AddrMode.ZpY, 4, false, ::iLax), - /* b8 */ Instruction("clv", AddrMode.Imp, 2, true, ::iClv), - /* b9 */ Instruction("lda", AddrMode.AbsY, 4, true, ::iLda), - /* ba */ Instruction("tsx", AddrMode.Imp, 2, true, ::iTsx), - /* bb */ Instruction("las", AddrMode.AbsY, 4, false, ::iLas), - /* bc */ Instruction("ldy", AddrMode.AbsX, 4, true, ::iLdy), - /* bd */ Instruction("lda", AddrMode.AbsX, 4, true, ::iLda), - /* be */ Instruction("ldx", AddrMode.AbsY, 4, true, ::iLdx), - /* bf */ Instruction("lax", AddrMode.AbsY, 4, false, ::iLax), - /* c0 */ Instruction("cpy", AddrMode.Imm, 2, true, ::iCpy), - /* c1 */ Instruction("cmp", AddrMode.IzX, 6, true, ::iCmp), - /* c2 */ Instruction("nop", AddrMode.Imm, 2, false, ::iNop), - /* c3 */ Instruction("dcp", AddrMode.IzX, 8, false, ::iDcp), - /* c4 */ Instruction("cpy", AddrMode.Zp, 3, true, ::iCpy), - /* c5 */ Instruction("cmp", AddrMode.Zp, 3, true, ::iCmp), - /* c6 */ Instruction("dec", AddrMode.Zp, 5, true, ::iDec), - /* c7 */ Instruction("dcp", AddrMode.Zp, 5, false, ::iDcp), - /* c8 */ Instruction("iny", AddrMode.Imp, 2, true, ::iIny), - /* c9 */ Instruction("cmp", AddrMode.Imm, 2, true, ::iCmp), - /* ca */ Instruction("dex", AddrMode.Imp, 2, true, ::iDex), - /* cb */ Instruction("axs", AddrMode.Imm, 2, false, ::iAxs), - /* cc */ Instruction("cpy", AddrMode.Abs, 4, true, ::iCpy), - /* cd */ Instruction("cmp", AddrMode.Abs, 4, true, ::iCmp), - /* ce */ Instruction("dec", AddrMode.Abs, 6, true, ::iDec), - /* cf */ Instruction("dcp", AddrMode.Abs, 6, false, ::iDcp), - /* d0 */ Instruction("bne", AddrMode.Rel, 2, true, ::iBne), - /* d1 */ Instruction("cmp", AddrMode.IzY, 5, true, ::iCmp), - /* d2 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* d3 */ Instruction("dcp", AddrMode.IzY, 8, false, ::iDcp), - /* d4 */ Instruction("nop", AddrMode.ZpX, 4, false, ::iNop), - /* d5 */ Instruction("cmp", AddrMode.ZpX, 4, true, ::iCmp), - /* d6 */ Instruction("dec", AddrMode.ZpX, 6, true, ::iDec), - /* d7 */ Instruction("dcp", AddrMode.ZpX, 6, false, ::iDcp), - /* d8 */ Instruction("cld", AddrMode.Imp, 2, true, ::iCld), - /* d9 */ Instruction("cmp", AddrMode.AbsY, 4, true, ::iCmp), - /* da */ Instruction("nop", AddrMode.Imp, 2, false, ::iNop), - /* db */ Instruction("dcp", AddrMode.AbsY, 7, false, ::iDcp), - /* dc */ Instruction("nop", AddrMode.AbsX, 4, false, ::iNop), - /* dd */ Instruction("cmp", AddrMode.AbsX, 4, true, ::iCmp), - /* de */ Instruction("dec", AddrMode.AbsX, 7, true, ::iDec), - /* df */ Instruction("dcp", AddrMode.AbsX, 7, false, ::iDcp), - /* e0 */ Instruction("cpx", AddrMode.Imm, 2, true, ::iCpx), - /* e1 */ Instruction("sbc", AddrMode.IzX, 6, true, ::iSbc), - /* e2 */ Instruction("nop", AddrMode.Imm, 2, false, ::iNop), - /* e3 */ Instruction("isc", AddrMode.IzX, 8, false, ::iIsc), - /* e4 */ Instruction("cpx", AddrMode.Zp, 3, true, ::iCpx), - /* e5 */ Instruction("sbc", AddrMode.Zp, 3, true, ::iSbc), - /* e6 */ Instruction("inc", AddrMode.Zp, 5, true, ::iInc), - /* e7 */ Instruction("isc", AddrMode.Zp, 5, false, ::iIsc), - /* e8 */ Instruction("inx", AddrMode.Imp, 2, true, ::iInx), - /* e9 */ Instruction("sbc", AddrMode.Imm, 2, true, ::iSbc), - /* ea */ Instruction("nop", AddrMode.Imp, 2, true, ::iNop), - /* eb */ Instruction("sbc", AddrMode.Imm, 2, false, ::iSbc), - /* ec */ Instruction("cpx", AddrMode.Abs, 4, true, ::iCpx), - /* ed */ Instruction("sbc", AddrMode.Abs, 4, true, ::iSbc), - /* ee */ Instruction("inc", AddrMode.Abs, 6, true, ::iInc), - /* ef */ Instruction("isc", AddrMode.Abs, 6, true, ::iIsc), - /* f0 */ Instruction("beq", AddrMode.Rel, 2, true, ::iBeq), - /* f1 */ Instruction("sbc", AddrMode.IzY, 5, true, ::iSbc), - /* f2 */ Instruction("???", AddrMode.Imp, 0, false, ::iInvalid), - /* f3 */ Instruction("isc", AddrMode.IzY, 8, false, ::iIsc), - /* f4 */ Instruction("nop", AddrMode.ZpX, 4, false, ::iNop), - /* f5 */ Instruction("sbc", AddrMode.ZpX, 4, true, ::iSbc), - /* f6 */ Instruction("inc", AddrMode.ZpX, 6, true, ::iInc), - /* f7 */ Instruction("isc", AddrMode.ZpX, 6, false, ::iIsc), - /* f8 */ Instruction("sed", AddrMode.Imp, 2, true, ::iSed), - /* f9 */ Instruction("sbc", AddrMode.AbsY, 4, true, ::iSbc), - /* fa */ Instruction("nop", AddrMode.Imp, 2, false, ::iNop), - /* fb */ Instruction("isc", AddrMode.AbsY, 7, false, ::iIsc), - /* fc */ Instruction("nop", AddrMode.AbsX, 4, false, ::iNop), - /* fd */ Instruction("sbc", AddrMode.AbsX, 4, true, ::iSbc), - /* fe */ Instruction("inc", AddrMode.AbsX, 7, true, ::iInc), - /* ff */ Instruction("isc", AddrMode.AbsX, 7, false, ::iIsc) + Instruction(0x00, "brk", AddrMode.Imp, 7, true, ::iBrk), + Instruction(0x01, "ora", AddrMode.IzX, 6, true, ::iOra), + Instruction(0x02, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x03, "slo", AddrMode.IzX, 8, false, ::iSlo), + Instruction(0x04, "nop", AddrMode.Zp, 3, false, ::iNop), + Instruction(0x05, "ora", AddrMode.Zp, 3, true, ::iOra), + Instruction(0x06, "asl", AddrMode.Zp, 5, true, ::iAsl), + Instruction(0x07, "slo", AddrMode.Zp, 5, false, ::iSlo), + Instruction(0x08, "php", AddrMode.Imp, 3, true, ::iPhp), + Instruction(0x09, "ora", AddrMode.Imm, 2, true, ::iOra), + Instruction(0x0a, "asl", AddrMode.Acc, 2, true, ::iAsl), + Instruction(0x0b, "anc", AddrMode.Imm, 2, false, ::iAnc), + Instruction(0x0c, "nop", AddrMode.Abs, 4, false, ::iNop), + Instruction(0x0d, "ora", AddrMode.Abs, 4, true, ::iOra), + Instruction(0x0e, "asl", AddrMode.Abs, 6, true, ::iAsl), + Instruction(0x0f, "slo", AddrMode.Abs, 6, false, ::iSlo), + Instruction(0x10, "bpl", AddrMode.Rel, 2, true, ::iBpl), + Instruction(0x11, "ora", AddrMode.IzY, 5, true, ::iOra), + Instruction(0x12, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x13, "slo", AddrMode.IzY, 6, false, ::iSlo), + Instruction(0x14, "nop", AddrMode.ZpX, 4, false, ::iNop), + Instruction(0x15, "ora", AddrMode.ZpX, 4, true, ::iOra), + Instruction(0x16, "asl", AddrMode.ZpX, 6, true, ::iAsl), + Instruction(0x17, "slo", AddrMode.ZpX, 6, false, ::iSlo), + Instruction(0x18, "clc", AddrMode.Imp, 2, true, ::iClc), + Instruction(0x19, "ora", AddrMode.AbsY, 4, true, ::iOra), + Instruction(0x1a, "nop", AddrMode.Imp, 2, false, ::iNop), + Instruction(0x1b, "slo", AddrMode.AbsY, 7, false, ::iSlo), + Instruction(0x1c, "nop", AddrMode.AbsX, 4, false, ::iNop), + Instruction(0x1d, "ora", AddrMode.AbsX, 4, true, ::iOra), + Instruction(0x1e, "asl", AddrMode.AbsX, 7, true, ::iAsl), + Instruction(0x1f, "slo", AddrMode.AbsX, 7, false, ::iSlo), + Instruction(0x20, "jsr", AddrMode.Abs, 6, true, ::iJsr), + Instruction(0x21, "and", AddrMode.IzX, 6, true, ::iAnd), + Instruction(0x22, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x23, "rla", AddrMode.IzX, 8, false, ::iRla), + Instruction(0x24, "bit", AddrMode.Zp, 3, true, ::iBit), + Instruction(0x25, "and", AddrMode.Zp, 3, true, ::iAnd), + Instruction(0x26, "rol", AddrMode.Zp, 5, true, ::iRol), + Instruction(0x27, "rla", AddrMode.Zp, 5, false, ::iRla), + Instruction(0x28, "plp", AddrMode.Imp, 4, true, ::iPlp), + Instruction(0x29, "and", AddrMode.Imm, 2, true, ::iAnd), + Instruction(0x2a, "rol", AddrMode.Acc, 2, true, ::iRol), + Instruction(0x2b, "anc", AddrMode.Imm, 2, false, ::iAnc), + Instruction(0x2c, "bit", AddrMode.Abs, 4, true, ::iBit), + Instruction(0x2d, "and", AddrMode.Abs, 4, true, ::iAnd), + Instruction(0x2e, "rol", AddrMode.Abs, 6, true, ::iRol), + Instruction(0x2f, "rla", AddrMode.Abs, 6, false, ::iRla), + Instruction(0x30, "bmi", AddrMode.Rel, 2, true, ::iBmi), + Instruction(0x31, "and", AddrMode.IzY, 5, true, ::iAnd), + Instruction(0x32, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x33, "rla", AddrMode.IzY, 8, false, ::iRla), + Instruction(0x34, "nop", AddrMode.ZpX, 4, false, ::iNop), + Instruction(0x35, "and", AddrMode.ZpX, 4, true, ::iAnd), + Instruction(0x36, "rol", AddrMode.ZpX, 6, true, ::iRol), + Instruction(0x37, "rla", AddrMode.ZpX, 6, false, ::iRla), + Instruction(0x38, "sec", AddrMode.Imp, 2, true, ::iSec), + Instruction(0x39, "and", AddrMode.AbsY, 4, true, ::iAnd), + Instruction(0x3a, "nop", AddrMode.Imp, 2, false, ::iNop), + Instruction(0x3b, "rla", AddrMode.AbsY, 7, false, ::iRla), + Instruction(0x3c, "nop", AddrMode.AbsX, 4, false, ::iNop), + Instruction(0x3d, "and", AddrMode.AbsX, 4, true, ::iAnd), + Instruction(0x3e, "rol", AddrMode.AbsX, 7, true, ::iRol), + Instruction(0x3f, "rla", AddrMode.AbsX, 7, false, ::iRla), + Instruction(0x40, "rti", AddrMode.Imp, 6, true, ::iRti), + Instruction(0x41, "eor", AddrMode.IzX, 6, true, ::iEor), + Instruction(0x42, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x43, "sre", AddrMode.IzX, 8, false, ::iSre), + Instruction(0x44, "nop", AddrMode.Zp, 3, false, ::iNop), + Instruction(0x45, "eor", AddrMode.Zp, 3, true, ::iEor), + Instruction(0x46, "lsr", AddrMode.Zp, 5, true, ::iLsr), + Instruction(0x47, "sre", AddrMode.Zp, 5, false, ::iSre), + Instruction(0x48, "pha", AddrMode.Imp, 3, true, ::iPha), + Instruction(0x49, "eor", AddrMode.Imm, 2, true, ::iEor), + Instruction(0x4a, "lsr", AddrMode.Acc, 2, true, ::iLsr), + Instruction(0x4b, "alr", AddrMode.Imm, 2, false, ::iAlr), + Instruction(0x4c, "jmp", AddrMode.Abs, 3, true, ::iJmp), + Instruction(0x4d, "eor", AddrMode.Abs, 4, true, ::iEor), + Instruction(0x4e, "lsr", AddrMode.Abs, 6, true, ::iLsr), + Instruction(0x4f, "sre", AddrMode.Abs, 6, false, ::iSre), + Instruction(0x50, "bvc", AddrMode.Rel, 2, true, ::iBvc), + Instruction(0x51, "eor", AddrMode.IzY, 5, true, ::iEor), + Instruction(0x52, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x53, "sre", AddrMode.IzY, 8, false, ::iSre), + Instruction(0x54, "nop", AddrMode.ZpX, 4, false, ::iNop), + Instruction(0x55, "eor", AddrMode.ZpX, 4, true, ::iEor), + Instruction(0x56, "lsr", AddrMode.ZpX, 6, true, ::iLsr), + Instruction(0x57, "sre", AddrMode.ZpX, 6, false, ::iSre), + Instruction(0x58, "cli", AddrMode.Imp, 2, true, ::iCli), + Instruction(0x59, "eor", AddrMode.AbsY, 4, true, ::iEor), + Instruction(0x5a, "nop", AddrMode.Imp, 2, false, ::iNop), + Instruction(0x5b, "sre", AddrMode.AbsY, 7, false, ::iSre), + Instruction(0x5c, "nop", AddrMode.AbsX, 4, false, ::iNop), + Instruction(0x5d, "eor", AddrMode.AbsX, 4, true, ::iEor), + Instruction(0x5e, "lsr", AddrMode.AbsX, 7, true, ::iLsr), + Instruction(0x5f, "sre", AddrMode.AbsX, 7, false, ::iSre), + Instruction(0x60, "rts", AddrMode.Imp, 6, true, ::iRts), + Instruction(0x61, "adc", AddrMode.IzX, 6, true, ::iAdc), + Instruction(0x62, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x63, "rra", AddrMode.IzX, 8, false, ::iRra), + Instruction(0x64, "nop", AddrMode.Zp, 3, false, ::iNop), + Instruction(0x65, "adc", AddrMode.Zp, 3, true, ::iAdc), + Instruction(0x66, "ror", AddrMode.Zp, 5, true, ::iRor), + Instruction(0x67, "rra", AddrMode.Zp, 5, false, ::iRra), + Instruction(0x68, "pla", AddrMode.Imp, 4, true, ::iPla), + Instruction(0x69, "adc", AddrMode.Imm, 2, true, ::iAdc), + Instruction(0x6a, "ror", AddrMode.Acc, 2, true, ::iRor), + Instruction(0x6b, "arr", AddrMode.Imm, 2, false, ::iArr), + Instruction(0x6c, "jmp", AddrMode.Ind, 5, true, ::iJmp), + Instruction(0x6d, "adc", AddrMode.Abs, 4, true, ::iAdc), + Instruction(0x6e, "ror", AddrMode.Abs, 6, true, ::iRor), + Instruction(0x6f, "rra", AddrMode.Abs, 6, false, ::iRra), + Instruction(0x70, "bvs", AddrMode.Rel, 2, true, ::iBvs), + Instruction(0x71, "adc", AddrMode.IzY, 5, true, ::iAdc), + Instruction(0x72, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x73, "rra", AddrMode.IzY, 8, false, ::iRra), + Instruction(0x74, "nop", AddrMode.ZpX, 4, false, ::iNop), + Instruction(0x75, "adc", AddrMode.ZpX, 4, true, ::iAdc), + Instruction(0x76, "ror", AddrMode.ZpX, 6, true, ::iRor), + Instruction(0x77, "rra", AddrMode.ZpX, 6, false, ::iRra), + Instruction(0x78, "sei", AddrMode.Imp, 2, true, ::iSei), + Instruction(0x79, "adc", AddrMode.AbsY, 4, true, ::iAdc), + Instruction(0x7a, "nop", AddrMode.Imp, 2, false, ::iNop), + Instruction(0x7b, "rra", AddrMode.AbsY, 7, false, ::iRra), + Instruction(0x7c, "nop", AddrMode.AbsX, 4, false, ::iNop), + Instruction(0x7d, "adc", AddrMode.AbsX, 4, true, ::iAdc), + Instruction(0x7e, "ror", AddrMode.AbsX, 7, true, ::iRor), + Instruction(0x7f, "rra", AddrMode.AbsX, 7, false, ::iRra), + Instruction(0x80, "nop", AddrMode.Imm, 2, false, ::iNop), + Instruction(0x81, "sta", AddrMode.IzX, 6, true, ::iSta), + Instruction(0x82, "nop", AddrMode.Imm, 2, false, ::iNop), + Instruction(0x83, "sax", AddrMode.IzX, 6, false, ::iSax), + Instruction(0x84, "sty", AddrMode.Zp, 3, true, ::iSty), + Instruction(0x85, "sta", AddrMode.Zp, 3, true, ::iSta), + Instruction(0x86, "stx", AddrMode.Zp, 3, true, ::iStx), + Instruction(0x87, "sax", AddrMode.Zp, 3, false, ::iSax), + Instruction(0x88, "dey", AddrMode.Imp, 2, true, ::iDey), + Instruction(0x89, "nop", AddrMode.Imm, 2, false, ::iNop), + Instruction(0x8a, "txa", AddrMode.Imp, 2, true, ::iTxa), + Instruction(0x8b, "xaa", AddrMode.Imm, 2, false, ::iXaa), + Instruction(0x8c, "sty", AddrMode.Abs, 4, true, ::iSty), + Instruction(0x8d, "sta", AddrMode.Abs, 4, true, ::iSta), + Instruction(0x8e, "stx", AddrMode.Abs, 4, true, ::iStx), + Instruction(0x8f, "sax", AddrMode.Abs, 4, true, ::iSax), + Instruction(0x90, "bcc", AddrMode.Rel, 2, true, ::iBcc), + Instruction(0x91, "sta", AddrMode.IzY, 6, true, ::iSta), + Instruction(0x92, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0x93, "ahx", AddrMode.IzY, 6, false, ::iAhx), + Instruction(0x94, "sty", AddrMode.ZpX, 4, true, ::iSty), + Instruction(0x95, "sta", AddrMode.ZpX, 4, true, ::iSta), + Instruction(0x96, "stx", AddrMode.ZpY, 4, true, ::iStx), + Instruction(0x97, "sax", AddrMode.ZpY, 4, false, ::iSax), + Instruction(0x98, "tya", AddrMode.Imp, 2, true, ::iTya), + Instruction(0x99, "sta", AddrMode.AbsY, 5, true, ::iSta), + Instruction(0x9a, "txs", AddrMode.Imp, 2, true, ::iTxs), + Instruction(0x9b, "tas", AddrMode.AbsY, 5, false, ::iTas), + Instruction(0x9c, "shy", AddrMode.AbsX, 5, false, ::iShy), + Instruction(0x9d, "sta", AddrMode.AbsX, 5, true, ::iSta), + Instruction(0x9e, "shx", AddrMode.AbsY, 5, false, ::iShx), + Instruction(0x9f, "ahx", AddrMode.AbsY, 5, false, ::iAhx), + Instruction(0xa0, "ldy", AddrMode.Imm, 2, true, ::iLdy), + Instruction(0xa1, "lda", AddrMode.IzX, 6, true, ::iLda), + Instruction(0xa2, "ldx", AddrMode.Imm, 2, true, ::iLdx), + Instruction(0xa3, "lax", AddrMode.IzX, 6, false, ::iLax), + Instruction(0xa4, "ldy", AddrMode.Zp, 3, true, ::iLdy), + Instruction(0xa5, "lda", AddrMode.Zp, 3, true, ::iLda), + Instruction(0xa6, "ldx", AddrMode.Zp, 3, true, ::iLdx), + Instruction(0xa7, "lax", AddrMode.Zp, 3, false, ::iLax), + Instruction(0xa8, "tay", AddrMode.Imp, 2, true, ::iTay), + Instruction(0xa9, "lda", AddrMode.Imm, 2, true, ::iLda), + Instruction(0xaa, "tax", AddrMode.Imp, 2, true, ::iTax), + Instruction(0xab, "lax", AddrMode.Imm, 2, false, ::iLax), + Instruction(0xac, "ldy", AddrMode.Abs, 4, true, ::iLdy), + Instruction(0xad, "lda", AddrMode.Abs, 4, true, ::iLda), + Instruction(0xae, "ldx", AddrMode.Abs, 4, true, ::iLdx), + Instruction(0xaf, "lax", AddrMode.Abs, 4, false, ::iLax), + Instruction(0xb0, "bcs", AddrMode.Rel, 2, true, ::iBcs), + Instruction(0xb1, "lda", AddrMode.IzY, 5, true, ::iLda), + Instruction(0xb2, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0xb3, "lax", AddrMode.IzY, 5, false, ::iLax), + Instruction(0xb4, "ldy", AddrMode.ZpX, 4, true, ::iLdy), + Instruction(0xb5, "lda", AddrMode.ZpX, 4, true, ::iLda), + Instruction(0xb6, "ldx", AddrMode.ZpY, 4, true, ::iLdx), + Instruction(0xb7, "lax", AddrMode.ZpY, 4, false, ::iLax), + Instruction(0xb8, "clv", AddrMode.Imp, 2, true, ::iClv), + Instruction(0xb9, "lda", AddrMode.AbsY, 4, true, ::iLda), + Instruction(0xba, "tsx", AddrMode.Imp, 2, true, ::iTsx), + Instruction(0xbb, "las", AddrMode.AbsY, 4, false, ::iLas), + Instruction(0xbc, "ldy", AddrMode.AbsX, 4, true, ::iLdy), + Instruction(0xbd, "lda", AddrMode.AbsX, 4, true, ::iLda), + Instruction(0xbe, "ldx", AddrMode.AbsY, 4, true, ::iLdx), + Instruction(0xbf, "lax", AddrMode.AbsY, 4, false, ::iLax), + Instruction(0xc0, "cpy", AddrMode.Imm, 2, true, ::iCpy), + Instruction(0xc1, "cmp", AddrMode.IzX, 6, true, ::iCmp), + Instruction(0xc2, "nop", AddrMode.Imm, 2, false, ::iNop), + Instruction(0xc3, "dcp", AddrMode.IzX, 8, false, ::iDcp), + Instruction(0xc4, "cpy", AddrMode.Zp, 3, true, ::iCpy), + Instruction(0xc5, "cmp", AddrMode.Zp, 3, true, ::iCmp), + Instruction(0xc6, "dec", AddrMode.Zp, 5, true, ::iDec), + Instruction(0xc7, "dcp", AddrMode.Zp, 5, false, ::iDcp), + Instruction(0xc8, "iny", AddrMode.Imp, 2, true, ::iIny), + Instruction(0xc9, "cmp", AddrMode.Imm, 2, true, ::iCmp), + Instruction(0xca, "dex", AddrMode.Imp, 2, true, ::iDex), + Instruction(0xcb, "axs", AddrMode.Imm, 2, false, ::iAxs), + Instruction(0xcc, "cpy", AddrMode.Abs, 4, true, ::iCpy), + Instruction(0xcd, "cmp", AddrMode.Abs, 4, true, ::iCmp), + Instruction(0xce, "dec", AddrMode.Abs, 6, true, ::iDec), + Instruction(0xcf, "dcp", AddrMode.Abs, 6, false, ::iDcp), + Instruction(0xd0, "bne", AddrMode.Rel, 2, true, ::iBne), + Instruction(0xd1, "cmp", AddrMode.IzY, 5, true, ::iCmp), + Instruction(0xd2, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0xd3, "dcp", AddrMode.IzY, 8, false, ::iDcp), + Instruction(0xd4, "nop", AddrMode.ZpX, 4, false, ::iNop), + Instruction(0xd5, "cmp", AddrMode.ZpX, 4, true, ::iCmp), + Instruction(0xd6, "dec", AddrMode.ZpX, 6, true, ::iDec), + Instruction(0xd7, "dcp", AddrMode.ZpX, 6, false, ::iDcp), + Instruction(0xd8, "cld", AddrMode.Imp, 2, true, ::iCld), + Instruction(0xd9, "cmp", AddrMode.AbsY, 4, true, ::iCmp), + Instruction(0xda, "nop", AddrMode.Imp, 2, false, ::iNop), + Instruction(0xdb, "dcp", AddrMode.AbsY, 7, false, ::iDcp), + Instruction(0xdc, "nop", AddrMode.AbsX, 4, false, ::iNop), + Instruction(0xdd, "cmp", AddrMode.AbsX, 4, true, ::iCmp), + Instruction(0xde, "dec", AddrMode.AbsX, 7, true, ::iDec), + Instruction(0xdf, "dcp", AddrMode.AbsX, 7, false, ::iDcp), + Instruction(0xe0, "cpx", AddrMode.Imm, 2, true, ::iCpx), + Instruction(0xe1, "sbc", AddrMode.IzX, 6, true, ::iSbc), + Instruction(0xe2, "nop", AddrMode.Imm, 2, false, ::iNop), + Instruction(0xe3, "isc", AddrMode.IzX, 8, false, ::iIsc), + Instruction(0xe4, "cpx", AddrMode.Zp, 3, true, ::iCpx), + Instruction(0xe5, "sbc", AddrMode.Zp, 3, true, ::iSbc), + Instruction(0xe6, "inc", AddrMode.Zp, 5, true, ::iInc), + Instruction(0xe7, "isc", AddrMode.Zp, 5, false, ::iIsc), + Instruction(0xe8, "inx", AddrMode.Imp, 2, true, ::iInx), + Instruction(0xe9, "sbc", AddrMode.Imm, 2, true, ::iSbc), + Instruction(0xea, "nop", AddrMode.Imp, 2, true, ::iNop), + Instruction(0xeb, "sbc", AddrMode.Imm, 2, false, ::iSbc), + Instruction(0xec, "cpx", AddrMode.Abs, 4, true, ::iCpx), + Instruction(0xed, "sbc", AddrMode.Abs, 4, true, ::iSbc), + Instruction(0xee, "inc", AddrMode.Abs, 6, true, ::iInc), + Instruction(0xef, "isc", AddrMode.Abs, 6, true, ::iIsc), + Instruction(0xf0, "beq", AddrMode.Rel, 2, true, ::iBeq), + Instruction(0xf1, "sbc", AddrMode.IzY, 5, true, ::iSbc), + Instruction(0xf2, "???", AddrMode.Imp, 0, false, ::iInvalid), + Instruction(0xf3, "isc", AddrMode.IzY, 8, false, ::iIsc), + Instruction(0xf4, "nop", AddrMode.ZpX, 4, false, ::iNop), + Instruction(0xf5, "sbc", AddrMode.ZpX, 4, true, ::iSbc), + Instruction(0xf6, "inc", AddrMode.ZpX, 6, true, ::iInc), + Instruction(0xf7, "isc", AddrMode.ZpX, 6, false, ::iIsc), + Instruction(0xf8, "sed", AddrMode.Imp, 2, true, ::iSed), + Instruction(0xf9, "sbc", AddrMode.AbsY, 4, true, ::iSbc), + Instruction(0xfa, "nop", AddrMode.Imp, 2, false, ::iNop), + Instruction(0xfb, "isc", AddrMode.AbsY, 7, false, ::iIsc), + Instruction(0xfc, "nop", AddrMode.AbsX, 4, false, ::iNop), + Instruction(0xfd, "sbc", AddrMode.AbsX, 4, true, ::iSbc), + Instruction(0xfe, "inc", AddrMode.AbsX, 7, true, ::iInc), + Instruction(0xff, "isc", AddrMode.AbsX, 7, false, ::iIsc) ).toTypedArray() @@ -1101,75 +1097,75 @@ class Cpu6502(private val illegalInstrsAllowed: Boolean, private val stopOnBrk: // unofficial/illegal instructions private fun iAhx() { - TODO() + TODO("ahx - ('illegal' instruction)") } private fun iAlr() { - TODO() + TODO("alr=asr - ('illegal' instruction)") } private fun iAnc() { - TODO() + TODO("anc - ('illegal' instruction)") } private fun iArr() { - TODO() + TODO("arr - ('illegal' instruction)") } private fun iAxs() { - TODO() + TODO("axs - ('illegal' instruction)") } private fun iDcp() { - TODO() + TODO("dcp - ('illegal' instruction)") } private fun iIsc() { - TODO() + TODO("isc=isb - ('illegal' instruction)") } private fun iLas() { - TODO() + TODO("las=lar - ('illegal' instruction)") } private fun iLax() { - TODO() + TODO("lax - ('illegal' instruction)") } private fun iRla() { - TODO() + TODO("rla - ('illegal' instruction)") } private fun iRra() { - TODO() + TODO("rra - ('illegal' instruction)") } private fun iSax() { - TODO() + TODO("sax - ('illegal' instruction)") } private fun iShx() { - TODO() + TODO("shx - ('illegal' instruction)") } private fun iShy() { - TODO() + TODO("shy - ('illegal' instruction)") } private fun iSlo() { - TODO() + TODO("slo=aso - ('illegal' instruction)") } private fun iSre() { - TODO() + TODO("sre=lse - ('illegal' instruction)") } private fun iTas() { - TODO() + TODO("tas - ('illegal' instruction)") } private fun iXaa() { - TODO() + TODO("xaa - ('illegal' instruction)") } } diff --git a/sim65/src/components/Parallel.kt b/sim65/src/components/Parallel.kt index f2f5d5b7f..6b063b3a4 100644 --- a/sim65/src/components/Parallel.kt +++ b/sim65/src/components/Parallel.kt @@ -1,6 +1,6 @@ package sim65.components -import sim65.C64Screencodes +import sim65.Petscii /** * A parallel output device (basically, prints bytes as characters to the screen) @@ -17,19 +17,19 @@ class Parallel(startAddress: Address, endAddress: Address) : MemMappedComponent( override fun clock() {} override fun reset() {} - override fun read(address: Address): UByte { + override operator fun get(address: Address): UByte { return if (address == startAddress) dataByte else 0 } - override fun write(address: Address, data: UByte) { + override operator fun set(address: Address, data: UByte) { if (address == startAddress) dataByte = data else if (address == endAddress) { if ((data.toInt() and 1) == 1) { - val char = C64Screencodes.decodeScreencode(listOf(dataByte), false).first() + val char = Petscii.decodeScreencode(listOf(dataByte), false).first() println("PARALLEL WRITE: '$char'") } } diff --git a/sim65/src/components/Ram.kt b/sim65/src/components/Ram.kt index 8cd4c3eb5..15ce4ad94 100644 --- a/sim65/src/components/Ram.kt +++ b/sim65/src/components/Ram.kt @@ -5,15 +5,12 @@ import java.io.File class Ram(startAddress: Address, endAddress: Address): MemMappedComponent(startAddress, endAddress) { private val memory = ShortArray(endAddress-startAddress+1) - override fun read(address: Address): UByte = memory[address-startAddress] + override operator fun get(address: Address): UByte = memory[address-startAddress] - override fun write(address: Address, data: UByte) { + override operator fun set(address: Address, data: UByte) { memory[address-startAddress] = data } - operator fun get(address: Address) = read(address) - operator fun set(address: Address, data: UByte) = write(address, data) - override fun cloneMem(): Array = memory.toTypedArray() override fun clock() { } diff --git a/sim65/src/components/Rom.kt b/sim65/src/components/Rom.kt index 9eee82b94..54f271031 100644 --- a/sim65/src/components/Rom.kt +++ b/sim65/src/components/Rom.kt @@ -7,8 +7,8 @@ class Rom(startAddress: Address, endAddress: Address, data: Array): MemMa require(endAddress-startAddress+1 == data.size) { "rom address range doesn't match size of data bytes" } } - override fun read(address: Address): UByte = memory[address-startAddress] - override fun write(address: Address, data: UByte) { } + override operator fun get(address: Address): UByte = memory[address-startAddress] + override operator fun set(address: Address, data: UByte) { } override fun cloneMem(): Array = memory.toTypedArray() override fun clock() { } override fun reset() { } diff --git a/sim65/src/components/Timer.kt b/sim65/src/components/Timer.kt index 5cbf2a42f..044a44ed6 100644 --- a/sim65/src/components/Timer.kt +++ b/sim65/src/components/Timer.kt @@ -17,11 +17,11 @@ class Timer(startAddress: Address, endAddress: Address): MemMappedComponent(star cycle = 0 } - override fun read(address: Address): UByte { + override operator fun get(address: Address): UByte { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun write(address: Address, data: UByte) { + override operator fun set(address: Address, data: UByte) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/sim65/test/Test6502CpuBasics.kt b/sim65/test/Test6502CpuBasics.kt index ef0f5bf76..21b8ff4c4 100644 --- a/sim65/test/Test6502CpuBasics.kt +++ b/sim65/test/Test6502CpuBasics.kt @@ -7,7 +7,7 @@ class Test6502CpuBasics { @Test fun testCpuFlagsAfterReset() { - val cpu = Cpu6502(true, true) + val cpu = Cpu6502(true) val bus = Bus() bus.add(cpu) cpu.reset() diff --git a/sim65/test/TestCommon6502.kt b/sim65/test/TestCommon6502.kt index 869cdb888..f8f6eaf19 100644 --- a/sim65/test/TestCommon6502.kt +++ b/sim65/test/TestCommon6502.kt @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. abstract class TestCommon6502 { // Tests common to 6502-based microprocessors - val mpu = Cpu6502(true, true) // TODO make a 65C02 cpu as well and let the subclasses testsuites define the appropriate instance + val mpu = Cpu6502(stopOnBrk = false) // TODO make a 65C02 cpu as well and let the subclasses testsuites define the appropriate instance val memory = Ram(0, 0xffff) val bus = Bus() @@ -53,8 +53,8 @@ abstract class TestCommon6502 { bus.add(mpu) bus.add(memory) memory.fill(0xaa) - memory.write(Cpu6502.RESET_vector, 0) - memory.write(Cpu6502.RESET_vector+1, 0) + memory[Cpu6502.RESET_vector] = 0 + memory[Cpu6502.RESET_vector + 1] = 0 mpu.reset() mpu.Status.I = false // allow interrupts again } @@ -74,7 +74,7 @@ abstract class TestCommon6502 { // test helpers fun writeMem(memory: MemMappedComponent, startAddress: Address, data: Iterable) { var addr = startAddress - data.forEach { memory.write(addr++, it) } + data.forEach { memory[addr++] = it } } @@ -91,6 +91,7 @@ abstract class TestCommon6502 { } // ADC Absolute + @Test fun test_adc_bcd_off_absolute_carry_clear_in_accumulator_zeroes() { mpu.A = 0 @@ -218,9 +219,9 @@ abstract class TestCommon6502 { } // ADC Zero Page + @Test fun test_adc_bcd_off_zp_carry_clear_in_accumulator_zeroes() { - mpu.A = 0 // $0000 ADC $00B0 writeMem(memory, 0x0000, listOf(0x65, 0xB0)) @@ -231,12 +232,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) assertTrue(mpu.Status.Z) - } @Test fun test_adc_bcd_off_zp_carry_set_in_accumulator_zero() { - mpu.A = 0 mpu.Status.C = true // $0000 ADC $00B0 @@ -248,12 +247,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_off_zp_carry_clear_in_no_carry_clear_out() { - mpu.A = 0x01 // $0000 ADC $00B0 writeMem(memory, 0x0000, listOf(0x65, 0xB0)) @@ -264,12 +261,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertFalse(mpu.Status.C) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_zp_carry_clear_in_carry_set_out() { - mpu.A = 0x02 // $0000 ADC $00B0 writeMem(memory, 0x0000, listOf(0x65, 0xB0)) @@ -280,12 +275,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_zp_overflow_clr_no_carry_01_plus_01() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC $00B0 @@ -295,12 +288,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x02, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_zp_overflow_clr_no_carry_01_plus_ff() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC $00B0 @@ -310,12 +301,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_zp_overflow_set_no_carry_7f_plus_01() { - mpu.Status.C = false mpu.A = 0x7f // $0000 ADC $00B0 @@ -325,12 +314,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x80, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_zp_overflow_set_no_carry_80_plus_ff() { - mpu.Status.C = false mpu.A = 0x80 // $0000 ADC $00B0 @@ -340,12 +327,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x7f, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_zp_overflow_set_on_40_plus_40() { - mpu.A = 0x40 mpu.Status.V = false // $0000 ADC $00B0 @@ -357,14 +342,12 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertTrue(mpu.Status.V) assertFalse(mpu.Status.Z) - - // ADC Immediate - } + // ADC Immediate + @Test fun test_adc_bcd_off_immediate_carry_clear_in_accumulator_zeroes() { - mpu.A = 0 // $0000 ADC #$00 writeMem(memory, 0x0000, listOf(0x69, 0x00)) @@ -374,12 +357,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) assertTrue(mpu.Status.Z) - } @Test fun test_adc_bcd_off_immediate_carry_set_in_accumulator_zero() { - mpu.A = 0 mpu.Status.C = true // $0000 ADC #$00 @@ -390,12 +371,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_off_immediate_carry_clear_in_no_carry_clear_out() { - mpu.A = 0x01 // $0000 ADC #$FE writeMem(memory, 0x0000, listOf(0x69, 0xFE)) @@ -405,12 +384,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertFalse(mpu.Status.C) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_immediate_carry_clear_in_carry_set_out() { - mpu.A = 0x02 // $0000 ADC #$FF writeMem(memory, 0x0000, listOf(0x69, 0xFF)) @@ -420,12 +397,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_immediate_overflow_clr_no_carry_01_plus_01() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC #$01 @@ -434,12 +409,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x02, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_immediate_overflow_clr_no_carry_01_plus_ff() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC #$FF @@ -448,12 +421,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_immediate_overflow_set_no_carry_7f_plus_01() { - mpu.Status.C = false mpu.A = 0x7f // $0000 ADC #$01 @@ -462,12 +433,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x80, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_immediate_overflow_set_no_carry_80_plus_ff() { - mpu.Status.C = false mpu.A = 0x80 // $0000 ADC #$FF @@ -476,12 +445,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x7f, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_immediate_overflow_set_on_40_plus_40() { - mpu.A = 0x40 // $0000 ADC #$40 writeMem(memory, 0x0000, listOf(0x69, 0x40)) @@ -491,12 +458,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertTrue(mpu.Status.V) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_on_immediate_79_plus_00_carry_set() { - mpu.Status.D = true mpu.Status.C = true mpu.A = 0x79 @@ -513,7 +478,6 @@ abstract class TestCommon6502 { @Test fun test_adc_bcd_on_immediate_6f_plus_00_carry_set() { - mpu.Status.D = true mpu.Status.C = true mpu.A = 0x6f @@ -526,12 +490,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.V) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_on_immediate_9c_plus_9d() { - mpu.Status.D = true mpu.Status.C = false mpu.Status.N = true @@ -556,7 +518,6 @@ abstract class TestCommon6502 { @Test fun test_adc_bcd_off_abs_x_carry_clear_in_accumulator_zeroes() { - mpu.A = 0x00 mpu.X = 0x03 // $0000 ADC $C000,X @@ -568,12 +529,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) assertTrue(mpu.Status.Z) - } @Test fun test_adc_bcd_off_abs_x_carry_set_in_accumulator_zero() { - mpu.A = 0 mpu.X = 0x03 mpu.Status.C = true @@ -586,12 +545,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_off_abs_x_carry_clear_in_no_carry_clear_out() { - mpu.A = 0x01 mpu.X = 0x03 // $0000 ADC $C000,X @@ -603,12 +560,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertFalse(mpu.Status.C) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_abs_x_carry_clear_in_carry_set_out() { - mpu.A = 0x02 mpu.X = 0x03 // $0000 ADC $C000,X @@ -620,12 +575,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_abs_x_overflow_clr_no_carry_01_plus_01() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC $C000,X @@ -635,12 +588,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x02, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_x_overflow_clr_no_carry_01_plus_ff() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC $C000,X @@ -650,12 +601,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x00, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_x_overflow_set_no_carry_7f_plus_01() { - mpu.Status.C = false mpu.A = 0x7f // $0000 ADC $C000,X @@ -665,12 +614,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x80, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_x_overflow_set_no_carry_80_plus_ff() { - mpu.Status.C = false mpu.A = 0x80 // $0000 ADC $C000,X @@ -680,12 +627,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x7f, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_x_overflow_set_on_40_plus_40() { - mpu.Status.V = false mpu.A = 0x40 mpu.X = 0x03 @@ -698,14 +643,12 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertTrue(mpu.Status.V) assertFalse(mpu.Status.Z) - - // ADC Absolute, Y-Indexed - } + // ADC Absolute, Y-Indexed + @Test fun test_adc_bcd_off_abs_y_carry_clear_in_accumulator_zeroes() { - mpu.A = 0x00 mpu.Y = 0x03 // $0000 ADC $C000,Y @@ -717,12 +660,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) assertTrue(mpu.Status.Z) - } @Test fun test_adc_bcd_off_abs_y_carry_set_in_accumulator_zero() { - mpu.A = 0 mpu.Y = 0x03 mpu.Status.C = true @@ -735,12 +676,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_off_abs_y_carry_clear_in_no_carry_clear_out() { - mpu.A = 0x01 mpu.Y = 0x03 // $0000 ADC $C000,Y @@ -752,12 +691,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertFalse(mpu.Status.C) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_abs_y_carry_clear_in_carry_set_out() { - mpu.A = 0x02 mpu.Y = 0x03 // $0000 ADC $C000,Y @@ -769,12 +706,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_abs_y_overflow_clr_no_carry_01_plus_01() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC $C000,Y @@ -784,12 +719,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x02, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_y_overflow_clr_no_carry_01_plus_ff() { - mpu.Status.C = false mpu.A = 0x01 // $0000 ADC $C000,Y @@ -799,12 +732,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x00, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_y_overflow_set_no_carry_7f_plus_01() { - mpu.Status.C = false mpu.A = 0x7f // $0000 ADC $C000,Y @@ -814,12 +745,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x80, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_y_overflow_set_no_carry_80_plus_ff() { - mpu.Status.C = false mpu.A = 0x80 // $0000 ADC $C000,Y @@ -829,12 +758,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x7f, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_abs_y_overflow_set_on_40_plus_40() { - mpu.Status.V = false mpu.A = 0x40 mpu.Y = 0x03 @@ -847,14 +774,12 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertTrue(mpu.Status.V) assertFalse(mpu.Status.Z) - - // ADC Zero Page, X-Indexed - } + // ADC Zero Page, X-Indexed + @Test fun test_adc_bcd_off_zp_x_carry_clear_in_accumulator_zeroes() { - mpu.A = 0x00 mpu.X = 0x03 // $0000 ADC $0010,X @@ -866,12 +791,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) assertTrue(mpu.Status.Z) - } @Test fun test_adc_bcd_off_zp_x_carry_set_in_accumulator_zero() { - mpu.A = 0 mpu.X = 0x03 mpu.Status.C = true @@ -884,12 +807,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_off_zp_x_carry_clear_in_no_carry_clear_out() { - mpu.A = 0x01 mpu.X = 0x03 // $0000 ADC $0010,X @@ -901,12 +822,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertFalse(mpu.Status.C) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_zp_x_carry_clear_in_carry_set_out() { - mpu.A = 0x02 mpu.X = 0x03 // $0000 ADC $0010,X @@ -918,12 +837,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_zp_x_overflow_clr_no_carry_01_plus_01() { - mpu.Status.C = false mpu.A = 0x01 mpu.X = 0x03 @@ -934,12 +851,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x02, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_zp_x_overflow_clr_no_carry_01_plus_ff() { - mpu.Status.C = false mpu.A = 0x01 mpu.X = 0x03 @@ -950,12 +865,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_zp_x_overflow_set_no_carry_7f_plus_01() { - mpu.Status.C = false mpu.A = 0x7f mpu.X = 0x03 @@ -966,7 +879,6 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x80, mpu.A) assertTrue(mpu.Status.V) - } @Test @@ -982,12 +894,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x7f, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_zp_x_overflow_set_on_40_plus_40() { - mpu.Status.V = false mpu.A = 0x40 mpu.X = 0x03 @@ -1000,14 +910,12 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertTrue(mpu.Status.V) assertFalse(mpu.Status.Z) - - // ADC Indirect, Indexed (X) - } + // ADC Indirect, Indexed (X) + @Test fun test_adc_bcd_off_ind_indexed_carry_clear_in_accumulator_zeroes() { - mpu.A = 0x00 mpu.X = 0x03 // $0000 ADC ($0010,X) @@ -1021,12 +929,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) assertTrue(mpu.Status.Z) - } @Test fun test_adc_bcd_off_ind_indexed_carry_set_in_accumulator_zero() { - mpu.A = 0 mpu.X = 0x03 mpu.Status.C = true @@ -1041,12 +947,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_off_ind_indexed_carry_clear_in_no_carry_clear_out() { - mpu.A = 0x01 mpu.X = 0x03 // $0000 ADC ($0010,X) @@ -1060,12 +964,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertFalse(mpu.Status.C) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_ind_indexed_carry_clear_in_carry_set_out() { - mpu.A = 0x02 mpu.X = 0x03 // $0000 ADC ($0010,X) @@ -1079,12 +981,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_ind_indexed_overflow_clr_no_carry_01_plus_01() { - mpu.Status.C = false mpu.A = 0x01 mpu.X = 0x03 @@ -1097,12 +997,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x02, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_ind_indexed_overflow_clr_no_carry_01_plus_ff() { - mpu.Status.C = false mpu.A = 0x01 mpu.X = 0x03 @@ -1115,12 +1013,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_ind_indexed_overflow_set_no_carry_7f_plus_01() { - mpu.Status.C = false mpu.A = 0x7f mpu.X = 0x03 @@ -1133,12 +1029,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x80, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_ind_indexed_overflow_set_no_carry_80_plus_ff() { - mpu.Status.C = false mpu.A = 0x80 mpu.X = 0x03 @@ -1151,12 +1045,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x7f, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_ind_indexed_overflow_set_on_40_plus_40() { - mpu.Status.V = false mpu.A = 0x40 mpu.X = 0x03 @@ -1171,14 +1063,12 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertTrue(mpu.Status.V) assertFalse(mpu.Status.Z) - - // ADC Indexed, Indirect (Y) - } + // ADC Indexed, Indirect (Y) + @Test fun test_adc_bcd_off_indexed_ind_carry_clear_in_accumulator_zeroes() { - mpu.A = 0x00 mpu.Y = 0x03 // $0000 ADC ($0010),Y @@ -1192,12 +1082,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) assertTrue(mpu.Status.Z) - } @Test fun test_adc_bcd_off_indexed_ind_carry_set_in_accumulator_zero() { - mpu.A = 0 mpu.Y = 0x03 mpu.Status.C = true @@ -1212,12 +1100,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_adc_bcd_off_indexed_ind_carry_clear_in_no_carry_clear_out() { - mpu.A = 0x01 mpu.Y = 0x03 // $0000 ADC ($0010),Y @@ -1231,12 +1117,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) assertFalse(mpu.Status.C) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_indexed_ind_carry_clear_in_carry_set_out() { - mpu.A = 0x02 mpu.Y = 0x03 // $0000 ADC ($0010),Y @@ -1250,12 +1134,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_adc_bcd_off_indexed_ind_overflow_clr_no_carry_01_plus_01() { - mpu.Status.C = false mpu.A = 0x01 mpu.Y = 0x03 @@ -1268,12 +1150,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x02, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_indexed_ind_overflow_clr_no_carry_01_plus_ff() { - mpu.Status.C = false mpu.A = 0x01 mpu.Y = 0x03 @@ -1286,12 +1166,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertFalse(mpu.Status.V) - } @Test fun test_adc_bcd_off_indexed_ind_overflow_set_no_carry_7f_plus_01() { - mpu.Status.C = false mpu.A = 0x7f mpu.Y = 0x03 @@ -1304,12 +1182,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x80, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_indexed_ind_overflow_set_no_carry_80_plus_ff() { - mpu.Status.C = false mpu.A = 0x80 mpu.Y = 0x03 @@ -1322,12 +1198,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x7f, mpu.A) assertTrue(mpu.Status.V) - } @Test fun test_adc_bcd_off_indexed_ind_overflow_set_on_40_plus_40() { - mpu.Status.V = false mpu.A = 0x40 mpu.Y = 0x03 @@ -1348,7 +1222,6 @@ abstract class TestCommon6502 { @Test fun test_and_absolute_all_zeros_setting_zero_flag() { - mpu.A = 0xFF // $0000 AND $ABCD writeMem(memory, 0x0000, listOf(0x2D, 0xCD, 0xAB)) @@ -1358,12 +1231,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_and_absolute_zeros_and_ones_setting_negative_flag() { - mpu.A = 0xFF // $0000 AND $ABCD writeMem(memory, 0x0000, listOf(0x2D, 0xCD, 0xAB)) @@ -1379,7 +1250,6 @@ abstract class TestCommon6502 { @Test fun test_and_zp_all_zeros_setting_zero_flag() { - mpu.A = 0xFF // $0000 AND $0010 writeMem(memory, 0x0000, listOf(0x25, 0x10)) @@ -1389,12 +1259,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_and_zp_zeros_and_ones_setting_negative_flag() { - mpu.A = 0xFF // $0000 AND $0010 writeMem(memory, 0x0000, listOf(0x25, 0x10)) @@ -1404,14 +1272,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // AND (Immediate) - } + // AND (Immediate) + @Test fun test_and_immediate_all_zeros_setting_zero_flag() { - mpu.A = 0xFF // $0000 AND #$00 writeMem(memory, 0x0000, listOf(0x29, 0x00)) @@ -1420,12 +1286,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_and_immediate_zeros_and_ones_setting_negative_flag() { - mpu.A = 0xFF // $0000 AND #$AA writeMem(memory, 0x0000, listOf(0x29, 0xAA)) @@ -1434,14 +1298,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // AND (Absolute, X-Indexed) - } + // AND (Absolute, X-Indexed) + @Test fun test_and_abs_x_all_zeros_setting_zero_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 AND $ABCD,X @@ -1452,12 +1314,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_and_abs_x_zeros_and_ones_setting_negative_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 AND $ABCD,X @@ -1468,14 +1328,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // AND (Absolute, Y-Indexed) - } + // AND (Absolute, Y-Indexed) + @Test fun test_and_abs_y_all_zeros_setting_zero_flag() { - mpu.A = 0xFF mpu.Y = 0x03 // $0000 AND $ABCD,X @@ -1486,7 +1344,6 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test @@ -1507,7 +1364,6 @@ abstract class TestCommon6502 { @Test fun test_and_ind_indexed_x_all_zeros_setting_zero_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 AND ($0010,X) @@ -1520,12 +1376,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_and_ind_indexed_x_zeros_and_ones_setting_negative_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 AND ($0010,X) @@ -1538,14 +1392,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // AND Indexed, Indirect (Y) - } + // AND Indexed, Indirect (Y) + @Test fun test_and_indexed_ind_y_all_zeros_setting_zero_flag() { - mpu.A = 0xFF mpu.Y = 0x03 // $0000 AND ($0010),Y @@ -1558,12 +1410,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_and_indexed_ind_y_zeros_and_ones_setting_negative_flag() { - mpu.A = 0xFF mpu.Y = 0x03 // $0000 AND ($0010),Y @@ -1576,14 +1426,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // AND Zero Page, X-Indexed - } + // AND Zero Page, X-Indexed + @Test fun test_and_zp_x_all_zeros_setting_zero_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 AND $0010,X @@ -1594,12 +1442,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_and_zp_x_all_zeros_and_ones_setting_negative_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 AND $0010,X @@ -1610,14 +1456,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ASL Accumulator - } + // ASL Accumulator + @Test fun test_asl_accumulator_sets_z_flag() { - mpu.A = 0x00 // $0000 ASL A memory[0x0000] = 0x0A @@ -1626,12 +1470,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_asl_accumulator_sets_n_flag() { - mpu.A = 0x40 // $0000 ASL A memory[0x0000] = 0x0A @@ -1640,12 +1482,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_asl_accumulator_shifts_out_zero() { - mpu.A = 0x7F // $0000 ASL A memory[0x0000] = 0x0A @@ -1653,12 +1493,10 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0xFE, mpu.A) assertFalse(mpu.Status.C) - } @Test fun test_asl_accumulator_shifts_out_one() { - mpu.A = 0xFF // $0000 ASL A memory[0x0000] = 0x0A @@ -1666,12 +1504,10 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0xFE, mpu.A) assertTrue(mpu.Status.C) - } @Test fun test_asl_accumulator_80_sets_z_flag() { - mpu.A = 0x80 mpu.Status.Z = false // $0000 ASL A @@ -1680,14 +1516,12 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - - // ASL Absolute - } + // ASL Absolute + @Test fun test_asl_absolute_sets_z_flag() { - // $0000 ASL $ABCD writeMem(memory, 0x0000, listOf(0x0E, 0xCD, 0xAB)) memory[0xABCD] = 0x00 @@ -1696,12 +1530,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_asl_absolute_sets_n_flag() { - // $0000 ASL $ABCD writeMem(memory, 0x0000, listOf(0x0E, 0xCD, 0xAB)) memory[0xABCD] = 0x40 @@ -1710,12 +1542,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0xABCD]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_asl_absolute_shifts_out_zero() { - mpu.A = 0xAA // $0000 ASL $ABCD writeMem(memory, 0x0000, listOf(0x0E, 0xCD, 0xAB)) @@ -1725,12 +1555,10 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0xABCD]) assertFalse(mpu.Status.C) - } @Test fun test_asl_absolute_shifts_out_one() { - mpu.A = 0xAA // $0000 ASL $ABCD writeMem(memory, 0x0000, listOf(0x0E, 0xCD, 0xAB)) @@ -1740,14 +1568,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0xABCD]) assertTrue(mpu.Status.C) - - // ASL Zero Page - } + // ASL Zero Page + @Test fun test_asl_zp_sets_z_flag() { - // $0000 ASL $0010 writeMem(memory, 0x0000, listOf(0x06, 0x10)) memory[0x0010] = 0x00 @@ -1756,12 +1582,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_asl_zp_sets_n_flag() { - // $0000 ASL $0010 writeMem(memory, 0x0000, listOf(0x06, 0x10)) memory[0x0010] = 0x40 @@ -1770,12 +1594,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0x0010]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_asl_zp_shifts_out_zero() { - mpu.A = 0xAA // $0000 ASL $0010 writeMem(memory, 0x0000, listOf(0x06, 0x10)) @@ -1785,12 +1607,10 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0x0010]) assertFalse(mpu.Status.C) - } @Test fun test_asl_zp_shifts_out_one() { - mpu.A = 0xAA // $0000 ASL $0010 writeMem(memory, 0x0000, listOf(0x06, 0x10)) @@ -1800,14 +1620,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0x0010]) assertTrue(mpu.Status.C) - - // ASL Absolute, X-Indexed - } + // ASL Absolute, X-Indexed + @Test fun test_asl_abs_x_indexed_sets_z_flag() { - mpu.X = 0x03 // $0000 ASL $ABCD,X writeMem(memory, 0x0000, listOf(0x1E, 0xCD, 0xAB)) @@ -1817,12 +1635,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_asl_abs_x_indexed_sets_n_flag() { - mpu.X = 0x03 // $0000 ASL $ABCD,X writeMem(memory, 0x0000, listOf(0x1E, 0xCD, 0xAB)) @@ -1832,12 +1648,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_asl_abs_x_indexed_shifts_out_zero() { - mpu.A = 0xAA mpu.X = 0x03 // $0000 ASL $ABCD,X @@ -1848,12 +1662,10 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0xABCD + mpu.X]) assertFalse(mpu.Status.C) - } @Test fun test_asl_abs_x_indexed_shifts_out_one() { - mpu.A = 0xAA mpu.X = 0x03 // $0000 ASL $ABCD,X @@ -1864,14 +1676,12 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.C) - - // ASL Zero Page, X-Indexed - } + // ASL Zero Page, X-Indexed + @Test fun test_asl_zp_x_indexed_sets_z_flag() { - mpu.X = 0x03 // $0000 ASL $0010,X writeMem(memory, 0x0000, listOf(0x16, 0x10)) @@ -1881,12 +1691,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_asl_zp_x_indexed_sets_n_flag() { - mpu.X = 0x03 // $0000 ASL $0010,X writeMem(memory, 0x0000, listOf(0x16, 0x10)) @@ -1896,12 +1704,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_asl_zp_x_indexed_shifts_out_zero() { - mpu.X = 0x03 mpu.A = 0xAA // $0000 ASL $0010,X @@ -1912,12 +1718,10 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0x0010 + mpu.X]) assertFalse(mpu.Status.C) - } @Test fun test_asl_zp_x_indexed_shifts_out_one() { - mpu.X = 0x03 mpu.A = 0xAA // $0000 ASL $0010,X @@ -1928,25 +1732,21 @@ abstract class TestCommon6502 { assertEquals(0xAA, mpu.A) assertEquals(0xFE, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.C) - - // BCC - } + // BCC + @Test fun test_bcc_carry_clear_branches_relative_forward() { - mpu.Status.C = false // $0000 BCC +6 writeMem(memory, 0x0000, listOf(0x90, 0x06)) mpu.step() assertEquals(0x0002 + 0x06, mpu.PC) - } @Test fun test_bcc_carry_clear_branches_relative_backward() { - mpu.Status.C = false mpu.PC = 0x0050 val rel = 256 + (-6) // two's complement of 6 @@ -1954,36 +1754,30 @@ abstract class TestCommon6502 { writeMem(memory, 0x0050, listOf(0x90, rel.toShort())) mpu.step() assertEquals(0x0052 - 6, mpu.PC) - } @Test fun test_bcc_carry_set_does_not_branch() { - mpu.Status.C = true // $0000 BCC +6 writeMem(memory, 0x0000, listOf(0x90, 0x06)) mpu.step() assertEquals(0x0002, mpu.PC) - - // BCS - } + // BCS + @Test fun test_bcs_carry_set_branches_relative_forward() { - mpu.Status.C = true // $0000 BCS +6 writeMem(memory, 0x0000, listOf(0xB0, 0x06)) mpu.step() assertEquals(0x0002 + 0x06, mpu.PC) - } @Test fun test_bcs_carry_set_branches_relative_backward() { - mpu.Status.C = true mpu.PC = 0x0050 val rel = 256 + (-6) // two's complement of 6 @@ -1991,36 +1785,30 @@ abstract class TestCommon6502 { writeMem(memory, 0x0050, listOf(0xB0, rel.toShort())) mpu.step() assertEquals(0x0052 - 6, mpu.PC) - } @Test fun test_bcs_carry_clear_does_not_branch() { - mpu.Status.C = false // $0000 BCS +6 writeMem(memory, 0x0000, listOf(0xB0, 0x06)) mpu.step() assertEquals(0x0002, mpu.PC) - - // BEQ - } + // BEQ + @Test fun test_beq_zero_set_branches_relative_forward() { - mpu.Status.Z = true // $0000 BEQ +6 writeMem(memory, 0x0000, listOf(0xF0, 0x06)) mpu.step() assertEquals(0x0002 + 0x06, mpu.PC) - } @Test fun test_beq_zero_set_branches_relative_backward() { - mpu.Status.Z = true mpu.PC = 0x0050 val rel = 256 + (-6) // two's complement of 6 @@ -2028,25 +1816,21 @@ abstract class TestCommon6502 { writeMem(memory, 0x0050, listOf(0xF0, rel.toShort())) mpu.step() assertEquals(0x0052 - 6, mpu.PC) - } @Test fun test_beq_zero_clear_does_not_branch() { - mpu.Status.Z = false // $0000 BEQ +6 writeMem(memory, 0x0000, listOf(0xF0, 0x06)) mpu.step() assertEquals(0x0002, mpu.PC) - - // BIT (Absolute) - } + // BIT (Absolute) + @Test fun test_bit_abs_copies_bit_7_of_memory_to_n_flag_when_0() { - mpu.Status.N = false // $0000 BIT $FEED writeMem(memory, 0x0000, listOf(0x2C, 0xED, 0xFE)) @@ -2054,12 +1838,10 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertTrue(mpu.Status.N) - } @Test fun test_bit_abs_copies_bit_7_of_memory_to_n_flag_when_1() { - mpu.Status.N = true // $0000 BIT $FEED writeMem(memory, 0x0000, listOf(0x2C, 0xED, 0xFE)) @@ -2067,12 +1849,10 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertFalse(mpu.Status.N) - } @Test fun test_bit_abs_copies_bit_6_of_memory_to_v_flag_when_0() { - mpu.Status.V = false // $0000 BIT $FEED writeMem(memory, 0x0000, listOf(0x2C, 0xED, 0xFE)) @@ -2080,12 +1860,10 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertTrue(mpu.Status.V) - } @Test fun test_bit_abs_copies_bit_6_of_memory_to_v_flag_when_1() { - mpu.Status.V = true // $0000 BIT $FEED writeMem(memory, 0x0000, listOf(0x2C, 0xED, 0xFE)) @@ -2093,12 +1871,10 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertFalse(mpu.Status.V) - } @Test fun test_bit_abs_stores_result_of_and_in_z_preserves_a_when_1() { - mpu.Status.Z = false // $0000 BIT $FEED writeMem(memory, 0x0000, listOf(0x2C, 0xED, 0xFE)) @@ -2108,12 +1884,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertEquals(0x01, mpu.A) assertEquals(0x00, memory[0xFEED]) - } @Test fun test_bit_abs_stores_result_of_and_when_nonzero_in_z_preserves_a() { - mpu.Status.Z = true // $0000 BIT $FEED writeMem(memory, 0x0000, listOf(0x2C, 0xED, 0xFE)) @@ -2123,12 +1897,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.Z) // result of AND is non-zero assertEquals(0x01, mpu.A) assertEquals(0x01, memory[0xFEED]) - } @Test fun test_bit_abs_stores_result_of_and_when_zero_in_z_preserves_a() { - mpu.Status.Z = false // $0000 BIT $FEED writeMem(memory, 0x0000, listOf(0x2C, 0xED, 0xFE)) @@ -2138,14 +1910,12 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) // result of AND is zero assertEquals(0x01, mpu.A) assertEquals(0x00, memory[0xFEED]) - - // BIT (Zero Page) - } + // BIT (Zero Page) + @Test fun test_bit_zp_copies_bit_7_of_memory_to_n_flag_when_0() { - mpu.Status.N = false // $0000 BIT $0010 writeMem(memory, 0x0000, listOf(0x24, 0x10)) @@ -2153,14 +1923,12 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertEquals(0x0002, mpu.PC) - assertEquals(3+Cpu6502.resetCycles, mpu.totalCycles) + assertEquals(3 + Cpu6502.resetCycles, mpu.totalCycles) assertTrue(mpu.Status.N) - } @Test fun test_bit_zp_copies_bit_7_of_memory_to_n_flag_when_1() { - mpu.Status.N = true // $0000 BIT $0010 writeMem(memory, 0x0000, listOf(0x24, 0x10)) @@ -2168,14 +1936,12 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertEquals(0x0002, mpu.PC) - assertEquals(3+Cpu6502.resetCycles, mpu.totalCycles) + assertEquals(3 + Cpu6502.resetCycles, mpu.totalCycles) assertFalse(mpu.Status.N) - } @Test fun test_bit_zp_copies_bit_6_of_memory_to_v_flag_when_0() { - mpu.Status.V = false // $0000 BIT $0010 writeMem(memory, 0x0000, listOf(0x24, 0x10)) @@ -2183,14 +1949,12 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertEquals(0x0002, mpu.PC) - assertEquals(3+Cpu6502.resetCycles, mpu.totalCycles) + assertEquals(3 + Cpu6502.resetCycles, mpu.totalCycles) assertTrue(mpu.Status.V) - } @Test fun test_bit_zp_copies_bit_6_of_memory_to_v_flag_when_1() { - mpu.Status.V = true // $0000 BIT $0010 writeMem(memory, 0x0000, listOf(0x24, 0x10)) @@ -2198,14 +1962,12 @@ abstract class TestCommon6502 { mpu.A = 0xFF mpu.step() assertEquals(0x0002, mpu.PC) - assertEquals(3+Cpu6502.resetCycles, mpu.totalCycles) + assertEquals(3 + Cpu6502.resetCycles, mpu.totalCycles) assertFalse(mpu.Status.V) - } @Test fun test_bit_zp_stores_result_of_and_in_z_preserves_a_when_1() { - mpu.Status.Z = false // $0000 BIT $0010 writeMem(memory, 0x0000, listOf(0x24, 0x10)) @@ -2213,16 +1975,14 @@ abstract class TestCommon6502 { mpu.A = 0x01 mpu.step() assertEquals(0x0002, mpu.PC) - assertEquals(3+Cpu6502.resetCycles, mpu.totalCycles) + assertEquals(3 + Cpu6502.resetCycles, mpu.totalCycles) assertTrue(mpu.Status.Z) assertEquals(0x01, mpu.A) assertEquals(0x00, memory[0x0010]) - } @Test fun test_bit_zp_stores_result_of_and_when_nonzero_in_z_preserves_a() { - mpu.Status.Z = true // $0000 BIT $0010 writeMem(memory, 0x0000, listOf(0x24, 0x10)) @@ -2230,16 +1990,14 @@ abstract class TestCommon6502 { mpu.A = 0x01 mpu.step() assertEquals(0x0002, mpu.PC) - assertEquals(3+Cpu6502.resetCycles, mpu.totalCycles) + assertEquals(3 + Cpu6502.resetCycles, mpu.totalCycles) assertFalse(mpu.Status.Z) // result of AND is non-zero assertEquals(0x01, mpu.A) assertEquals(0x01, memory[0x0010]) - } @Test fun test_bit_zp_stores_result_of_and_when_zero_in_z_preserves_a() { - mpu.Status.Z = false // $0000 BIT $0010 writeMem(memory, 0x0000, listOf(0x24, 0x10)) @@ -2247,29 +2005,25 @@ abstract class TestCommon6502 { mpu.A = 0x01 mpu.step() assertEquals(0x0002, mpu.PC) - assertEquals(3+Cpu6502.resetCycles, mpu.totalCycles) + assertEquals(3 + Cpu6502.resetCycles, mpu.totalCycles) assertTrue(mpu.Status.Z) // result of AND is zero assertEquals(0x01, mpu.A) assertEquals(0x00, memory[0x0010]) - - // BMI - } + // BMI + @Test fun test_bmi_negative_set_branches_relative_forward() { - mpu.Status.N = true // $0000 BMI +06 writeMem(memory, 0x0000, listOf(0x30, 0x06)) mpu.step() assertEquals(0x0002 + 0x06, mpu.PC) - } @Test fun test_bmi_negative_set_branches_relative_backward() { - mpu.Status.N = true mpu.PC = 0x0050 // $0000 BMI -6 @@ -2277,36 +2031,30 @@ abstract class TestCommon6502 { writeMem(memory, 0x0050, listOf(0x30, rel.toShort())) mpu.step() assertEquals(0x0052 - 6, mpu.PC) - } @Test fun test_bmi_negative_clear_does_not_branch() { - mpu.Status.N = false // $0000 BEQ +6 writeMem(memory, 0x0000, listOf(0x30, 0x06)) mpu.step() assertEquals(0x0002, mpu.PC) - - // BNE - } + // BNE + @Test fun test_bne_zero_clear_branches_relative_forward() { - mpu.Status.Z = false // $0000 BNE +6 writeMem(memory, 0x0000, listOf(0xD0, 0x06)) mpu.step() assertEquals(0x0002 + 0x06, mpu.PC) - } @Test fun test_bne_zero_clear_branches_relative_backward() { - mpu.Status.Z = false mpu.PC = 0x0050 // $0050 BNE -6 @@ -2314,36 +2062,30 @@ abstract class TestCommon6502 { writeMem(memory, 0x0050, listOf(0xD0, rel.toShort())) mpu.step() assertEquals(0x0052 - 6, mpu.PC) - } @Test fun test_bne_zero_set_does_not_branch() { - mpu.Status.Z = true // $0000 BNE +6 writeMem(memory, 0x0000, listOf(0xD0, 0x06)) mpu.step() assertEquals(0x0002, mpu.PC) - - // BPL - } + // BPL + @Test fun test_bpl_negative_clear_branches_relative_forward() { - mpu.Status.N = false // $0000 BPL +06 writeMem(memory, 0x0000, listOf(0x10, 0x06)) mpu.step() assertEquals(0x0002 + 0x06, mpu.PC) - } @Test fun test_bpl_negative_clear_branches_relative_backward() { - mpu.Status.N = false mpu.PC = 0x0050 // $0050 BPL -6 @@ -2351,29 +2093,24 @@ abstract class TestCommon6502 { writeMem(memory, 0x0050, listOf(0x10, rel.toShort())) mpu.step() assertEquals(0x0052 - 6, mpu.PC) - } @Test fun test_bpl_negative_set_does_not_branch() { - mpu.Status.N = true // $0000 BPL +6 writeMem(memory, 0x0000, listOf(0x10, 0x06)) mpu.step() assertEquals(0x0002, mpu.PC) - - // BRK - } + // BRK + @Test fun test_brk_pushes_pc_plus_2_and_status_then_sets_pc_to_irq_vector() { - writeMem(memory, 0xFFFE, listOf(0xCD, 0xAB)) mpu.SP = 0xff mpu.Status.I = false - // $C000 BRK memory[0xC000] = 0x00 mpu.PC = 0xC000 @@ -2431,7 +2168,6 @@ abstract class TestCommon6502 { @Test fun test_bvs_overflow_set_branches_relative_backward() { - mpu.Status.V = true mpu.PC = 0x0050 val rel = 256 + (-6) // two's complement of 6 @@ -2439,7 +2175,6 @@ abstract class TestCommon6502 { writeMem(memory, 0x0050, listOf(0x70, rel.toShort())) mpu.step() assertEquals(0x0052 - 6, mpu.PC) - } @Test @@ -2513,7 +2248,6 @@ abstract class TestCommon6502 { @Test fun test_cmp_imm_sets_zero_carry_clears_neg_flags_if_equal() { // Comparison: A == m - // $0000 CMP #10 , A will be 10 writeMem(memory, 0x0000, listOf(0xC9, 10)) mpu.A = 10 @@ -2527,7 +2261,6 @@ abstract class TestCommon6502 { @Test fun test_cmp_imm_clears_zero_carry_takes_neg_if_less_unsigned() { // Comparison: A < m (unsigned) - // $0000 CMP #10 , A will be 1 writeMem(memory, 0x0000, listOf(0xC9, 10)) mpu.A = 1 @@ -2536,13 +2269,11 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) // 0x01-0x0A=0xF7 assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) - } @Test fun test_cmp_imm_clears_zero_sets_carry_takes_neg_if_less_signed() { // Comparison: A < #nn (signed), A negative - // $0000 CMP #1, A will be -1 (0xFF) writeMem(memory, 0x0000, listOf(0xC9, 1)) mpu.A = 0xFF @@ -2551,13 +2282,11 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) // 0xFF-0x01=0xFE assertFalse(mpu.Status.Z) assertTrue(mpu.Status.C) // A>m unsigned - } @Test fun test_cmp_imm_clears_zero_carry_takes_neg_if_less_signed_nega() { // Comparison: A < m (signed), A and m both negative - // $0000 CMP #0xFF (-1), A will be -2 (0xFE) writeMem(memory, 0x0000, listOf(0xC9, 0xFF)) mpu.A = 0xFE @@ -2566,13 +2295,11 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.N) // 0xFE-0xFF=0xFF assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) // A m (unsigned) - // $0000 CMP #1 , A will be 10 writeMem(memory, 0x0000, listOf(0xC9, 1)) mpu.A = 10 @@ -2586,7 +2313,6 @@ abstract class TestCommon6502 { @Test fun test_cmp_imm_clears_zero_carry_takes_neg_if_more_signed() { // Comparison: A > m (signed), memory negative - // $0000 CMP #$FF (-1), A will be 2 writeMem(memory, 0x0000, listOf(0xC9, 0xFF)) mpu.A = 2 @@ -2600,7 +2326,6 @@ abstract class TestCommon6502 { @Test fun test_cmp_imm_clears_zero_carry_takes_neg_if_more_signed_nega() { // Comparison: A > m (signed), A and m both negative - // $0000 CMP #$FE (-2), A will be -1 (0xFF) writeMem(memory, 0x0000, listOf(0xC9, 0xFE)) mpu.A = 0xFF @@ -2612,10 +2337,10 @@ abstract class TestCommon6502 { } // CPX Immediate + @Test fun test_cpx_imm_sets_zero_carry_clears_neg_flags_if_equal() { // Comparison: X == m - // $0000 CPX #$20 writeMem(memory, 0x0000, listOf(0xE0, 0x20)) mpu.X = 0x20 @@ -2627,10 +2352,10 @@ abstract class TestCommon6502 { } // CPY Immediate + @Test fun test_cpy_imm_sets_zero_carry_clears_neg_flags_if_equal() { // Comparison: Y == m - // $0000 CPY #$30 writeMem(memory, 0x0000, listOf(0xC0, 0x30)) mpu.Y = 0x30 @@ -2644,7 +2369,6 @@ abstract class TestCommon6502 { // DEC Absolute @Test fun test_dec_abs_decrements_memory() { - // $0000 DEC 0xABCD writeMem(memory, 0x0000, listOf(0xCE, 0xCD, 0xAB)) memory[0xABCD] = 0x10 @@ -2657,7 +2381,6 @@ abstract class TestCommon6502 { @Test fun test_dec_abs_below_00_rolls_over_and_sets_negative_flag() { - // $0000 DEC 0xABCD writeMem(memory, 0x0000, listOf(0xCE, 0xCD, 0xAB)) memory[0xABCD] = 0x00 @@ -2670,7 +2393,6 @@ abstract class TestCommon6502 { @Test fun test_dec_abs_sets_zero_flag_when_decrementing_to_zero() { - // $0000 DEC 0xABCD writeMem(memory, 0x0000, listOf(0xCE, 0xCD, 0xAB)) memory[0xABCD] = 0x01 @@ -2682,9 +2404,9 @@ abstract class TestCommon6502 { } // DEC Zero Page + @Test fun test_dec_zp_decrements_memory() { - // $0000 DEC 0x0010 writeMem(memory, 0x0000, listOf(0xC6, 0x10)) memory[0x0010] = 0x10 @@ -2693,12 +2415,10 @@ abstract class TestCommon6502 { assertEquals(0x0F, memory[0x0010]) assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_dec_zp_below_00_rolls_over_and_sets_negative_flag() { - // $0000 DEC 0x0010 writeMem(memory, 0x0000, listOf(0xC6, 0x10)) memory[0x0010] = 0x00 @@ -2711,7 +2431,6 @@ abstract class TestCommon6502 { @Test fun test_dec_zp_sets_zero_flag_when_decrementing_to_zero() { - // $0000 DEC 0x0010 writeMem(memory, 0x0000, listOf(0xC6, 0x10)) memory[0x0010] = 0x01 @@ -2723,9 +2442,9 @@ abstract class TestCommon6502 { } // DEC Absolute, X-Indexed + @Test fun test_dec_abs_x_decrements_memory() { - // $0000 DEC 0xABCD,X writeMem(memory, 0x0000, listOf(0xDE, 0xCD, 0xAB)) mpu.X = 0x03 @@ -2739,7 +2458,6 @@ abstract class TestCommon6502 { @Test fun test_dec_abs_x_below_00_rolls_over_and_sets_negative_flag() { - // $0000 DEC 0xABCD,X writeMem(memory, 0x0000, listOf(0xDE, 0xCD, 0xAB)) memory[0xABCD + mpu.X] = 0x00 @@ -2752,7 +2470,6 @@ abstract class TestCommon6502 { @Test fun test_dec_abs_x_sets_zero_flag_when_decrementing_to_zero() { - // $0000 DEC 0xABCD,X writeMem(memory, 0x0000, listOf(0xDE, 0xCD, 0xAB)) memory[0xABCD + mpu.X] = 0x01 @@ -2764,9 +2481,9 @@ abstract class TestCommon6502 { } // DEC Zero Page, X-Indexed + @Test fun test_dec_zp_x_decrements_memory() { - // $0000 DEC 0x0010,X writeMem(memory, 0x0000, listOf(0xD6, 0x10)) mpu.X = 0x03 @@ -2780,7 +2497,6 @@ abstract class TestCommon6502 { @Test fun test_dec_zp_x_below_00_rolls_over_and_sets_negative_flag() { - // $0000 DEC 0x0010,X writeMem(memory, 0x0000, listOf(0xD6, 0x10)) mpu.X = 0x03 @@ -2794,7 +2510,6 @@ abstract class TestCommon6502 { @Test fun test_dec_zp_x_sets_zero_flag_when_decrementing_to_zero() { - // $0000 DEC 0x0010,X writeMem(memory, 0x0000, listOf(0xD6, 0x10)) mpu.X = 0x03 @@ -2807,6 +2522,7 @@ abstract class TestCommon6502 { } // DEX + @Test fun test_dex_decrements_x() { mpu.X = 0x10 @@ -2844,6 +2560,7 @@ abstract class TestCommon6502 { } // DEY + @Test fun test_dey_decrements_y() { mpu.Y = 0x10 @@ -2869,7 +2586,6 @@ abstract class TestCommon6502 { @Test fun test_dey_sets_zero_flag_when_decrementing_to_zero() { - mpu.Y = 0x01 // $0000 DEY memory[0x0000] = 0x88 @@ -2880,9 +2596,9 @@ abstract class TestCommon6502 { } // EOR Absolute + @Test fun test_eor_absolute_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF writeMem(memory, 0x0000, listOf(0x4D, 0xCD, 0xAB)) memory[0xABCD] = 0xFF @@ -2891,12 +2607,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertEquals(0xFF, memory[0xABCD]) assertTrue(mpu.Status.Z) - } @Test fun test_eor_absolute_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 writeMem(memory, 0x0000, listOf(0x4D, 0xCD, 0xAB)) memory[0xABCD] = 0xFF @@ -2906,14 +2620,12 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0xABCD]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // EOR Zero Page - } + // EOR Zero Page + @Test fun test_eor_zp_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF writeMem(memory, 0x0000, listOf(0x45, 0x10)) memory[0x0010] = 0xFF @@ -2922,12 +2634,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertEquals(0xFF, memory[0x0010]) assertTrue(mpu.Status.Z) - } @Test fun test_eor_zp_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 writeMem(memory, 0x0000, listOf(0x45, 0x10)) memory[0x0010] = 0xFF @@ -2937,26 +2647,22 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0x0010]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // EOR Immediate - } + // EOR Immediate + @Test fun test_eor_immediate_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF writeMem(memory, 0x0000, listOf(0x49, 0xFF)) mpu.step() assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_eor_immediate_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 writeMem(memory, 0x0000, listOf(0x49, 0xFF)) mpu.step() @@ -2964,14 +2670,12 @@ abstract class TestCommon6502 { assertEquals(0xFF, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // EOR Absolute, X-Indexed - } + // EOR Absolute, X-Indexed + @Test fun test_eor_abs_x_indexed_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF mpu.X = 0x03 writeMem(memory, 0x0000, listOf(0x5D, 0xCD, 0xAB)) @@ -2981,12 +2685,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertEquals(0xFF, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.Z) - } @Test fun test_eor_abs_x_indexed_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 mpu.X = 0x03 writeMem(memory, 0x0000, listOf(0x5D, 0xCD, 0xAB)) @@ -2997,14 +2699,12 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // EOR Absolute, Y-Indexed - } + // EOR Absolute, Y-Indexed + @Test fun test_eor_abs_y_indexed_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF mpu.Y = 0x03 writeMem(memory, 0x0000, listOf(0x59, 0xCD, 0xAB)) @@ -3014,12 +2714,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertEquals(0xFF, memory[0xABCD + mpu.Y]) assertTrue(mpu.Status.Z) - } @Test fun test_eor_abs_y_indexed_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 mpu.Y = 0x03 writeMem(memory, 0x0000, listOf(0x59, 0xCD, 0xAB)) @@ -3030,14 +2728,12 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0xABCD + mpu.Y]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // EOR Indirect, Indexed (X) - } + // EOR Indirect, Indexed (X) + @Test fun test_eor_ind_indexed_x_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF mpu.X = 0x03 writeMem(memory, 0x0000, listOf(0x41, 0x10)) // => EOR listOf($0010,X) @@ -3048,12 +2744,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertEquals(0xFF, memory[0xABCD]) assertTrue(mpu.Status.Z) - } @Test fun test_eor_ind_indexed_x_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 mpu.X = 0x03 writeMem(memory, 0x0000, listOf(0x41, 0x10)) // => EOR listOf($0010,X) @@ -3065,14 +2759,12 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0xABCD]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // EOR Indexed, Indirect (Y) - } + // EOR Indexed, Indirect (Y) + @Test fun test_eor_indexed_ind_y_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF mpu.Y = 0x03 writeMem(memory, 0x0000, listOf(0x51, 0x10)) // => EOR listOf($0010),Y @@ -3083,12 +2775,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertEquals(0xFF, memory[0xABCD + mpu.Y]) assertTrue(mpu.Status.Z) - } @Test fun test_eor_indexed_ind_y_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 mpu.Y = 0x03 writeMem(memory, 0x0000, listOf(0x51, 0x10)) // => EOR listOf($0010),Y @@ -3100,14 +2790,12 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0xABCD + mpu.Y]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // EOR Zero Page, X-Indexed - } + // EOR Zero Page, X-Indexed + @Test fun test_eor_zp_x_indexed_flips_bits_over_setting_z_flag() { - mpu.A = 0xFF mpu.X = 0x03 writeMem(memory, 0x0000, listOf(0x55, 0x10)) @@ -3117,12 +2805,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertEquals(0xFF, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.Z) - } @Test fun test_eor_zp_x_indexed_flips_bits_over_setting_n_flag() { - mpu.A = 0x00 mpu.X = 0x03 writeMem(memory, 0x0000, listOf(0x55, 0x10)) @@ -3133,14 +2819,12 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // INC Absolute - } + // INC Absolute + @Test fun test_inc_abs_increments_memory() { - writeMem(memory, 0x0000, listOf(0xEE, 0xCD, 0xAB)) memory[0xABCD] = 0x09 mpu.step() @@ -3148,12 +2832,10 @@ abstract class TestCommon6502 { assertEquals(0x0A, memory[0xABCD]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_abs_increments_memory_rolls_over_and_sets_zero_flag() { - writeMem(memory, 0x0000, listOf(0xEE, 0xCD, 0xAB)) memory[0xABCD] = 0xFF mpu.step() @@ -3161,12 +2843,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_abs_sets_negative_flag_when_incrementing_above_7F() { - writeMem(memory, 0x0000, listOf(0xEE, 0xCD, 0xAB)) memory[0xABCD] = 0x7F mpu.step() @@ -3174,14 +2854,12 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0xABCD]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - - // INC Zero Page - } + // INC Zero Page + @Test fun test_inc_zp_increments_memory() { - writeMem(memory, 0x0000, listOf(0xE6, 0x10)) memory[0x0010] = 0x09 mpu.step() @@ -3189,12 +2867,10 @@ abstract class TestCommon6502 { assertEquals(0x0A, memory[0x0010]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_zp_increments_memory_rolls_over_and_sets_zero_flag() { - writeMem(memory, 0x0000, listOf(0xE6, 0x10)) memory[0x0010] = 0xFF mpu.step() @@ -3202,12 +2878,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_zp_sets_negative_flag_when_incrementing_above_7F() { - writeMem(memory, 0x0000, listOf(0xE6, 0x10)) memory[0x0010] = 0x7F mpu.step() @@ -3215,14 +2889,12 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0x0010]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - - // INC Absolute, X-Indexed - } + // INC Absolute, X-Indexed + @Test fun test_inc_abs_x_increments_memory() { - writeMem(memory, 0x0000, listOf(0xFE, 0xCD, 0xAB)) mpu.X = 0x03 memory[0xABCD + mpu.X] = 0x09 @@ -3231,12 +2903,10 @@ abstract class TestCommon6502 { assertEquals(0x0A, memory[0xABCD + mpu.X]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_abs_x_increments_memory_rolls_over_and_sets_zero_flag() { - writeMem(memory, 0x0000, listOf(0xFE, 0xCD, 0xAB)) mpu.X = 0x03 memory[0xABCD + mpu.X] = 0xFF @@ -3245,12 +2915,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_abs_x_sets_negative_flag_when_incrementing_above_7F() { - writeMem(memory, 0x0000, listOf(0xFE, 0xCD, 0xAB)) mpu.X = 0x03 memory[0xABCD + mpu.X] = 0x7F @@ -3259,14 +2927,12 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0xABCD + mpu.X]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - - // INC Zero Page, X-Indexed - } + // INC Zero Page, X-Indexed + @Test fun test_inc_zp_x_increments_memory() { - writeMem(memory, 0x0000, listOf(0xF6, 0x10)) mpu.X = 0x03 memory[0x0010 + mpu.X] = 0x09 @@ -3275,12 +2941,10 @@ abstract class TestCommon6502 { assertEquals(0x0A, memory[0x0010 + mpu.X]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_zp_x_increments_memory_rolls_over_and_sets_zero_flag() { - writeMem(memory, 0x0000, listOf(0xF6, 0x10)) memory[0x0010 + mpu.X] = 0xFF mpu.step() @@ -3288,12 +2952,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inc_zp_x_sets_negative_flag_when_incrementing_above_7F() { - writeMem(memory, 0x0000, listOf(0xF6, 0x10)) memory[0x0010 + mpu.X] = 0x7F mpu.step() @@ -3301,14 +2963,12 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0x0010 + mpu.X]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - - // INX - } + // INX + @Test fun test_inx_increments_x() { - mpu.X = 0x09 memory[0x0000] = 0xE8 // => INX mpu.step() @@ -3316,19 +2976,16 @@ abstract class TestCommon6502 { assertEquals(0x0A, mpu.X) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_inx_above_FF_rolls_over_and_sets_zero_flag() { - mpu.X = 0xFF memory[0x0000] = 0xE8 // => INX mpu.step() assertEquals(0x0001, mpu.PC) assertEquals(0x00, mpu.X) assertTrue(mpu.Status.Z) - } @Test @@ -3345,7 +3002,6 @@ abstract class TestCommon6502 { @Test fun test_iny_increments_y() { - mpu.Y = 0x09 memory[0x0000] = 0xC8 // => INY mpu.step() @@ -3357,58 +3013,49 @@ abstract class TestCommon6502 { @Test fun test_iny_above_FF_rolls_over_and_sets_zero_flag() { - mpu.Y = 0xFF memory[0x0000] = 0xC8 // => INY mpu.step() assertEquals(0x0001, mpu.PC) assertEquals(0x00, mpu.Y) assertTrue(mpu.Status.Z) - } @Test fun test_iny_sets_negative_flag_when_incrementing_above_7F() { - mpu.Y = 0x7f memory[0x0000] = 0xC8 // => INY mpu.step() assertEquals(0x0001, mpu.PC) assertEquals(0x80, mpu.Y) assertTrue(mpu.Status.N) - - // JMP Absolute - } + // JMP Absolute + @Test fun test_jmp_abs_jumps_to_absolute_address() { - // $0000 JMP $ABCD writeMem(memory, 0x0000, listOf(0x4C, 0xCD, 0xAB)) mpu.step() assertEquals(0xABCD, mpu.PC) - - // JMP Indirect - } + // JMP Indirect + @Test fun test_jmp_ind_jumps_to_indirect_address() { - // $0000 JMP ($ABCD) writeMem(memory, 0x0000, listOf(0x6C, 0x00, 0x02)) writeMem(memory, 0x0200, listOf(0xCD, 0xAB)) mpu.step() assertEquals(0xABCD, mpu.PC) - - // JSR - } + // JSR + @Test fun test_jsr_pushes_pc_plus_2_and_sets_pc() { - // $C000 JSR $FFD2 mpu.SP = 0xFF writeMem(memory, 0xC000, listOf(0x20, 0xD2, 0xFF)) @@ -3424,7 +3071,6 @@ abstract class TestCommon6502 { @Test fun test_lda_absolute_loads_a_sets_n_flag() { - mpu.A = 0x00 // $0000 LDA $ABCD writeMem(memory, 0x0000, listOf(0xAD, 0xCD, 0xAB)) @@ -3434,12 +3080,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_lda_absolute_loads_a_sets_z_flag() { - mpu.A = 0xFF // $0000 LDA $ABCD writeMem(memory, 0x0000, listOf(0xAD, 0xCD, 0xAB)) @@ -3449,14 +3093,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDA Zero Page - } + // LDA Zero Page + @Test fun test_lda_zp_loads_a_sets_n_flag() { - mpu.A = 0x00 // $0000 LDA $0010 writeMem(memory, 0x0000, listOf(0xA5, 0x10)) @@ -3466,12 +3108,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_lda_zp_loads_a_sets_z_flag() { - mpu.A = 0xFF // $0000 LDA $0010 writeMem(memory, 0x0000, listOf(0xA5, 0x10)) @@ -3481,14 +3121,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDA Immediate - } + // LDA Immediate + @Test fun test_lda_immediate_loads_a_sets_n_flag() { - mpu.A = 0x00 // $0000 LDA #$80 writeMem(memory, 0x0000, listOf(0xA9, 0x80)) @@ -3497,12 +3135,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_lda_immediate_loads_a_sets_z_flag() { - mpu.A = 0xFF // $0000 LDA #$00 writeMem(memory, 0x0000, listOf(0xA9, 0x00)) @@ -3511,14 +3147,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDA Absolute, X-Indexed - } + // LDA Absolute, X-Indexed + @Test fun test_lda_abs_x_indexed_loads_a_sets_n_flag() { - mpu.A = 0x00 mpu.X = 0x03 // $0000 LDA $ABCD,X @@ -3529,12 +3163,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_lda_abs_x_indexed_loads_a_sets_z_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 LDA $ABCD,X @@ -3545,12 +3177,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_lda_abs_x_indexed_does_not_page_wrap() { - mpu.A = 0 mpu.X = 0xFF // $0000 LDA $0080,X @@ -3559,14 +3189,12 @@ abstract class TestCommon6502 { mpu.step() assertEquals(0x0003, mpu.PC) assertEquals(0x42, mpu.A) - - // LDA Absolute, Y-Indexed - } + // LDA Absolute, Y-Indexed + @Test fun test_lda_abs_y_indexed_loads_a_sets_n_flag() { - mpu.A = 0x00 mpu.Y = 0x03 // $0000 LDA $ABCD,Y @@ -3577,12 +3205,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_lda_abs_y_indexed_loads_a_sets_z_flag() { - mpu.A = 0xFF mpu.Y = 0x03 // $0000 LDA $ABCD,Y @@ -3593,12 +3219,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_lda_abs_y_indexed_does_not_page_wrap() { - mpu.A = 0 mpu.Y = 0xFF // $0000 LDA $0080,X @@ -3607,14 +3231,12 @@ abstract class TestCommon6502 { mpu.step() assertEquals(0x0003, mpu.PC) assertEquals(0x42, mpu.A) - - // LDA Indirect, Indexed (X) - } + // LDA Indirect, Indexed (X) + @Test fun test_lda_ind_indexed_x_loads_a_sets_n_flag() { - mpu.A = 0x00 mpu.X = 0x03 // $0000 LDA ($0010,X) @@ -3627,12 +3249,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_lda_ind_indexed_x_loads_a_sets_z_flag() { - mpu.A = 0x00 mpu.X = 0x03 // $0000 LDA ($0010,X) @@ -3645,14 +3265,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDA Indexed, Indirect (Y) - } + // LDA Indexed, Indirect (Y) + @Test fun test_lda_indexed_ind_y_loads_a_sets_n_flag() { - mpu.A = 0x00 mpu.Y = 0x03 // $0000 LDA ($0010),Y @@ -3665,12 +3283,24 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) + } + @Test + fun test_lda_indexed_ind_y_correct_index() { + mpu.A = 0x00 + mpu.Y = 0xf3 + // $0000 LDA ($0010),Y + // $0010 Vector to $ABCD + writeMem(memory, 0x0000, listOf(0xB1, 0x10)) + writeMem(memory, 0x0010, listOf(0xCD, 0xAB)) + memory[0xABCD + mpu.Y] = 0x80 + mpu.step() + assertEquals(0x0002, mpu.PC) + assertEquals(0x80, mpu.A) } @Test fun test_lda_indexed_ind_y_loads_a_sets_z_flag() { - mpu.A = 0x00 mpu.Y = 0x03 // $0000 LDA ($0010),Y @@ -3683,14 +3313,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDA Zero Page, X-Indexed - } + // LDA Zero Page, X-Indexed + @Test fun test_lda_zp_x_indexed_loads_a_sets_n_flag() { - mpu.A = 0x00 mpu.X = 0x03 // $0000 LDA $10,X @@ -3701,12 +3329,22 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) + } + @Test + fun test_lda_zp_x_indexed_correct_index() { + mpu.A = 0x00 + mpu.X = 0xf3 + // $0000 LDA $10,X + writeMem(memory, 0x0000, listOf(0xB5, 0x10)) + memory[(0x0010 + mpu.X) and 255] = 0x80 + mpu.step() + assertEquals(0x0002, mpu.PC) + assertEquals(0x80, mpu.A) } @Test fun test_lda_zp_x_indexed_loads_a_sets_z_flag() { - mpu.A = 0xFF mpu.X = 0x03 // $0000 LDA $10,X @@ -3717,14 +3355,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDX Absolute - } + // LDX Absolute + @Test fun test_ldx_absolute_loads_x_sets_n_flag() { - mpu.X = 0x00 // $0000 LDX $ABCD writeMem(memory, 0x0000, listOf(0xAE, 0xCD, 0xAB)) @@ -3734,12 +3370,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.X) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldx_absolute_loads_x_sets_z_flag() { - mpu.X = 0xFF // $0000 LDX $ABCD writeMem(memory, 0x0000, listOf(0xAE, 0xCD, 0xAB)) @@ -3749,14 +3383,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.X) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDX Zero Page - } + // LDX Zero Page + @Test fun test_ldx_zp_loads_x_sets_n_flag() { - mpu.X = 0x00 // $0000 LDX $0010 writeMem(memory, 0x0000, listOf(0xA6, 0x10)) @@ -3766,12 +3398,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.X) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldx_zp_loads_x_sets_z_flag() { - mpu.X = 0xFF // $0000 LDX $0010 writeMem(memory, 0x0000, listOf(0xA6, 0x10)) @@ -3781,14 +3411,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.X) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDX Immediate - } + // LDX Immediate + @Test fun test_ldx_immediate_loads_x_sets_n_flag() { - mpu.X = 0x00 // $0000 LDX #$80 writeMem(memory, 0x0000, listOf(0xA2, 0x80)) @@ -3797,12 +3425,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.X) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldx_immediate_loads_x_sets_z_flag() { - mpu.X = 0xFF // $0000 LDX #$00 writeMem(memory, 0x0000, listOf(0xA2, 0x00)) @@ -3811,14 +3437,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.X) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDX Absolute, Y-Indexed - } + // LDX Absolute, Y-Indexed + @Test fun test_ldx_abs_y_indexed_loads_x_sets_n_flag() { - mpu.X = 0x00 mpu.Y = 0x03 // $0000 LDX $ABCD,Y @@ -3829,12 +3453,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.X) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldx_abs_y_indexed_loads_x_sets_z_flag() { - mpu.X = 0xFF mpu.Y = 0x03 // $0000 LDX $ABCD,Y @@ -3845,14 +3467,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.X) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDX Zero Page, Y-Indexed - } + // LDX Zero Page, Y-Indexed + @Test fun test_ldx_zp_y_indexed_loads_x_sets_n_flag() { - mpu.X = 0x00 mpu.Y = 0x03 // $0000 LDX $0010,Y @@ -3863,12 +3483,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.X) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldx_zp_y_indexed_loads_x_sets_z_flag() { - mpu.X = 0xFF mpu.Y = 0x03 // $0000 LDX $0010,Y @@ -3879,14 +3497,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.X) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDY Absolute - } + // LDY Absolute + @Test fun test_ldy_absolute_loads_y_sets_n_flag() { - mpu.Y = 0x00 // $0000 LDY $ABCD writeMem(memory, 0x0000, listOf(0xAC, 0xCD, 0xAB)) @@ -3896,12 +3512,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.Y) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldy_absolute_loads_y_sets_z_flag() { - mpu.Y = 0xFF // $0000 LDY $ABCD writeMem(memory, 0x0000, listOf(0xAC, 0xCD, 0xAB)) @@ -3911,14 +3525,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.Y) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDY Zero Page - } + // LDY Zero Page + @Test fun test_ldy_zp_loads_y_sets_n_flag() { - mpu.Y = 0x00 // $0000 LDY $0010 writeMem(memory, 0x0000, listOf(0xA4, 0x10)) @@ -3928,12 +3540,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.Y) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldy_zp_loads_y_sets_z_flag() { - mpu.Y = 0xFF // $0000 LDY $0010 writeMem(memory, 0x0000, listOf(0xA4, 0x10)) @@ -3943,14 +3553,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.Y) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDY Immediate - } + // LDY Immediate + @Test fun test_ldy_immediate_loads_y_sets_n_flag() { - mpu.Y = 0x00 // $0000 LDY #$80 writeMem(memory, 0x0000, listOf(0xA0, 0x80)) @@ -3959,12 +3567,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.Y) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldy_immediate_loads_y_sets_z_flag() { - mpu.Y = 0xFF // $0000 LDY #$00 writeMem(memory, 0x0000, listOf(0xA0, 0x00)) @@ -3973,14 +3579,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.Y) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDY Absolute, X-Indexed - } + // LDY Absolute, X-Indexed + @Test fun test_ldy_abs_x_indexed_loads_x_sets_n_flag() { - mpu.Y = 0x00 mpu.X = 0x03 // $0000 LDY $ABCD,X @@ -3991,12 +3595,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.Y) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldy_abs_x_indexed_loads_x_sets_z_flag() { - mpu.Y = 0xFF mpu.X = 0x03 // $0000 LDY $ABCD,X @@ -4007,14 +3609,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.Y) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LDY Zero Page, X-Indexed - } + // LDY Zero Page, X-Indexed + @Test fun test_ldy_zp_x_indexed_loads_x_sets_n_flag() { - mpu.Y = 0x00 mpu.X = 0x03 // $0000 LDY $0010,X @@ -4025,12 +3625,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.Y) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_ldy_zp_x_indexed_loads_x_sets_z_flag() { - mpu.Y = 0xFF mpu.X = 0x03 // $0000 LDY $0010,X @@ -4041,14 +3639,12 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.Y) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - - // LSR Accumulator - } + // LSR Accumulator + @Test fun test_lsr_accumulator_rotates_in_zero_not_carry() { - mpu.Status.C = true // $0000 LSR A memory[0x0000] = (0x4A) @@ -4059,12 +3655,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_accumulator_sets_carry_and_zero_flags_after_rotation() { - mpu.Status.C = false // $0000 LSR A memory[0x0000] = (0x4A) @@ -4075,12 +3669,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_accumulator_rotates_bits_right() { - mpu.Status.C = true // $0000 LSR A memory[0x0000] = (0x4A) @@ -4091,14 +3683,12 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - - // LSR Absolute - } + // LSR Absolute + @Test fun test_lsr_absolute_rotates_in_zero_not_carry() { - mpu.Status.C = true // $0000 LSR $ABCD writeMem(memory, 0x0000, listOf(0x4E, 0xCD, 0xAB)) @@ -4109,12 +3699,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_absolute_sets_carry_and_zero_flags_after_rotation() { - mpu.Status.C = false // $0000 LSR $ABCD writeMem(memory, 0x0000, listOf(0x4E, 0xCD, 0xAB)) @@ -4125,12 +3713,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_absolute_rotates_bits_right() { - mpu.Status.C = true // $0000 LSR $ABCD writeMem(memory, 0x0000, listOf(0x4E, 0xCD, 0xAB)) @@ -4141,14 +3727,12 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - - // LSR Zero Page - } + // LSR Zero Page + @Test fun test_lsr_zp_rotates_in_zero_not_carry() { - mpu.Status.C = true // $0000 LSR $0010 writeMem(memory, 0x0000, listOf(0x46, 0x10)) @@ -4159,12 +3743,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_zp_sets_carry_and_zero_flags_after_rotation() { - mpu.Status.C = false // $0000 LSR $0010 writeMem(memory, 0x0000, listOf(0x46, 0x10)) @@ -4175,12 +3757,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_zp_rotates_bits_right() { - mpu.Status.C = true // $0000 LSR $0010 writeMem(memory, 0x0000, listOf(0x46, 0x10)) @@ -4191,14 +3771,12 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - - // LSR Absolute, X-Indexed - } + // LSR Absolute, X-Indexed + @Test fun test_lsr_abs_x_indexed_rotates_in_zero_not_carry() { - mpu.Status.C = true mpu.X = 0x03 // $0000 LSR $ABCD,X @@ -4210,12 +3788,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_abs_x_indexed_sets_c_and_z_flags_after_rotation() { - mpu.Status.C = false mpu.X = 0x03 // $0000 LSR $ABCD,X @@ -4227,12 +3803,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_abs_x_indexed_rotates_bits_right() { - mpu.Status.C = true // $0000 LSR $ABCD,X writeMem(memory, 0x0000, listOf(0x5E, 0xCD, 0xAB)) @@ -4243,14 +3817,12 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - - // LSR Zero Page, X-Indexed - } + // LSR Zero Page, X-Indexed + @Test fun test_lsr_zp_x_indexed_rotates_in_zero_not_carry() { - mpu.Status.C = true mpu.X = 0x03 // $0000 LSR $0010,X @@ -4262,12 +3834,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_zp_x_indexed_sets_carry_and_zero_flags_after_rotation() { - mpu.Status.C = false mpu.X = 0x03 // $0000 LSR $0010,X @@ -4279,12 +3849,10 @@ abstract class TestCommon6502 { assertTrue(mpu.Status.Z) assertTrue(mpu.Status.C) assertFalse(mpu.Status.N) - } @Test fun test_lsr_zp_x_indexed_rotates_bits_right() { - mpu.Status.C = true mpu.X = 0x03 // $0000 LSR $0010,X @@ -4296,26 +3864,22 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.Z) assertFalse(mpu.Status.C) assertFalse(mpu.Status.N) - - // NOP - } + // NOP + @Test fun test_nop_does_nothing() { - // $0000 NOP memory[0x0000] = 0xEA mpu.step() assertEquals(0x0001, mpu.PC) - - // ORA Absolute - } + // ORA Absolute + @Test fun test_ora_absolute_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 // $0000 ORA $ABCD @@ -4325,12 +3889,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_absolute_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 // $0000 ORA $ABCD @@ -4341,14 +3903,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ORA Zero Page - } + // ORA Zero Page + @Test fun test_ora_zp_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 // $0000 ORA $0010 @@ -4358,12 +3918,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_zp_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 // $0000 ORA $0010 @@ -4374,14 +3932,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ORA Immediate - } + // ORA Immediate + @Test fun test_ora_immediate_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 // $0000 ORA #$00 @@ -4390,12 +3946,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_immediate_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 // $0000 ORA #$82 @@ -4405,14 +3959,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ORA Absolute, X - } + // ORA Absolute, X + @Test fun test_ora_abs_x_indexed_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 mpu.X = 0x03 @@ -4423,12 +3975,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_abs_x_indexed_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 mpu.X = 0x03 @@ -4440,14 +3990,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ORA Absolute, Y - } + // ORA Absolute, Y + @Test fun test_ora_abs_y_indexed_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 mpu.Y = 0x03 @@ -4458,12 +4006,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_abs_y_indexed_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 mpu.Y = 0x03 @@ -4475,14 +4021,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ORA Indirect, Indexed (X) - } + // ORA Indirect, Indexed (X) + @Test fun test_ora_ind_indexed_x_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 mpu.X = 0x03 @@ -4495,12 +4039,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_ind_indexed_x_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 mpu.X = 0x03 @@ -4514,14 +4056,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ORA Indexed, Indirect (Y) - } + // ORA Indexed, Indirect (Y) + @Test fun test_ora_indexed_ind_y_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 mpu.Y = 0x03 @@ -4534,12 +4074,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_indexed_ind_y_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 mpu.Y = 0x03 @@ -4553,14 +4091,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // ORA Zero Page, X - } + // ORA Zero Page, X + @Test fun test_ora_zp_x_indexed_zeroes_or_zeros_sets_z_flag() { - mpu.Status.Z = false mpu.A = 0x00 mpu.X = 0x03 @@ -4571,12 +4107,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) - } @Test fun test_ora_zp_x_indexed_turns_bits_on_sets_n_flag() { - mpu.Status.N = false mpu.A = 0x03 mpu.X = 0x03 @@ -4588,14 +4122,12 @@ abstract class TestCommon6502 { assertEquals(0x83, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - - // PHA - } + // PHA + @Test fun test_pha_pushes_a_and_updates_sp() { - mpu.A = 0xAB // $0000 PHA memory[0x0000] = 0x48 @@ -4607,6 +4139,7 @@ abstract class TestCommon6502 { } // PHP + @Test fun test_php_pushes_processor_status_and_updates_sp() { for (flags in 0 until 0x100) { @@ -4619,13 +4152,12 @@ abstract class TestCommon6502 { assertEquals(0xFC, mpu.SP) assertEquals((flags or fBREAK or fUNUSED), memory[0x1FD].toInt()) } - } // PLA + @Test fun test_pla_pulls_top_byte_from_stack_into_a_and_updates_sp() { - // $0000 PLA memory[0x0000] = 0x68 memory[0x01FF] = 0xAB @@ -4634,14 +4166,12 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0xAB, mpu.A) assertEquals(0xFF, mpu.SP) - - // PLP - } + // PLP + @Test fun test_plp_pulls_top_byte_from_stack_into_flags_and_updates_sp() { - // $0000 PLP memory[0x0000] = 0x28 memory[0x01FF] = 0xBA // must have BREAK and UNUSED set @@ -4650,14 +4180,12 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0xBA, mpu.Status.asByte()) assertEquals(0xFF, mpu.SP) - - // ROL Accumulator - } + // ROL Accumulator + @Test fun test_rol_accumulator_zero_and_carry_zero_sets_z_flag() { - mpu.A = 0x00 mpu.Status.C = false // $0000 ROL A @@ -4667,12 +4195,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_accumulator_80_and_carry_zero_sets_z_flag() { - mpu.A = 0x80 mpu.Status.C = false mpu.Status.Z = false @@ -4687,7 +4213,6 @@ abstract class TestCommon6502 { @Test fun test_rol_accumulator_zero_and_carry_one_clears_z_flag() { - mpu.A = 0x00 mpu.Status.C = true // $0000 ROL A @@ -4697,12 +4222,10 @@ abstract class TestCommon6502 { assertEquals(0x01, mpu.A) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_accumulator_sets_n_flag() { - mpu.A = 0x40 mpu.Status.C = true // $0000 ROL A @@ -4712,12 +4235,10 @@ abstract class TestCommon6502 { assertEquals(0x81, mpu.A) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_rol_accumulator_shifts_out_zero() { - mpu.A = 0x7F mpu.Status.C = false // $0000 ROL A @@ -4726,12 +4247,10 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0xFE, mpu.A) assertFalse(mpu.Status.C) - } @Test fun test_rol_accumulator_shifts_out_one() { - mpu.A = 0xFF mpu.Status.C = false // $0000 ROL A @@ -4740,14 +4259,12 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0xFE, mpu.A) assertTrue(mpu.Status.C) - - // ROL Absolute - } + // ROL Absolute + @Test fun test_rol_absolute_zero_and_carry_zero_sets_z_flag() { - mpu.Status.C = false // $0000 ROL $ABCD writeMem(memory, 0x0000, listOf(0x2E, 0xCD, 0xAB)) @@ -4757,12 +4274,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_absolute_80_and_carry_zero_sets_z_flag() { - mpu.Status.C = false mpu.Status.Z = false // $0000 ROL $ABCD @@ -4773,12 +4288,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_absolute_zero_and_carry_one_clears_z_flag() { - mpu.A = 0x00 mpu.Status.C = true // $0000 ROL $ABCD @@ -4789,12 +4302,10 @@ abstract class TestCommon6502 { assertEquals(0x01, memory[0xABCD]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_absolute_sets_n_flag() { - mpu.Status.C = true // $0000 ROL $ABCD writeMem(memory, 0x0000, listOf(0x2E, 0xCD, 0xAB)) @@ -4804,12 +4315,10 @@ abstract class TestCommon6502 { assertEquals(0x81, memory[0xABCD]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_rol_absolute_shifts_out_zero() { - mpu.Status.C = false // $0000 ROL $ABCD writeMem(memory, 0x0000, listOf(0x2E, 0xCD, 0xAB)) @@ -4818,12 +4327,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0xFE, memory[0xABCD]) assertFalse(mpu.Status.C) - } @Test fun test_rol_absolute_shifts_out_one() { - mpu.Status.C = false // $0000 ROL $ABCD writeMem(memory, 0x0000, listOf(0x2E, 0xCD, 0xAB)) @@ -4832,14 +4339,12 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0xFE, memory[0xABCD]) assertTrue(mpu.Status.C) - - // ROL Zero Page - } + // ROL Zero Page + @Test fun test_rol_zp_zero_and_carry_zero_sets_z_flag() { - mpu.Status.C = false // $0000 ROL $0010 writeMem(memory, 0x0000, listOf(0x26, 0x10)) @@ -4849,12 +4354,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_zp_80_and_carry_zero_sets_z_flag() { - mpu.Status.C = false mpu.Status.Z = false // $0000 ROL $0010 @@ -4865,12 +4368,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_zp_zero_and_carry_one_clears_z_flag() { - mpu.A = 0x00 mpu.Status.C = true // $0000 ROL $0010 @@ -4881,12 +4382,10 @@ abstract class TestCommon6502 { assertEquals(0x01, memory[0x0010]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_zp_sets_n_flag() { - mpu.Status.C = true // $0000 ROL $0010 writeMem(memory, 0x0000, listOf(0x26, 0x10)) @@ -4896,12 +4395,10 @@ abstract class TestCommon6502 { assertEquals(0x81, memory[0x0010]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_rol_zp_shifts_out_zero() { - mpu.Status.C = false // $0000 ROL $0010 writeMem(memory, 0x0000, listOf(0x26, 0x10)) @@ -4910,12 +4407,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0xFE, memory[0x0010]) assertFalse(mpu.Status.C) - } @Test fun test_rol_zp_shifts_out_one() { - mpu.Status.C = false // $0000 ROL $0010 writeMem(memory, 0x0000, listOf(0x26, 0x10)) @@ -4924,14 +4419,12 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0xFE, memory[0x0010]) assertTrue(mpu.Status.C) - - // ROL Absolute, X-Indexed - } + // ROL Absolute, X-Indexed + @Test fun test_rol_abs_x_indexed_zero_and_carry_zero_sets_z_flag() { - mpu.Status.C = false mpu.X = 0x03 // $0000 ROL $ABCD,X @@ -4942,12 +4435,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_abs_x_indexed_80_and_carry_zero_sets_z_flag() { - mpu.Status.C = false mpu.Status.Z = false mpu.X = 0x03 @@ -4959,12 +4450,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_abs_x_indexed_zero_and_carry_one_clears_z_flag() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROL $ABCD,X @@ -4975,12 +4464,10 @@ abstract class TestCommon6502 { assertEquals(0x01, memory[0xABCD + mpu.X]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_abs_x_indexed_sets_n_flag() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROL $ABCD,X @@ -4991,12 +4478,10 @@ abstract class TestCommon6502 { assertEquals(0x81, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_rol_abs_x_indexed_shifts_out_zero() { - mpu.X = 0x03 mpu.Status.C = false // $0000 ROL $ABCD,X @@ -5006,12 +4491,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0xFE, memory[0xABCD + mpu.X]) assertFalse(mpu.Status.C) - } @Test fun test_rol_abs_x_indexed_shifts_out_one() { - mpu.X = 0x03 mpu.Status.C = false // $0000 ROL $ABCD,X @@ -5021,14 +4504,12 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0xFE, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.C) - - // ROL Zero Page, X-Indexed - } + // ROL Zero Page, X-Indexed + @Test fun test_rol_zp_x_indexed_zero_and_carry_zero_sets_z_flag() { - mpu.Status.C = false mpu.X = 0x03 writeMem(memory, 0x0000, listOf(0x36, 0x10)) @@ -5039,12 +4520,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_zp_x_indexed_80_and_carry_zero_sets_z_flag() { - mpu.Status.C = false mpu.Status.Z = false mpu.X = 0x03 @@ -5056,12 +4535,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_zp_x_indexed_zero_and_carry_one_clears_z_flag() { - mpu.X = 0x03 mpu.Status.C = true writeMem(memory, 0x0000, listOf(0x36, 0x10)) @@ -5072,12 +4549,10 @@ abstract class TestCommon6502 { assertEquals(0x01, memory[0x0010 + mpu.X]) assertFalse(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_rol_zp_x_indexed_sets_n_flag() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROL $0010,X @@ -5088,12 +4563,10 @@ abstract class TestCommon6502 { assertEquals(0x81, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.N) assertFalse(mpu.Status.Z) - } @Test fun test_rol_zp_x_indexed_shifts_out_zero() { - mpu.X = 0x03 mpu.Status.C = false // $0000 ROL $0010,X @@ -5103,12 +4576,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0xFE, memory[0x0010 + mpu.X]) assertFalse(mpu.Status.C) - } @Test fun test_rol_zp_x_indexed_shifts_out_one() { - mpu.X = 0x03 mpu.Status.C = false // $0000 ROL $0010,X @@ -5118,14 +4589,12 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0xFE, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.C) - - // ROR Accumulator - } + // ROR Accumulator + @Test fun test_ror_accumulator_zero_and_carry_zero_sets_z_flag() { - mpu.A = 0x00 mpu.Status.C = false // $0000 ROR A @@ -5135,12 +4604,10 @@ abstract class TestCommon6502 { assertEquals(0x00, mpu.A) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_ror_accumulator_zero_and_carry_one_rotates_in_sets_n_flags() { - mpu.A = 0x00 mpu.Status.C = true // $0000 ROR A @@ -5150,12 +4617,10 @@ abstract class TestCommon6502 { assertEquals(0x80, mpu.A) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - } @Test fun test_ror_accumulator_shifts_out_zero() { - mpu.A = 0x02 mpu.Status.C = true // $0000 ROR A @@ -5164,12 +4629,10 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0x81, mpu.A) assertFalse(mpu.Status.C) - } @Test fun test_ror_accumulator_shifts_out_one() { - mpu.A = 0x03 mpu.Status.C = true // $0000 ROR A @@ -5178,14 +4641,12 @@ abstract class TestCommon6502 { assertEquals(0x0001, mpu.PC) assertEquals(0x81, mpu.A) assertTrue(mpu.Status.C) - - // ROR Absolute - } + // ROR Absolute + @Test fun test_ror_absolute_zero_and_carry_zero_sets_z_flag() { - mpu.Status.C = false // $0000 ROR $ABCD writeMem(memory, 0x0000, listOf(0x6E, 0xCD, 0xAB)) @@ -5195,12 +4656,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_ror_absolute_zero_and_carry_one_rotates_in_sets_n_flags() { - mpu.Status.C = true // $0000 ROR $ABCD writeMem(memory, 0x0000, listOf(0x6E, 0xCD, 0xAB)) @@ -5210,12 +4669,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0xABCD]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - } @Test fun test_ror_absolute_shifts_out_zero() { - mpu.Status.C = true // $0000 ROR $ABCD writeMem(memory, 0x0000, listOf(0x6E, 0xCD, 0xAB)) @@ -5224,12 +4681,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x81, memory[0xABCD]) assertFalse(mpu.Status.C) - } @Test fun test_ror_absolute_shifts_out_one() { - mpu.Status.C = true // $0000 ROR $ABCD writeMem(memory, 0x0000, listOf(0x6E, 0xCD, 0xAB)) @@ -5238,14 +4693,12 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x81, memory[0xABCD]) assertTrue(mpu.Status.C) - - // ROR Zero Page - } + // ROR Zero Page + @Test fun test_ror_zp_zero_and_carry_zero_sets_z_flag() { - mpu.Status.C = false // $0000 ROR $0010 writeMem(memory, 0x0000, listOf(0x66, 0x10)) @@ -5255,12 +4708,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_ror_zp_zero_and_carry_one_rotates_in_sets_n_flags() { - mpu.Status.C = true // $0000 ROR $0010 writeMem(memory, 0x0000, listOf(0x66, 0x10)) @@ -5270,12 +4721,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0x0010]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - } @Test fun test_ror_zp_zero_absolute_shifts_out_zero() { - mpu.Status.C = true // $0000 ROR $0010 writeMem(memory, 0x0000, listOf(0x66, 0x10)) @@ -5284,12 +4733,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x81, memory[0x0010]) assertFalse(mpu.Status.C) - } @Test fun test_ror_zp_shifts_out_one() { - mpu.Status.C = true // $0000 ROR $0010 writeMem(memory, 0x0000, listOf(0x66, 0x10)) @@ -5298,14 +4745,12 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x81, memory[0x0010]) assertTrue(mpu.Status.C) - - // ROR Absolute, X-Indexed - } + // ROR Absolute, X-Indexed + @Test fun test_ror_abs_x_indexed_zero_and_carry_zero_sets_z_flag() { - mpu.X = 0x03 mpu.Status.C = false // $0000 ROR $ABCD,X @@ -5316,12 +4761,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_ror_abs_x_indexed_z_and_c_1_rotates_in_sets_n_flags() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROR $ABCD,X @@ -5332,12 +4775,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0xABCD + mpu.X]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - } @Test fun test_ror_abs_x_indexed_shifts_out_zero() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROR $ABCD,X @@ -5347,12 +4788,10 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x81, memory[0xABCD + mpu.X]) assertFalse(mpu.Status.C) - } @Test fun test_ror_abs_x_indexed_shifts_out_one() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROR $ABCD,X @@ -5362,14 +4801,12 @@ abstract class TestCommon6502 { assertEquals(0x0003, mpu.PC) assertEquals(0x81, memory[0xABCD + mpu.X]) assertTrue(mpu.Status.C) - - // ROR Zero Page, X-Indexed - } + // ROR Zero Page, X-Indexed + @Test fun test_ror_zp_x_indexed_zero_and_carry_zero_sets_z_flag() { - mpu.X = 0x03 mpu.Status.C = false // $0000 ROR $0010,X @@ -5380,12 +4817,10 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.Z) assertFalse(mpu.Status.N) - } @Test fun test_ror_zp_x_indexed_zero_and_carry_one_rotates_in_sets_n_flags() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROR $0010,X @@ -5396,12 +4831,10 @@ abstract class TestCommon6502 { assertEquals(0x80, memory[0x0010 + mpu.X]) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.N) - } @Test fun test_ror_zp_x_indexed_zero_absolute_shifts_out_zero() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROR $0010,X @@ -5411,12 +4844,10 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x81, memory[0x0010 + mpu.X]) assertFalse(mpu.Status.C) - } @Test fun test_ror_zp_x_indexed_shifts_out_one() { - mpu.X = 0x03 mpu.Status.C = true // $0000 ROR $0010,X @@ -5426,19 +4857,16 @@ abstract class TestCommon6502 { assertEquals(0x0002, mpu.PC) assertEquals(0x81, memory[0x0010 + mpu.X]) assertTrue(mpu.Status.C) - - // RTI - } + // RTI + @Test fun test_rti_restores_status_and_pc_and_updates_sp() { - // $0000 RTI memory[0x0000] = 0x40 writeMem(memory, 0x01FD, listOf(0xFC, 0x03, 0xC0)) // Status, PCL, PCH mpu.SP = 0xFC - mpu.step() assertEquals(0xFF, mpu.SP) assertEquals(0xFC, mpu.Status.asByte()) @@ -5447,51 +4875,45 @@ abstract class TestCommon6502 { @Test fun test_rti_forces_break_and_unused_flags_high() { - // $0000 RTI memory[0x0000] = 0x40 writeMem(memory, 0x01FD, listOf(0x00, 0x03, 0xC0)) // Status, PCL, PCH mpu.SP = 0xFC - mpu.step() assertTrue(mpu.Status.B) // assertEquals(fUNUSED, mpu.Status.asByte().toInt() and fUNUSED) } // RTS + @Test fun test_rts_restores_pc_and_increments_then_updates_sp() { - // $0000 RTS memory[0x0000] = 0x60 writeMem(memory, 0x01FE, listOf(0x03, 0xC0)) // PCL, PCH mpu.PC = 0x0000 mpu.SP = 0xFD - mpu.step() assertEquals(0xC004, mpu.PC) assertEquals(0xFF, mpu.SP) - } @Test fun test_rts_wraps_around_top_of_memory() { - // $1000 RTS memory[0x1000] = 0x60 writeMem(memory, 0x01FE, listOf(0xFF, 0xFF)) // PCL, PCH mpu.PC = 0x1000 mpu.SP = 0xFD - mpu.step() assertEquals(0x0000, mpu.PC) assertEquals(0xFF, mpu.SP) } // SBC Absolute + @Test fun test_sbc_abs_all_zeros_and_no_borrow_is_zero() { - mpu.Status.D = false mpu.Status.C = true // borrow = 0 mpu.A = 0x00 @@ -5551,6 +4973,7 @@ abstract class TestCommon6502 { } // SBC Zero Page + @Test fun test_sbc_zp_all_zeros_and_no_borrow_is_zero() { mpu.Status.D = false @@ -5964,7 +5387,6 @@ abstract class TestCommon6502 { @Test fun test_sbc_ind_y_downto_zero_no_borrow_sets_z_clears_n() { - mpu.Status.D = false mpu.Status.C = true // borrow = 0 mpu.A = 0x01 @@ -5978,12 +5400,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertTrue(mpu.Status.C) assertTrue(mpu.Status.Z) - } @Test fun test_sbc_ind_y_downto_zero_with_borrow_sets_z_clears_n() { - mpu.Status.D = false mpu.Status.C = false // borrow = 1 mpu.A = 0x01 @@ -5997,12 +5417,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertTrue(mpu.Status.C) assertTrue(mpu.Status.Z) - } @Test fun test_sbc_ind_y_downto_four_with_borrow_clears_z_n() { - mpu.Status.D = false mpu.Status.C = false // borrow = 1 mpu.A = 0x07 @@ -6016,14 +5434,12 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.C) - - // SBC Zero Page, X-Indexed - } + // SBC Zero Page, X-Indexed + @Test fun test_sbc_zp_x_all_zeros_and_no_borrow_is_zero() { - mpu.Status.D = false mpu.Status.C = true // borrow = 0 mpu.A = 0x00 @@ -6036,12 +5452,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertTrue(mpu.Status.C) assertTrue(mpu.Status.Z) - } @Test fun test_sbc_zp_x_downto_zero_no_borrow_sets_z_clears_n() { - mpu.Status.D = false mpu.Status.C = true // borrow = 0 mpu.A = 0x01 @@ -6054,12 +5468,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertTrue(mpu.Status.C) assertTrue(mpu.Status.Z) - } @Test fun test_sbc_zp_x_downto_zero_with_borrow_sets_z_clears_n() { - mpu.Status.D = false mpu.Status.C = false // borrow = 1 mpu.A = 0x01 @@ -6072,12 +5484,10 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertTrue(mpu.Status.C) assertTrue(mpu.Status.Z) - } @Test fun test_sbc_zp_x_downto_four_with_borrow_clears_z_n() { - mpu.Status.D = false mpu.Status.C = false // borrow = 1 mpu.A = 0x07 @@ -6090,28 +5500,24 @@ abstract class TestCommon6502 { assertFalse(mpu.Status.N) assertFalse(mpu.Status.Z) assertTrue(mpu.Status.C) - - // SEC - } + // SEC + @Test fun test_sec_sets_carry_flag() { - mpu.Status.C = false // $0000 SEC memory[0x0000] = 0x038 mpu.step() assertEquals(0x0001, mpu.PC) assertTrue(mpu.Status.C) - - // SED - } + // SED + @Test fun test_sed_sets_decimal_mode_flag() { - mpu.Status.D = false // $0000 SED memory[0x0000] = 0xF8 @@ -6136,7 +5542,6 @@ abstract class TestCommon6502 { @Test fun test_sta_absolute_stores_a_leaves_a_and_n_flag_unchanged() { - val flags = 0xFF and fNEGATIVE.inv() mpu.Status.fromByte(flags) mpu.A = 0xFF @@ -6148,12 +5553,10 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0xABCD]) assertEquals(0xFF, mpu.A) assertEquals(flags, mpu.Status.asByte().toInt()) - } @Test fun test_sta_absolute_stores_a_leaves_a_and_z_flag_unchanged() { - val flags = 0xFF and fZERO.inv() mpu.Status.fromByte(flags) mpu.A = 0x00 @@ -6165,14 +5568,12 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0xABCD]) assertEquals(0x00, mpu.A) assertEquals(flags, mpu.Status.asByte().toInt()) - - // STA Zero Page - } + // STA Zero Page + @Test fun test_sta_zp_stores_a_leaves_a_and_n_flag_unchanged() { - val flags = 0xFF and fNEGATIVE.inv() mpu.Status.fromByte(flags) mpu.A = 0xFF @@ -6184,12 +5585,10 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0x0010]) assertEquals(0xFF, mpu.A) assertEquals(flags, mpu.Status.asByte().toInt()) - } @Test fun test_sta_zp_stores_a_leaves_a_and_z_flag_unchanged() { - val flags = 0xFF and fZERO.inv() mpu.Status.fromByte(flags) mpu.A = 0x00 @@ -6201,14 +5600,12 @@ abstract class TestCommon6502 { assertEquals(0x00, memory[0x0010]) assertEquals(0x00, mpu.A) assertEquals(flags, mpu.Status.asByte().toInt()) - - // STA Absolute, X-Indexed - } + // STA Absolute, X-Indexed + @Test fun test_sta_abs_x_indexed_stores_a_leaves_a_and_n_flag_unchanged() { - val flags = 0xFF and fNEGATIVE.inv() mpu.Status.fromByte(flags) mpu.A = 0xFF @@ -6221,12 +5618,10 @@ abstract class TestCommon6502 { assertEquals(0xFF, memory[0xABCD + mpu.X]) assertEquals(0xFF, mpu.A) assertEquals(flags, mpu.Status.asByte().toInt()) - } @Test fun test_sta_abs_x_indexed_stores_a_leaves_a_and_z_flag_unchanged() { - val flags = 0xFF and fZERO.inv() mpu.Status.fromByte(flags) mpu.A = 0x00 @@ -6245,7 +5640,6 @@ abstract class TestCommon6502 { @Test fun test_sta_abs_y_indexed_stores_a_leaves_a_and_n_flag_unchanged() { - val flags = 0xFF and fNEGATIVE.inv() mpu.Status.fromByte(flags) mpu.A = 0xFF diff --git a/sim65/test/TestDisassembler.kt b/sim65/test/TestDisassembler.kt index c3bf26c73..3b5029c9f 100644 --- a/sim65/test/TestDisassembler.kt +++ b/sim65/test/TestDisassembler.kt @@ -8,7 +8,7 @@ class TestDisassembler { @Test fun testDisassembleAllOpcodes() { - val cpu = Cpu6502(true, true) + val cpu = Cpu6502(true) val memory = Ram(0, 0xffff) memory.load("test/testfiles/disassem_instr_test.prg", 0x1000 - 2) val result = cpu.disassemble(memory, 0x1000, 0x1221)